etcd集羣部署

概述

節點

etcd有兩種節點,分別爲集羣節點和代理節點。兩種節點在使用上幾乎沒有區別,這使咱們能夠在每臺機器上都安裝etcd,進而把etcd看成本地服務使用。它們的區別在於內部原理不一樣:前端

  • 集羣節點是真正的etcd集羣的構成者,這些節點負責數據存取,集羣管理等
  • 代理節點能夠理解爲一個反向代理,它只簡單的接受請求,轉發請求給etcd集羣

集羣大小與容錯

集羣的大小指集羣節點的個數。根據 etcd 的分佈式數據冗餘策略,集羣節點越多,容錯能力(Failure Tolerance)越強,同時寫性能也會越差。 因此關於集羣大小的優化,其實就是容錯和寫性能的一個平衡。 另外,etcd推薦使用奇數做爲集羣節點個數。由於奇數個節點與和其配對的偶數個節點相比(好比 3節點和4節點對比),容錯能力相同,卻能夠少一個節點。因此綜合考慮性能和容錯能力,etcd 官方文檔推薦的 etcd 集羣大小是 3, 5, 7。node

部署etcd集羣

etcd 集羣的搭建有三種方式,包括:static方式,etcd discovery方式和DNS discovery。DNS discovery方式在實際生產中不多使用,在這裏不做說明。bash

我這裏的部署以etcd v3.3.1爲例,etcd的安裝能夠直接使用二進制文件,也可使用yum或apt的方式安裝,我這裏默認使用二進制的方式安裝,且二進制文件存放在/opt/kubernetes/bin目錄下。配置文件存放在/opt/kubernetes/cfg目錄下。frontend

static方式

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

下面是一些經常使用配置選項的說明:

  • --name:方便理解的節點名稱,默認爲 default,在集羣中應該保持惟一,可使用 hostname
  • --data-dir:服務運行數據保存的路徑,默認爲 ${name}.etcd
  • --snapshot-count:指定有多少事務(transaction)被提交時,觸發截取快照保存到磁盤
  • --heartbeat-interval:leader 多久發送一次心跳到 followers。默認值是 100ms
  • --eletion-timeout:從新投票的超時時間,若是follower在該時間間隔沒有收到心跳包,會觸發從新投票,默認爲 1000 ms
  • --listen-peer-urls:和同伴通訊的地址,好比 http://ip:2380,若是有多個,使用逗號分隔。須要全部節點都可以訪問,因此不要使用 localhost
  • --listen-client-urls:對外提供服務的地址:好比 http://ip:2379,http://127.0.0.1:2379,客戶端會鏈接到這裏和etcd交互
  • --advertise-client-urls:對外公告的該節點客戶端監聽地址,這個值會告訴集羣中其餘節點
  • --initial-advertise-peer-urls:該節點同伴監聽地址,這個值會告訴集羣中其餘節點
  • --initial-cluster:集羣中全部節點的信息,格式爲 node1=http://ip1:2380,node2=http://ip2:2380,…。須要注意的是,這裏的 node1 是節點的--name指定的名字;後面的ip1:2380 是--initial-advertise-peer-urls 指定的值
  • --initial-cluster-state:新建集羣的時候,這個值爲 new;假如已經存在的集羣,這個值爲existing
  • --initial-cluster-token:建立集羣的token,這個值每一個集羣保持惟一。這樣的話,若是你要從新建立集羣,即便配置和以前同樣,也會再次生成新的集羣和節點 uuid;不然會致使多個集羣之間的衝突,形成未知的錯誤

這些選項,與上面咱們配置文件裏的配置一一對應,如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

etcd discovery方式

不少時候,你只知道須要要搭建一個多大(包含多少節點)的集羣,可是並不能事先知道這幾個節點的ip,從而沒法使用 -initial-cluster 參數。 這個時候,就須要使用discovery的方式來搭建etcd集羣。事實上,這種方式在實際生產環境中,使用的也並很少。

etcd discovery 有兩種:

  • 自定義的etcd discovery
  • 公共etcd discovery。

如下的兩種配置方式由於不多用於生產,因此我只是驗證了第一種方式,第二種方式徹底摘抄於網上其餘文檔,並未做具體驗證,僅供參考。

公共的etcd discover服務

  1. 建立一個用於discovery的token:
curl https://discovery.etcd.io/new?size=3     #size=3表示建立一個3節點的集羣

# 返回以下結果:
https://discovery.etcd.io/96ca21e0510d96442a3689751cb6fdc0
  1. 在三臺節點上分別啓動etcd,方式以下:
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節點。

自定義的etc discovery服務

這種方式就是利用一個已有的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
相關文章
相關標籤/搜索