k8s中pod滾動更新如何減少流量丟失

潇潇暮鱼鱼發表於2024-07-09

有一個大前提,在舊pod狀態更新為Terminating並且SIGTERM後,容器仍然會將已經接收到的流量正常完成後才會銷燬。

1.流量上線時的有損情況,新增健康檢測,防止新pod還沒準備好就分配流量

2.流量下線時的有損情況,新增preStop生命週期掛鉤, 在容器終止之前呼叫此鉤子防止在新pod還沒分配流量前,將流量分給已經SIGTERM的容器。

一旦新的Pod處於活動狀態並準備就緒,Kubernetes將使舊的Pod停止服務,從而將Pod的狀態更新為Terminating ,將其從端點物件中刪除,然後傳送SIGTERMSIGTERM使容器以(希望)正常的方式關閉,並且不接受任何新連線。 在將Pod從端點物件中逐出後,負載均衡器會將流量路由到其餘(新的)流量。 這就是造成我們部署中的可用性差距的原因。 在負載均衡器注意到更改並可以更新其配置之前或之時,透過終止訊號停用Pod。 這種重新配置是非同步發生的,可能先傳送SIGTERM訊號後才摘除舊pod的Endpoints,此時可能導致很少的不幸請求被路由到終止Pod。此時應該配置preStop生命週期掛鉤


apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx
  #優雅退出
  lifecycle:
    preStop:
      exec:
        command: ["/bin/bash", "-c", "sleep 30"]
terminationGracePeriodSeconds: 60

相關文章