探索Kubernetes的高可用性:單Master集群和多Master節點集群方案
一、單Master集群
k8s 集群是由一組運行 k8s 的節點組成的,節點可以是物理機、虛擬機或者云服務器。k8s 集群中的節點分為兩種角色:master 和 node。
- master 節點:master 節點負責控制和管理整個集群,它運行著一些關鍵的組件,如 kube-apiserver、kube-scheduler、kube-controller-manager 等。master 節點可以有一個或多個,如果有多個 master 節點,那么它們之間需要通過 etcd 這個分布式鍵值存儲來保持數據的一致性。
- node 節點:node 節點是承載用戶應用的工作節點,它運行著一些必要的組件,如 kubelet、kube-proxy、container runtime 等。node 節點可以有一個或多個,如果有多個 node 節點,那么它們之間需要通過網絡插件來實現通信和路由。
一般情況下我們會搭建單master多node集群。它是一種常見的 k8s 集群架構,它只有一個 master 節點和多個 node 節點。這種架構的優點是簡單易搭建,適合用于學習和測試 k8s 的功能和特性。這種架構的缺點是 master 節點成為了單點故障,如果 master 節點出現問題,那么整個集群就無法正常工作。
搭建 k8s 單 master 多 node 集群有多種方法,根據不同的需求和場景,可以選擇合適的方式來搭建和運維node集群。一般來說,有以下幾種常見的方式:
- 使用kubeadm:這是一種使用官方提供的工具kubeadm來快速創建和管理node集群的方式。kubeadm可以自動安裝和配置node節點上所需的組件,如kubelet、kube-proxy、容器運行時等。這種方式適用于學習和測試目的,或者簡單的生產環境。
- 使用kops:這是一種使用開源工具kops來在云服務商(如AWS、GCP等)上創建和管理node集群的方式。kops可以自動創建和配置云資源,如虛擬機、網絡、存儲等,并安裝和配置node節點上所需的組件。這種方式適用于在云端部署高可用和可擴展的node集群。
- 使用其他工具或平臺:這是一種使用其他第三方提供的工具或平臺來創建和管理node集群的方式。例如,你可以使用Ansible、Terraform、Rancher等工具來自動化和定制node集群的創建和配置過程。或者,你可以使用云服務商提供的托管服務(如EKS、GKE、AKS等)來直接創建和管理node集群。這種方式適用于不同的需求和偏好,但可能需要更多的學習和調試成本。
二、多Master集群
通常情況下如果只有一個master節點,那么一旦它出現故障或者不可用,那么整個集群就會失去控制,無法進行任何操作。因此,為了保證集群的高可用性,需要使用多個master節點來構建master集群。多master集群可以分為應用集群與存儲集群。應用集群主要是apiserver、scheduler、controller-manager的集群它們可以是單獨的節點實現負載均衡集群,而etcd可以實現多節點的高可用集群。其中etcd高可以集群也可以分為內置集群與外部集群的方式。以下就具體的介紹:
1、應用負載均衡集群
kubernetes多master集群是指使用多個master節點來提高集群的可用性和容錯性的方案。master節點是負責控制和管理集群中的資源和服務的節點,它運行著以下組件:
- kube-apiserver:提供了HTTP REST接口的關鍵服務進程,是集群中所有資源的增、刪、改、查等操作的唯一入口,也是集群控制的入口進程。
- kube-scheduler:負責資源調度(Pod調度)的進程,相當于公交公司的“調度室”。
- kube-controller-manager:集群中所有資源對象的自動化控制中心,可以將其理解為資源對象的“大總管”。
實現kubernetes master集群有多種方式,根據不同的需求和場景,可以選擇合適的方式來搭建和運維master集群。一般來說,根據實現方式,負載均衡集群可以分為以下幾種方案:
- 硬件負載均衡:硬件負載均衡是使用專門的硬件設備來實現負載均衡的方案,如 F5、Cisco 等。硬件負載均衡的優點是性能高、穩定性強,缺點是成本高、擴展性差。
- 軟件負載均衡:軟件負載均衡是使用普通的服務器和軟件來實現負載均衡的方案,如 Nginx、HAProxy 等。軟件負載均衡的優點是成本低、擴展性好,缺點是性能低、穩定性差。
- 混合負載均衡:混合負載均衡是結合硬件和軟件來實現負載均衡的方案,如使用硬件設備作為全局入口,使用軟件作為局部分發?;旌县撦d均衡的優點是兼顧了性能和成本,缺點是復雜度高、維護難。
2、存儲高可用集群
etcd:分布式鍵值存儲系統,用于保存集群中所有資源對象的狀態和元數據。
k8s配置高可用(HA)Kubernetes etcd集群。
你可以設置 以下兩種HA 集群:
- 使用堆疊(stacked)控制平面節點,其中 etcd 節點與控制平面節點共存
- 使用外部 etcd 節點,其中 etcd 在與控制平面不同的節點上運行
(1)堆疊(Stacked)etcd 拓撲--內置etcd集群
堆疊(Stacked)HA集群是一種這樣的拓撲,其中 etcd 分布式數據存儲集群堆疊在 kubeadm 管理的控制平面節點上,作為控制平面的一個組件運行。
每個控制平面節點運行 kube-apiserver、kube-scheduler 和 kube-controller-manager 實例。 kube-apiserver 使用負載均衡器暴露給工作節點。
每個控制平面節點創建一個本地etcd成員(member),這個 etcd 成員只與該節點的 kube-apiserver 通信。 這同樣適用于本地 kube-controller-manager 和 kube-scheduler 實例。
這種拓撲將控制平面和 etcd 成員耦合在同一節點上。相對使用外部 etcd 集群, 設置起來更簡單,而且更易于副本管理。
然而,堆疊集群存在耦合失敗的風險。如果一個節點發生故障,則etcd 成員和控制平面實例都將丟失, 并且冗余會受到影響。你可以通過添加更多控制平面節點來降低此風險。
因此,你應該為 HA 集群運行至少三個堆疊的控制平面節點。
這是 kubeadm 中的默認拓撲。當使用 kubeadm init 和 kubeadm join --control-plane 時, 在控制平面節點上會自動創建本地 etcd 成員。
(2)外部 etcd 拓撲--外部etcd集群
具有外部 etcd 的 HA 集群是一種這樣的拓撲, 其中 etcd 分布式數據存儲集群在獨立于控制平面節點的其他節點上運行。
就像堆疊的 etcd 拓撲一樣,外部 etcd 拓撲中的每個控制平面節點都會運行 kube-apiserver、kube-scheduler 和 kube-controller-manager 實例。 同樣,kube-apiserver 使用負載均衡器暴露給工作節點。但是 etcd 成員在不同的主機上運行, 每個 etcd 主機與每個控制平面節點的 kube-apiserver 通信。
這種拓撲結構解耦了控制平面和 etcd 成員。因此它提供了一種 HA 設置, 其中失去控制平面實例或者 etcd 成員的影響較小,并且不會像堆疊的 HA 拓撲那樣影響集群冗余。
但此拓撲需要兩倍于堆疊 HA 拓撲的主機數量。 具有此拓撲的 HA 集群至少需要三個用于控制平面節點的主機和三個用于 etcd 節點的主機。