新聞中心
為 Kubernetes 運(yùn)行 etcd 集群
etcd 是兼具一致性和高可用性的鍵值數(shù)據(jù)庫(kù),可以作為保存 Kubernetes 所有集群數(shù)據(jù)的后臺(tái)數(shù)據(jù)庫(kù)。

你的 Kubernetes 集群的 etcd 數(shù)據(jù)庫(kù)通常需要有個(gè)備份計(jì)劃。
要了解 etcd 更深層次的信息,請(qǐng)參考 etcd 文檔。
在開(kāi)始之前
你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒(méi)有集群,你可以通過(guò) Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:
- Katacoda
- 玩轉(zhuǎn) Kubernetes
要檢查版本,請(qǐng)輸入 ?kubectl version?。
先決條件
- 運(yùn)行的 etcd 集群個(gè)數(shù)成員為奇數(shù)。
- etcd 是一個(gè) leader-based 分布式系統(tǒng)。確保主節(jié)點(diǎn)定期向所有從節(jié)點(diǎn)發(fā)送心跳,以保持集群穩(wěn)定。
- 確保不發(fā)生資源不足。
- 保持 etcd 集群的穩(wěn)定對(duì) Kubernetes 集群的穩(wěn)定性至關(guān)重要。 因此,請(qǐng)?jiān)趯?zhuān)用機(jī)器或隔離環(huán)境上運(yùn)行 etcd 集群,以滿足 所需資源需求。
- 在生產(chǎn)中運(yùn)行的 etcd 的最低推薦版本是 ?
3.2.10+?。
集群的性能和穩(wěn)定性對(duì)網(wǎng)絡(luò)和磁盤(pán) I/O 非常敏感。任何資源匱乏都會(huì)導(dǎo)致心跳超時(shí), 從而導(dǎo)致集群的不穩(wěn)定。不穩(wěn)定的情況表明沒(méi)有選出任何主節(jié)點(diǎn)。 在這種情況下,集群不能對(duì)其當(dāng)前狀態(tài)進(jìn)行任何更改,這意味著不能調(diào)度新的 pod。
資源需求
使用有限的資源運(yùn)行 etcd 只適合測(cè)試目的。為了在生產(chǎn)中部署,需要先進(jìn)的硬件配置。 在生產(chǎn)中部署 etcd 之前,請(qǐng)查看所需資源參考文檔。
啟動(dòng) etcd 集群
本節(jié)介紹如何啟動(dòng)單節(jié)點(diǎn)和多節(jié)點(diǎn) etcd 集群。
單節(jié)點(diǎn) etcd 集群
只為測(cè)試目的使用單節(jié)點(diǎn) etcd 集群。
- 運(yùn)行以下命令:
- 使用參數(shù) ?
--etcd-servers=$PRIVATE_IP:2379? 啟動(dòng) Kubernetes API 服務(wù)器。
etcd --listen-client-urls=http://$PRIVATE_IP:2379 \
--advertise-client-urls=http://$PRIVATE_IP:2379確保將 ?PRIVATE_IP ?設(shè)置為etcd客戶端 IP。
多節(jié)點(diǎn) etcd 集群
出于耐用性和高可用性考量,在生產(chǎn)環(huán)境中應(yīng)以多節(jié)點(diǎn)集群的方式運(yùn)行 etcd,并且定期備份。 建議在生產(chǎn)環(huán)境中使用五個(gè)成員的集群。 有關(guān)該內(nèi)容的更多信息,請(qǐng)參閱常見(jiàn)問(wèn)題文檔。
可以通過(guò)靜態(tài)成員信息或動(dòng)態(tài)發(fā)現(xiàn)的方式配置 etcd 集群。 有關(guān)集群的詳細(xì)信息,請(qǐng)參閱 etcd 集群文檔。
例如,考慮運(yùn)行以下客戶端 URL 的五個(gè)成員的 etcd 集群:?http://$IP1:2379?、 ?http://$IP2:2379?、?http://$IP3:2379?、?http://$IP4:2379? 和 ?http://$IP5:2379?。 要啟動(dòng) Kubernetes API 服務(wù)器:
- 運(yùn)行以下命令:
- 使用參數(shù) ?
--etcd-servers=$IP1:2379,$IP2:2379,$IP3:2379,$IP4:2379,$IP5:2379? 啟動(dòng) Kubernetes API 服務(wù)器。
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
確保將 ?IP? 變量設(shè)置為客戶端 IP 地址。
使用負(fù)載均衡的多節(jié)點(diǎn) etcd 集群
要運(yùn)行負(fù)載均衡的 etcd 集群:
- 建立一個(gè) etcd 集群。
- 在 etcd 集群前面配置負(fù)載均衡器。例如,讓負(fù)載均衡器的地址為 ?
$LB?。 - 使用參數(shù) ?
--etcd-servers=$LB:2379? 啟動(dòng) Kubernetes API 服務(wù)器。
加固 etcd 集群
對(duì) etcd 的訪問(wèn)相當(dāng)于集群中的 root 權(quán)限,因此理想情況下只有 API 服務(wù)器才能訪問(wèn)它。 考慮到數(shù)據(jù)的敏感性,建議只向需要訪問(wèn) etcd 集群的節(jié)點(diǎn)授予權(quán)限。
想要確保 etcd 的安全,可以設(shè)置防火墻規(guī)則或使用 etcd 提供的安全特性,這些安全特性依賴(lài)于 x509 公鑰基礎(chǔ)設(shè)施(PKI)。 首先,通過(guò)生成密鑰和證書(shū)對(duì)來(lái)建立安全的通信通道。 例如,使用密鑰對(duì) ?peer.key? 和 ?peer.cert? 來(lái)保護(hù) etcd 成員之間的通信, 而 ?client.key? 和 ?client.cert? 用于保護(hù) etcd 與其客戶端之間的通信。 請(qǐng)參閱 etcd 項(xiàng)目提供的 示例腳本, 以生成用于客戶端身份驗(yàn)證的密鑰對(duì)和 CA 文件。
安全通信
若要使用安全對(duì)等通信對(duì) etcd 進(jìn)行配置,請(qǐng)指定參數(shù) ?--peer-key-file=peer.key? 和 ?--peer-cert-file=peer.cert?,并使用 HTTPS 作為 URL 模式。
類(lèi)似地,要使用安全客戶端通信對(duì) etcd 進(jìn)行配置,請(qǐng)指定參數(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 集群的訪問(wèn)
配置安全通信后,限制只有 Kubernetes API 服務(wù)器可以訪問(wèn) etcd 集群。使用 TLS 身份驗(yàn)證來(lái)完成此任務(wù)。
例如,考慮由 CA ?etcd.ca? 信任的密鑰對(duì) ?k8sclient.key? 和 ?k8sclient.cert?。 當(dāng) etcd 配置為 ?--client-cert-auth? 和 TLS 時(shí),它使用系統(tǒng) CA 或由 ?--trusted-ca-file? 參數(shù)傳入的 CA 驗(yàn)證來(lái)自客戶端的證書(shū)。指定參數(shù) ?--client-cert-auth=true? 和 ?--trusted-ca-file=etcd.ca? 將限制對(duì)具有證書(shū) ?k8sclient.cert? 的客戶端的訪問(wèn)。
一旦正確配置了 etcd,只有具有有效證書(shū)的客戶端才能訪問(wèn)它。要讓 Kubernetes API 服務(wù)器訪問(wèn), 可以使用參數(shù) ?--etcd-certfile=k8sclient.cert?、?--etcd-keyfile=k8sclient.key? 和 ?--etcd-cafile=ca.cert? 配置。
Note: Kubernetes 目前不支持 etcd 身份驗(yàn)證。 想要了解更多信息,請(qǐng)參閱相關(guān)的問(wèn)題 支持 etcd v2 的基本認(rèn)證。
替換失敗的 etcd 成員
etcd 集群通過(guò)容忍少數(shù)成員故障實(shí)現(xiàn)高可用性。 但是,要改善集群的整體健康狀況,請(qǐng)立即替換失敗的成員。當(dāng)多個(gè)成員失敗時(shí),逐個(gè)替換它們。 替換失敗成員需要兩個(gè)步驟:刪除失敗成員和添加新成員。
雖然 etcd 在內(nèi)部保留唯一的成員 ID,但建議為每個(gè)成員使用唯一的名稱(chēng),以避免人為錯(cuò)誤。 例如,考慮一個(gè)三成員的 etcd 集群。假定 URL 分別為:?member1=http://10.0.0.1?、?member2=http://10.0.0.2? 和 ?member3=http://10.0.0.3?。當(dāng) ?member1? 失敗時(shí),將其替換為 ?member4=http://10.0.0.4?。
- 獲取失敗的 ?
member1? 的成員 ID: - 移除失敗的成員
- 增加新成員:
- 在 IP 為 ?
10.0.0.4? 的機(jī)器上啟動(dòng)新增加的成員: - 執(zhí)行以下操作之一:
- 更新 Kubernetes API 服務(wù)器的 ?
--etcd-servers? 參數(shù),使 Kubernetes 知道配置已更改,然后重新啟動(dòng) Kubernetes API 服務(wù)器。 - 如果在 deployment 中使用了負(fù)載均衡,更新負(fù)載均衡配置。
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:2379etcdctl member remove 8211f1d0f64f3269
顯示以下信息:
Removed member 8211f1d0f64f3269 from cluster
etcdctl member add member4 --peer-urls=http://10.0.0.4:2380
顯示以下信息:
Member 2be1eb8f84b7f63e added to cluster ef37ad9dc622a7c4
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]有關(guān)集群重新配置的詳細(xì)信息,請(qǐng)參閱 etcd 重構(gòu)文檔。
備份 etcd 集群
所有 Kubernetes 對(duì)象都存儲(chǔ)在 etcd 上。定期備份 etcd 集群數(shù)據(jù)對(duì)于在災(zāi)難場(chǎng)景(例如丟失所有控制平面節(jié)點(diǎn))下恢復(fù) Kubernetes 集群非常重要。 快照文件包含所有 Kubernetes 狀態(tài)和關(guān)鍵信息。為了保證敏感的 Kubernetes 數(shù)據(jù)的安全,可以對(duì)快照文件進(jìn)行加密。
備份 etcd 集群可以通過(guò)兩種方式完成:etcd 內(nèi)置快照和卷快照。
內(nèi)置快照
etcd 支持內(nèi)置快照??煺湛梢詮氖褂?nbsp;?etcdctl snapshot save? 命令的活動(dòng)成員中獲取, 也可以通過(guò)從 etcd 數(shù)據(jù)目錄 復(fù)制 ?member/snap/db? 文件,該 etcd 數(shù)據(jù)目錄目前沒(méi)有被 etcd 進(jìn)程使用。獲取快照不會(huì)影響成員的性能。
下面是一個(gè)示例,用于獲取 ?$ENDPOINT? 所提供的鍵空間的快照到文件 ?snapshotdb?:
ETCDCTL_API=3 etcdctl --endpoints $ENDPOINT snapshot save snapshotdb
驗(yàn)證快照:
ETCDCTL_API=3 etcdctl --write-out=table snapshot status snapshotdb
+----------+----------+------------+------------+
| HASH | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| fe01cf57 | 10 | 7 | 2.1 MB |
+----------+----------+------------+------------+卷快照
如果 etcd 運(yùn)行在支持備份的存儲(chǔ)卷(如 Amazon Elastic Block 存儲(chǔ))上,則可以通過(guò)獲取存儲(chǔ)卷的快照來(lái)備份 etcd 數(shù)據(jù)。
使用 etcdctl 選項(xiàng)的快照
我們還可以使用 etcdctl 提供的各種選項(xiàng)來(lái)制作快照。例如:
ETCDCTL_API=3 etcdctl -h
列出 etcdctl 可用的各種選項(xiàng)。例如,你可以通過(guò)指定端點(diǎn)、證書(shū)等來(lái)制作快照,如下所示:
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert= --cert= --key= \
snapshot save 可以從 etcd Pod 的描述中獲得 ?trusted-ca-file?、?cert-file? 和 ?key-file?。
為 etcd 集群擴(kuò)容
通過(guò)交換性能,對(duì) etcd 集群擴(kuò)容可以提高可用性??s放不會(huì)提高集群性能和能力。 一般情況下不要擴(kuò)大或縮小 etcd 集群的集合。不要為 etcd 集群配置任何自動(dòng)縮放組。 強(qiáng)烈建議始終在任何官方支持的規(guī)模上運(yùn)行生產(chǎn) Kubernetes 集群時(shí)使用靜態(tài)的五成員 etcd 集群。
合理的擴(kuò)展是在需要更高可靠性的情況下,將三成員集群升級(jí)為五成員集群。 請(qǐng)參閱 etcd 重新配置文檔 以了解如何將成員添加到現(xiàn)有集群中的信息。
恢復(fù) etcd 集群
etcd 支持從 major.minor 或其他不同 patch 版本的 etcd 進(jìn)程中獲取的快照進(jìn)行恢復(fù)。 還原操作用于恢復(fù)失敗的集群的數(shù)據(jù)。
在啟動(dòng)還原操作之前,必須有一個(gè)快照文件。它可以是來(lái)自以前備份操作的快照文件, 也可以是來(lái)自剩余數(shù)據(jù)目錄的快照文件。 例如:
ETCDCTL_API=3 etcdctl --endpoints 10.2.0.9:2379 snapshot restore snapshotdb
恢復(fù)時(shí)也可以指定操作選項(xiàng),例如:
ETCDCTL_API=3 etcdctl --data-dir snapshot restore snapshotdb
有關(guān)從快照文件還原集群的詳細(xì)信息和示例,請(qǐng)參閱 etcd 災(zāi)難恢復(fù)文檔。
如果還原的集群的訪問(wèn) URL 與前一個(gè)集群不同,則必須相應(yīng)地重新配置 Kubernetes API 服務(wù)器。 在本例中,使用參數(shù) ?--etcd-servers=$NEW_ETCD_CLUSTER? 而不是參數(shù) ?--etcd-servers=$OLD_ETCD_CLUSTER? 重新啟動(dòng) Kubernetes API 服務(wù)器。 用相應(yīng)的 IP 地址替換 ?$NEW_ETCD_CLUSTER? 和 ?$OLD_ETCD_CLUSTER?。如果在 etcd 集群前面使用負(fù)載平衡,則可能需要更新負(fù)載均衡器。
如果大多數(shù) etcd 成員永久失敗,則認(rèn)為 etcd 集群失敗。在這種情況下,Kubernetes 不能對(duì)其當(dāng)前狀態(tài)進(jìn)行任何更改。 雖然已調(diào)度的 pod 可能繼續(xù)運(yùn)行,但新的 pod 無(wú)法調(diào)度。在這種情況下,恢復(fù) etcd 集群并可能需要重新配置 Kubernetes API 服務(wù)器以修復(fù)問(wèn)題。
Note:
如果集群中正在運(yùn)行任何 API 服務(wù)器,則不應(yīng)嘗試還原 etcd 的實(shí)例。相反,請(qǐng)按照以下步驟還原 etcd:
- 停止所有 API 服務(wù)實(shí)例
- 在所有 etcd 實(shí)例中恢復(fù)狀態(tài)
- 重啟所有 API 服務(wù)實(shí)例
我們還建議重啟所有組件(例如 ?
kube-scheduler?、?
kube-controller-manager?、?
kubelet?),以確保它們不會(huì) 依賴(lài)一些過(guò)時(shí)的數(shù)據(jù)。請(qǐng)注意,實(shí)際中還原會(huì)花費(fèi)一些時(shí)間。 在還原過(guò)程中,關(guān)鍵組件將丟失領(lǐng)導(dǎo)鎖并自行重啟。
升級(jí) etcd 集群
有關(guān) etcd 升級(jí)的更多詳細(xì)信息,請(qǐng)參閱 etcd 升級(jí)文檔。
Note: 在開(kāi)始升級(jí)之前,請(qǐng)先備份你的 etcd 集群。
網(wǎng)站欄目:創(chuàng)新互聯(lián)kubernetes教程:Kubernetes 運(yùn)行 etcd 集群
鏈接分享:http://m.5511xx.com/article/cccjdcc.html


咨詢
建站咨詢
