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

由上圖可知,重試設置生效。

相關文章
相關標籤/搜索