ISTIO 學習筆記(一)之 安裝


一、背景

  serviceMesh 目前 在服務治理方面 作為新興技術 已逐步被使用,其對應的 產品為 Istio。

二、部署

1、前提條件

    在物理服務器上或虛擬機中部署好 kubernetes集群。 (參考:kubernetes 學習筆記之安裝)

2、部署 Istio

    Istio目前最新版本為1.7.3,但是由於1.7.3提供的 demo profile 不支持默認安裝 grafana、kiali、prometheus、tracing 等第三方組件,但 1.6.12支持,且1.6.12和1.7.3 在架構上是一致的,所以選擇安裝1.6.12。

(1) 下載包

   在 https://github.com/istio/istio/releases 中下載

 (2) 配置 istioctl

    將istio-1.6.12-linux-amd64.tar.gz上傳到安裝kubernetes集群的物理機或虛擬機上,執行以下命令。

#切換到包所在目錄

cd /root/wf

#解壓包

tar -zxvf  istio-1.6.12-linux-amd64.tar.gz

#重命名

mv istio-1.6.12 istio

#添加環境變量

vi /etc/profile

export PATH=/root/wf/istio/bin:$PATH

#修改的環境變量生效

source /etc/profile

#驗證istioctl命令是否存在

istioctl

(3) 安裝 istio

  a) 查看 profile demo

說明:

  • addonComponents:表示要安裝的第三方組件,這里顯示:istiocoredns不默認安裝,grafana\kiali\prometheus\tracing默認安裝;
  • components:表示istio內部組件,這里顯示,citadel\cni不默認安裝。

  b) 執行部署命令

    為了最大限度的能夠使用istio的特性功能,這里選擇安裝所有支持的addonComponents及components。

istioctl manifest apply --set profile=demo --set addonComponents.istiocoredns.enabled=true --set components.citadel.enabled=true --set components.cni.enabled=true

  c) 配置 kiali kubernetes 集群外可訪問

  • 在kubernetes中創建gateway及vritualservice,文件信息如下:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: kiali
  namespace: istio-system
spec:
  gateways:
  - kiali-gateway  #該虛擬服務的路由規則適用於流入kiali-gateway網關的流量
  hosts:
  - "*"
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: kiali
        port:
          number: 20001
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: kiali-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway   #使用 istio 提供的 ingressgateway服務
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
          - "*"
  • gateway 及 vritualservice(PS:其實vritualservice可以直接用於所有集群入口流量路由的配置)
#部署gateway\virtualservice
kubectl apply -f /root/wf/docker/kiali-virtualservice.yaml
#查看istio-system 安裝的 istio-ingressgateway 對外提供的訪問端口
kubectl get svc -n istio-system

 圖中顯示 istio-ingressgateway 80 對外對應的端口為 30932

  • 配置 grafana 到 kiali 中
#查看kiali的configmap內容,其實可以看到kiali掛載的配置文件config.yaml 中grafana.url值為空
kubectl get cm -n istio-system kiali -o yaml
#編輯configmap
kubectl edit cm –n istio-system kiali

 

   配置完成后,可以在services/workload下的 Inbound Metrics/ Outbound Metrics 看到內容。

(3) 部署 bookinfo 示例程序

  • 部署
#查看集群中所有的命名空間
kubectl get namespaces
#查看default命名空間的信息
kubectl describe ns default
#給default命名空間添加標簽,該標簽添加成功則部署在該命名空間中的pod會自動注入sidecar容器
kubectl label namespace default istio-injection=enabled
#部署bookinfo 官方示例程序
kubectl apply-f /root/wf/istio/samples/bookinfo/platform/kube/ bookinfo.yaml
#檢查是否bookinfo相關的pod都是running狀態
kubectl get pods 
#當發現通過以上部署pod時,未創建pod且原因 為 sidecar容器自動失敗,此時可以采用手動注入方式
#卸載bookinfo示例程序
kubectl delete -f /root/wf/istio/samples/bookinfo/platform/kube/ bookinfo.yaml
#手動注入sidecar容器
istioctl kube-inject -f /root/wf/istio/samples/bookinfo/platform/kube/ bookinfo.yaml |kubectl apply -f -
  • 配置 bookinfo kubernetes 集群外可訪問

            在配置kiali的時候已經創建了針對kubernetes集群外訪問集群內服務的gateway,因此這里直接使用這個gateway,現在要做的是創建virtualservice,內容如下:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "*"
  gateways:
  - istio-system/kiali-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
            number: 9080

