探索 ETCD 操作:來自日常操作和故障排除經驗分享

2023/11/20閱讀時間約 12 分鐘

接續上一篇文章,本文再深入一點關於ETCD基本操作以及在其他文章中關於ETCD節點資料不一致情況的除錯內容分享,還沒看過上一篇文章的話,可以到以下連結:

接下來將分成下列幾項來分享,先是一些關於實作的記錄,再來分享在別篇文章看到關於節點資料不一致的處理過程,個人覺得任何經驗都是非常有價值的,除了自已不斷進步之外,透過多看不同的情境下所出現的問題與處理方式還可以讓自已的學習更為有效。

日常?

日常?

以下為本文章節:

  1. CLI工具安裝與Alias設定
  2. 基本操作
  3. 資料量不一致怎麼辦
  4. 結論

那就開始吧!!


1. CLI工具安裝與Alias設定

首先先進行操作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
  • endpoints : 指向外部3台ETCD nodes的2379port
  • cacert, cert, key : 指向ETCD建置時所產生的憑證

2. 基本操作

### 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
raw-image
### show endpoint status (此處可看到88.16被選為Leader)

[root]# etcdctl endpoint status -w tab### show endpoint status
raw-image
### 移動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
raw-image
### 查看特定的key

[root]# etcdctl get /registry/clusterrolebindings/calico-kube-controlle

3. 資料量不一致怎麼辦

執行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
raw-image

4. 結論

本文說明了基本的ETCD的常用操作,實務上當完成ETCD與K8S的串接後,除非有問題,不然我想最常作的應該就是「確認狀態」、「備份與還原」這二個動作。雖然不需要太過針對ETCD進行直接的操作,但是它是一個非常重要的關鍵物件,當K8S出了什麼問題時,真正能救你的可能就是透過還原ETCD來回復整個cluster的狀態了,所以有基本的認識還是必要的。

未來有機會將繼續分享一些整理過的心得、還原Control-Plane的實際操作。再請大家繼續關注。


Reference:

10會員
40內容數
記錄IT社畜的自我學習筆記,如同專題名稱,主要是怕自已忘記自已做過什麼、學到什麼。索性就分享我自已在學習Kubernetes這條路上的各種測試、學習心得。
留言0
查看全部
發表第一個留言支持創作者!