마스터 노드를 제거하고 신규 워커노드를 마스터 노드로 Join 시킬 때

작성자 김민태 수정일 2024-06-20 14:06

#마스터, #워커, #master, #worker, #join

특정 고객사측의 요구로 인해, 3개의 마스터 노드가 이중화 클러스터링이 되어 있는 경우

기존 마스터 노드를 제거하고 신규 워커노드를 마스터 노드로 편입시키는 요구사항이 있을 수있다.


이러한 경우 아래의 가이드를 통해 서비스 중단 없이 새로운 마스터노드를 Control-plane 노드로 Join이 가능하다.



▼ 현재 서버 구성 상황

총 5개의 클러스터로

devai 및 aiops POD들은  마스터3,워커1, 워커2  에서 구동되게 설정 되어 있음.

> 마스터1과 마스터2에는 학습 및 운영 파드가 기동되지 않음 (순수 컨트롤 플레인 노드)






▼ 변경 될 서버 구성

❖ 제거 대상 : 마스터3 , 워커2

 → 기존 워커 1 노드를 → 마스터3번으로 변경

  마스터3번을  클러스터링 포함




위와 같은 작업을 진행하고자 할 때 참고 할 수 있는 가이드를 아래에 서술하므로

향후 관련 작업 진행하게 될시 참고하면 Mode 서비스가 중단되지 않고 Maste 노드의 제거 및 Join이 가능하게 된다.


  ✓ 가이드는 SPSD 3.0 제품을 기준으로 설명하였으나, 다른 제품도 크게 다르지는 않을 것으로 생각함







- 사전 준비 사항- 

만약 L4스위치 및 로드밸런싱이 되어있는 클러스터였다면, 신규로 편입 될 마스터 노드는 본디 워너 노드 였으므로
해당 워커 노드와 L4 스위치 같에 통신 및 6443 포트 통신이 되는지 확인이 필요하다.





기존 kubeadm 의 Config 구성 백업
kubeadm config view

위 명령어 입력시 출력 되는 Cluster 구성원 정보를 확인한다. (L4 및 로드밸런서 주소가 

> 일반적으로 설치 디렉토리 하위에 kubeadm.yaml 이라는 파일로 이미 생성되어 있을 가능성이 높음.



제거 될 마스터3번 노드에서의 label 정보들 백업
kubectl get nodes --show-labels

신규 Join하게 될 워커 노드에게도 기존 마스터 노드가 가지고 있던 label 정보를 동일하게 기입하기 위해 미리 백업을 해둔다.




신규 편입 될 워커노드에서 helm 명령어 작동 여부 확인
helm --help

스파클링소다 3.0의 컨트롤 플레인 노드들은 helm 명령어를 모든 마스터 노드에 설치하므로 각 노드가 helm이 동작해야 한다.

하지만 신규로 편입 될 워커 노드를 기존 마스터 노드가 아니었을 것이므로 helm을 사용할 수 있게 /usr/local/bin 하위에 helm을 복사하여야 한다.


만약 helm 명령어가 동작하지 않을 경우 3.0 기존 설치 스크립트를 사용하여 설치가 가능

cd ./sparklingsoda_bnk/install/helm
bash install_client_helm.sh

> client_helm으로 실행하면 됨.

   일반 install_helm.sh로 실행하여 helm을 설치하는 경우 tiller 파드를 apply 하므로 필요치 않은 기능이 포함되어 있음.






기존 마스터 노드를 제거
kubectl drain spsd-master3 --delete-local-data --force --ignore-daemonsets

kubectl delete node spsd-master3


etcd 멤버 제거를 위해 etcd 파드 컨테이너로 접근
kubectl exec -it etcd-spsd-master -nkube-system /bin/sh

❖ etcd 파드 내부에는 bash가 없으므로 sh로 접근해야 함.




etcd의 Member 리스트 조회


ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--endpoints=https://192.168.50.112:2379 \
member list


----------------------
member list> > > >
---------------------- 
1024aafa70e55992, started, spsd-master, https://192.168.50.112:2380, https://192.168.50.112:2379
22daec9339aa7280, started, spsd-master2, https://192.168.50.113:2380, https://192.168.50.113:2379
e493c0598f15a2d6, started, spsd-worker1, https://192.168.50.115:2380, https://192.168.50.115:2379

 --endpoints= 기입 될 주소는 상황에 맞게 L4스위치 VIP 및 마스터 노드1의 IP를 알맞게 입력



etcd 멤버 삭제


위 명령어로 조회 시 제거될 노드의 HOSTNAME의 etcd member의 ID가 맨 앞에 출력

해당 Member ID를 복사하여 아래의 명령어를 이어서 실행


ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--endpoints=https://192.168.50.112:2379 \
member remove 2d12cea7bcef7927

 > 마지막 줄의 member remove <ETCD-MEMBER_ID> 를 상황에 맞게 기입합니다.





kubeadm의 Cluster 구성 Config 수정
kubectl get cm -nkube-system | grep kubeadm

> 조회 된 ConfigMap이 kubeadm-config 이라면
kubectl edit cm kubeadm-config -nkube-system

제거 될 마스터 노드의 IP및 HOSTNAME을  신규 Worker노드 정보로 교체합니다.





제거 될 마스터 노드에서 kubeadm reset
kubeadm reset

제거 후 /etc/kubernetes 및 /root/.kube/ 등 제거




마스터 1번 노드에서 join 키 생성
bash create_master_join_file.sh 

> 실행시 출력되는 값 복사하여 신규 워커노드에서 install_master_join.sh 이름으로 생성





마스터 노드로 이동하여 제거할 워커 노드 제거 후 마스터로 편입 준비
kubectl drain spsd-worker1 --delete-local-data --force --ignore-daemonsets
kubectl delete node spsd-worker1



제거 된 노드에서 불필요 히스토리 파일 삭제
kubeadm reset

rm -rf /var/lib/kubelet /etc/cni/net.d /var/lib/dockershim /var/run/kubernetes /var/lib/cni

iptables -F



reset 완료 된 워커노드를 컨트롤 플레인 노드로 Join 실행
bash install_another_master.sh



마스터1 노드로 이동하여 기존 마스터3 IP 흔적 수정
cd /etc/kubernetes
find . -type f -exec sed -i 's/192.168.50.114/192.168.50.115/g' {} +

혹시 모르니 나중 인증서 갱신 때 헷갈리지 않기 위해 설치 스크립트에 있는 config.yaml이나 kubeadm.yaml을 미리 IP 수정





마스터1,2 노드 crt 키 제거 후 재갱신
cd ./pki
rm -f apiserver.{crt,key}
rm -f etcd/peer.{crt,key}
rm -f etcd/server.{crt,key}




kubeadm.yaml 파일이 위치한 곳으로 이동하여 key 재생성
kubeadm init phase certs apiserver  --config kubeadm.yaml
kubeadm init phase certs etcd-peer --config kubeadm.yaml
kubeadm init phase certs etcd-server --config kubeadm.yaml

> 마스터1,2, 모두 시행




마스터 노드들 재기동  (1,2)
systemctl restart kubelet


이후 라벨링 작업 및 /data/ 디렉토리 volume_bin 파일 위치 제대로 확인 후 POD상태 확인
















아티클이 유용했나요?

훌륭합니다!

피드백을 제공해 주셔서 감사합니다.

도움이 되지 못해 죄송합니다!

피드백을 제공해 주셔서 감사합니다.

아티클을 개선할 수 있는 방법을 알려주세요!

최소 하나의 이유를 선택하세요
CAPTCHA 확인이 필요합니다.

피드백 전송

소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.

02-558-8300