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:
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。如下图所示: