网络弹性也称为运维弹性,是指网络在遇到灾难事件时快速恢复和继续运行的能力。灾难事件的范畴很普遍,好比长时间停电、网络设备故障、恶意入侵等。html
工做中经常会碰到这样的开发、测试场景,好比:“对方处理请求时间过长,没有及时响应,咱们的程序要怎么处理来确保不会无限期地等待”。常见的处理方式是被调用方使用 sleep 语句模拟响应时间过长,调用方设定请求超时时间太短,来形成请求超时的结果。可是这种处理方法有不少的弊端,第一:本属于网络弹性层的东西,却须要在代码中体现;第二:超时时间设置过长可能致使过多的延迟、设置太短可能致使没必要要的失败,所以超时时间须要动态调整。基于上面两个弊端,Istio 使用虚拟服务来优雅实现超时处理。nginx
本实例须要结合 Istio 故障注入模拟被调用方响应请求慢的场景,有关 Istio 失败注入之延迟请参考本人的另一篇博文,简单到让你分分钟轻松完爆。web
该实例的架构图以下:docker
架构说明以下,本实例就是模拟客户端调用 nginx,nginx 将请求转发给 tomcat 的常见功能。tomcat 响应请求设置为 5s(经过故障注入实现,至关于 sleep 5s 逻辑),nginx 设置 client 的请求超时时间为 2s。由于 nginx 须要在 2s 内返回给 client,而 nginx 请求 tomcat 却须要 5s,所以模拟 client 调用 nginx 超时的情景。api
该实例资源文件一共有 4 个,分别以下:tomcat
client.yaml # 客户端资源网络
deploy.yaml # nginx、tomcat 的 deployment 资源架构
svc.yaml # nginx、tomcat 的 service 资源app
vs.yaml # Istio 虚拟资源运维
资源内容以下图所示:
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"]
资源内容以下图所示:
--- 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
资源内容以下图所示:
--- 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
Istio 虚拟服务资源内容以下所示:
--- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: jiuxi-nginx-vs spec: hosts: - nginx-svc http: - route: - destination: host: nginx-svc timeout: 2s --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: jiuxi-tomcat-vs spec: hosts: - tomcat-svc http: - fault: delay: percentage: value: 100 fixedDelay: 5s route: - destination: host: tomcat-svc
此虚拟服务有两个知识点。
第一:故障注入:
http: - fault: delay: percentage: value: 100 fixedDelay: 5s该设置说明每次调用 tomcat-svc 的 k8s service,都会延迟 5s 才会调用。
第二:调用超时:
hosts: - nginx-svc http: - route: - destination: host: nginx-svc timeout: 2s该设置说明调用 nginx-svc 的 k8s service,请求超时时间是 2s。
在上面咱们编写完样例,下面准备部署。
须要对 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 注入状况:
部署 svc.yaml:
kubectl apply -f svc.yaml
部署 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
执行结果以下所示:
/ # time wget -q -O - http://nginx-svc wget: server returned error: HTTP/1.1 504 Gateway Timeout Command exited with non-zero status 1 real 0m 2.02s user 0m 0.00s sys 0m 0.00s
说明 timeout 样例运行成功。
也能够一样验证故障注入效果,执行以下语句:
/ # time wget -q -O - http://tomcat-svc <!DOCTYPE html> <html lang="en"> ... </html> real 0m 5.01s user 0m 0.00s sys 0m 0.00s
执行效果是请求 5s 后才会返回,说明 Istio 故障注入(延迟 5s)运行成功。