Kubernetes 運行 etcd 集群

2022-06-06 11:21 更新

為 Kubernetes 運行 etcd 集群

etcd 是兼具一致性和高可用性的鍵值數(shù)據(jù)庫,可以作為保存 Kubernetes 所有集群數(shù)據(jù)的后臺數(shù)據(jù)庫。

你的 Kubernetes 集群的 etcd 數(shù)據(jù)庫通常需要有個備份計劃。

要了解 etcd 更深層次的信息,請參考 etcd 文檔。

在開始之前

你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構(gòu)建:

要檢查版本,請輸入 ?kubectl version?。

先決條件 

  • 運行的 etcd 集群個數(shù)成員為奇數(shù)。
  • etcd 是一個 leader-based 分布式系統(tǒng)。確保主節(jié)點定期向所有從節(jié)點發(fā)送心跳,以保持集群穩(wěn)定。
  • 確保不發(fā)生資源不足。
  • 集群的性能和穩(wěn)定性對網(wǎng)絡(luò)和磁盤 I/O 非常敏感。任何資源匱乏都會導(dǎo)致心跳超時, 從而導(dǎo)致集群的不穩(wěn)定。不穩(wěn)定的情況表明沒有選出任何主節(jié)點。 在這種情況下,集群不能對其當(dāng)前狀態(tài)進行任何更改,這意味著不能調(diào)度新的 pod。
  • 保持 etcd 集群的穩(wěn)定對 Kubernetes 集群的穩(wěn)定性至關(guān)重要。 因此,請在專用機器或隔離環(huán)境上運行 etcd 集群,以滿足 所需資源需求。
  • 在生產(chǎn)中運行的 etcd 的最低推薦版本是 ?3.2.10+?。

資源需求 

使用有限的資源運行 etcd 只適合測試目的。為了在生產(chǎn)中部署,需要先進的硬件配置。 在生產(chǎn)中部署 etcd 之前,請查看所需資源參考文檔。

啟動 etcd 集群 

本節(jié)介紹如何啟動單節(jié)點和多節(jié)點 etcd 集群。

單節(jié)點 etcd 集群 

只為測試目的使用單節(jié)點 etcd 集群。

  1. 運行以下命令:
  2. etcd --listen-client-urls=http://$PRIVATE_IP:2379 \
       --advertise-client-urls=http://$PRIVATE_IP:2379
  3. 使用參數(shù) ?--etcd-servers=$PRIVATE_IP:2379? 啟動 Kubernetes API 服務(wù)器。
  4. 確保將 ?PRIVATE_IP ?設(shè)置為etcd客戶端 IP。

多節(jié)點 etcd 集群 

出于耐用性和高可用性考量,在生產(chǎn)環(huán)境中應(yīng)以多節(jié)點集群的方式運行 etcd,并且定期備份。 建議在生產(chǎn)環(huán)境中使用五個成員的集群。 有關(guān)該內(nèi)容的更多信息,請參閱常見問題文檔。

可以通過靜態(tài)成員信息或動態(tài)發(fā)現(xiàn)的方式配置 etcd 集群。 有關(guān)集群的詳細(xì)信息,請參閱 etcd 集群文檔

例如,考慮運行以下客戶端 URL 的五個成員的 etcd 集群:?http://$IP1:2379?、 ?http://$IP2:2379?、?http://$IP3:2379?、?http://$IP4:2379? 和 ?http://$IP5:2379?。 要啟動 Kubernetes API 服務(wù)器:

  1. 運行以下命令:
  2. etcd --listen-client-urls=http://$IP1:2379,http://$IP2:2379,http://$IP3:2379,http://$IP4:2379,http://$IP5:2379 --advertise-client-urls=http://$IP1:2379,http://$IP2:2379,http://$IP3:2379,http://$IP4:2379,http://$IP5:2379
    
  3. 使用參數(shù) ?--etcd-servers=$IP1:2379,$IP2:2379,$IP3:2379,$IP4:2379,$IP5:2379? 啟動 Kubernetes API 服務(wù)器。
  4. 確保將 ?IP<n>? 變量設(shè)置為客戶端 IP 地址。

