有一個大前提,在舊pod狀態更新為Terminating並且SIGTERM後,容器仍然會將已經接收到的流量正常完成後才會銷燬。
1.流量上線時的有損情況,新增健康檢測,防止新pod還沒準備好就分配流量
2.流量下線時的有損情況,新增preStop
生命週期掛鉤, 在容器終止之前呼叫此鉤子防止在新pod還沒分配流量前,將流量分給已經SIGTERM的容器。
一旦新的Pod處於活動狀態並準備就緒,Kubernetes將使舊的Pod停止服務,從而將Pod的狀態更新為Terminating
,將其從端點物件中刪除,然後傳送SIGTERM
。 SIGTERM
使容器以(希望)正常的方式關閉,並且不接受任何新連線。 在將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