Istio 故障注入之中止(httpStatus)
Istio 故障注入
Istio 故障注入與其他在網路層引入錯誤(例如延遲資料包或者直接殺死 Pod)的機制不同,Istio 允許在應用程式層注入故障。這使得可以注入更多相關的故障,比如 HTTP 錯誤程式碼等。
Istio 可以注入兩種型別的故障,而這兩種故障都是使用虛擬服務來配置的:
延遲:模擬增加網路延遲或上游服務過載。
中止:模擬服務故障而導致呼叫服務不可用。中止通常以 HTTP 錯誤程式碼或 TCP 連線失敗表示
Istio 故障注入例項
本例項包括 4 個資原始檔,3 個 k8s 相關,1 個 istio 相關:
client.yaml
nginx-svc.yaml
nginx-deploy.yaml
nginx-vs.yaml
客戶端資原始檔
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"]
執行如下語句進行 Istio 注入,注入後,此 client 將處於網格之內:
istioctl kube-inject -f client.yaml | kubectl apply -f -
Istio 注入成功成功如下圖所示:
k8s 服務檔案
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
部署工作負載(deployment)
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
發現模擬後端服務中止失效。如下圖所示: