istio應用部署樣例
該版本為1.0.5版本,目前版本已經更新。該執行個體為一套istio服務上線流程:->
注入
部署
建立目标規則
。就大多數istio服務網格應用均可基于這一流程上線。
建立預設路由
部署istio
istio有多種部署方式,阿裡雲、華為雲等雲服務商均提供一鍵安裝,同時也可以通過GitHub下載下傳release包,使用
install/kubernetes/istio-demo.yaml
部署,或者使用helm部署。這裡采用阿裡雲容器服務一鍵部署istio。

部署兩個版本的服務
這裡選擇一個簡單的Python項目作為服務端,這裡使用
崔秀龍老哥的
flaskapp服務,該服務的作用就是提供2個url路徑:
- 一個是/env,使用者擷取容器中的環境變量,例如 http://flaskapp/env/version
- 另一個是/fetch ,用于擷取在參數url中指定的網址的内容,例如 http://flaskapp/fetch?url=http://weibo.com
建立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檢視注入情況
這裡也可以使用
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檢視調用情況
可以看到流量都進入了v2版本中
小結
這裡實作了一個極簡的istio應用,可以幫助新手快速入門,官網提供的Bookinfo應用較為複雜。這裡提供的小例子更為簡潔易懂,非常利于入門。
參考
- 《深入淺出Istio》 --- 崔秀龍