etcd有兩種節點,分別爲集羣節點和代理節點。兩種節點在使用上幾乎沒有區別,這使咱們能夠在每臺機器上都安裝etcd,進而把etcd看成本地服務使用。它們的區別在於內部原理不一樣:前端
集羣的大小指集羣節點的個數。根據 etcd 的分佈式數據冗餘策略,集羣節點越多,容錯能力(Failure Tolerance)越強,同時寫性能也會越差。 因此關於集羣大小的優化,其實就是容錯和寫性能的一個平衡。 另外,etcd推薦使用奇數做爲集羣節點個數。由於奇數個節點與和其配對的偶數個節點相比(好比 3節點和4節點對比),容錯能力相同,卻能夠少一個節點。因此綜合考慮性能和容錯能力,etcd 官方文檔推薦的 etcd 集羣大小是 3, 5, 7。node
etcd 集羣的搭建有三種方式,包括:static方式,etcd discovery方式和DNS discovery。DNS discovery方式在實際生產中不多使用,在這裏不做說明。bash
我這裏的部署以etcd v3.3.1爲例,etcd的安裝能夠直接使用二進制文件,也可使用yum或apt的方式安裝,我這裏默認使用二進制的方式安裝,且二進制文件存放在/opt/kubernetes/bin目錄下。配置文件存放在/opt/kubernetes/cfg目錄下。frontend
static方式是最簡單的一種搭建etcd的方式。它不須要任何額外的服務,只須要知道準備用來運行etcd的全部節點的hostname或者IP便可。curl
測試的三臺機器以下:tcp
HostName | Address | EtcdName |
---|---|---|
etcd1 | 10.5.12.16 | etcd1 |
etcd2 | 10.5.12.17 | etcd2 |
etcd3 | 10.5.12.18 | etcd3 |
etcd1上的/opt/kubernetes/cfg/etcd.conf配置文件以下:分佈式
ETCD_NAME=etcd1 ETCD_DATA_DIR="/data/etcd" ETCD_LISTEN_CLIENT_URLS="http://10.5.12.16:2379,http://127.0.0.1:2379" ETCD_LISTEN_PEER_URLS="http://10.5.12.16:2380" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.5.12.16:2380" ETCD_INITIAL_CLUSTER="etcd1=http://10.5.12.16:2380,etcd2=http://10.5.12.17:2380,etcd3=http://10.5.12.18:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://10.5.12.16:2379"
其餘節點配置基本相同,這裏就再也不做詳細說明。性能
全部節點上服務啓動文件/usr/lib/systemd/system/etcd.service以下:測試
[Unit] Description=Etcd Server After=network.target [Service] Type=simple WorkingDirectory=/var/lib/etcd EnvironmentFile=-/opt/kubernetes/cfg/etcd.conf # set GOMAXPROCS to number of processors ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /opt/kubernetes/bin/etcd" Type=notify [Install] WantedBy=multi-user.target
還須要說明的是,默認etcd採用的是v2接口,在一些特定場景中,須要使用etcd的v3接口。則須要配置以下環境變量:優化
export ETCDETC_API=3
經過以下方式啓動:
systemctl daemon-reload systemctl start etcd systemctl enable etcd
啓動後,咱們查看etcd進程,以下:
/opt/kubernetes/bin/etcd --name etcd1 --data-dir /data/etcd --listen-client-urls http://10.5.12.16:2379,http://127.0.0.1:2379 --listen-peer-urls http://10.5.12.16:2380 --initial-advertise-peer-urls http://10.5.12.16:2380 --initial-cluster etcd1=http://10.5.12.16:2380,etcd2=http://10.5.12.17:2380,etcd3=http://10.5.12.18:2380 --advertise-client-urls http://10.5.12.16:2379 --initial-cluster-token etcd-cluster --initial-cluster-state new
下面是一些經常使用配置選項的說明:
這些選項,與上面咱們配置文件裏的配置一一對應,如ETCD_INITIAL_CLUSTER
等同於--inital-cluster
, ETCD_INITIAL_CLUSTER_STATE
等同於--initial-cluster-state
。
全部以--init開頭的配置都是在第一次啓動etcd集羣的時候纔會用到,後續節點的重啓會被忽略,如--initial-cluseter參數。因此當成功初始化了一個etcd集羣之後,就再也不須要這個參數或環境變量了。
能夠在三個節點的前端使用haproxy作反向代理(事實上,這並非必須的,在實際生產中,不多這麼作。),haproxy.cfg配置以下:
frontend etcd bind 10.5.12.19:4001 mode tcp option tcplog default_backend etcd log 127.0.0.1 local3 backend etcd balance roundrobin fullconn 1024 server etcd1 10.5.12.16:2379 check port 4001 inter 300 fall 3 server etcd2 10.5.12.17:2379 check port 4001 inter 300 fall 3 server etcd3 10.5.12.18:2379 check port 4001 inter 300 fall 3
不少時候,你只知道須要要搭建一個多大(包含多少節點)的集羣,可是並不能事先知道這幾個節點的ip,從而沒法使用 -initial-cluster 參數。 這個時候,就須要使用discovery的方式來搭建etcd
集羣。事實上,這種方式在實際生產環境中,使用的也並很少。
etcd discovery 有兩種:
如下的兩種配置方式由於不多用於生產,因此我只是驗證了第一種方式,第二種方式徹底摘抄於網上其餘文檔,並未做具體驗證,僅供參考。
curl https://discovery.etcd.io/new?size=3 #size=3表示建立一個3節點的集羣 # 返回以下結果: https://discovery.etcd.io/96ca21e0510d96442a3689751cb6fdc0
etcd --name etcd1 --data-dir /data/etcd \ --initial-advertise-peer-urls http://10.5.12.16:2380 \ --listen-peer-urls http://10.5.12.16:2380 \ --listen-client-urls http://10.5.12.16:2379,http://127.0.0.1:2379 \ --advertise-client-urls http://10.5.12.16:2379 \ --discovery https://discovery.etcd.io/96ca21e0510d96442a3689751cb6fdc0
若是使用變量的方式,則ETCD_DISCOVERY
等於--discovery
,另外,若是實際啓動的etcd節點數大於discovery token建立時指定的size,多餘的節點會自動變爲proxy節點。
這種方式就是利用一個已有的etcd集羣來提供discovery服務,從而建立一個新的etcd集羣,假設已有的etcd集羣的一個訪問地址爲myetcd.local,那麼首先要在已有的etcd上建立一個特殊的key,以下:
# 其中value=3表示集羣的大小,5c007a14875d53d9bf0ef5a6fc0257c817f0fb83則用來作discovery的token curl -X PUT https://myetcd.local/v2/keys/discovery/5c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3
而後在三個要部署集羣的節點上執行以下操做便可:
etcd --name etcd1 --data-dir /data/etcd \ --initial-advertise-peer-urls http://10.5.12.16:2380 \ --listen-peer-urls http://10.5.12.16:2380 \ --listen-client-urls http://10.5.12.16:2379,http://127.0.0.1:2379 \ --advertise-client-urls http://10.5.12.16:2379 \ --discovery https://discovery.etcd.io/5c007a14875d53d9bf0ef5a6fc0257c817f0fb83