K8S核心組件etcd詳解(上)
1 介紹
etcd是一(yi)個(ge)高可用(yong)的分(fen)布式(shi)鍵值存儲(chu)系(xi)統,是CoreOS(現在隸(li)屬于Red Hat)公司開發的一(yi)個(ge)開源項目。它提供了一(yi)個(ge)簡(jian)單的接口來存儲(chu)和(he)檢索鍵值對數據,并(bing)使用(yong)實現了分(fen)布式(shi)一(yi)致性。etcd廣泛應用(yong)于、等分(fen)布式(shi)系(xi)統中,用(yong)于存儲(chu)配(pei)置(zhi)信息、服務發現、領導(dao)者選舉等方面。
2 etcd高可用集群部署
2.1 服務器配置
| 主機名 | ip地址 | cpu數量 | 內存數量 |
| etcd1 | 172.18.101.39 | 4 | 8 |
| etcd2 | 172.18.101.40 | 4 | 8 |
| etcd3 | 172.18.101.41 | 4 | 8 |
2.2 部署etcd集群
安裝包下載地址
以下操(cao)作在三個etcd節點上(shang)進行
[root@etcd-1 ~]# wget //github.com/etcd-io/etcd/releases/download/v3.4.27/etcd-v3.4.27-linux-amd64.tar.gz
[root@etcd-1 ~]# tar xvf etcd-v3.4.27-linux-amd64.tar.gz
[root@etcd-1 ~]# mv etcd-v3.4.27-linux-amd64/etcd* /usr/local/bin/ ##復制etcd命令文件
[root@etcd-1 ~]# mkdir -p /var/lib/etcd/ ##創建數據存放目錄
[root@etcd-1 ~]# mkdir -p /etc/etcd ##創建配置文件存放目錄
三個(ge)節(jie)點設置etcd配置文件,三個(ge)節(jie)點的防火(huo)墻要放行2379及2380端口
#etcd節點1
[root@etcd-1 ~]# cat /etc/etcd/etcd.conf
ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="//172.18.101.39:2380"
ETCD_LISTEN_CLIENT_URLS="//127.0.0.1:2379,//172.18.101.39:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="//172.18.101.39:2380"
ETCD_INITIAL_CLUSTER="etcd1=//172.18.101.39:2380,etcd2=//172.18.101.40:2380,etcd3=//172.18.101.41:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="singless"
ETCD_ADVERTISE_CLIENT_URLS="//172.18.101.39:2379"
#etcd節點2
[root@etcd-2 ~]# cat /etc/etcd/etcd.conf
ETCD_NAME=etcd2
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="//172.18.101.40:2380"
ETCD_LISTEN_CLIENT_URLS="//127.0.0.1:2379,//172.18.101.40:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="//172.18.101.40:2380"
ETCD_INITIAL_CLUSTER="etcd1=//172.18.101.39:2380,etcd2=//172.18.101.40:2380,etcd3=//172.18.101.41:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="singless"
ETCD_ADVERTISE_CLIENT_URLS="//172.18.101.40:2379"
#etcd節點3
[root@etcd-3 ~]# cat /etc/etcd/etcd.conf
ETCD_NAME=etcd3
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="//172.18.101.41:2380"
ETCD_LISTEN_CLIENT_URLS="//127.0.0.1:2379,//172.18.101.41:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="//172.18.101.41:2380"
ETCD_INITIAL_CLUSTER="etcd1=//172.18.101.39:2380,etcd2=//172.18.101.40:2380,etcd3=//172.18.101.41:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="singless"
ETCD_ADVERTISE_CLIENT_URLS="//172.18.101.41:2379"
- ETCD_NAME:指定ETCD節點的名稱。每個節點在集群中應具有唯一的名稱,以便進行識別和通信。
- ETCD_DATA_DIR:指定ETCD存儲數據的目錄路徑。ETCD使用此目錄來持久化存儲數據。
- ETCD_LISTEN_PEER_URLS:指定ETCD節點監聽對等節點連接的URL。對等URL用于節點之間的通信和數據同步。
- ETCD_LISTEN_CLIENT_URLS:指定ETCD節點監聽客戶端連接的URL列表。客戶端URL用于與ETCD集群進行交互,例如執行讀取或寫入操作。
- ETCD_INITIAL_ADVERTISE_PEER_URLS:指定ETCD節點初始公告對等節點連接的URL。當新節點加入集群時,將向其他節點宣告自己的URL,以便其他節點可以找到并連接到它。
- ETCD_INITIAL_CLUSTER:指定ETCD集群的初始成員列表及其對等節點連接URL。每個成員由名稱和對等節點連接URL組成,用逗號分隔。在啟動集群時,指定初始成員列表用于插入新節點。
- ETCD_INITIAL_CLUSTER_STATE:指定ETCD集群的初始狀態。可選值為"new"和"existing"。"new"表示創建一個新的集群,"existing"表示已經存在的集群。
- ETCD_INITIAL_CLUSTER_TOKEN:指定ETCD集群的初始令牌。所有成員在啟動時應使用相同的令牌,以便它們可以識別和加入相同的集群。
- ETCD_ADVERTISE_CLIENT_URLS:指定ETCD節點公告給客戶端的連接URL。客戶端連接URL用于向應用程序或工具公開ETCD節點,以便進行讀取和寫入操作。
配(pei)置(zhi)管理etcd,三個節點配(pei)置(zhi)相同
[root@etcd-1 ~]# cat /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
User=root
Type=notify
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/local/bin/etcd
Restart=on-failure
RestartSec=10s
LimitNOFILE=40000
[Install]
WantedBy=multi-user.target
三個節點上啟動服務
[root@etcd-1 ~]# systemctl enable etcd
[root@etcd-1 ~]# systemctl start etcd
2.3 部署后集群狀態檢查
2.3.1 查看集群成員
[root@etcd-1 ~]# etcdctl member list ##列出集群成員
916281517eb238d9, started, etcd2, //172.18.101.40:2380, //172.18.101.40:2379, false
9a04401d57e3afba, started, etcd1, //172.18.101.39:2380, //172.18.101.39:2379, false
9f9b71960dcb7180, started, etcd3, //172.18.101.41:2380, //172.18.101.41:2379, false
[root@etcd-1 ~]# etcdctl -w table endpoint status --endpoints=172.18.101.39:2379,172.18.101.40:2379,172.18.101.41:2379 ##查看集群leader是哪個節點
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 172.18.101.39:2379 | 9a04401d57e3afba | 3.4.27 | 20 kB | true | false | 123 | 14 | 14 | |
| 172.18.101.40:2379 | 916281517eb238d9 | 3.4.27 | 20 kB | false | false | 123 | 14 | 14 | |
| 172.18.101.41:2379 | 9f9b71960dcb7180 | 3.4.27 | 20 kB | false | false | 123 | 14 | 14 | |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
2.3.2 查看集群成員的健康狀態
[root@etcd-1 ~]# etcdctl -w table endpoint health --endpoints=172.18.101.39:2379,172.18.101.40:2379,172.18.101.41:2379
+--------------------+--------+------------+-------+
| ENDPOINT | HEALTH | TOOK | ERROR |
+--------------------+--------+------------+-------+
| 172.18.101.39:2379 | true | 2.190331ms | |
| 172.18.101.41:2379 | true | 2.517434ms | |
| 172.18.101.40:2379 | true | 3.06371ms | |
+--------------------+--------+------------+-------+
3 某個節點異常如何處理
- 使用命令移除節點
- 刪除異常節點數據目錄
- 重新將節點添加至集群
3.1 移除節點
假設etcd3出(chu)現了(le)異常
[root@etcd-1 ~]# etcdctl member list ##第一列為節點的id
916281517eb238d9, started, etcd2, //172.18.101.40:2380, //172.18.101.40:2379, false
9a04401d57e3afba, started, etcd1, //172.18.101.39:2380, //172.18.101.39:2379, false
9f9b71960dcb7180, started, etcd3, //172.18.101.41:2380, //172.18.101.41:2379, false
[root@etcd-1 ~]#
[root@etcd-1 ~]# etcdctl member remove 9f9b71960dcb7180 ##通過節點的id將節點刪除
Member 9f9b71960dcb7180 removed from cluster 8356fccf618a037f
[root@etcd-1 ~]# etcdctl member list
916281517eb238d9, started, etcd2, //172.18.101.40:2380, //172.18.101.40:2379, false
9a04401d57e3afba, started, etcd1, //172.18.101.39:2380, //172.18.101.39:2379, false
3.2 刪除異常節點的數據目錄
[root@etcd-3 ~]# rm -rf /var/lib/etcd
[root@etcd-3 ~]# cat /etc/etcd/etcd.conf ##修改ETCD_INITIAL_CLUSTER_STATE為exsiting
ETCD_NAME=etcd3
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="//172.18.101.41:2380"
ETCD_LISTEN_CLIENT_URLS="//127.0.0.1:2379,//172.18.101.41:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="//172.18.101.41:2380"
ETCD_INITIAL_CLUSTER="etcd1=//172.18.101.39:2380,etcd2=//172.18.101.40:2380,etcd3=//172.18.101.41:2380"
ETCD_INITIAL_CLUSTER_STATE="existing" ##修改為existing
ETCD_INITIAL_CLUSTER_TOKEN="singless"
ETCD_ADVERTISE_CLIENT_URLS="//172.18.101.41:2379"
3.3 將節點添加至集群
[root@etcd-1 ~]# etcdctl member add etcd3 --peer-urls=//172.18.101.41:2380
Member 51fc8f5f71060fdc added to cluster 8356fccf618a037f
[root@etcd-1 ~]# etcdctl member list ##可以看到節點添加后處于一個未啟動的狀態,需要手動去etcd-3節點上啟動一下etcd服務
51fc8f5f71060fdc, unstarted, , //172.18.101.41:2380, , false
916281517eb238d9, started, etcd2, //172.18.101.40:2380, //172.18.101.40:2379, false
9a04401d57e3afba, started, etcd1, //172.18.101.39:2380, //172.18.101.39:2379, false
在etcd-3上啟(qi)動(dong)服務即可
[root@etcd-3 ~]# systemctl start etcd
[root@etcd-1 ~]# etcdctl member list ##重新添加后,節點的id會變,屬于正常現象
51fc8f5f71060fdc, started, etcd3, //172.18.101.41:2380, //172.18.101.41:2379, false
916281517eb238d9, started, etcd2, //172.18.101.40:2380, //172.18.101.40:2379, false
9a04401d57e3afba, started, etcd1, //172.18.101.39:2380, //172.18.101.39:2379, false
4 etcdctl增刪改查操作
etcdctl 是用(yong)于與 ETCD 進行(xing)交互的(de)命(ming)令行(xing)工具,它提(ti)供了(le)一系(xi)列命(ming)令和選項(xiang),用(yong)于檢(jian)索、設置、修(xiu)改和刪除 ETCD 中的(de)數據(ju)。
4.1 etcd的數據存儲模型
前面介紹過,etcd是一個分布式的(de)鍵值(zhi)存儲系(xi)統。etcd在(zai)鍵的(de)組織上采用了層次化(hua)的(de)空間結構,類(lei)似于文件系(xi)統中(zhong)目錄(lu)(lu)的(de)概念。但是并不存在(zai)目錄(lu)(lu)的(de)那種(zhong)層級(ji)關系(xi)。
例如現在
類似(si)于文(wen)件系(xi)統中的目錄(lu)(文(wen)件夾(jia))結(jie)構,ETCD的命名(ming)空間(jian)允許以(yi)(yi)鍵的層(ceng)次結(jie)構來組織數據,并且每個(ge)鍵可(ke)以(yi)(yi)唯一(yi)(yi)地標識一(yi)(yi)個(ge)節(jie)(jie)(jie)點(dian)(dian)。頂層(ceng)節(jie)(jie)(jie)點(dian)(dian)被稱為(wei)根節(jie)(jie)(jie)點(dian)(dian),然后可(ke)以(yi)(yi)在根節(jie)(jie)(jie)點(dian)(dian)下創建子節(jie)(jie)(jie)點(dian)(dian),子節(jie)(jie)(jie)點(dian)(dian)又(you)可(ke)以(yi)(yi)包含更多(duo)子節(jie)(jie)(jie)點(dian)(dian),以(yi)(yi)此類推。這種層(ceng)次化(hua)的結(jie)構可(ke)以(yi)(yi)用于將數據進(jin)行分類、分類和(he)組織。
例如,假設我(wo)們(men)有以下(xia)目(mu)錄結構:
- /singless/test
- /singless/test/gender
在上述(shu)示例中/singless/test和/singless/test/gender,有類似于(yu)目(mu)錄一(yi)樣的共(gong)同的索引前綴/和/singless,但(dan)是并不(bu)存在目(mu)錄的那種層(ceng)級關(guan)系。它們都可以作(zuo)為一(yi)個key存儲相應的value。
4.2 增和改
增加數(shu)據和修改數(shu)據需要用到put命令進行(xing)操(cao)作(zuo)
[root@etcd-1 ~]# etcdctl put /singless/test/gender male ##創建一個鍵/singless/test/gender,值為male
OK
[root@etcd-1 ~]# etcdctl put /singless/test true ##創建一個鍵/singless/test,值為test
OK
4.3 查詢操作
查(cha)詢操作(zuo)需要使用到(dao)get參數
[root@etcd-1 ~]# etcdctl get /singless/test/gender ##根據具體的key查詢對應的值
/singless/test/gender
male
[root@etcd-1 ~]# etcdctl get --prefix / ##根據索引前綴查詢,這里查詢的是以/為前綴的key、value,所以能看到所有的鍵值對
/singless/test
true
/singless/test/gender
male
[root@etcd-1 ~]# etcdctl put /singless/test false ##使用put修改鍵/singless/test的value
OK
[root@etcd-1 ~]# etcdctl get /singless/test
/singless/test
false
4.4 刪除操作
刪除操作使用del命令(ling)
[root@etcd-1 ~]# etcdctl del /singless/test ##可以指定key進行刪除
1
[root@etcd-1 ~]# etcdctl get --prefix /
/singless/test/gender
male
[root@etcd-1 ~]# etcdctl del --prefix / ##也可以執行索引前綴進行刪除
1
[root@etcd-1 ~]# etcdctl get --prefix /
5 k8s中的etcd
5.1 介紹
k8s中所有對象(xiang)的manifest都(dou)需要保存到某個地方,這樣他們的manifest在(zai)api server重啟和失(shi)敗的時(shi)候才(cai)不會(hui)丟失(shi),因(yin)此(ci)引入了etcd。在(zai)k8s中只有api server和etcd直接交互(hu),其(qi)它(ta)組件(jian)都(dou)通過api server間接和etcd交互(hu),這樣做的好處如下。
- 增強樂觀鎖系統及驗證系統的健壯性
- 方便后續存儲的替換,只需修改api server組件的相關接口。
etcd是一(yi)個響應(ying)快、分(fen)布式、一(yi)致的KV存(cun)儲,也是k8s存(cun)儲集群(qun)狀(zhuang)態和元數據的唯一(yi)地(di)方(fang)。
5.2 查看k8s中etcd存儲的數據
[root@k8s-master01 ~]# kubectl get pod -n kube-system |grep etcd
etcd-k8s-master01 1/1 Running 1 47d
etcd-k8s-master02 1/1 Running 0 47d
etcd-k8s-master03 1/1 Running 0 47d
[root@k8s-master01 ~]#
[root@k8s-master01 ~]# kubectl exec -it -n kube-system etcd-k8s-master01 -- /bin/sh
sh-5.1# etcdctl member list --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key
15c808b23512a31a, started, k8s-master02, //10.0.107.77:2380, //10.0.107.77:2379, false
5ca9692dbcd57e55, started, k8s-master03, //10.0.113.204:2380, //10.0.113.204:2379, false
f8b45063ae1a7dfa, started, k8s-master01, //10.0.87.66:2380, //10.0.87.66:2379, false
k8s中(zhong)的(de)etcd需要(yao)使用到(dao)證(zheng)(zheng)書進行認證(zheng)(zheng)
查看(kan)etcd中存儲的(de)數(shu)據(ju),可以手(shou)動(dong)在master節點上安(an)裝(zhuang)etcdctl命令
[root@k8s-master01 ~]# export ETCDCTL_API=3 ##指定使用的api版本
[root@k8s-master01 ~]# etcdctl get --prefix "" --endpoints=10.0.87.66:2379,10.0.107.77:2379,10.0.113.204:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key |head -2
--endpoints指(zhi)定etcd節點,另(ling)外要使(shi)用到(dao)k8s證(zheng)書,證(zheng)書通(tong)常在(zai)/etc/kubernetes/pki/目錄下(xia),以(yi)(yi)下(xia)輸出可(ke)以(yi)(yi)看到(dao)etcd中存儲的(de)k8s相(xiang)關的(de)鍵(jian)值數(shu)據。