執行命令:

kubectl apply –f /root/wf/istio/samples/bookinfo/networking/bookinfo-gateway.yaml

  在瀏覽器輸入 http://x.x.x.x:30932/productpage 即可訪問集群內的 bookinfo系統,不斷刷新會發現頁面右側的星級狀態一直在發生變化。

三、部署過程中遇到的問題

1、鏡像拉取不成功

(1) 在通過istioctl manifest部署的時候,會遇到timeout的情況,導致部署不成功。

排查方法:

#istio內部組件及第三方組件默認安裝在 istio-system命名空間
#查看該命名空間上的所有pod,會看到部分不是running的狀態
kubectl get pods –n istio-system
#查看失敗的pod的描述信息,在events 一欄可以看到錯誤信息,這里會提示是imagepull失敗,xxx 為 pod name
kubectl describe pod xxx –n istio-system

解決辦法:

  方法一:讓kubernetes 所屬服務器能夠連上外網(這種是最好的,這樣部署的時候,會自動從外網拉取所需鏡像文件);

  方法二:在方法一不可行的情況下使用,提前下載好所有需要的image.

  a) 在kubernetes服務器上,通過以下命令獲取所有需要下載的image

kubectl get deployment –n istio-system –o yaml > test.yaml

     打開test.yaml文件,其中image 的值就是需要的image.

grafana/grafana:6.7.4
docker.io/istio/proxyv2:1.6.12
docker.io/jaegertracing/all-in-one:1.16
coredns/coredns:1.6.2
istio/coredns-plugin:0.2-istio-1.1
docker.io/istio/pilot:1.6.12
quay.io/kiali/kiali:v1.18
docker.io/prom/prometheus:v2.15.1
docker.io/istio/install-cni:1.6.12

  b) 使用一台可以連接外網的服務器,且該服務器上已經安裝了docker;

  c) 在可連接外網的服務器上執行以下命令,save image

docker pull xxxx
docker images
docker save –o /root/wf/kiali.tar quay.io/kiali/kiali:v1.18

   d) 在kubernetes 服務器上,load image 到docker中(PS: kubernetes集群的master 和worker node所屬服務器都要操作)

        將連接外網上save下來 image文件都上傳到kubernetes所屬服務器上,並執行以下命令。

#加載鏡像文件
docker load -i kiali.tar
#顯示本地docker中所有的鏡像文件
docker images

   e) 重新部署 istio

#卸載
istioctl manifest generate --set profile=demo --set addonComponents.istiocoredns.enabled=true --set components.citadel.enabled=true --set components.cni.enabled=true | kubectl delete -f -
#安裝
istioctl manifest apply --set profile=demo --set addonComponents.istiocoredns.enabled=true --set components.citadel.enabled=true --set components.cni.enabled=true

 (2) 部署 bookinfo 中也會出現 pod 狀態部署 running,且是由於鏡像拉取失敗造成的,按照以上方式提前准備好鏡像。

#卸載
kubectl delete -f /root/wf/istio/samples/bookinfo/platform/kube/ bookinfo.yaml
#部署
kubectl apply-f /root/wf/istio/samples/bookinfo/platform/kube/ bookinfo.yaml

2、部署 bookinfo 發現對應的 pod 沒有創建

排查方法:

#查看default命名空間中所有已創建的 deployment
kubectl getdeployment 
#查看default命名空間中 name為details-v1 的deployment信息
kubectl describe deployment details-v1
#查看副本資源數據信息
kubectl describe rs/details-v1-5974b67c8

 

 

 有時副本資源報的錯誤信息如下:

通過如下命令也可以查看到錯誤日志:

kubectl logs kube-controller-manager-master1 -n kube-system

或者

kubectl logs kube-apiserver-master1 -n kube-system

 解決方法:

   以上是網絡插件存在問題,在istio的deployment部署文件中添加 hostNetwork:true,表示使用宿主機網絡,即沒有問題。但是具體原因,好需要研究。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM