网络弹性介绍
网络弹性也称为运维弹性,是指网络在遇到灾难事件时快速恢复和继续运行的能力。灾难事件的范畴很广泛,比如长时间停电、网络设备故障、恶意入侵等。
重试(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
执行结果如下图所示:
由上图可知,重试设置生效。