목표 ETCD 노드를 추가 및 제거해보기
ETCD 노드(k8s-node5) 추가
inventory.ini를 수정하자.etcd노드만을 추가하기 위해서 아래와 같이 변경한다 .
k8s-node4(삭제완료), 5는 워커노드로도 사용되지 않았던 노드이다.- 만약에 워커노드나 컨트롤 플레인으로 사용되었던 노드라면 먼저 해당 노드를 제거해야한다.(
remove-node.yml)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| cat << EOF > /root/kubespray/inventory/mycluster/inventory.ini
[kube_control_plane]
k8s-node1 ansible_host=192.168.10.11 ip=192.168.10.11 etcd_member_name=etcd1
k8s-node2 ansible_host=192.168.10.12 ip=192.168.10.12 etcd_member_name=etcd2
k8s-node3 ansible_host=192.168.10.13 ip=192.168.10.13 etcd_member_name=etcd3
[etcd]
k8s-node1 ansible_host=192.168.10.11 ip=192.168.10.11 etcd_member_name=etcd1
k8s-node2 ansible_host=192.168.10.12 ip=192.168.10.12 etcd_member_name=etcd2
k8s-node3 ansible_host=192.168.10.13 ip=192.168.10.13 etcd_member_name=etcd3
k8s-node4 ansible_host=192.168.10.14 ip=192.168.10.14 etcd_member_name=etcd4
k8s-node5 ansible_host=192.168.10.15 ip=192.168.10.15 etcd_member_name=etcd5
EOF
|
cluster.yml 실행- 실행하는 시점에서
etcd 노드는 짝수가 될 것이나 모든 기능은 정상적으로 작동해야하며 노드를 제거하기 전에 클러스터가 새로운 etcd 리더를 선출하려고 할때만 문제가 발생할 수 있다. (하지만 실행중 애플리케이션은 계속해서 사용가능) - 한번에 여러 ETCD 노드를 추가하는 경우에는 리트라이 횟수를 늘리는 옵션을 적용하자.
1
2
| ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml \
--limit=etcd,kube_control_plane -e ignore_assert_errors=yes -e etcd_retries=10
|
- 모든 컨트롤 플레인에서
kube-apiserver.yaml을 편집한다.
1
| vi /etc/kubernetes/manifests/kube-apiserver.yaml
|
1
2
3
| ..
- --etcd-servers=https://192.168.10.11:2379,https://192.168.10.12:2379,https://192.168.10.13:2379, https://192.168.10.14:2379, https://192.168.10.15:2379
..
|
1
2
3
4
5
| ssh k8s-node1 cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd-servers
ssh k8s-node2 cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd-servers
ssh k8s-node3 cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd-servers
|
1
| for i in {1..5}; do echo ">> k8s-node$i <<"; ssh k8s-node$i etcdctl.sh endpoint status -w table; echo; done
|
ETCD 노드 삭제
ETCD 5대에서 다시 3대로 줄여보자 (홀수 유지)
- 노드가 꺼져있을 때에는 아래 옵션 추가
-e node=k8s-node5 -e reset_nodes=false-e allow_ungraceful_removal=true
- etcd 멤버에서 제거
왜 인벤토리에 남겨둔 채로 실행하나? → Kubespray가 해당 노드에 접속해서 etcd 서비스 중지, 데이터 정리, 인증서 삭제 등 클린업을 수행해야 하기 때문
1
2
| #k8s-node5 제거
ansible-playbook -i inventory/mycluster/inventory.ini remove-node.yml -e node=k8s-node5
|
1
2
| #k8s-node4 제거
ansible-playbook -i inventory/mycluster/inventory.ini remove-node.yml -e node=k8s-node4
|
1
2
3
4
5
6
7
8
9
10
11
| cat << EOF > /root/kubespray/inventory/mycluster/inventory.ini
[kube_control_plane]
k8s-node1 ansible_host=192.168.10.11 ip=192.168.10.11 etcd_member_name=etcd1
k8s-node2 ansible_host=192.168.10.12 ip=192.168.10.12 etcd_member_name=etcd2
k8s-node3 ansible_host=192.168.10.13 ip=192.168.10.13 etcd_member_name=etcd3
[etcd]
k8s-node1 ansible_host=192.168.10.11 ip=192.168.10.11 etcd_member_name=etcd1
k8s-node2 ansible_host=192.168.10.12 ip=192.168.10.12 etcd_member_name=etcd2
k8s-node3 ansible_host=192.168.10.13 ip=192.168.10.13 etcd_member_name=etcd3
EOF
|
1
2
| ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml \
--limit=etcd,kube_control_plane -e ignore_assert_errors=yes -e etcd_retries=10
|
1
| vi /etc/kubernetes/manifests/kube-apiserver.yaml
|
1
| - --etcd-servers=https://192.168.10.11:2379,https://192.168.10.12:2379,https://192.168.10.13:2379
|
1
| for i in {1..5}; do echo ">> k8s-node$i <<"; ssh k8s-node$i etcdctl.sh endpoint status -w table; echo; done
|
중요 인벤토리에서 먼저 삭제하면 remove-node.yml이 해당 노드에 접근할 수 없어 클린업이 안 된다. 반드시 제거 실행 후 인벤토리 삭제 순서를 지키자.