天天看點

Istio - TrafficManagement - Timeout

> 逾時是為了解決長時間或者無限期的等待造成服務不可用,通常需要在代碼中植入此類的網絡層面的彈性處理邏輯,但通過 Istio 就可以使用 Vitual Sevice來優雅的實作逾時的處理。

#### 什麼場景需要用到逾時處理

在生産環境中經常會碰到由于調用方等待下遊的響應過長,堆積大量的請求阻塞了自身服務,造成雪崩的情況,通過通過逾時處理來避免由于無限期等待造成的故障,進而增強服務的可用性。

#### 通過例子來了解

Istio - TrafficManagement - Timeout

nginx 服務設定了逾時時間為3秒,如果超出這個時間就不在等待,傳回逾時錯誤。

httpd 服務設定了響應時間延遲5秒,任何請求都需要等待5秒後才能傳回。

client 通過通路 nginx 服務去反向代理 httpd 服務,由于 httpd 服務需要5秒後才能傳回,但nginx 服務隻等待3秒,是以用戶端會提示逾時錯誤。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deployment
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-deployment
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
        - image: 'nginx:latest'
          name: nginx-deployment
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: httpd-deployment
  name: httpd-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpd-deployment
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: httpd-deployment
    spec:
      containers:
        - image: 'httpd:latest'
          name: httpd-deployment
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx-deployment
  type: ClusterIP
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: httpd-service
spec:
  selector:
    app: httpd-deployment
  type: ClusterIP
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginx-vs
spec:
  hosts:
  - nginx-service
  http:
  - route:
    - destination:
        host: nginx-service
    timeout: 3s
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpd-vs
spec:
  hosts:
  - httpd-service
  http:
  - fault:
      delay:
        percentage:
          value: 100
        fixedDelay: 5s
    route:
    - destination:
        host: httpd-service
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: client-deployment
  name: client-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: client-deployment
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: client-deployment
    spec:
      containers:
        - image: 'busybox:latest'
          name: client-deployment
          command: [ "/bin/sh", "-c", "sleep 3600"]      

##### 配置 nginx 反向代理 模拟下遊調用

``kubectl exec -it nginx-deployment-56c94b9957-xgw88 -- sh``

tee /etc/nginx/conf.d/default.conf <<-'EOF'
server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://httpd-service;
        proxy_http_version 1.1;
    }
}
EOF      

執行 ``nginx -t ; nginx -s reload`` 重新開機服務以生效配置

##### 進入用戶端容器測試結果

``kubectl exec -it client-deployment-56c94b9957-xgw88 -- sh``

``while true; do wget -q -O - http://nginx-service; done``

Istio - TrafficManagement - Timeout

每隔3秒,由于 nginx 服務的逾時時間到了而 httpd 未有響應,則提示傳回逾時錯誤。

繼續閱讀