MLOPS/kubernetes
워커노드가 주기적으로 NotReady인 문제 해결
개발허재
2023. 10. 29. 17:36
상황
쿠버네티스 클러스터의 워커노드 1번 VM의 컴퓨팅 자원 Scale Up을 진행했습니다.
그 후, 몇일이 지나 워커노드가 NotReady 상태인 이슈가 발생했습니다.
당시에는 수동으로 kubelet restart를 해주어 해결했는데, 계속 주기적으로 워커노드 NotReady인 상황이 발생했습니다.
kubelet 에러 메세지는 아래와 같습니다.
Aug 07 10:06:02 MD2-L-KNUH-WIDE-KUBESPAWNER-WORKER-001 kubelet[40194]: E0807 10:06:02.918771 40194 conn.go:254] Error on socket receive: read tcp 127.0.0.1:45467->127.0.0.1:40854: use of closed network connection
Aug 07 11:10:12 MD2-L-KNUH-WIDE-KUBESPAWNER-WORKER-001 kubelet[40194]: E0807 11:10:12.424641 40194 conn.go:254] Error on socket receive: read tcp 127.0.0.1:45467->127.0.0.1:41678: use of closed network connection
Aug 07 18:52:10 MD2-L-KNUH-WIDE-KUBESPAWNER-WORKER-001 kubelet[40194]: E0807 18:52:10.911930 40194 kubelet_node_status.go:388] Error updating node status, will retry: error getting node "md2-l-knuh-wide-kubespawner-worker-001": Get https://10.80.185.23:6443/api/v1/nodes/md2-l-knuh-wide-kubespawner-worker-001?resourceVersion=0&timeout>
Aug 07 18:52:18 MD2-L-KNUH-WIDE-KUBESPAWNER-WORKER-001 kubelet[40194]: E0807 18:52:18.228292 40194 controller.go:170] failed to update node lease, error: Put https://10.80.185.23:6443/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/md2-l-knuh-wide-kubespawner-worker-001?timeout=10s: net/http: request canceled (Client.Ti>
Aug 07 18:52:20 MD2-L-KNUH-WIDE-KUBESPAWNER-WORKER-001 kubelet[40194]: E0807 18:52:20.912330 40194 kubelet_node_status.go:388] Error updating node status, will retry: error getting node "md2-l-knuh-wide-kubespawner-worker-001": Get https://10.80.185.23:6443/api/v1/nodes/md2-l-knuh-wide-kubespawner-worker-001?timeout=10s: context dead>
Aug 07 18:52:20 MD2-L-KNUH-WIDE-KUBESPAWNER-WORKER-001 kubelet[40194]: E0807 18:52:20.917931 40194 event.go:265] Unable to write event: 'Post https://10.80.185.23:6443/api/v1/namespaces/wide-file-manager/events: read tcp 10.80.185.120:42920->10.80.185.23:6443: use of closed network connection' (may retry after sleeping)
원인
메모리 이슈로 인한 문제라는 가설을 세우고 워커 노드의 메모리 관련 에러 로그를 해당 시간 범위내에서 찾아봤지만 아니었습니다.
네트워크 관련 이슈라는 가설을 세우고 인프라팀에 문의하였지만, 역시 아니었습니다.
해결
따라서, Kubernetes 소프트웨어 단에서의 이슈라고 판단했고 해당 이슈와 비슷하게 논의된 Github Issue를 발견하게 되었습니다.
(링크: https://github.com/kubernetes/kubernetes/issues/87615)
현재 사용중인 Kubernetes는 1.19 이하 버전이었고 해당 깃헙 이슈에 따르면 1.19 버전부터 반영이 되었다고 하고 있습니다.
따라서, Kubernetes 업그레이드를 하는 것을 2차 목표로 하고, 1차로 Hot-fix하기 위해 아래와 같이 워커 노드에 적용하여 해결할 수 있었습니다.
Cron Job Shell Script 작성
$ mkdir /crontab
$ chmod 777 -R /crontab
$ vi restart-kubelet.sh
#!/bin/bash
# Calculate the timestamp 5 minutes ago
timestamp=$(date -d "5 minutes ago" +"%Y-%m-%d %H:%M:%S")
# Search logs from the last 5 minutes for the error message
output=$(journalctl -u kubelet --since "$timestamp" | grep "Error updating node status")
if [[ $? != 0 ]]; then
echo "Error not found in logs"
elif [[ $output ]]; then
echo "Restart kubelet"
systemctl restart kubelet
fi
5분마다 Cron Job 실행
$ crontab -e
# 크론탭 에딧 창에 아래와 같이 크론탭 스크립트 수정
*/5 * * * * /bin/bash /crontab/restart-kubelet.sh >> /var/log/cron/restart-kubelet.log
$ service cron restart