
Kubernetes 叢集的升級過程
在使用 Kubernetes 叢集的某個時候,需要更新正在運行的節點。這可能包括套件更新、核心更新或新虛擬機器映像的部署。在 Kubernetes 術語中,這被稱為 .
這篇文章是 4 篇系列文章中的一篇:
- 這篇文章。
- 優雅關閉 Kubernetes 叢集中的 Pod
- 刪除 Pod 時延遲終止
- 如何使用 PodDisruptionBudgets 避免 Kubernetes 叢集停機
(譯者註:本系列剩餘文章的翻譯即將發布)
在本文中,我們將介紹 Kubernetes 提供的所有工具,以實現叢集中運行的節點的零停機時間。
問題定義
我們最初會採取一種簡單的方法,識別問題並評估這種方法的潛在風險,並累積知識來解決我們在整個週期中遇到的每一個問題。結果是使用生命週期鉤子、就緒偵測和 Pod 中斷預算的配置來實現零停機時間。
為了開始我們的旅程,讓我們舉一個具體的例子。假設我們有一個雙節點 Kubernetes 集群,其中運行一個應用程序,其後有兩個 pod。 Service:

讓我們從在兩個 Kubernetes 叢集節點上執行兩個帶有 Nginx 和 Service 的 pod 開始。
我們要升級叢集中兩個工作節點的核心版本。我們該怎麼做呢?一個簡單的解決方案是使用更新的配置來載入新節點,然後關閉舊節點並啟動新節點。雖然這種方法可行,但存在一些問題:
- 當您關閉舊節點時,在其上執行的 pod 也將關閉。如果需要清理 pod 以便正常關閉怎麼辦?您正在使用的虛擬化系統可能不會等待清理過程完成。
- 如果一次關閉所有節點會怎麼樣?當 pod 移動到新節點時,您將會遇到相當長的停機時間。
我們需要一種方法來從舊節點優雅地遷移 pod,同時確保在對節點進行更改時沒有任何工作程序正在運行。或者當我們進行完整的叢集替換時,如範例中所示(即替換 VM 映像),我們希望將正在執行的應用程式從舊節點遷移到新節點。在這兩種情況下,我們都希望防止新的 pod 被調度到舊節點上,然後從舊節點中驅逐所有正在運行的 pod。為了實現這些目標,我們可以使用指令 kubectl drain.
從節點重新分配所有 Pod
排空操作可讓您從節點重新指派所有 pod。在執行耗盡期間,該節點被標記為不可調度(標誌 NoSchedule)。這可以防止新的 pod 出現在其上。然後 drain 開始從節點驅逐 pod,並透過發送訊號終止目前在節點上運行的容器 TERM 容器中的容器。
雖然 kubectl drain 可以很好地驅逐 pod,還有兩個因素可能會導致執行排水操作時失敗:
- 您的申請必須能夠在提交後正常終止。
TERM訊號.當 Pod 被驅逐時,Kubernetes 會發送一個訊號TERM容器並等待它們停止指定的時間,如果之後它們還沒有停止,則會強制終止它們。無論如何,如果您的容器沒有正確接收訊號,您仍然可能會錯誤地關閉正在執行的 pod(例如,資料庫中正在執行交易)。 - 您將丟失所有包含您的應用程式的 pod。當您在新節點上啟動新容器時它可能不可用,或者如果您的 pod 部署時沒有控制器,它們可能根本無法重新啟動。
避免停機
為了最大限度地減少自願中斷(例如節點上的耗盡操作)造成的停機時間,Kubernetes 提供了以下故障處理選項:
在本系列的其餘部分中,我們將使用這些 Kubernetes 功能來減輕 pod 遷移的影響。為了更容易理解主要思想,我們將使用上面的範例和以下資源配置:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
targetPort: 80
port: 80此配置是一個最小範例。 Deployment,它管理叢集中的 nginx pod。此外,配置描述了資源 Service,可用於存取叢集中的 nginx pod。
在整個週期中,我們將迭代擴展此配置,以便它最終包含 Kubernetes 提供的所有功能,以減少停機時間。
若要取得在 AWS 及其他平台上實現零停機的 Kubernetes 叢集更新的完整實作和測試版本,請造訪 .
也請閱讀我們部落格上的其他文章:
來源: www.habr.com
