ex1. 마스터 노드가 죽었다
이 글은 저녁 6시부터 다음날 아침 6시까지의 긴박했던 시간에 대한 기록이다.
현재 회사 내부에서는 소규모 k8s 클러스터를 구축, 1개의 마스터 노드와 3개의 워커 노드, 1개의 dns 서버와 1개의 nfs 서버로 구성되어 있다.
자원에 여유가 없으니 여러 개의 마스터 노드를 둬 HA를 구성하기는 커녕 앱의 레플리카를 여러 개 띄우는것도 어려운 상황이다.
문제는 node-exporter, prometheus, grafana로 구성된 모니터링 서버에서 발견되었다.
레드마인, 깃랩 및 클러스터의 리소스 모니터링을 구성해두고 있었는데, 24시간당 약 90분가량 데이터가 뽑히지 않는 현상이 발생했다.
클러스터를 살펴봤는데, prometheus가 수십 번 리스타트된 기록이 있었다. 또한 nodejs + mongodb로 구성된 사내 데이터 공유용 웹 서버가 있는데, 해당 서버도 동일하게 수십 번 리스타트되었다.
cpu 또는 메모리 문제로 추측하고 리소스를 살펴보았는데, 마스터 노드가 NotReady 상태가 되어있었다.
kubectl get nodes -o wide
마스터 노드에서는 운영용 파드를 띄우지 않으므로 당장은 괜찮았으나, 별도 관리를 위해서는 정상화가 필요했다.
크게 생각하지 않고 마스터 노드의 kubelet을 재시작했는데, kubectl 명령에서 최악의 에러가 뜨기 시작했다.
service kubelet restart
kubectl ...
The connection to the server <host>:6443 was refused - did you specify the right host or port?
그렇다. 마스터 노드가 죽은것이다.
패닉에 빠진 나는 구글링을 좀 해보다가, 최악의 선택을 하고 만다.
kubeadm reset
자, 이제 마스터노드는 초기화되었다.
다행인 점은 이미 동작중이었던 워커 노드와 운영 중인 파드는 마스터노드와 관계없이 동작하고 있었다는 점이다.
즉, 마스터 노드가 죽어도 워커 노드는 알아서 동작한다. 단, 한 번 죽으면 되살릴 수는 없게되지만 말이다.
나는 여기서 우선 비슷한 사례를 찾아보려 했다.
워커 노드는 정상동작하고, 마스터 노드가 초기화 되었을 때 다시 마스터 노드를 워커 노드 무리에 붙일 방법이 있을까?
답을 찾지 못했고, 결국 처음부터 클러스터를 새로 구축하고 기존의 파드를 다시 띄우는 대장정을 시작하게 됐다.