探索Kubernetes的高可用性:?jiǎn)蜯aster集群和多Master節(jié)點(diǎn)集群方案
一、單Master集群
k8s 集群是由一組運(yùn)行 k8s 的節(jié)點(diǎn)組成的,節(jié)點(diǎn)可以是物理機(jī)、虛擬機(jī)或者云服務(wù)器。k8s 集群中的節(jié)點(diǎn)分為兩種角色:master 和 node。
- master 節(jié)點(diǎn):master 節(jié)點(diǎn)負(fù)責(zé)控制和管理整個(gè)集群,它運(yùn)行著一些關(guān)鍵的組件,如 kube-apiserver、kube-scheduler、kube-controller-manager 等。master 節(jié)點(diǎn)可以有一個(gè)或多個(gè),如果有多個(gè) master 節(jié)點(diǎn),那么它們之間需要通過(guò) etcd 這個(gè)分布式鍵值存儲(chǔ)來(lái)保持?jǐn)?shù)據(jù)的一致性。
- node 節(jié)點(diǎn):node 節(jié)點(diǎn)是承載用戶(hù)應(yīng)用的工作節(jié)點(diǎn),它運(yùn)行著一些必要的組件,如 kubelet、kube-proxy、container runtime 等。node 節(jié)點(diǎn)可以有一個(gè)或多個(gè),如果有多個(gè) node 節(jié)點(diǎn),那么它們之間需要通過(guò)網(wǎng)絡(luò)插件來(lái)實(shí)現(xiàn)通信和路由。
一般情況下我們會(huì)搭建單master多node集群。它是一種常見(jiàn)的 k8s 集群架構(gòu),它只有一個(gè) master 節(jié)點(diǎn)和多個(gè) node 節(jié)點(diǎn)。這種架構(gòu)的優(yōu)點(diǎn)是簡(jiǎn)單易搭建,適合用于學(xué)習(xí)和測(cè)試 k8s 的功能和特性。這種架構(gòu)的缺點(diǎn)是 master 節(jié)點(diǎn)成為了單點(diǎn)故障,如果 master 節(jié)點(diǎn)出現(xiàn)問(wèn)題,那么整個(gè)集群就無(wú)法正常工作。
搭建 k8s 單 master 多 node 集群有多種方法,根據(jù)不同的需求和場(chǎng)景,可以選擇合適的方式來(lái)搭建和運(yùn)維node集群。一般來(lái)說(shuō),有以下幾種常見(jiàn)的方式:
- 使用kubeadm:這是一種使用官方提供的工具kubeadm來(lái)快速創(chuàng)建和管理node集群的方式。kubeadm可以自動(dòng)安裝和配置node節(jié)點(diǎn)上所需的組件,如kubelet、kube-proxy、容器運(yùn)行時(shí)等。這種方式適用于學(xué)習(xí)和測(cè)試目的,或者簡(jiǎn)單的生產(chǎn)環(huán)境。
- 使用kops:這是一種使用開(kāi)源工具kops來(lái)在云服務(wù)商(如AWS、GCP等)上創(chuàng)建和管理node集群的方式。kops可以自動(dòng)創(chuàng)建和配置云資源,如虛擬機(jī)、網(wǎng)絡(luò)、存儲(chǔ)等,并安裝和配置node節(jié)點(diǎn)上所需的組件。這種方式適用于在云端部署高可用和可擴(kuò)展的node集群。
- 使用其他工具或平臺(tái):這是一種使用其他第三方提供的工具或平臺(tái)來(lái)創(chuàng)建和管理node集群的方式。例如,你可以使用Ansible、Terraform、Rancher等工具來(lái)自動(dòng)化和定制node集群的創(chuàng)建和配置過(guò)程?;蛘?,你可以使用云服務(wù)商提供的托管服務(wù)(如EKS、GKE、AKS等)來(lái)直接創(chuàng)建和管理node集群。這種方式適用于不同的需求和偏好,但可能需要更多的學(xué)習(xí)和調(diào)試成本。
二、多Master集群
通常情況下如果只有一個(gè)master節(jié)點(diǎn),那么一旦它出現(xiàn)故障或者不可用,那么整個(gè)集群就會(huì)失去控制,無(wú)法進(jìn)行任何操作。因此,為了保證集群的高可用性,需要使用多個(gè)master節(jié)點(diǎn)來(lái)構(gòu)建master集群。多master集群可以分為應(yīng)用集群與存儲(chǔ)集群。應(yīng)用集群主要是apiserver、scheduler、controller-manager的集群它們可以是單獨(dú)的節(jié)點(diǎn)實(shí)現(xiàn)負(fù)載均衡集群,而etcd可以實(shí)現(xiàn)多節(jié)點(diǎn)的高可用集群。其中etcd高可以集群也可以分為內(nèi)置集群與外部集群的方式。以下就具體的介紹:
1、應(yīng)用負(fù)載均衡集群
kubernetes多master集群是指使用多個(gè)master節(jié)點(diǎn)來(lái)提高集群的可用性和容錯(cuò)性的方案。master節(jié)點(diǎn)是負(fù)責(zé)控制和管理集群中的資源和服務(wù)的節(jié)點(diǎn),它運(yùn)行著以下組件:
- kube-apiserver:提供了HTTP REST接口的關(guān)鍵服務(wù)進(jìn)程,是集群中所有資源的增、刪、改、查等操作的唯一入口,也是集群控制的入口進(jìn)程。
- kube-scheduler:負(fù)責(zé)資源調(diào)度(Pod調(diào)度)的進(jìn)程,相當(dāng)于公交公司的“調(diào)度室”。
- kube-controller-manager:集群中所有資源對(duì)象的自動(dòng)化控制中心,可以將其理解為資源對(duì)象的“大總管”。
實(shí)現(xiàn)kubernetes master集群有多種方式,根據(jù)不同的需求和場(chǎng)景,可以選擇合適的方式來(lái)搭建和運(yùn)維master集群。一般來(lái)說(shuō),根據(jù)實(shí)現(xiàn)方式,負(fù)載均衡集群可以分為以下幾種方案:
- 硬件負(fù)載均衡:硬件負(fù)載均衡是使用專(zhuān)門(mén)的硬件設(shè)備來(lái)實(shí)現(xiàn)負(fù)載均衡的方案,如 F5、Cisco 等。硬件負(fù)載均衡的優(yōu)點(diǎn)是性能高、穩(wěn)定性強(qiáng),缺點(diǎn)是成本高、擴(kuò)展性差。
- 軟件負(fù)載均衡:軟件負(fù)載均衡是使用普通的服務(wù)器和軟件來(lái)實(shí)現(xiàn)負(fù)載均衡的方案,如 Nginx、HAProxy 等。軟件負(fù)載均衡的優(yōu)點(diǎn)是成本低、擴(kuò)展性好,缺點(diǎn)是性能低、穩(wěn)定性差。
- 混合負(fù)載均衡:混合負(fù)載均衡是結(jié)合硬件和軟件來(lái)實(shí)現(xiàn)負(fù)載均衡的方案,如使用硬件設(shè)備作為全局入口,使用軟件作為局部分發(fā)?;旌县?fù)載均衡的優(yōu)點(diǎn)是兼顧了性能和成本,缺點(diǎn)是復(fù)雜度高、維護(hù)難。
2、存儲(chǔ)高可用集群
etcd:分布式鍵值存儲(chǔ)系統(tǒng),用于保存集群中所有資源對(duì)象的狀態(tài)和元數(shù)據(jù)。
k8s配置高可用(HA)Kubernetes etcd集群。
你可以設(shè)置 以下兩種HA 集群:
- 使用堆疊(stacked)控制平面節(jié)點(diǎn),其中 etcd 節(jié)點(diǎn)與控制平面節(jié)點(diǎn)共存
- 使用外部 etcd 節(jié)點(diǎn),其中 etcd 在與控制平面不同的節(jié)點(diǎn)上運(yùn)行
(1)堆疊(Stacked)etcd 拓?fù)?-內(nèi)置etcd集群
堆疊(Stacked)HA集群是一種這樣的拓?fù)?,其?etcd 分布式數(shù)據(jù)存儲(chǔ)集群堆疊在 kubeadm 管理的控制平面節(jié)點(diǎn)上,作為控制平面的一個(gè)組件運(yùn)行。
每個(gè)控制平面節(jié)點(diǎn)運(yùn)行 kube-apiserver、kube-scheduler 和 kube-controller-manager 實(shí)例。 kube-apiserver 使用負(fù)載均衡器暴露給工作節(jié)點(diǎn)。
每個(gè)控制平面節(jié)點(diǎn)創(chuàng)建一個(gè)本地etcd成員(member),這個(gè) etcd 成員只與該節(jié)點(diǎn)的 kube-apiserver 通信。 這同樣適用于本地 kube-controller-manager 和 kube-scheduler 實(shí)例。
這種拓?fù)鋵⒖刂破矫婧?etcd 成員耦合在同一節(jié)點(diǎn)上。相對(duì)使用外部 etcd 集群, 設(shè)置起來(lái)更簡(jiǎn)單,而且更易于副本管理。
然而,堆疊集群存在耦合失敗的風(fēng)險(xiǎn)。如果一個(gè)節(jié)點(diǎn)發(fā)生故障,則etcd 成員和控制平面實(shí)例都將丟失, 并且冗余會(huì)受到影響。你可以通過(guò)添加更多控制平面節(jié)點(diǎn)來(lái)降低此風(fēng)險(xiǎn)。
因此,你應(yīng)該為 HA 集群運(yùn)行至少三個(gè)堆疊的控制平面節(jié)點(diǎn)。
這是 kubeadm 中的默認(rèn)拓?fù)洹.?dāng)使用 kubeadm init 和 kubeadm join --control-plane 時(shí), 在控制平面節(jié)點(diǎn)上會(huì)自動(dòng)創(chuàng)建本地 etcd 成員。
(2)外部 etcd 拓?fù)?-外部etcd集群
具有外部 etcd 的 HA 集群是一種這樣的拓?fù)洌?其中 etcd 分布式數(shù)據(jù)存儲(chǔ)集群在獨(dú)立于控制平面節(jié)點(diǎn)的其他節(jié)點(diǎn)上運(yùn)行。
就像堆疊的 etcd 拓?fù)湟粯?,外?etcd 拓?fù)渲械拿總€(gè)控制平面節(jié)點(diǎn)都會(huì)運(yùn)行 kube-apiserver、kube-scheduler 和 kube-controller-manager 實(shí)例。 同樣,kube-apiserver 使用負(fù)載均衡器暴露給工作節(jié)點(diǎn)。但是 etcd 成員在不同的主機(jī)上運(yùn)行, 每個(gè) etcd 主機(jī)與每個(gè)控制平面節(jié)點(diǎn)的 kube-apiserver 通信。
這種拓?fù)浣Y(jié)構(gòu)解耦了控制平面和 etcd 成員。因此它提供了一種 HA 設(shè)置, 其中失去控制平面實(shí)例或者 etcd 成員的影響較小,并且不會(huì)像堆疊的 HA 拓?fù)淠菢佑绊懠喝哂唷?/p>
但此拓?fù)湫枰獌杀队诙询B HA 拓?fù)涞闹鳈C(jī)數(shù)量。 具有此拓?fù)涞?HA 集群至少需要三個(gè)用于控制平面節(jié)點(diǎn)的主機(jī)和三個(gè)用于 etcd 節(jié)點(diǎn)的主機(jī)。