[Kubernetes-etcd] etcdctl 설치 및 사용
읽기에 앞서 호스트명 확인 하세요.
etcdctl 다운로드 및 설정 하기
---
ETCD_VER=v3.4.12
# choose either URL
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
---
vi etcd.sh로 해당 내용 복사 붙여넣기 후, sh etcd.sh로 실행하면 됨.
혹은 tar 파일만 저장하고, 따로 설정을 해주고 싶은 경우.
---
ETCD_VER=v3.4.12
# choose either URL
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
---
---
mkdir -p /tmp/etcd-download-test
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
---
따로 스크립트 만들어서 실행해주면 됨.
이 후,
# vi ~/.bashrc
아래 내용 추가
---
alias etcdctl="export ETCDCTL_API=3; /tmp/etcd-download-test/etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key --endpoints=127.0.0.1:2379"
---
적용
source ~/.bashrc
# etcdctl version
[root@test-2 ~]# etcdctl version
etcdctl version: 3.4.12
API version: 3.4
테스트를 위해 etcd에서 CrashLoopBackOff 상태를 만들어 줌.
# systemctl stop kubelet && systemctl stop docker
# rm -rf /var/lib/etcd/member/snap/
# rm -rf /var/lib/etcd/member/wal/
# systemctl restart docker && systemctl restart kubelet
etcd가 동작을 안하니, 자연스럽게 api-server도 문제가 발생함.
etcd member 조회
# etcdctl --write-out=table member list
[root@test-2 ~]# etcdctl --write-out=table member list
+------------------+---------+--------+----------------------------+----------------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+--------+----------------------------+----------------------------+------------+
| 70e2268f082b4628 | started | test-2 | https://192.168.85.14:2380 | https://192.168.85.14:2379 | false |
| 7578680c0a984b7b | started | test-3 | https://192.168.85.15:2380 | https://192.168.85.15:2379 | false |
| f6be366b95916aaf | started | test-1 | https://192.168.85.13:2380 | https://192.168.85.13:2379 | false |
+------------------+---------+--------+----------------------------+----------------------------+------------+
장애가 발생을 하더라도 member를 조회를 하더라도, started 상태를 유지 하고 있음.
최신 정보로 업데이트를 해주려면 해당 멤버를 삭제 해야 함.
[root@test-2 ~]# etcdctl member remove 7578680c0a984b7b ## 멤버 조회시 문제가 있는 ID
Member 7578680c0a984b7b removed from cluster db5d45d17d68db70
[root@test-2 ~]# etcdctl --write-out=table member list
+------------------+---------+--------+----------------------------+----------------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+--------+----------------------------+----------------------------+------------+
| 70e2268f082b4628 | started | test-2 | https://192.168.85.14:2380 | https://192.168.85.14:2379 | false |
| f6be366b95916aaf | started | test-1 | https://192.168.85.13:2380 | https://192.168.85.13:2379 | false |
+------------------+---------+--------+----------------------------+----------------------------+------------+
삭제가 된 것을 확인 할 수 있음.
이 후, 다시 멤버로 추가 함.
etcd member 추가
# etcdctl member add {etcd_name} --peer-urls=https://{master_IP}:2380
>> etcd_name에 추가할 호스트명을 기입하지 않도록 주의
호스트명 넣었다가 클러스터 나가서 고생좀 함.
[root@test-2 ~]# etcdctl member add etcd3 --peer-urls=https://192.168.85.15:2380
Member 14787f76acd8309 added to cluster db5d45d17d68db70
ETCD_NAME="etcd3"
ETCD_INITIAL_CLUSTER="etcd3=https://192.168.85.15:2380,test-2=https://192.168.85.14:2380,test-1=https://192.168.85.13:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.8515:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"
[root@test-2 ~]# etcdctl --write-out=table member list
+------------------+-----------+--------+----------------------------+----------------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+-----------+--------+----------------------------+----------------------------+------------+
| 14787f76acd8309 | unstarted | | https://192.168.85.15:2380 | | false |
| 70e2268f082b4628 | started | test-2 | https://192.168.85.14:2380 | https://192.168.85.14:2379 | false |
| f6be366b95916aaf | started | test-1 | https://192.168.85.13:2380 | https://192.168.85.13:2379 | false |
+------------------+-----------+--------+----------------------------+----------------------------+------------+
[root@test-3 ~]# rm -rf /var/lib/etcd/
[root@test-3 ~]# reboot
[root@test-3 ~]# etcdctl member list --write-out=table
+------------------+---------+--------+----------------------------+----------------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+--------+----------------------------+----------------------------+------------+
| 70e2268f082b4628 | started | test-2 | https://192.168.85.14:2380 | https://192.168.85.14:2379 | false |
| a19f08aebf17bd42 | started | test-3 | https://192.168.85.15:2380 | https://192.168.85.15:2379 | false |
| f6be366b95916aaf | started | test-1 | https://192.168.85.13:2380 | https://192.168.85.13:2379 | false |
+------------------+---------+--------+----------------------------+----------------------------+------------+
멤버 조회 시 정상적으로 기동 된 것을 확인 할 수 있음.
이 때, /vat/lib/etcd의 member데이터도 정상적으로 파일이 생겼는지 확인 가능 db 파일 확인
-------번외1 (member list에서 CLIENT ADDRS 다른 경우)
멤버를 조회 할때 클라이언트 주소가 VIP로 설정된 경우가 있음.
원인은 모르겠는데 추측헌데, 장애로 vip가 다른 노드로 옮겨 가서 재기동이 된 것이 큼
이때, /etc/kubernetes/manifests/etcd.yaml에서 ip 변경하면 etcd pod가 재기동 되면서 클라이언트 주소가 변경됨
------ 번외2 (member list에서 PEER ADDRS 다른 경우)
이 경우에도 원인은 모르겠으나, 호스트 IP로 설정되야 하는데 vip로 설정이 된 경우가 있음.
혹은 인터페이스가 많아서 k8s에서 제대로 못찾거나
이때, etcdctl member update {member_ID} --peer-urls=https://{master_IP}:2380 로 변경하면 됨.