1 介紹
https://etcd.io/docs/v3.5/
etcd是一個高可用的分布式鍵值存儲系統,是CoreOS(現在隸屬于Red Hat)公司開發的一個開源項目。它提供了一個簡單的接口來存儲和檢索鍵值對數據,并使用Raft協議實現了分布式一致性。etcd廣泛應用于Docker、Kubernetes等分布式系統中,用于存儲配置信息、服務發現、領導者選舉等方面。
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集群
安裝包下載地址
https://github.com/etcd-io/etcd/tags
以下操作在三個etcd節點上進行
[root@etcd-1 ~]# wget https://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 ##創建配置文件存放目錄
三個節點設置etcd配置文件,三個節點的防火墻要放行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="http://172.18.101.39:2380" ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.18.101.39:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.18.101.39:2380" ETCD_INITIAL_CLUSTER="etcd1=http://172.18.101.39:2380,etcd2=http://172.18.101.40:2380,etcd3=http://172.18.101.41:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="singless" ETCD_ADVERTISE_CLIENT_URLS="http://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="http://172.18.101.40:2380" ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.18.101.40:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.18.101.40:2380" ETCD_INITIAL_CLUSTER="etcd1=http://172.18.101.39:2380,etcd2=http://172.18.101.40:2380,etcd3=http://172.18.101.41:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="singless" ETCD_ADVERTISE_CLIENT_URLS="http://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="http://172.18.101.41:2380" ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.18.101.41:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.18.101.41:2380" ETCD_INITIAL_CLUSTER="etcd1=http://172.18.101.39:2380,etcd2=http://172.18.101.40:2380,etcd3=http://172.18.101.41:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="singless" ETCD_ADVERTISE_CLIENT_URLS="http://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節點,以便進行讀取和寫入操作。
配置systemd管理etcd,三個節點配置相同
[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, http://172.18.101.40:2380, http://172.18.101.40:2379,?false 9a04401d57e3afba, started, etcd1, http://172.18.101.39:2380, http://172.18.101.39:2379,?false 9f9b71960dcb7180, started, etcd3, http://172.18.101.41:2380, http://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出現了異常
[root@etcd-1 ~]# etcdctl member list ##第一列為節點的id 916281517eb238d9, started, etcd2, http://172.18.101.40:2380, http://172.18.101.40:2379,?false 9a04401d57e3afba, started, etcd1, http://172.18.101.39:2380, http://172.18.101.39:2379,?false 9f9b71960dcb7180, started, etcd3, http://172.18.101.41:2380, http://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, http://172.18.101.40:2380, http://172.18.101.40:2379,?false 9a04401d57e3afba, started, etcd1, http://172.18.101.39:2380, http://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="http://172.18.101.41:2380" ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.18.101.41:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.18.101.41:2380" ETCD_INITIAL_CLUSTER="etcd1=http://172.18.101.39:2380,etcd2=http://172.18.101.40:2380,etcd3=http://172.18.101.41:2380" ETCD_INITIAL_CLUSTER_STATE="existing"??##修改為existing ETCD_INITIAL_CLUSTER_TOKEN="singless" ETCD_ADVERTISE_CLIENT_URLS="http://172.18.101.41:2379"
3.3 將節點添加至集群
[root@etcd-1 ~]# etcdctl member add etcd3 --peer-urls=http://172.18.101.41:2380 Member 51fc8f5f71060fdc added to cluster 8356fccf618a037f [root@etcd-1 ~]# etcdctl member list ##可以看到節點添加后處于一個未啟動的狀態,需要手動去etcd-3節點上啟動一下etcd服務 51fc8f5f71060fdc, unstarted, , http://172.18.101.41:2380, ,?false 916281517eb238d9, started, etcd2, http://172.18.101.40:2380, http://172.18.101.40:2379,?false 9a04401d57e3afba, started, etcd1, http://172.18.101.39:2380, http://172.18.101.39:2379,?false
在etcd-3上啟動服務即可
[root@etcd-3 ~]# systemctl start etcd [root@etcd-1 ~]# etcdctl member list ##重新添加后,節點的id會變,屬于正常現象 51fc8f5f71060fdc, started, etcd3, http://172.18.101.41:2380, http://172.18.101.41:2379,?false 916281517eb238d9, started, etcd2, http://172.18.101.40:2380, http://172.18.101.40:2379,?false 9a04401d57e3afba, started, etcd1, http://172.18.101.39:2380, http://172.18.101.39:2379,?false
4 etcdctl增刪改查操作
https://github.com/etcd-io/etcd/tree/main/etcdctl
etcdctl
是用于與 ETCD 進行交互的命令行工具,它提供了一系列命令和選項,用于檢索、設置、修改和刪除 ETCD 中的數據。
4.1 etcd的數據存儲模型
前面介紹過,etcd是一個分布式的鍵值存儲系統。etcd在鍵的組織上采用了層次化的空間結構,類似于文件系統中目錄的概念。但是并不存在目錄的那種層級關系。
例如現在
類似于文件系統中的目錄(文件夾)結構,ETCD的命名空間允許以鍵的層次結構來組織數據,并且每個鍵可以唯一地標識一個節點。頂層節點被稱為根節點,然后可以在根節點下創建子節點,子節點又可以包含更多子節點,以此類推。這種層次化的結構可以用于將數據進行分類、分類和組織。
例如,假設我們有以下目錄結構:
-
/singless/test
-
/singless/test/gender
在上述示例中/singless/test
和/singless/test/gender
,有類似于目錄一樣的共同的索引前綴/
和/singless
,但是并不存在目錄的那種層級關系。它們都可以作為一個key存儲相應的value。
4.2 增和改
增加數據和修改數據需要用到put命令進行操作
[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 查詢操作
查詢操作需要使用到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命令
[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中所有對象的manifest都需要保存到某個地方,這樣他們的manifest在api server重啟和失敗的時候才不會丟失,因此引入了etcd。在k8s中只有api server和etcd直接交互,其它組件都通過api server間接和etcd交互,這樣做的好處如下。
-
增強樂觀鎖系統及驗證系統的健壯性
-
方便后續存儲的替換,只需修改api server組件的相關接口。
etcd是一個響應快、分布式、一致的KV存儲,也是k8s存儲集群狀態和元數據的唯一地方。
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, https://10.0.107.77:2380, https://10.0.107.77:2379,?false 5ca9692dbcd57e55, started, k8s-master03, https://10.0.113.204:2380, https://10.0.113.204:2379,?false f8b45063ae1a7dfa, started, k8s-master01, https://10.0.87.66:2380, https://10.0.87.66:2379,?false
k8s中的etcd需要使用到證書進行認證
查看etcd中存儲的數據,可以手動在master節點上安裝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指定etcd節點,另外要使用到k8s證書,證書通常在/etc/kubernetes/pki/目錄下,以下輸出可以看到etcd中存儲的k8s相關的鍵值數據。