使用負(fù)載均衡的多節(jié)點 etcd 集群 

要運行負(fù)載均衡的 etcd 集群:

  1. 建立一個 etcd 集群。
  2. 在 etcd 集群前面配置負(fù)載均衡器。例如,讓負(fù)載均衡器的地址為 ?$LB?。
  3. 使用參數(shù) ?--etcd-servers=$LB:2379? 啟動 Kubernetes API 服務(wù)器。

加固 etcd 集群 

對 etcd 的訪問相當(dāng)于集群中的 root 權(quán)限,因此理想情況下只有 API 服務(wù)器才能訪問它。 考慮到數(shù)據(jù)的敏感性,建議只向需要訪問 etcd 集群的節(jié)點授予權(quán)限。

想要確保 etcd 的安全,可以設(shè)置防火墻規(guī)則或使用 etcd 提供的安全特性,這些安全特性依賴于 x509 公鑰基礎(chǔ)設(shè)施(PKI)。 首先,通過生成密鑰和證書對來建立安全的通信通道。 例如,使用密鑰對 ?peer.key? 和 ?peer.cert? 來保護 etcd 成員之間的通信, 而 ?client.key? 和 ?client.cert? 用于保護 etcd 與其客戶端之間的通信。 請參閱 etcd 項目提供的 示例腳本, 以生成用于客戶端身份驗證的密鑰對和 CA 文件。

安全通信 

若要使用安全對等通信對 etcd 進行配置,請指定參數(shù) ?--peer-key-file=peer.key? 和 ?--peer-cert-file=peer.cert?,并使用 HTTPS 作為 URL 模式。

類似地,要使用安全客戶端通信對 etcd 進行配置,請指定參數(shù) ?--key-file=k8sclient.key? 和 ?--cert-file=k8sclient.cert?,并使用 HTTPS 作為 URL 模式。 使用安全通信的客戶端命令的示例:

ETCDCTL_API=3 etcdctl --endpoints 10.2.0.9:2379 \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  member list

限制 etcd 集群的訪問 

配置安全通信后,限制只有 Kubernetes API 服務(wù)器可以訪問 etcd 集群。使用 TLS 身份驗證來完成此任務(wù)。

例如,考慮由 CA ?etcd.ca? 信任的密鑰對 ?k8sclient.key? 和 ?k8sclient.cert?。 當(dāng) etcd 配置為 ?--client-cert-auth? 和 TLS 時,它使用系統(tǒng) CA 或由 ?--trusted-ca-file? 參數(shù)傳入的 CA 驗證來自客戶端的證書。指定參數(shù) ?--client-cert-auth=true? 和 ?--trusted-ca-file=etcd.ca? 將限制對具有證書 ?k8sclient.cert? 的客戶端的訪問。

一旦正確配置了 etcd,只有具有有效證書的客戶端才能訪問它。要讓 Kubernetes API 服務(wù)器訪問, 可以使用參數(shù) ?--etcd-certfile=k8sclient.cert?、?--etcd-keyfile=k8sclient.key? 和 ?--etcd-cafile=ca.cert? 配置。

Note: Kubernetes 目前不支持 etcd 身份驗證。 想要了解更多信息,請參閱相關(guān)的問題 支持 etcd v2 的基本認(rèn)證。

替換失敗的 etcd 成員 

etcd 集群通過容忍少數(shù)成員故障實現(xiàn)高可用性。 但是,要改善集群的整體健康狀況,請立即替換失敗的成員。當(dāng)多個成員失敗時,逐個替換它們。 替換失敗成員需要兩個步驟:刪除失敗成員和添加新成員。

雖然 etcd 在內(nèi)部保留唯一的成員 ID,但建議為每個成員使用唯一的名稱,以避免人為錯誤。 例如,考慮一個三成員的 etcd 集群。假定 URL 分別為:?member1=http://10.0.0.1?、?member2=http://10.0.0.2? 和 ?member3=http://10.0.0.3?。當(dāng) ?member1? 失敗時,將其替換為 ?member4=http://10.0.0.4?。

  1. 獲取失敗的 ?member1? 的成員 ID:
  2. etcdctl --endpoints=http://10.0.0.2,http://10.0.0.3 member list
    

    顯示以下信息:

    8211f1d0f64f3269, started, member1, http://10.0.0.1:2380, http://10.0.0.1:2379
    91bc3c398fb3c146, started, member2, http://10.0.0.2:2380, http://10.0.0.2:2379
    fd422379fda50e48, started, member3, http://10.0.0.3:2380, http://10.0.0.3:2379
  3. 移除失敗的成員
  4. etcdctl member remove 8211f1d0f64f3269
    

    顯示以下信息:

    Removed member 8211f1d0f64f3269 from cluster
    
  5. 增加新成員:
  6. etcdctl member add member4 --peer-urls=http://10.0.0.4:2380
    

    顯示以下信息:

    Member 2be1eb8f84b7f63e added to cluster ef37ad9dc622a7c4
    
  7. 在 IP 為 ?10.0.0.4? 的機器上啟動新增加的成員:
  8. export ETCD_NAME="member4"
    export ETCD_INITIAL_CLUSTER="member2=http://10.0.0.2:2380,member3=http://10.0.0.3:2380,member4=http://10.0.0.4:2380"
    export ETCD_INITIAL_CLUSTER_STATE=existing
    etcd [flags]
  9. 執(zhí)行以下操作之一:
    • 更新 Kubernetes API 服務(wù)器的 ?--etcd-servers? 參數(shù),使 Kubernetes 知道配置已更改,然后重新啟動 Kubernetes API 服務(wù)器。
    • 如果在 deployment 中使用了負(fù)載均衡,更新負(fù)載均衡配置。

有關(guān)集群重新配置的詳細(xì)信息,請參閱 etcd 重構(gòu)文檔。

備份 etcd 集群 

所有 Kubernetes 對象都存儲在 etcd 上。定期備份 etcd 集群數(shù)據(jù)對于在災(zāi)難場景(例如丟失所有控制平面節(jié)點)下恢復(fù) Kubernetes 集群非常重要。 快照文件包含所有 Kubernetes 狀態(tài)和關(guān)鍵信息。為了保證敏感的 Kubernetes 數(shù)據(jù)的安全,可以對快照文件進行加密。

備份 etcd 集群可以通過兩種方式完成:etcd 內(nèi)置快照和卷快照。

內(nèi)置快照 

etcd 支持內(nèi)置快照??煺湛梢詮氖褂?nbsp;?etcdctl snapshot save? 命令的活動成員中獲取, 也可以通過從 etcd 數(shù)據(jù)目錄 復(fù)制 ?member/snap/db? 文件,該 etcd 數(shù)據(jù)目錄目前沒有被 etcd 進程使用。獲取快照不會影響成員的性能。

下面是一個示例,用于獲取 ?$ENDPOINT? 所提供的鍵空間的快照到文件 ?snapshotdb?:

ETCDCTL_API=3 etcdctl --endpoints $ENDPOINT snapshot save snapshotdb

驗證快照:

ETCDCTL_API=3 etcdctl --write-out=table snapshot status snapshotdb
+----------+----------+------------+------------+
|   HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| fe01cf57 |       10 |          7 | 2.1 MB     |
+----------+----------+------------+------------+

卷快照 

如果 etcd 運行在支持備份的存儲卷(如 Amazon Elastic Block 存儲)上,則可以通過獲取存儲卷的快照來備份 etcd 數(shù)據(jù)。

使用 etcdctl 選項的快照 

我們還可以使用 etcdctl 提供的各種選項來制作快照。例如:

ETCDCTL_API=3 etcdctl -h 

列出 etcdctl 可用的各種選項。例如,你可以通過指定端點、證書等來制作快照,如下所示:

ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=<trusted-ca-file> --cert=<cert-file> --key=<key-file> \
  snapshot save <backup-file-location>

可以從 etcd Pod 的描述中獲得 ?trusted-ca-file?、?cert-file? 和 ?key-file?。

為 etcd 集群擴容 

通過交換性能,對 etcd 集群擴容可以提高可用性??s放不會提高集群性能和能力。 一般情況下不要擴大或縮小 etcd 集群的集合。不要為 etcd 集群配置任何自動縮放組。 強烈建議始終在任何官方支持的規(guī)模上運行生產(chǎn) Kubernetes 集群時使用靜態(tài)的五成員 etcd 集群。

合理的擴展是在需要更高可靠性的情況下,將三成員集群升級為五成員集群。 請參閱 etcd 重新配置文檔 以了解如何將成員添加到現(xiàn)有集群中的信息。

恢復(fù) etcd 集群 

etcd 支持從 major.minor 或其他不同 patch 版本的 etcd 進程中獲取的快照進行恢復(fù)。 還原操作用于恢復(fù)失敗的集群的數(shù)據(jù)。

在啟動還原操作之前,必須有一個快照文件。它可以是來自以前備份操作的快照文件, 也可以是來自剩余數(shù)據(jù)目錄的快照文件。 例如:

ETCDCTL_API=3 etcdctl --endpoints 10.2.0.9:2379 snapshot restore snapshotdb

恢復(fù)時也可以指定操作選項,例如:

ETCDCTL_API=3 etcdctl --data-dir <data-dir-location> snapshot restore snapshotdb

有關(guān)從快照文件還原集群的詳細(xì)信息和示例,請參閱 etcd 災(zāi)難恢復(fù)文檔。

如果還原的集群的訪問 URL 與前一個集群不同,則必須相應(yīng)地重新配置 Kubernetes API 服務(wù)器。 在本例中,使用參數(shù) ?--etcd-servers=$NEW_ETCD_CLUSTER? 而不是參數(shù) ?--etcd-servers=$OLD_ETCD_CLUSTER? 重新啟動 Kubernetes API 服務(wù)器。 用相應(yīng)的 IP 地址替換 ?$NEW_ETCD_CLUSTER? 和 ?$OLD_ETCD_CLUSTER?。如果在 etcd 集群前面使用負(fù)載平衡,則可能需要更新負(fù)載均衡器。

如果大多數(shù) etcd 成員永久失敗,則認(rèn)為 etcd 集群失敗。在這種情況下,Kubernetes 不能對其當(dāng)前狀態(tài)進行任何更改。 雖然已調(diào)度的 pod 可能繼續(xù)運行,但新的 pod 無法調(diào)度。在這種情況下,恢復(fù) etcd 集群并可能需要重新配置 Kubernetes API 服務(wù)器以修復(fù)問題。

Note:
如果集群中正在運行任何 API 服務(wù)器,則不應(yīng)嘗試還原 etcd 的實例。相反,請按照以下步驟還原 etcd:
  • 停止所有 API 服務(wù)實例
  • 在所有 etcd 實例中恢復(fù)狀態(tài)
  • 重啟所有 API 服務(wù)實例
我們還建議重啟所有組件(例如 ?kube-scheduler?、?kube-controller-manager?、?kubelet?),以確保它們不會 依賴一些過時的數(shù)據(jù)。請注意,實際中還原會花費一些時間。 在還原過程中,關(guān)鍵組件將丟失領(lǐng)導(dǎo)鎖并自行重啟。

升級 etcd 集群 

有關(guān) etcd 升級的更多詳細(xì)信息,請參閱 etcd 升級文檔。

Note: 在開始升級之前,請先備份你的 etcd 集群。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號