Istio 网络弹性 实践 之 故障注入 和 调用重试

网络弹性介绍

网络弹性也称为运维弹性,是指网络在遇到灾难事件时快速恢复和继续运行的能力。灾难事件的范畴很普遍,好比长时间停电、网络设备故障、恶意入侵等。nginx


重试(attempts)

Istio 重试机制就是若是调用服务失败,Envoy 代理尝试链接服务的最大次数。而默认状况下,Envoy 代理在失败后并不会尝试从新链接服务,除非咱们启动 Istio 重试机制。web


重试样例

本样例中在一次调用服务失败后最多配 3 次重试。docker

本样例须要结合 Istio 故障注入模拟被调用服务宕机,假如不了解故障注入也不要紧,直接执行个人样例就行。下面先展现一下整个实例的架构图:api

架构说明以下,本实例就是模拟客户端调用 nginx,nginx 将请求转发给 tomcat 的常见功能。tomcat 经过故障注入而停止对外服务,nginx 设置若是访问 tomcat 失败则会重试 3 次。所以模拟 client 调用 nginx 重试的情景。tomcat

该实例资源文件一共有 4 个,分别以下:网络

client.yaml # 客户端资源架构

deploy.yaml # nginx、tomcat 的 deployment 资源app

svc.yaml # nginx、tomcat 的 service 资源运维

vs.yaml # Istio 虚拟资源ide

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

添加和修改以下内容:

spacer.gifclipboard10.png

编辑完后,再执行以下语句验证配置和让配置生效:

spacer.gifclipboard11.png

自此,整个样例配置和部署完毕。


重试实例验证

登陆 client,执行以下语句:

kubectl exec -it client-5b77d5949f-nzdtl -- sh

执行以下语句:

wget -q -O - http://nginx-svc

执行结果以下所示:

kubectl logs -f nginx-7559f7d487-79q9p -c istio-proxy

执行结果以下图所示:

clipboard11.png

由上图可知,重试设置生效。

相关文章
相关标签/搜索