Kubernetes/삽질

node NotReady - kubelet (code=exited, status=255)

비번변경 2022. 2. 22. 00:20

쿠버네티스 클러스터 내 노드 일부가 notReady 상태를 유지하고 있다.

node NotReady

이런 경우는 대부분 노드에서 kubelet이 정상적으로 동작하고 있지 않는 상태일 경우에 해당한다.

describe 명령으로 확인해보면 이런 모양에 가까울 것이다.

describe node

 

kubelet 동작 확인

systemctl 명령으로 kubelet의 상태를 확인해본다.

systemctl status kubelet.service

systemctl status kubelet.service

exit-code와 함께 정상적으로 동작하지 않고 있는 상태임을 확인할 수 있다.

 

만약 아래와 같이 inactive 상태인 경우, kubelet을 재시작한 후의 상태를 확인해보도록 한다.

inactive

 

kubelet 시작/재시작

# 시작
systemctl start kubelet.service

# 재시작
systemctl restart kubelet.service

 

kubelet 로그 확인

정상적으로 동작하고 있지 않다면, 아래 명령어로 kubelet 로그를 확인한다.

journalctl -xefu kubelet

# 또는
journalctl -f | grep kubelet

내 경우 문제가 되는 부분은 아래와 같은 내용이었다.

 

1. swap 메모리

Feb 09 04:03:15 <HOSTNAME> kubelet[47471]: F0209 04:03:15.377781   47471 server.go:265] failed to run Kubelet: running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false. /proc/swaps contained

쿠버네티스에서는 기본적으로 swap 메모리를 허용하지 않는다고 한다. (참고 문서 : 191120 why k8s disable swap? )

swap을 사용할 필요가 없어서, 비활성화하여 문제를 해결했다.

 

swap 메모리 비활성화

swapoff -a

 

2. hostname

내 경우에는 서버 재기동 이후 발생한 문제였는데, 서버 재기동하면서 hostname이 변경되었었다. 문제가 되던 환경에서는 hostname과 node 이름이 연관이 있었는지, 아래 메시지처럼 노드를 찾을 수 없다는 메시지가 확인되었다.

Feb 09 04:03:43 <HOSTNAME> kubelet[47738]: E0209 04:03:43.600493   47738 kubelet.go:2183] node "<NEW_NODE_NAME>" not found
Feb 09 04:03:43 <HOSTNAME> kubelet[47738]: E0209 04:03:43.501900   47738 controller.go:136] failed to ensure node lease exists, will retry in 200ms, error: leases.coordination.k8s.io "<HOSTNAME>" is forbidden: User "system:node:<ORIGIN_NODE_NAME>" cannot get resource "leases" in API group "coordination.k8s.io" in the namespace "kube-node-lease": can only access node lease with the same name as the requesting node
Feb 09 04:03:43 <HOSTNAME> kubelet[47738]: E0209 04:03:43.630057   47738 kubelet_node_status.go:92] Unable to register node "<NEW_NODE_NAME>" with API server: nodes "<NEW_NODE_NAME>" is forbidden: node "<ORIGING_NODE_NAME" is not allowed to modify node "<NEW_NODE_NAME>"
Feb 09 04:03:43 <HOSTNAME> kubelet[47738]: E0209 04:03:43.730318   47738 eviction_manager.go:260] eviction manager: failed to get summary stats: failed to get node info: node "<NEW_NODE_NAME>" not found

 

따라서 node 명과 동일하게 서버의 hostname을 설정해주었다.

 

Ubuntu hostname 설정 명령어

hostnamectl set-hostname <HOSTNAME>

 

 


k8s swap 사용 필요 시 https://jwcheong0420.github.io/2020/02/05/enabling-swap-in-k8s/ 참고