Istio 故障注入與其餘在網絡層引入錯誤(例如延遲數據包或者直接殺死 Pod)的機制不一樣,Istio 容許在應用程序層注入故障。這使得能夠注入更多相關的故障,好比 HTTP 錯誤代碼等。nginx
Istio 能夠注入兩種類型的故障,而這兩種故障都是使用虛擬服務來配置的:web
延遲:模擬增長網絡延遲或上游服務過載。後端
停止:模擬服務故障而致使調用服務不可用。停止一般以 HTTP 錯誤代碼或 TCP 鏈接失敗表示api
本實例包括 4 個資源文件,3 個 k8s 相關,1 個 istio 相關:網絡
client.yamlapp
nginx-svc.yamlspa
nginx-deploy.yaml3d
nginx-vs.yamlcode
client.yaml 內容以下:server
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"]
執行以下語句進行 Istio 注入,注入後,此 client 將處於網格以內:
istioctl kube-inject -f client.yaml | kubectl apply -f -
Istio 注入成功成功以下圖所示:
nginx-svc.yaml 內容以下:
apiVersion: v1 kind: Service metadata: name: nginx-svc spec: selector: server: nginx ports: - name: http port: 80 targetPort: 80 protocol: TCP
執行以下語句部署 service:
kubectl apply -f nginx-svc.yaml
nginx-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
部署語句以下:
kubectl apply -f nginx-deploy.yaml
故障注入就在虛擬服務資源中,內容以下:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vs spec: hosts: - nginx-svc http: - fault: abort: percentage: value: 100 httpStatus: 503 route: - destination: host: nginx-svc
部署語句以下:
kubectl apply -f nginx-vs.yaml
自此,整個實例部署完畢。
執行以下語句登陸客戶端:
kubectl exec -it client-5b77d5949f-clrb7 -- sh
使用 wget 訪問 nginx-svc:
wget -q -O - http://nginx-svc
發現模擬後端服務停止失效。以下圖所示: