공부하면서/Kubernetes

[장애경험] master 없는 worker 노드들 살리기

omelette master 2023. 7. 28. 00:29
해결책을 적어놓은게 아니라 있었던 일을 적어놓은 것

요약

  • velero + minio 로 일일 백업중인 k8s cluster
  • master 1대가 reset 되어 버림, worker들 이전 master 정보만 바라봄
  • cluster 다시 구축후 velero + minio로 복구

상황

부랴부랴 저녁 8시에 도착해서 직접 본 상황은...
master 1대와 worker 12대로 이루어진 kubernetes cluster 환경에서
master와 worker 2대가 reset 되어 있었고
갑자기 master가 뿅 하고 사라지니 나머지 10대의 worker들은 어리둥절 하는 상황😵
원래 계획은 worker 2대 삭제 하는거였는데 inventory(ansible)에 master에 대한 정보도 같이 넣어 발생한거라고 한다


그러면 그냥 수동으로 kubeadm, kubelet 다 정리 해버리고 새로 하면 안될까? 싶은 맘도 있지만
별도의 플랫폼을 사용하여 구축된 k8s고 (무슨 플랫폼인지는... 적어놓진 않겠다)
그 내부에는 ansible을 이용하여 각 노드들에 배포하는 playbook이 구성되어 있다
 
수동으로 각 노드들의 kubernetes 관련 패키지들을 제거 하자는 의견도 있었으나
해당 플랫폼의 동작방식을 이해할수 없는 상황에서
수동으로 제거시 추적이 힘들거라는 괜한 의심이 들어서 하지 말자고 했었다
그래서 playbook 동작시 verbose로 오류내용 파악하여
최소한의 조건만 맞추어 초기화 하고 다시 구축하는 방식이 가장 간편하다고 판단 되었다
 
그나마 다행인점은 기존에 velero + minio를 이용하여 주기적으로 nas에 백업이 되던 상황이였고
나는 고장난 클러스터를 깔끔하게 삭제후 다시 구축하여 백업된 velero + minio data 연동후 cluster 복구 하는 과정을 목표로 작업했다.

재미있던 점은 내가 회사 소속이 아니다보니 동행한 회사 직원이 액션을 해줘야 했다는점 이다
책임소지 때문에 그렇다나...
그러다보니 고스트 바둑왕마냥 뒤에서 훈수만 두어야 하는 상황이였는데 (사실 고스트바둑왕 안봤음)
액션을 취하는 직원도 엄청난 부담이였을것이다 (1년도 안된 신입이지만 아주 잘한다)
양옆에 담당자들이 있고 뒤에는 내가 있고...


일단 증상을 확인하기 위해 기존 worker들을 플랫폼을 이용해 reset을 진행했다
쭉쭉쭉 가다가 빨갛게 떨어지는 오류...
FAILED - RETRYING: reset | stop all cri pods
이게 뭘까 싶어서 verbose로 찍어보니
worker에서 crictl pods -q 를 이용하여 띄어져 있는 pod들의 ID를 조회하고
circtl stop을 진행하면서 떨어지는 오류였는데
x509 certificate error ...
이때 왜 crictl 로 작업하는데 master의 허락을 받아야 할까? 가 궁금했었다
저 x509 오류 출력으로 인하여 여러 고민을 했었는데
 
1. 새로 생성된 master의 인증정보를 초기화 되지 않은 각 worker의 kubelet에 적용하여 join 시키기
2. 어짜피 망가진거 지금이라도 수동으로 하기 (다시 화두에 오른 내용)
3. OS 재설치 (가장 깔끔하지만 OS 설치 담당자가 들어와서 작업 해야하는거라 언제될지 모르는 상황)
다행히 이 3가지 방법중에 하나도 선택하지 않았다
 
결국 열심히 찾다보니 진행한 방법은
x509가 발생하는 원인 찾기ㅋㅋ
정답 아닌 내 생각이지만 crictl 에서 master에 통신하려는 이유가 cni와 묶여있어서 그런것 아닐까 라는 생각을 했다
다행히 시간이 지나 급하다보니 나도 작업을 할수 있었고


작업 하다보니 알게된점

 

Reset cluster and remove node error at crictl can't remove all pods · Issue #7177 · kubernetes-sigs/kubespray

Hi. This error occured with error at bellow . I create cluster with Containerd runtime and Calico. This issue appear from this commit fix crictl path. But afterwards crictl still error 😢 . Please f...

github.com

동일 증상이 별로 없는것인지 검색을 잘 못한 문제인지 키워드를 crictl 과 x509에 초점을 맞추다 보니 찾은 crictl issue
ip netns list | cut -d' ' -f 1 | xargs -n1 ip netns delete; crictl rmp -af
ip netns list 를 통해 현재 사용중인 컨테이너 네트워크 네임스페이스들이 출력되고
ip netns delete 로 네트워크 네임스페이스를 지워버린다
그뒤에 crictl rmp로 pod 제거


효과는 아주 좋았다
master가 없는 상황에서 이미 exited 된 pod들 밖에 없어서 그런지 잘 삭제 된다
crictl rmp -af를 하는데 에러가 발생하여 삭제가 안된다면
systemctl restart containerd 를 다시 해주면 된다
그 뒤에 /etc/cni 도 삭제 해주고...
 
이렇게 하여 13대의 서버들을 전부 reset 완료 하고
다시 클러스터를 구축
다시 플랫폼을 이용하여 구축하는 과정에서 
당연하게도 한번에 되진 않았지만...
k8s 자체는 문제 없지만 플랫폼에서 지원하는 third party 들이 역시 문제...
 
metallb를 설치하고 metallb 서비스 IP를 참조하여 dex와 traefik을 진행한다
이때 관련 auth 셋팅을 하는데 SAN(Subject Alternative Name) 에 metallb에 IP에 대한 정보가 없어 https가 안된다는 오류가 발생

해당 문제는 인증서 갱신후 kubelet 재시작

kubeadm init phase certs all --config /etc/kubernetes/kubeadm-config.yaml
kubeadm init phase kubeconfig all --config /etc/kubernetes/kubeadm-config.yaml  
systemctl restart kubelet

이후 velero와 minio 관련하여 pv,pvc 진행 해주셨고

third party들 설치가 끝나고나서 올라온 velero를 이용하여 복구했다...

velero 사용경험이 없다보니 복구시 짠! 하고 모든게 복구되는줄 알았는데

천천히 복구되는 느낌?

기다리다 보면 하나씩 올라오는게 나름 순차적으로 하는게 있는것 같았다.

결국 새벽 3시 정도에 작업 마무리되어 올라오는 서비스 하나씩 보며 백수 라이프 이야기로 시간을 보냈다.

알바비도 낭낭하게 받고...🥰🥰


마치며...

백수 상태여서 해도 되는건가 했었는데

이런 경험은 또 처음이기도 했고, 알바비 챙겨준다니까...

언젠가 내가 경험할수도 있는 일이라고 생각하니 나쁘진 않았다

 

'공부하면서 > Kubernetes' 카테고리의 다른 글

CKS 자격증  (0) 2024.04.11
[Kubernetes] kind  (0) 2022.12.22
[Kubernetes] 설치  (0) 2022.12.22
CKAD 자격증  (0) 2022.03.01
CKA 자격증  (0) 2021.09.02