Istio 故障注入与其余在网络层引入错误(例如延迟数据包或者直接杀死 Pod)的机制不一样,Istio 容许在应用程序层注入故障。这使得能够注入更多相关的故障,好比 HTTP 错误代码等。nginx
Istio 能够注入两种类型的故障,而这两种故障都是使用虚拟服务来配置的:web
延迟:模拟增长网络延迟或上游服务过载。api
停止:模拟服务故障而致使调用服务不可用。停止一般以 HTTP 错误代码或 TCP 链接失败表示网络
本实例包括 4 个资源文件,3 个 k8s 相关,1 个 istio 相关:app
client.yamlspa
nginx-svc.yaml3d
nginx-deploy.yamlcode
nginx-vs.yamlserver
client.yaml 内容以下:blog
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: delay: percentage: value: 100 fixedDelay: 10s 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
发现延迟生效,由于设置的延迟时间是 5s。除去我中间操做花去了大约 3s,发现最终的延迟确实是 5s。以下图所示: