Istio 網路彈性 實踐 之 故障注入 和 呼叫重試
網路彈性介紹
網路彈性也稱為運維彈性,是指網路在遇到災難事件時快速恢復和繼續執行的能力。災難事件的範疇很廣泛,比如長時間停電、網路裝置故障、惡意入侵等。
重試(attempts)
Istio 重試機制就是如果呼叫服務失敗,Envoy 代理嘗試連線服務的最大次數。而預設情況下,Envoy 代理在失敗後並不會嘗試重新連線服務,除非我們啟動 Istio 重試機制。
重試樣例
本樣例中在一次呼叫服務失敗後最多配 3 次重試。
本樣例需要結合 Istio 故障注入模擬被呼叫服務宕機,假如不瞭解故障注入也沒關係,直接執行我的樣例就行。下面先展示一下整個例項的架構圖:
架構說明如下,本例項就是模擬客戶端呼叫 nginx,nginx 將請求轉發給 tomcat 的常見功能。tomcat 通過故障注入而中止對外服務,nginx 設定如果訪問 tomcat 失敗則會重試 3 次。因此模擬 client 呼叫 nginx 重試的情景。
該例項資原始檔一共有 4 個,分別如下:
client.yaml # 客戶端資源
deploy.yaml # nginx、tomcat 的 deployment 資源
svc.yaml # nginx、tomcat 的 service 資源
vs.yaml # Istio 虛擬資源
client.yaml 檔案
資源內容如下圖所示:
apiVersion: apps/v1 kind: Deployment metadata: name: client spec: replicas: 1 selector: matchLabels: app: client template: metadata: labels: app: client spec: containers: - name: busybox image: busybox imagePullPolicy: IfNotPresent command: ["/bin/sh", "-c", "sleep 3600"]
deploy.yaml
資源內容如下圖所示:
--- apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: server: nginx app: web spec: replicas: 1 selector: matchLabels: server: nginx app: web template: metadata: name: nginx labels: server: nginx app: web spec: containers: - name: nginx image: nginx:1.14-alpine imagePullPolicy: IfNotPresent --- apiVersion: apps/v1 kind: Deployment metadata: name: tomcat labels: server: tomcat app: web spec: replicas: 1 selector: matchLabels: server: tomcat app: web template: metadata: name: tomcat labels: server: tomcat app: web spec: containers: - name: tomcat image: docker.io/kubeguide/tomcat-app:v1 imagePullPolicy: IfNotPresent
svc.yaml
資源內容如下圖所示:
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
server: nginx
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
spec:
selector:
server: tomcat
ports:
- name: http
port: 8080
targetPort: 8080
protocol: TCP
vs.yaml
Istio 虛擬服務資源內容如下所示:
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: jiuxi-nginx-vs
spec:
hosts:
- nginx-svc
http:
- route:
- destination:
host: nginx-svc
reties:
attempts: 3
perTryTimeout: 10s
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: jiuxi-tomcat-vs
spec:
hosts:
- tomcat-svc
http:
- fault:
delay:
percentage:
value: 100
httpStatus: 503
route:
- destination:
host: tomcat-svc
此虛擬服務有兩個知識點。
第一:故障注入。該虛擬服務的作用物件就是 tomcat-svc。使用此故障注入後,在網格中該 tomcat 就是不可用的。
http: - fault: delay: percentage: value: 100 httpStatus: 503
該設定說明每次呼叫 tomcat-svc 的 k8s service,都會返回錯誤狀態碼503。
第二:呼叫超時:
hosts: - nginx-svc http: - route: - destination: host: nginx-svc reties: attempts: 3 perTryTimeout: 10s
該設定說明呼叫 nginx-svc 的 k8s service,如果呼叫失敗就會進行重試3次。
重試例項部署
在上面我們編寫完樣例,下面準備部署。
Istio 注入
需要對 client 和 deploy 資原始檔進行 Istio 注入,將 client、nginx、tomcat 都放入到網格中。本人是手工注入 Istio 方式,如果你設定了自動 Istio 注入不會影響,一樣可以輕鬆完爆。
istioctl kube-inject -f client.yaml | kubectl apply -f - istioctl kube-inject -f deploy.yaml | kubectl apply -f -
執行成功後,通過 kubectl get pods 檢視 Istio 注入情況:
部署 k8s service
部署 svc.yaml:
kubectl apply -f svc.yaml
部署 Istio 虛擬服務
部署 vs.yaml:
kubectl apply -f vs.yaml
重試例項設定
因為要用到 nginx 對 tomcat 的轉發功能,因此需要對 nginx 做一些設定:
登入 nginx pod:
kubectl exec -it nginx-7559f7d487-djzbb -- sh
編輯 nginx 配置檔案:
vi /etc/nginx/conf.d/default.conf
新增和修改如下內容:
編輯完後,再執行如下語句驗證配置和讓配置生效:
自此,整個樣例配置和部署完畢。
重試例項驗證
登入 client,執行如下語句:
kubectl exec -it client-5b77d5949f-nzdtl -- sh
執行如下語句:
wget -q -O - http://nginx-svc
執行結果如下所示:
kubectl logs -f nginx-7559f7d487-79q9p -c istio-proxy
執行結果如下圖所示:
由上圖可知,重試設定生效。