接續上一篇文章,本文再深入一點關於ETCD基本操作以及在其他文章中關於ETCD節點資料不一致情況的除錯內容分享,還沒看過上一篇文章的話,可以到以下連結:
接下來將分成下列幾項來分享,先是一些關於實作的記錄,再來分享在別篇文章看到關於節點資料不一致的處理過程,個人覺得任何經驗都是非常有價值的,除了自已不斷進步之外,透過多看不同的情境下所出現的問題與處理方式還可以讓自已的學習更為有效。
以下為本文章節:
那就開始吧!!
首先先進行操作ETCD的命令工具安裝,我們將利用這個工具進行許多ETCD的操作任務。
### 安裝ETCDCTL
[root]# ETCD_RELEASE=$(curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest|grep tag_name | cut -d '"' -f 4)
[root]# echo $ETCD_RELEASE
v3.5.9[root]# wget https://github.com/etcd-io/etcd/releases/download/${ETCD_RELEASE}/etcd-${ETCD_RELEASE}-linux-amd64.tar.gz
[root]# tar zxvf etcd-v3.5.9-linux-amd64.tar.gz
[root]# cd etcd-v3.5.9-linux-amd64
[root]# ls -al
[root]# cp -rp etcdctl
### Alias設定 (之後就不用帶一堆參數)
[root]# vim /root/.bash_profile
alias etcdctl="ETCDCTL_API=3 /usr/local/bin/etcdctl \
--endpoints=10.107.88.15:2379,10.107.88.16:2379,10.107.88.17:2379 \--cacert=/etc/kubernetes/pki/etcd/ca.crt \--cert=/etc/kubernetes/pki/apiserver-etcd-client.crt \--key=/etc/kubernetes/pki/apiserver-etcd-client.key"
[root]# source /root/.bash
### member list
[root]# etcdctl member list
4fc005cb2e00078b, started, etcd03, https://10.107.88.17:2380, https://10.107.88.17:2379, false
db6cb663afc3dec9, started, etcd02, https://10.107.88.16:2380, https://10.107.88.16:2379, false
e8107c88a85d3042, started, etcd01, https://10.107.88.15:2380, https://10.107.88.15:237
### member list (以表格呈現)
[root]# etcdctl member list -w tab
### show endpoint status (此處可看到88.16被選為Leader)
[root]# etcdctl endpoint status -w tab### show endpoint status
### 移動leader
[root]# etcdctl endpoint --cluster=true status -w table
[root]# etcdctl --endpoints 10.107.88.16:2379 move-leader 4fc005cb2e00
### 查看所有的key (以路徑的方式呈現)
[root]# ETCDCTL_API=3 etcdctl get / --prefix --keys-on
### 查看特定的key
[root]# etcdctl get /registry/clusterrolebindings/calico-kube-controlle
執行endpoint status之後發現DB size有差異,但3個節點狀態正常,RAFT INDEX 數量一致,可是DB size看到member之間的資料不同步。同時出現有些建立出來的Pod消失了,使用以下指令確認:
# kubectl get pod -n test
※ 大致上的處理流程為以下5個步驟:
S1. 備份正常的ETCD 節點與資料目錄
S2. 清除member/, wal/目錄下的資料(異常的ETCD)
S3. 從正常的ETCD節點,刪除異常的ETCD member
S4. 將異常節點重新加入cluster
S5. 啟動ETCD service
接下來分別演示這5個步驟的內容:
### S1. 備份ETCD 節點與資料目錄
[master]# etcdctl --endpoints=https://192.168.12.15:2379 snapshot save /backup/etcd01-snapshot.db
[master]# etcdctl --endpoints=https://192.168.12.16:2379 snapshot save /backup/etcd02-snapshot.db (異常)
[master]# etcdctl --endpoints=https://192.168.12.17:2379 snapshot save /backup/etcd03-snapshot.db (leader, 目前DB ize最大)
### S2. 清除member/, wal/目錄下的資料(異常的ETCD)
[etcd02]# mv /var/lib/etcd /var/lib/etcd.bak
[etcd02]# tar -czvf etcd-20230308bak.taz.gz /var/lib/etcd
### S3. 從正常的ETCD節點,刪除異常的ETCD (endpoints是正常的leader)
[etcd03]# etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/apiserver-etcd-client.crt \
--key=/etc/kubernetes/pki/apiserver-etcd-client.key \
--endpoints=10.107.88.17:2379 member list
[etcd03]# etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/apiserver-etcd-client.crt \
--key=/etc/kubernetes/pki/apiserver-etcd-client.key \
--endpoints=10.107.88.17:2379 member remove db6cb663af
### S4. 將異常節點重新加入cluster
[etcd02]# mv /etc/kubernetes/manifests/etcd.yaml /etc/kubernetes/manifests-backup/etcd.yaml
[etcd02]# vim /etc/kubernetes/manifests-backup/etcd.yaml
- --initial-cluster=etcd03.test.example.poc=https://10.107.88.17:2380,etcd02.test.example.poc=https://10.107.88.16:2380,etcd01.test.example.poc=https://10.107.88.15:2380- --initial-cluster-state=existing
[etcd02]# etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/apiserver-etcd-client.crt \
--key=/etc/kubernetes/pki/apiserver-etcd-client.key \
--endpoints=10.107.88.17:2379 member add etcd02.test.example.poc --peer-urls=https://10.107.88.16:2380
Member db6cb663afc3dec9 added to cluster 71d4ff56
### S5. 啟動ETCD service (etcd02)
[etcd02]# mv /etc/kubernetes/manifests-backup/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
### 確認
[master]# for count in {15..17};do ETCDCTL_API=3 etcdctl get \
--prefix --keys-only --endpoints=https://10.107.88.${count}:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/apiserver-etcd-client.crt \
--key=/etc/kubernetes/pki/apiserver-etcd-client.key \
| wc -l;done
[master]# for count in {15..17};do ETCDCTL_API=3 etcdctl endpoint status --endpoints=https://10.107.88.${count}:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/apiserver-etcd-client.crt \
--key=/etc/kubernetes/pki/apiserver-etcd-client
本文說明了基本的ETCD的常用操作,實務上當完成ETCD與K8S的串接後,除非有問題,不然我想最常作的應該就是「確認狀態」、「備份與還原」這二個動作。雖然不需要太過針對ETCD進行直接的操作,但是它是一個非常重要的關鍵物件,當K8S出了什麼問題時,真正能救你的可能就是透過還原ETCD來回復整個cluster的狀態了,所以有基本的認識還是必要的。
未來有機會將繼續分享一些整理過的心得、還原Control-Plane的實際操作。再請大家繼續關注。
Reference: