[k8s]滾動更新機制-不宕機發布


Kubernetes 零宕機滾動更新

svc的轉發

首先會通過 集群的 DNS 服務解析到 Service 的 ClusterIP,
然后轉發到 Service 后面的 Pod 實例,這是每個節點上面的 kube-proxy 通過更新 iptables 規則來實現的。

Kubernetes 會根據 Pods 的狀態去更新 Endpoints 對象,這樣就可以保證 Endpoints 中包含的都是准備好處理請求的 Pod。

Ingress的轉發

大部分 Ingress Controller,比如 nginx-ingress、traefik 都是通過直接 watch Endpoints 對象來直接獲取 Pod 的地址的,而不用通過 iptables 做一層轉發了。

滾動更新

Kubernetes 的目標都是在滾動更新的過程中最大程度地減少服務的中斷。
一旦新的 Pod 處於活動狀態並准備就緒后,
Kubernetes 就將會停止就的 Pod,從而將 Pod 的狀態更新為 “Terminating”,
然后從 Endpoints 對象中移除,
並且發送一個 SIGTERM 信號給 Pod 的主進程。

SIGTERM 信號就會讓容器以正常的方式關閉,並且不接受任何新的連接。
Pod 從 Endpoints 對象中被移除后,前面的負載均衡器就會將流量路由到其他(新的)Pod 中去。

因為在負責均衡器注意到變更並更新其配置之前,
終止信號就會去停用 Pod,這個重新配置過程又是異步發生的,
所以並不能保證正確的順序,所以就可能導致很少的請求會被路由到終止的 Pod 上去。

零宕機

這里我們在 zero-downtime 這個 Deployment 中添加一個 preStop 鈎子:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: zero-downtime
  labels:
    app: zero-downtime
spec:
  replicas: 3
  selector:
    matchLabels:
      app: zero-downtime
  template:
    spec:
      containers:
      - name: zero-downtime
        image: nginx
        livenessProbe:
          # ...
        readinessProbe:
          # ...
        lifecycle:
          preStop:
            exec:
              command: ["/bin/bash", "-c", "sleep 20"]
  strategy:
    # ...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM