陳洋 羅敏 常珞
(河南醫(yī)學(xué)高等專科學(xué)校 河南省鄭州市 451191)
ETCD 是CoreOS 團(tuán)隊(duì)于2013年6月發(fā)起的開源項(xiàng)目,它的目標(biāo)是構(gòu)建一個(gè)高可用的分布式鍵值(key-value)數(shù)據(jù)庫(kù)。它有以下幾個(gè)特點(diǎn):基于HTTP+JSON 的API 讓你用curl 就可以訪問,簡(jiǎn)單便捷;可使用SSL 客戶認(rèn)證機(jī)制,保證訪問的安全性;每個(gè)實(shí)例每秒支持一千次寫操作,效率更高;使用Raft 算法充分實(shí)現(xiàn)了分布式,保證了每個(gè)節(jié)點(diǎn)數(shù)據(jù)的一致性[2]。
ETCD 集群是一個(gè)分布式系統(tǒng),是一個(gè)高度一致的分布式鍵值存儲(chǔ),它提供了一種可靠的方式來存儲(chǔ)需要由分布式系統(tǒng)或機(jī)器集群訪問的數(shù)據(jù)。為保證數(shù)據(jù)的一致性,在etcd 集群中,每個(gè)節(jié)點(diǎn)都維護(hù)了一個(gè)狀態(tài)機(jī),且至多存在一個(gè)有效主節(jié)點(diǎn)。主節(jié)點(diǎn)處理所有來自客戶端寫操作,根據(jù)Raft 算法原理,每一次寫操作,需要集群中的主節(jié)點(diǎn)在內(nèi)超過半數(shù)節(jié)點(diǎn)(n/2 +1)根據(jù)日志的邏輯時(shí)鐘和日志編號(hào)來判斷是否將該日志記錄持久化到本地,并將日志輸入到狀態(tài)機(jī),而將結(jié)果返回給客戶端。通過 Raft 協(xié)議保證操作對(duì)狀態(tài)機(jī)的改動(dòng)會(huì)可靠的同步到其他節(jié)點(diǎn),從而保證節(jié)點(diǎn)數(shù)據(jù)的一致性。因此節(jié)點(diǎn)數(shù)越多,效率越低,但作為集群,etcd 節(jié)點(diǎn)數(shù)量總是大于等于2[10]。
表1:etcd 集群最大容錯(cuò)節(jié)點(diǎn)[3]
節(jié)點(diǎn)數(shù)一般不會(huì)選擇偶數(shù),主要是因?yàn)榕紨?shù)節(jié)點(diǎn)的集群風(fēng)險(xiǎn)更高[3],主要表現(xiàn)在兩個(gè)方面:其一,在選主過程中,有較大概率出現(xiàn)等額選票,造成選主失敗從而觸發(fā)下一輪選舉;其二,偶數(shù)節(jié)點(diǎn)集群在某些網(wǎng)絡(luò)分割的場(chǎng)景下無法正常工作。當(dāng)網(wǎng)絡(luò)分割發(fā)生后,將集群節(jié)點(diǎn)對(duì)半分割開,按照Raft 協(xié)議,此時(shí)集群寫操作無法使得大多數(shù)節(jié)點(diǎn)同意,從而導(dǎo)致寫失敗,使集群無法正常工作。
圖1:etcd 集群etcd-4 節(jié)點(diǎn)etcd 配置文件
圖2:etcd 集群部署成功顯示的狀態(tài)
圖3:生成集群配置所需要的證書
圖4:實(shí)現(xiàn)etcd 集群客戶端認(rèn)證
圖5:etcd 集群內(nèi)部安全認(rèn)證
通常,按照需求將集群節(jié)點(diǎn)部署為3、5 或7 個(gè)節(jié)點(diǎn),其可支持的容錯(cuò)節(jié)點(diǎn)如表1 所示。
本次集群搭建選擇3 個(gè)節(jié)點(diǎn),節(jié)點(diǎn)名稱分別是etcd-4 、etcd-5、etcd-6。 etcd 集群的搭建三種方式[4],包括:static、etcd discovery 和DNS discovery。static 是最簡(jiǎn)單的一種搭建etcd 的方式,它不需要任何額外的服務(wù),只需要知道運(yùn)行etcd 的所有節(jié)點(diǎn)的hostname 或者IP 地址即可。
在Linux 操作系統(tǒng)下,etcd 服務(wù)的安裝方式有yum 安裝和二進(jìn)制安裝。二進(jìn)制安裝需要從github 官方網(wǎng)址https://github.com/etcdio/etcd/releases 中選擇合適的版本,下載到本地進(jìn)行安裝部署。二進(jìn)制部署難度相對(duì)而言較大,但容易控制,更有利于后期維護(hù)。在實(shí)際生產(chǎn)過程中,推薦使用二進(jìn)制的方式進(jìn)行安裝部署。而yum源安裝方式相對(duì)簡(jiǎn)單,安裝門檻較低,一般用在測(cè)試中。
本次測(cè)試使用yum 源的方式安裝,static 方式部署。關(guān)于安裝etcd 服務(wù)所需要的配置信息,可以參考官方提供的最低配置,在這里不再介紹[11]。在所有節(jié)點(diǎn)安裝etcd 服務(wù),啟動(dòng)服務(wù)并加入自起列表,使用etcdctl 訪問etcd 并檢查驗(yàn)證其狀態(tài)。如顯示got healthy,則說明etcd 服務(wù)已經(jīng)啟動(dòng)成功了:
上述節(jié)點(diǎn)只是啟動(dòng)了etcd 服務(wù),并未形成集群。要構(gòu)建集群,就需要了解etcd 集群的通信方式。集群服務(wù)中的通信一般包括兩種場(chǎng)景:對(duì)外提供服務(wù)的通信,發(fā)生在集群外部的客戶端和集群某節(jié)點(diǎn)服務(wù)器之間的通信,etcd 服務(wù)默認(rèn)訪問2379 端口;集群內(nèi)部的通信,發(fā)生在集群內(nèi)部節(jié)點(diǎn)之間的通信,etcd 服務(wù)的默認(rèn)訪問2380端口。
yum 源安裝默認(rèn)配置文件在/etc/etcd/目錄中,按照節(jié)點(diǎn)IP 地址與集群通信方式,修改配置文件中的參數(shù),如圖1 所示。
這里簡(jiǎn)單對(duì)圖1 的中配置參數(shù)做一下簡(jiǎn)單說明,如想了解更多,可參考官方文檔[6]進(jìn)行系統(tǒng)學(xué)習(xí)。
ETCD_NAME:節(jié)點(diǎn)名稱,集群中唯一; ETCD_DATA_DIR:數(shù)據(jù)目錄ETCD_INITIAL_CLUSTER:集群節(jié)點(diǎn)地址;ETCD_INITIAL_CLUSTER_TOKEN:集群標(biāo)識(shí)符,Token 值一樣的隸屬同一個(gè)集群;ETCD_INITIAL_CLUSTER_STATE:加入集群的當(dāng)前狀態(tài),new 是新集群,existing 表示已有集群。
集群的配置信息如節(jié)點(diǎn)url、token 均存儲(chǔ)在數(shù)據(jù)目錄中,其配置項(xiàng)僅在建立集群時(shí)生效。所有集群的改動(dòng)如:要更新單個(gè)成員peerURLs、做一次更新操作、要替代單個(gè)節(jié)點(diǎn)、添加或刪除節(jié)點(diǎn)操作等都將使用etcd 自帶的 etcdctl 命令行工具[10]來實(shí)現(xiàn);或刪除已有數(shù)據(jù),重啟etcd,這種方式一般用在新建集群時(shí)使用。
刪除etcd 的數(shù)據(jù)文件,重啟etcd 服務(wù)啟動(dòng)成功后,可以在任意一個(gè)節(jié)點(diǎn)上使用etcdctl 驗(yàn)證集群狀態(tài),當(dāng)顯示cluster is healthy,說明集群部署成功,如圖2 所示。
Etcd 的特點(diǎn)是支持客戶端認(rèn)證的,因此可以使用自簽證書進(jìn)行安全部署[8]。自簽證書的工具有openssl、easyrsa 與cfssl 三種[7],用官方推薦的cfssl[5]工具生成證書,官方文檔中詳細(xì)介紹了證書的生成方法,由于篇幅問題,這里不再贅述。著重介紹一下所用的三類認(rèn)證證書[5]:
client certificate 用于通過服務(wù)器驗(yàn)證客戶端。例如etcdctl、etcd proxy 或docker 客戶端。
server certificate 由服務(wù)器使用,并由客戶端驗(yàn)證服務(wù)器身份。例如docker 服務(wù)器或kube-apiserver。
peer certificate 用于集群成員之間認(rèn)證,供節(jié)點(diǎn)之間校驗(yàn),既認(rèn)證服務(wù)器也認(rèn)證客戶端。
根據(jù)etcd 集群節(jié)點(diǎn)的IP 地址,替換官方文檔中所提供證書配置文件中的IP 地址,生成集群所用到的證書文件,如圖3 所示。
在實(shí)際生產(chǎn)過程中,為確保根證書密鑰(ca.pem、ca-key.pem)的安全性,建議使用單機(jī)(可以從圖3 看到,是在etcd-4 節(jié)點(diǎn)上生成的證書)生成證書,且必須保證生成證書的安全條件。
拷貝根證書的公鑰ca.pem 和client、server 以及peer 的私鑰、公鑰到集群的另外兩個(gè)節(jié)點(diǎn)供認(rèn)證使用。
建議在實(shí)際生產(chǎn)環(huán)境中部署etcd 集群時(shí),盡量使用5 個(gè)節(jié)點(diǎn)部署;或在生成server certificate 時(shí),多預(yù)留幾個(gè)IP 地址,以滿足后期擴(kuò)容、容災(zāi)需求。為方便證書管理,客戶端與服務(wù)器的認(rèn)證以及集群內(nèi)部認(rèn)證都可以使用peer certificate。
通過yum 方式安裝的etcd 服務(wù),其默認(rèn)生成的service 用戶名為etcd,而用root 用戶生成的證書文件,其屬主為root 用戶,普通用戶不可讀。因此,需修改證書文件屬主為etcd 或修改證書的權(quán)限使普通用戶能讀取使用。
在所有節(jié)點(diǎn)上修改etcd 配置文件,將client 的url 修改為https,并配置相關(guān)證書:
ETCD_LISTEN_CLIENT_URLS="https://192.168.1.44:2379,ht tp://127.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS= "https://192.168.1.44:2379"
ETCD_CERT_FILE="/opt/TLS/etcd/server.pem " #服務(wù)器證書
ETCD_KEY_FILE="/opt/TLS/etcd/server-key.pem" #服務(wù)器私鑰
ETCD_CLIENT_CERT_AUTH="true" #啟動(dòng)客戶端認(rèn)證
ETCD_TRUSTED_CA_FILE="/opt/TLS/etcd/ca.pem" #根證書
由上述集群配置更新可知,修改配置文件之后還需要通過etcdctl 命令,實(shí)現(xiàn)客戶端與服務(wù)器的通信,命令如下:
etcdctl --ca-file /opt/TLS/etcd/ca.pem --cert-file /opt/TLS/etcd/client.pem --key-file /opt/TLS/etcd/client-key.pem cluster-health
當(dāng)顯示cluster is healthy 時(shí),說明客戶端認(rèn)證實(shí)現(xiàn)https 連接,如圖4 所示。
etcd 的客戶端與服務(wù)器端認(rèn)證已經(jīng)部署成功,接下來將實(shí)現(xiàn)etcd 集群內(nèi)部之間https 通信。
在所有節(jié)點(diǎn)上修改etcd 配置文件,將peer 的url 修改為https,添加peer 相關(guān)證書:
ETCD_LISTEN_PEER_URLS="https://192.168.1.44:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.44:2380"
ETCD_INITIAL_CLUSTER="etcd-4=https:/192.168.1.44:2380,etcd-5=https://192.168.1.45:2380,etcd-6=https://192.168.1.46:2380"
ETCD_PEER_CERT_FILE="/opt/etcd/TLS/etcd/peer.pem"
ETCD_PEER_KEY_FILE="/opt/etcd/TLS/etcd/peer-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/opt/etcd/TLS/etcd/ca.pem"
配置參數(shù)后,刪除原有數(shù)據(jù),重新啟動(dòng)etcd 服務(wù),實(shí)現(xiàn)集群內(nèi)部之間的https 傳輸,如圖5 所示。
至此,靜態(tài)etcd 集群內(nèi)外訪問都實(shí)現(xiàn)了https 通信。
文章通過介紹etcd 的基本概念,從單節(jié)點(diǎn)安裝服務(wù),到集群成功部署;從證書生成,最后到集群內(nèi)外都實(shí)現(xiàn)基于https 的安全訪問,詳細(xì)的介紹了etcd 集群的搭建過程,具有很強(qiáng)的參考意義。其中,客戶端的安全認(rèn)證為kubernetes 集群中Master 節(jié)點(diǎn)中kubeapiserver 組件訪問etcd 集群提供了很好的借鑒作用,為高可用kubernetes 集群的安全部署夯實(shí)基礎(chǔ)。
不足之處:本次安裝部署etcd 采用的yum 源的方式進(jìn)行安裝,在實(shí)際生產(chǎn)中并不適用,只能做參考使用,但其部署原理是一致的。另外,證明實(shí)現(xiàn)https 通信還需要進(jìn)行抓包測(cè)試。
注意,本次部署適用在新建集群,如果是已運(yùn)行的etcsd 集群,要修改集群內(nèi)外訪問方式,需要修改配置文件并用etcdctl 命令更新,以防止原有數(shù)據(jù)的丟失。