構(gòu)建高可用 kubernete 集群

原文:https://kubernetes.io/docs/admin/high-availability/building/

簡介

本文介紹了如何構(gòu)建一個(gè)高可用(high-availability, HA)的 Kubernetes 集群。這是一個(gè)相當(dāng)高級的話題。我們鼓勵(lì)只想嘗試性使用 Kubernetes 的用戶使用更簡單的配置,例如 Minikube,或者嘗試 Google Kubernetes Engine 提供的托管 Kubernetes 集群。

此外,目前我們并沒有在端到端(e2e)測試中對 Kubernetes 的高可用性支持進(jìn)行連續(xù)測試。我們正在努力添加這個(gè)持續(xù)測試項(xiàng),但現(xiàn)在對單節(jié)點(diǎn) master 安裝方式測試得更加嚴(yán)格。

  • TOC
    {:toc}

概述

建立一個(gè)真正可靠的、高可用的分布式系統(tǒng)需要多個(gè)步驟。它類似于穿著內(nèi)褲、褲子、腰帶、吊帶、另一條內(nèi)褲和另一條褲子。我們將對每個(gè)步驟進(jìn)行詳細(xì)介紹,但是這里給出一個(gè)總結(jié),用于幫助指導(dǎo)和引導(dǎo)用戶。

涉及的步驟如下:

這是系統(tǒng)完成時(shí)應(yīng)該看起來的樣子:


高可用 Kubernetes 示意圖

初始設(shè)置

本指南的其余部分假設(shè)您正在設(shè)置一個(gè) 3 節(jié)點(diǎn)的集群 master,其中的每臺機(jī)器上都運(yùn)行著某種 Linux。本指南中的例子針對 Debian 發(fā)行版,但他們應(yīng)該很容易的用于其他發(fā)行版上。
同樣的,無論是在公有/私有云服務(wù)提供商上,還是在裸金屬上運(yùn)行集群,這些設(shè)置都應(yīng)該可以工作。

實(shí)現(xiàn)高可用 Kubernetes 集群最簡單的方法是從一個(gè)現(xiàn)有的單 master 集群開始。https://get.k8s.io 處的說明描述了在各種平臺上安裝單 master 集群的簡單方法。

可靠的節(jié)點(diǎn)

在每個(gè) master 節(jié)點(diǎn)上,我們都將運(yùn)行一些實(shí)現(xiàn) Kubernetes API 的進(jìn)程。為了使這些進(jìn)程可靠,第一步是保證在它們故障之后能夠自動(dòng)重啟。為了實(shí)現(xiàn)這一點(diǎn),我們需要安裝一個(gè)進(jìn)程監(jiān)視器。我們選擇使用每個(gè)工作節(jié)點(diǎn)上都會運(yùn)行的 kubelet。這很方便,因?yàn)槲覀兛梢允褂萌萜鱽矸职l(fā)我們的二進(jìn)制文件、建立資源限額并審視每個(gè)守護(hù)進(jìn)程的資源使用情況。當(dāng)然,我們也需要一些機(jī)制來監(jiān)控 kubelet 本身(在此插入一個(gè)"誰在監(jiān)視監(jiān)視者"的笑話)。對于 Debian 系統(tǒng),我們選擇 monit,但也存在一些替代的選擇。例如,在基于 systemd 的系統(tǒng)(例如 RHEL,CentOS)上,您可以運(yùn)行 'systemctl enable kubelet'。

如果您是從標(biāo)準(zhǔn) Kubernetes 安裝擴(kuò)展而來,那么 kubelet 二進(jìn)制文件應(yīng)該已經(jīng)存在于您的系統(tǒng)之中。您可以運(yùn)行 which kubelet 來確定此文件是否已經(jīng)安裝。如果沒有,您應(yīng)該安裝 kubelet 二進(jìn)制文件、 kubelet 初始化文件default-kubelet 腳本。

如果您正在使用 monit,您還應(yīng)該安裝 monit 守護(hù)進(jìn)程(apt-get install monit)和 monit-kubelet 以及 monit-docker 配置。

在 systemd 系統(tǒng)中,您應(yīng)該執(zhí)行 systemctl enable kubeletsystemctl enable docker。

建立一個(gè)冗余的,可靠的數(shù)據(jù)存儲層

高可用性解決方案的核心基礎(chǔ)是冗余,可靠的存儲層。高可用性的頭號規(guī)則是保護(hù)數(shù)據(jù)。無論發(fā)生什么事情,如果你有數(shù)據(jù),你還可以重建。如果失去了數(shù)據(jù),你就完了。

集群化的 etcd 已將您的存儲復(fù)制到了集群中的所有 master 實(shí)例上。這意味著要丟失數(shù)據(jù),需要讓全部三個(gè)節(jié)點(diǎn)的物理(或虛擬)磁盤同時(shí)失效。發(fā)生這種情況的可能性相對較低。所以對很多人來說,運(yùn)行復(fù)制的 etcd 集群可能已經(jīng)足夠可靠了。如果仍然不夠,您還可以添加 更多的冗余存儲層

集群化的 etcd

建立 etcd 集群的完整細(xì)節(jié)超出了本文的范圍,etcd 集群頁面 給出了大量的細(xì)節(jié)。本示例演練了一個(gè)簡單集群的設(shè)置,使用 etcd 內(nèi)置的發(fā)現(xiàn)機(jī)制來構(gòu)建我們的集群。

首先,訪問 etcd discovery 服務(wù)來創(chuàng)建一個(gè)新的令牌:

curl https://discovery.etcd.io/new?size=3

在每個(gè)節(jié)點(diǎn)上,將 etcd.yaml 文件復(fù)制到 /etc/kubernetes/manifests/etcd.yaml

每個(gè)節(jié)點(diǎn)上的 kubelet 會主動(dòng)監(jiān)視該目錄的內(nèi)容,并會按照 etcd.yaml 中對 pod 的定義創(chuàng)建一個(gè) etcd 服務(wù)實(shí)例。

請注意,您應(yīng)該將所有機(jī)中上 etcd.yaml 中的 ${DISCOVERY_TOKEN} 替換為上面獲得的令牌 URL,并將 ${NODE_NAME} 替換為一個(gè)不同的名稱(例如 node-1),以及將 ${NODE_IP} 替換為每個(gè)機(jī)器的正確 IP 地址。

驗(yàn)證您的集群

一旦將其復(fù)制到所有三個(gè)節(jié)點(diǎn)中,您應(yīng)該建立起了一個(gè)集群化的 etcd。您可以在 master 上這樣驗(yàn)證:

kubectl exec < pod_name > etcdctl member list

以及:

kubectl exec < pod_name > etcdctl cluster-health

您還可以通過在一個(gè)節(jié)點(diǎn)上運(yùn)行 etcdctl set foo bar 并在另一個(gè)節(jié)點(diǎn)上運(yùn)行 etcdctl get foo 來驗(yàn)證其是否工作正常。

更可靠的存儲

當(dāng)然,如果您對提高數(shù)據(jù)可靠性感興趣,還有其他選項(xiàng)可以讓您找到比在普通磁盤上安裝 etcd 數(shù)據(jù)更可靠的位置(皮帶吊帶,ftw?。?/p>

如果您使用云服務(wù)提供商,那么他們通常會提供此服務(wù),例如 Google Cloud Platform 上的 Persistent Disk。這是一種可以掛載到虛擬機(jī)上的塊設(shè)備持久性存儲。其他云服務(wù)提供商也提供了類似的解決方案。

如果您在物理機(jī)器上運(yùn)行,則可以使用通過網(wǎng)絡(luò)連接的 iSCSI 或 NFS 接口的冗余存儲?;蛘撸梢赃\(yùn)行 Gluster 或 Ceph 等集群文件系統(tǒng)。最后,您還可以在每臺物理機(jī)器上運(yùn)行 RAID 陣列。

無論您選擇如何實(shí)現(xiàn),如果您選擇使用這些選項(xiàng)之一,則應(yīng)確保您的存儲已掛載到每臺機(jī)器上。如果您的存儲在集群中的三個(gè) master 之間共享,則應(yīng)該在存儲上為每個(gè)節(jié)點(diǎn)創(chuàng)建一個(gè)不同的目錄。在所有的介紹中,我們都將假設(shè)這個(gè)存儲被掛載到您機(jī)器中的 /var/etcd/data 目錄。

復(fù)制的 API Server

一旦正確的設(shè)置好了復(fù)制的 etcd 集群,我們將使用 kubelet 安裝 apiserver。

安裝配置文件

首先,您需要?jiǎng)?chuàng)建初始日志文件,以便 Docker 掛載一個(gè)文件而不是目錄:

touch /var/log/kube-apiserver.log

接下來,您在每個(gè)節(jié)點(diǎn)上創(chuàng)建一個(gè) /srv/kubernetes/ 目錄。這個(gè)目錄包含:

  • basic_auth.csv - basic auth 用戶名和密碼
  • ca.crt - 證書頒發(fā)機(jī)構(gòu)證書(Certificate Authority cert)
  • known_tokens.csv - 實(shí)體(例如 kubelet) 用于同 apiserver 通信的令牌
  • kubecfg.crt - 客戶端證書,公鑰
  • kubecfg.key - 客戶端證書,私鑰
  • server.cert - 服務(wù)器證書,公鑰
  • server.key - 服務(wù)器證書,私鑰

創(chuàng)建此目錄的最簡單方法可能是從一個(gè)工作集群的 master 節(jié)點(diǎn)復(fù)制它們,或者您可以自己手動(dòng)生成這些文件。

啟動(dòng) API Server

一旦創(chuàng)建了這些文件,請將 kube-apiserver.yaml 復(fù)制到每個(gè) master 節(jié)點(diǎn)的 /etc/kubernetes/manifests/ 目錄下。

kubelet 監(jiān)視這個(gè)目錄,并且會使用文件中指定的 pod 定義自動(dòng)創(chuàng)建一個(gè) kube-apiserver 的容器實(shí)例。

負(fù)載均衡

此時(shí),您應(yīng)該有 3 個(gè)全部正常工作的 apiserver。如果您設(shè)置了一個(gè)網(wǎng)絡(luò)負(fù)載均衡器,你就可以通過它訪問您的集群,并平衡各個(gè) apiserver 實(shí)例的流量。負(fù)載均衡器的配置取決于您的平臺的具體情況,例如,Google Cloud Platform 的相關(guān)說明可以在 這里 找到。

請注意,如果您啟用了身份驗(yàn)證,可能需要重新生成證書,在每個(gè)獨(dú)立節(jié)點(diǎn)的 IP 地址外,還應(yīng)包含負(fù)載均衡器的IP地址。

對于部署到集群中的 pod 來說,kubernetes service/dns 名稱自動(dòng)的提供了一個(gè) master 的負(fù)載均衡 endpoint。

對于 API 的外部用戶(例如 kubectl 命令行接口、持續(xù)構(gòu)建管道或其它客戶端),您應(yīng)該配置它們使用外部負(fù)載均衡器 IP 地址同 API 進(jìn)行通信。

Endpoint reconciler

如前一節(jié)所述,apiserver 通過一個(gè)名為 kubernetes 的 service 進(jìn)行公開。這個(gè) service 的 endpoint 對應(yīng)于我們剛剛部署的 apiserver 集群。

由于更新 endpoint 和 service 需要 apiserver 啟動(dòng),apiserver 中有特殊的代碼可以使其直接更新自己的 endpoint。這個(gè)代碼被稱為“reconciler(協(xié)調(diào)器)”,因?yàn)樗鼤Υ鎯υ?etcd 中及正在運(yùn)行的 endpoint 列表進(jìn)行協(xié)調(diào)。

在 Kubernetes 1.9 版本之前,reconciler 希望您通過一個(gè)命令行參數(shù)(例如 --apiserver-count=3)提供 endpoint 的數(shù)量(意即 apiserver 的副本數(shù))。如果有更多可用的副本,reconciler 將對 endpoint 列表進(jìn)行截取。因此,如果一個(gè)運(yùn)行 apiserver 副本的節(jié)點(diǎn)宕機(jī)并被替換,endpoint 列表將最終被更新。然而,在副本被替換前,它的 endpoint 都將留存在列表中。在此期間,一小部分發(fā)送到 kubernetes service 的 API 請求將會失敗,因?yàn)樗鼈儠话l(fā)送到一個(gè)未運(yùn)行的 endpoint。

這就是上一節(jié)建議您部署負(fù)載均衡器并通過它訪問 API 的原因。這個(gè) 負(fù)載均衡器將直接評估 apiserver 的健康狀態(tài),確保請求不會發(fā)送到崩潰的示例。

如果您不添加 --apiserver-count 參數(shù),其值將默認(rèn)為 1。您的集群將會正常工作,但每個(gè) apiserver 副本都會持續(xù)嘗試在刪除其它 endpoint 時(shí)將自己添加到列表中,這將在 kube-proxy 和其他組件中產(chǎn)生大量無用的更新。

從 Kubernetes 1.9 版本開始,有了一個(gè)新的 reconciler 實(shí)現(xiàn)。它使用了一個(gè)被每個(gè) apiserver 副本定期更新的租約。當(dāng)副本宕機(jī)時(shí),它會停止更新自己的租約,其他副本注意到這個(gè)租約過期并從 endpoint 列表中將其刪除。您可以在啟動(dòng) apiserver 副本時(shí),通過添加 --endpoint-reconciler-type=lease 參數(shù)來切換到新的 reconciler。

如果您希望了解更多信息,可以查看以下資源:

主選舉的組件

到目前為止,我們已經(jīng)建立起了狀態(tài)存儲,并且已經(jīng)建立了 API server,但我們還沒有運(yùn)行任何實(shí)際修改集群狀態(tài)的內(nèi)容,例如 controller manager 和 scheduler。為了可靠的實(shí)現(xiàn)這一點(diǎn),我們每次只希望一個(gè) actor 修改狀態(tài),但是我們希望復(fù)制這些 actor 實(shí)例,以防止有機(jī)器宕機(jī)。為了達(dá)到這個(gè)目的,我們將在 API 中使用一個(gè)租約鎖來執(zhí)行主選舉(master election)。我們將對每個(gè) scheduler 和 controller manager 使用 --leader-elect 參數(shù),以在 API 中使用租約來確保同一時(shí)間只有一個(gè) scheduler 和 controller-manager 實(shí)例運(yùn)行。

scheduler 和 controller-manager 可以配置為和相同節(jié)點(diǎn)(意即 127.0.0.1)上的 API server 進(jìn)行通信,或者也可以配置為使用 API server 的負(fù)載均衡器地址。不管如何配置它們,當(dāng)使用 --leader-elect 參數(shù)時(shí),scheduler 和 controller-manager 都將完成上文提到的主選舉過程。

當(dāng)無法訪問 API server 時(shí),選舉的 leader 無法更新其租約,這將導(dǎo)致選舉產(chǎn)生新的 leader。在 scheduler 和 controller-manager 通過 127.0.0.1 訪問 API server 并且相同節(jié)點(diǎn)上的 API server 宕機(jī)時(shí),這一點(diǎn)顯得尤為重要。

安裝配置文件

首先,在每個(gè)節(jié)點(diǎn)上創(chuàng)建空的日志文件,這樣 Docker 將掛載一個(gè)文件而不是創(chuàng)建新目錄:

touch /var/log/kube-scheduler.log
touch /var/log/kube-controller-manager.log

接下來,通過復(fù)制 kube-scheduler.yamlkube-controller-manager.yaml/etc/kubernetes/manifests/ 目錄來建立每個(gè)節(jié)點(diǎn)的 scheduler 和 controller manager 的 pod 的配置描述文件。

結(jié)論

目前,您已經(jīng)完成了 master 組件的配置(耶?。?,但您仍然需要添加工作節(jié)點(diǎn)(噗!)。

如果您有一個(gè)存在的集群,這就很簡單,只需要重新配置 kubelet 與負(fù)載均衡器的 endpoint 通信,并重啟每個(gè)節(jié)點(diǎn)上的 kubelet。

如果您建立的是一個(gè)新集群,您將需要在每個(gè)工作節(jié)點(diǎn)上安裝 kubelet 和 kube-proxy,并且將 --apiserver 參數(shù)設(shè)置為您的復(fù)制的 endpoint。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 安裝k8s Master高可用集群 主機(jī) 角色 組件 172.18.6.101 K8S Master Kubele...
    jony456123閱讀 8,169評論 0 9
  • Kubernetes部屬說明 環(huán)境準(zhǔn)備 資料準(zhǔn)備 開始部屬 編寫yaml文件,用于部屬Kubenetes基礎(chǔ)容器e...
    俊逸之光閱讀 2,780評論 2 0
  • docker實(shí)現(xiàn)了更便捷的單機(jī)容器虛擬化的管理, docker的位置處于操作系統(tǒng)層與應(yīng)用層之間; 相對傳統(tǒng)虛擬化(...
    Harvey_L閱讀 20,153評論 3 44
  • 文‖云飛揚(yáng) 風(fēng),向你吹來的時(shí)候 白楊林收藏那抹飄逝的倩影 你已筋疲力盡 在清冷里翻山越嶺 凌亂過誰的發(fā)絲 守候著誰...
    山東云飛揚(yáng)閱讀 281評論 0 0
  • 不一樣的卡梅拉1我想去看海張富林,講的是一個(gè)小雞叫卡梅拉,那時(shí)正好是下蛋時(shí)期,他不想下蛋就說下蛋下蛋總是下蛋還有比...
    寂寞的時(shí)光者閱讀 174評論 0 0

友情鏈接更多精彩內(nèi)容