本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

kubeadm:使用 etcd Learner 安全地加入控制平面節點

kubeadm 工具現在支援 etcd learner 模式,它允許你利用 etcd 3.4 版本中引入的 learner 模式功能,來增強你的 Kubernetes 叢集的彈性和穩定性。本指南將引導你使用 kubeadm 來使用 etcd learner 模式。預設情況下,kubeadm 在每個控制平面節點上執行一個本地 etcd 例項。

在 v1.27 中,kubeadm 引入了一個新的特性門控 EtcdLearnerMode。啟用此特性門控後,在加入新的控制平面節點時,新的 etcd 成員將被建立為一個 learner,並且只有在 etcd 資料完全同步後才會被提升為投票成員。

使用 etcd learner 模式有什麼好處?

etcd learner 模式提供了幾個令人信服的理由,讓我們在 Kubernetes 叢集中考慮採用它。

  1. 增強彈性:etcd learner 節點是無投票權的成員,它們在完全投入運營前會先追趕 leader 的日誌。這可以防止新的叢集成員破壞法定人數或引發 leader 選舉,從而使叢集在成員變更期間更具彈性。
  2. 減少叢集不可用時間:新增新成員的傳統方法通常會導致叢集出現不可用期,尤其是在基礎設施緩慢或配置錯誤的情況下。etcd learner 模式可以最大限度地減少此類中斷。
  3. 簡化維護:learner 節點提供了一種更安全、可逆的方式來新增或替換叢集成員。這降低了由於配置錯誤或新增成員期間的操作失誤而導致意外叢集中斷的風險。
  4. 提高網路容忍度:在涉及網路分割槽的場景中,learner 模式可以實現更優雅的處理。根據新成員所處的網路分割槽,它可以無縫地與現有叢集整合,而不會造成中斷。

總之,etcd learner 模式在成員新增和變更期間提高了 Kubernetes 叢集的可靠性和可管理性,使其成為叢集運維人員的一項寶貴功能。

節點如何加入使用新模式的叢集

建立一個由 etcd learner 模式支援的 Kubernetes 叢集

有關使用 kubeadm 建立高可用性叢集的一般說明,可以參考使用 kubeadm 建立高可用性叢集

要使用 kubeadm 建立一個由 etcd learner 模式支援的 Kubernetes 叢集,請遵循以下步驟:

# kubeadm init --feature-gates=EtcdLearnerMode=true ...
kubeadm init --config=kubeadm-config.yaml

kubeadm 配置檔案如下所示:

apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
featureGates:
  EtcdLearnerMode: true

kubeadm 工具部署了一個單節點 Kubernetes 叢集,並將 etcd 設定為使用 learner 模式。

將節點加入 Kubernetes 叢集

在將控制平面節點加入新的 Kubernetes 叢集之前,請確保現有的控制平面節點和所有 etcd 成員都是健康的。

使用 etcdctl 檢查叢集健康狀況。如果 etcdctl 不可用,你可以在容器映象內執行此工具。你應該直接透過你的容器執行時(例如使用 crictl run 等工具)來執行此操作,而不是透過 Kubernetes。

以下是一個使用安全通訊來檢查 etcd 叢集健康狀況的客戶端命令示例:

ETCDCTL_API=3 etcdctl --endpoints 127.0.0.1:2379 \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  member list
...
dc543c4d307fadb9, started, node1, https://10.6.177.40:2380, https://10.6.177.40:2379, false

要檢查 Kubernetes 控制平面是否健康,執行 kubectl get node -l node-role.kubernetes.io/control-plane= 並檢查節點是否就緒。

在將工作節點加入新的 Kubernetes 叢集之前,請確保控制平面節點是健康的。

接下來

  • EtcdLearnerMode 特性門控在 v1.27 中是 alpha 階段,我們預計它將在 Kubernetes 的下一個次要版本(v1.29)中升級為 beta 階段。
  • etcd 有一個開放的 issue 可能會使該過程更加自動化:支援將 learner 成員自動提升為投票成員
  • 瞭解更多關於 kubeadm 配置格式 的資訊。

反饋

本指南對你有幫助嗎?如果你有任何反饋或遇到任何問題,請告訴我們。我們隨時歡迎你的反饋!歡迎參加每兩週一次的 SIG Cluster Lifecycle 會議或每週的 kubeadm office hours。或者透過 Slack(頻道 #kubeadm)或 SIG 的郵件列表與我們聯絡。