您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關K8s中如何進行優雅停機和零宕機部署,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創建、刪除 Pod 是 K8s 中最常見的任務之一。下面介紹了 Pod 在響應創建、刪除請求時發生的內部流程,還討論了如何在 Pod 啟動或關閉時防止斷開連接,以及如何正常關閉長時間運行的任務。
在輸入命令后,kubectl 就會將 Pod 定義提交給 Kubernetes API。
在數據庫中保存集群狀態
API 接收并檢查 Pod 定義,然后將其存儲在 etcd 數據庫中。另外,Pod 將被添加到調度程序的隊列中。
Kubelet
kubelet 的工作是輪詢控制平面以獲取更新。kubelet 不會自行創建 Pod,而是將工作交給其他三個組件:
如果 Pod 不是任何 Service 的一部分,那到這里就結束了,因為 Pod 已經創建完畢并可以使用,但如果 Pod 是 Service 的一部分,那還有幾個步驟需要執行。
Pod 和 Service
在創建 Service 時,我們需要注意兩點信息:
kubectl apply
將 Service 提交給集群時,Kubernetes 會找到所有和選擇器(name: app)有著相同標簽的 Pod,并收集其 IP 地址,當然它們需要先通過 Readiness 探針,然后再將每個 IP 地址都和端口連接在一起。
10.0.0.3
,
targetPort
是 3000,Kubernetes 會將這兩個值連接起來稱為 endpoint。
endpoint 存儲在控制平面中,Endpoint 對象也會更新。
在 Kubernetes 中使用 endpoint
endpoint 被 Kubernetes 中的多個組件所使用。Kube-proxy 使用 endpoint 在節點上設置 iptables 規則。因此,每次對 Endpoint 對象進行更改時,kube-proxy 都會檢索 IP 地址和 endpiont 新列表,以編寫新的 iptables 規則。
刪除 Pod
刪除 Pod 時,我們要遵循上文相同的步驟,不過是相反的。首先,我們從 Endpoint 對象中刪除 endpiont,但這次“readiness”探針會被忽略,endpiont 會立即從控制平面中移除,然后再依次觸發所有事件到 kube-proxy,Ingress 控制器、DNS、服務網格等。這些組件將更新其內部狀態,并停止將流量路由到 IP 地址。
創建 Pod 時,Kubernetes 會等待 kubelet 報告 IP 地址,然后進行 endpoint 廣播,但刪除 Pod 時,這些事件是并行開始的。這可能會導致一些條件競爭。如果在 endpoint 廣播之前刪除Pod怎么辦?
優雅停機
當 Pod 在 kube-proxy 或 Ingress 控制器刪除之前終止,我們可能會遇到停機時間。此時,Kubernetes 仍將流量路由到 IP 地址,但 Pod 已經不存在了。Ingress 控制器、kube-proxy、CoreDNS 等也沒有足夠的時間從其內部狀態中刪除 IP地址。
terminationGracePeriodSeconds
)。如果我們無法更改代碼以獲得更長的等待時間要怎么辦?我們可以調用腳本以獲得固定的等待時間,然后退出應用程序。
preStop
hook。我們可以將
preStop
hook 設置為等待 15 秒。下面是一個例子:
preStop
hook 是 Pod LifeCycle hook 之一。
寬限期和滾動更新
優雅停機適用于要刪除的 Pod,但如果我們不刪除 Pod,會怎么樣?其實即使我們不做,Kubernetes 也會刪除 Pod。在每次部署較新版本的應用程序時,Kubernetes 都會創建、刪除 Pod。
1.用新的容器鏡像創建一個 Pod。
2.銷毀現有的 Pod。
3.等待 Pod 準備就緒。
它會不斷重復上述步驟,直到將所有 Pod 遷移到較新的版本。Kubernetes 在新 Pod 準備接收流量之后會重復每個周期。另外,Kubernetes 不會在轉移 Pod 前等待 Pod 被刪除。如果我們有 10 個 Pod,并且 Pod 需要 2 秒鐘的準備時間和 20 秒的關閉時間,就會發生以下情況:
1.創建一個 Pod,終止前一個 Pod。
2.Kubernetes 創建一個新的 Pod 后,需要 2 秒鐘的準備時間。
3.同時,被終止的 Pod 會有 20 秒的停止時間。
終止長時間運行的任務
如果我們要對大型視頻進行轉碼,是否有任何方法可以延遲停止 Pod?
terminationGracePeriodSeconds
增加到幾個小時,但這樣 Pod 的 endpoint 將 unreachable。如果我們公開指標以監控 Pod,instrumentation 將無法訪問 Pod。Prometheus 之類的工具依賴于 Endpoints 在集群中 scrape Pod。一旦刪除 Pod,endpoint 刪除信息就會在集群中傳播,甚至傳播到 Prometheus。
如果想自動刪除,那我們可以需要設置一個自動伸縮器,當它們完成任務時,可以將 Deployment 擴展到零個副本。
我們應該注意 Pod 從集群中刪除后,它們的 IP 地址可能仍用于路由流量。相比立即關閉 Pod,我們不如在應用程序中等待一下或設置一個 preStop
hook。在 endpoint 傳播到集群中,并且 Pod 從 kube-proxy、Ingress 控制器、CoreDNS 等中刪除后,Pod 才算被移除。
上述就是小編為大家分享的K8s中如何進行優雅停機和零宕機部署了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。