天天看點

阿裡雲容器服務Istio初探istio應用部署樣例

istio應用部署樣例

該版本為1.0.5版本,目前版本已經更新。該執行個體為一套istio服務上線流程:

注入

->

部署

建立目标規則

建立預設路由

。就大多數istio服務網格應用均可基于這一流程上線。

部署istio

istio有多種部署方式,阿裡雲、華為雲等雲服務商均提供一鍵安裝,同時也可以通過GitHub下載下傳release包,使用

install/kubernetes/istio-demo.yaml

部署,或者使用helm部署。這裡采用阿裡雲容器服務一鍵部署istio。

阿裡雲容器服務Istio初探istio應用部署樣例

部署兩個版本的服務

這裡選擇一個簡單的Python項目作為服務端,這裡使用

崔秀龍

老哥的

flaskapp

服務,該服務的作用就是提供2個url路徑:

建立2個Deployment,分别命名為 flaskapp-v1 和 flaskapp-v2 ,同時建立一個 Service ,将其命名為flaskapp。代碼檔案為

flaskapp.istio.yaml

---
apiVersion: v1
kind: Service
metadata:
name: flaskapp
labels:
    app: flaskapp
spec:
selector:
    app: flaskapp
ports:
- name: http
    port: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: flaskapp-v1
spec:
replicas: 1
template:
    metadata:
    labels:
        app: flaskapp
        version: v1
    spec:
    containers:
    - name: flaskapp
        image: dustise/flaskapp
        imagePullPolicy: IfNotPresent
        env:
        - name: version
        value: v1
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: flaskapp-v2
spec:
replicas: 1
template:
    metadata:
    labels:
        app: flaskapp
        version: v2
    spec:
    containers:
    - name: flaskapp
        image: dustise/flaskapp
        imagePullPolicy: IfNotPresent
        env:
        - name: version
        value: v2
           

注意

  • 兩個版本Deployment的鏡像一緻,但是使用了不同的version标簽區分,分别為 v1 和 v2 。實際環境中的鏡像是不同的
  • 在兩個Deployment中都有一個名為version的環境變量,分别為 v1 和 v2 。這裡設定是為了友善後續區分服務。
  • 兩個Deployment中都使用了 app 和 version 标簽,在 istio 網格應用中通常會使用這兩個标簽作為應用和版本的辨別。
  • Service 中的 Selector 僅使用了一個 app 标簽,這意味着該 Service 對兩個 Deployment 都是有效的。
  • 将在 Service 中定義的端口根據 istio 規範命名為http。

istio注入并部署服務端

$ istioctl kube-inject -f flask.istio.yaml | kubectl apply -f -
service/flaskapp created
deployment.extensions/flaskapp-v1 created
deployment.extensions/flaskapp-v2 created
           

在rancher檢視注入情況

阿裡雲容器服務Istio初探istio應用部署樣例

這裡也可以使用

kubectl describe po flaskapp-v1-7d4f9b8459-2ncnf

指令檢視Pod容器,這裡可以看到Pod中多了一個容器,名為

istio-proxy

,這就表示注入成功了。而前面

istio-init

的初始化容器,這個容器是用于初始化劫持的。

部署用戶端

這裡的用戶端是一個安裝了測試工具的鏡像,測試的内容可以在容器内通過shell完成。代碼檔案為

sleep.istio.yaml

---
apiVersion: v1
kind: Service
metadata:
name: sleep
labels:
    app: sleep
    version: v1
spec:
selector:
    app: sleep
    version: v1
ports:
- name: ssh
    port: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
template:
    metadata:
    labels:
        app: sleep
        version: v1
    spec:
    containers:
    - name: sleep
        image: dustise/sleep
        imagePullPolicy: IfNotPresent
           

istio注入并部署用戶端

$ istioctl kube-inject -f sleep.istio.yaml | kubectl apply -f -
service/sleep created
deployment.extensions/sleep created
           

sleep

應用的Pod進入Running狀态就可以進行驗證了

驗證服務

直接在sleep容器中執行指令行

bash-4.4# for i in `seq 10`;do http --body http://flaskapp/env/version;done

v1

v2

...

v1
           

該指令使用一個for循環,重複通路

,檢視内容,結果為 v1 和 v2 随機出現,各占一半。出現 v1 和 v2 版本輪流調用的效果,達到了基本的負載均衡的功能。

建立目标規則

目标規則代碼

flaskapp-destinationrule.yaml

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: flaskapp
spec:
host: flaskapp
subsets:
- name: v1
    labels:
    version: v1
- name: v2
    labels:
    version: v2
           

部署目标規則(這裡使用kubectl和istioctl均可)

$ kubectl apply -f flaskapp-destinationrule.yaml
Created config destination-rule/default/flaskapp at revision 59183403
           

建立預設路由

預設路由代碼

flaskapp-default-vs-v2.yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: flaskapp-default-v2
spec:
hosts: 
- flaskapp
http:
- route:
    - destination:
    host: flaskapp
    subset: v2
           

部署預設路由

$ kubectl apply -f flaskapp-default-vs-v2.yaml
Created config virtual-service/default/flaskapp-default-v2 at revision 59185583
           

驗證路由規則是否生效

再次在sleep容器中執行指令,檢視新定義的流量管理規則是否生效

bash-4.4# for i in `seq 10`;do http --body http://flaskapp/env/version;done
v2

v2

v2

v2

v2

v2

v2

v2

v2

v2
           

這裡就可以看到,設定的預設路由已經生效了,多次重複通路,傳回的内容都是來自環境變量 version 設定為 v2 的版本,也就是v2版本。

kiali檢視調用情況

阿裡雲容器服務Istio初探istio應用部署樣例

可以看到流量都進入了v2版本中

小結

這裡實作了一個極簡的istio應用,可以幫助新手快速入門,官網提供的Bookinfo應用較為複雜。這裡提供的小例子更為簡潔易懂,非常利于入門。

參考