淺談Kubernetes集群的高可用方案
大?。?/span>0.4 MB 人氣: 2017-10-11 需要積分:1
標簽:容器(21808)
Kubernetes作為容器應(yīng)用的管理中心,通過對Pod的數(shù)量進行監(jiān)控,并且根據(jù)主機或容器失效的狀態(tài)將新的Pod調(diào)度到其他Node上,實現(xiàn)了應(yīng)用層的高可用性。針對Kubernetes集群,高可用性還應(yīng)包含以下兩個層面的考慮:etcd數(shù)據(jù)存儲的高可用性和Kubernetes Master組件的高可用性。本文節(jié)選自龔正等所著的《kubernetes權(quán)威指南》。1.etcd高可用性方案
etcd在整個Kubernetes集群中處于中心數(shù)據(jù)庫的地位,為保證Kubernetes集群的高可用性,首先需要保證數(shù)據(jù)庫不是單故障點。一方面,etcd需要以集群的方式進行部署,以實現(xiàn)etcd數(shù)據(jù)存儲的冗余、備份與高可用性;另一方面,etcd存儲的數(shù)據(jù)本身也應(yīng)考慮使用可靠的存儲設(shè)備。
etcd集群的部署可以使用靜態(tài)配置,也可以通過etcd提供的REST API在運行時動態(tài)添加、修改或刪除集群中的成員。本節(jié)將對etcd集群的靜態(tài)配置進行說明。關(guān)于動態(tài)修改的操作方法請參考etcd官方文檔的說明。
首先,規(guī)劃一個至少3臺服務(wù)器(節(jié)點)的etcd集群,在每臺服務(wù)器上安裝好etcd。
部署一個由3臺服務(wù)器組成的etcd集群,其配置如表4.10所示,其集群部署實例如圖4.2所示。
圖4.2 etcd集群部署實例
然后修改每臺服務(wù)器上etcd的配置文件/etc/etcd/etcd.conf。
以etcd1為創(chuàng)建集群的實例,需要將其ETCD_INITIAL_CLUSTER_STATE設(shè)置為“new”。etcd1的完整配置如下:
# [member]ETCD_NAME=etcd1 #etcd實例名稱ETCD_DATA_DIR="/var/lib/etcd/etcd1" #etcd數(shù)據(jù)保存目錄ETCD_LISTEN_PEER_URLS="http://10.0.0.1:2380" #集群內(nèi)部通信使用的URLETCD_LISTEN_CLIENT_URLS="http://10.0.0.1:2379" #供外部客戶端使用的URL…… #[cluster]ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.0.1:2380" #廣播給集群內(nèi)其他成員使用的URLETCD_INITIAL_CLUSTER="etcd1=http://10.0.0.1:2380,etcd2=http://10.0.0.2:2380, etcd3=http://10.0.0.3:2380" #初始集群成員列表ETCD_INITIAL_CLUSTER_STATE="new" #初始集群狀態(tài),new為新建集群ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #集群名稱ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.1:2379" #廣播給外部客戶端使用的URL
啟動etcd1服務(wù)器上的etcd服務(wù):
$ systemctl restart etcd
啟動完成后,就創(chuàng)建了一個名為etcd-cluster的集群。
etcd2和etcd3為加入etcd-cluster集群的實例,需要將其ETCD_INITIAL_CLUSTER_STATE設(shè)置為“exist”。etcd2的完整配置如下(etcd3的配置略):
# [member]ETCD_NAME=etcd2 #etcd實例名稱ETCD_DATA_DIR="/var/lib/etcd/etcd2" #etcd數(shù)據(jù)保存目錄ETCD_LISTEN_PEER_URLS="http://10.0.0.2:2380" #集群內(nèi)部通信使用的URLETCD_LISTEN_CLIENT_URLS="http://10.0.0.2:2379" #供外部客戶端使用的URL…… #[cluster]ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.0.2:2380" #廣播給集群內(nèi)其他成員使用的URLETCD_INITIAL_CLUSTER="etcd1=http://10.0.0.1:2380,etcd2=http://10.0.0.2:2380,etcd3=http://10.0.0.3:2380" #初始集群成員列表ETCD_INITIAL_CLUSTER_STATE="exist" # existing表示加入已存在的集群ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #集群名稱ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.2:2379" #廣播給外部客戶端使用的URL
啟動etcd2和etcd3服務(wù)器上的etcd服務(wù):
$ systemctl restart etcd
啟動完成后,在任意etcd節(jié)點執(zhí)行etcdctl cluster-health命令來查詢集群的運行狀態(tài):
$ etcdctl cluster-health clusterishealthy member ce2a822cea30bfca ishealthy member acda82ba1cf790fc ishealthy member eba209cd0012cd2 ishealthy
在任意etcd節(jié)點上執(zhí)行etcdctl member list命令來查詢集群的成員列表:
$ etcdctl member list ce2a822cea30bfca: name=default peerURLs=http://10.0.0.1:2380,http://10.0.0.1: 7001clientURLs=http://10.0.0.1:2379,http://10.0.0.1:4001acda82ba1cf790fc: name=default peerURLs=http://10.0.0.2:2380,http://10.0.0.2: 7001clientURLs=http://10.0.0.2:2379,http://10.0.0.2:4001eba209cd40012cd2: name=default peerURLs=http://10.0.0.3:2380,http://10.0.0.3: 7001clientURLs=http://10.0.0.3:2379,http://10.0.0.3:4001
至此,一個etcd集群就創(chuàng)建成功了。
以kube-apiserver為例,將訪問etcd集群的參數(shù)設(shè)置為:
--etcd-servers=http://10.0.0.1:4001,http://10.0.0.2:4001,http://10.0.0.3:4001
在etcd集群成功啟動之后,如果需要對集群成員進行修改,則請參考官方文檔的詳細說明:
對于etcd中需要保存的數(shù)據(jù)的可靠性,可以考慮使用RAID磁盤陣列、高性能存儲設(shè)備、NFS網(wǎng)絡(luò)文件系統(tǒng),或者使用云服務(wù)商提供的網(wǎng)盤系統(tǒng)等來實現(xiàn)。
2. Kubernetes Master組件的高可用性方案
在Kubernetes體系中,Master服務(wù)扮演著總控中心的角色,主要的三個服務(wù)kube-apiserver、kube-controller-mansger和kube-scheduler通過不斷與工作節(jié)點上的Kubelet和kube-proxy進行通信來維護整個集群的健康工作狀態(tài)。如果Master的服務(wù)無法訪問到某個Node,則會將該Node標記為不可用,不再向其調(diào)度新建的Pod。但對Master自身則需要進行額外的監(jiān)控,使Master不成為集群的單故障點,所以對Master服務(wù)也需要進行高可用方式的部署。
以Master的kube-apiserver、kube-controller-mansger和kube-scheduler三個服務(wù)作為一個部署單元,類似于etcd集群的典型部署配置。使用至少三臺服務(wù)器安裝Master服務(wù),并且使用Active-Standby-Standby模式,保證任何時候總有一套Master能夠正常工作。
所有工作節(jié)點上的Kubelet和kube-proxy服務(wù)則需要訪問Master集群的統(tǒng)一訪問入口地址,例如可以使用pacemaker等工具來實現(xiàn)。圖4.3展示了一種典型的部署方式。
圖4.3 Kubernetes Master高可用部署架構(gòu)
?
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%