無需停機即可升級 Kubernetes 集群

無需停機即可升級 Kubernetes 集群

Kubernetes 叢集的升級過程

在使用 Kubernetes 叢集的某個時候,需要更新正在運行的節點。這可能包括套件更新、核心更新或新虛擬機器映像的部署。在 Kubernetes 術語中,這被稱為 “自願擾亂”.

這篇文章是 4 篇系列文章中的一篇:

  1. 這篇文章。
  2. 優雅關閉 Kubernetes 叢集中的 Pod
  3. 刪除 Pod 時延遲終止
  4. 如何使用 PodDisruptionBudgets 避免 Kubernetes 叢集停機

(譯者註:本系列剩餘文章的翻譯即將發布)

在本文中,我們將介紹 Kubernetes 提供的所有工具,以實現叢集中運行的節點的零停機時間。

問題定義

我們最初會採取一種簡單的方法,識別問題並評估這種方法的潛在風險,並累積知識來解決我們在整個週期中遇到的每一個問題。結果是使用生命週期鉤子、就緒偵測和 Pod 中斷預算的配置來實現零停機時間。

為了開始我們的旅程,讓我們舉一個具體的例子。假設我們有一個雙節點 Kubernetes 集群,其中運行一個應用程序,其後有兩個 pod。 Service:

無需停機即可升級 Kubernetes 集群

讓我們從在兩個 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 叢集更新的完整實作和測試版本,請造訪 Gruntwork.io.

也請閱讀我們部落格上的其他文章:

來源: www.habr.com

為具有 DDoS 保護、VPS VDS 服務器的站點購買可靠的主機 🔥 購買具備 DDoS 防護的可靠網站寄存服務,包括 VPS 和 VDS 伺服器 | ProHoster