Kubernetes Node 재실행 후 swap 으로 인한 kubelet 무한 재시작

최근 홈 서버에 Kubernetes 클러스터를 구성하던 중, 노드가 재실행한 후에 노드가 NotReady 상태로 떨어지며 kubelet 이 계속 재시작되는 문제를 겪었다.
systemd 로그를 확인해 보니, kubelet 이 무한 재시작되며 restart counter 가 6500회를 넘는 심각한 상태였다.

🔍 문제 상황

계속 재시작 되는 노드로 들어가서 kubelet 서비스 상태를 확인하면 다음과 같은 메시지가 반복적으로 출력된다.

> sudo systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; preset: enabled)
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: activating (auto-restart) (Result: exit-code) since Sun 2025-11-23 10:52:13 KST; 1s ago
Docs: https://kubernetes.io/docs/
Process: 150004 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=1/FAILURE)
Main PID: 150004 (code=exited, status=1/FAILURE)
CPU: 90ms

> sudo journalctl -u kubelet -n 50 --no-pager
Nov 23 10:52:54 systemd[1]: kubelet.service: Main process exited, code=exited, status=1/FAILURE
Nov 23 10:52:54 systemd[1]: kubelet.service: Failed with result 'exit-code'.
Nov 23 10:53:04 systemd[1]: kubelet.service: Scheduled restart job, restart counter is at 6578.
Nov 23 10:53:04 systemd[1]: Started kubelet.service - kubelet: The Kubernetes Node Agent.
Nov 23 10:53:04 kubelet[150116]: Flag --container-runtime-endpoint has been deprecated, This parameter should be set via the config file specified by the Kubelet's --config flag. See https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ for more information.
Nov 23 10:53:04 kubelet[150116]: Flag --pod-infra-container-image has been deprecated, will be removed in a future release. Image garbage collector will get sandbox image information from CRI.
Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.710817 150116 server.go:209] "--pod-infra-container-image will not be pruned by the image garbage collector in kubelet and should also be set in the remote runtime"
Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.715367 150116 server.go:492] "Kubelet version" kubeletVersion="v1.29.15"
Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.715402 150116 server.go:494] "Golang settings" GOGC="" GOMAXPROCS="" GOTRACEBACK=""
Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.715759 150116 server.go:924] "Client rotation is on, will bootstrap in background"
Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.716990 150116 certificate_store.go:130] Loading cert/key pair from "/var/lib/kubelet/pki/kubelet-client-current.pem".
Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.718180 150116 dynamic_cafile_content.go:157] "Starting controller" name="client-ca-bundle::/etc/kubernetes/pki/ca.crt"
Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.727293 150116 server.go:750] "--cgroups-per-qos enabled, but --cgroup-root was not specified. defaulting to /"
Nov 23 10:53:04 kubelet[150116]: E1123 10:53:04.727405 150116 run.go:74] "command failed" err="failed to run Kubelet: running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false. /proc/s

핵심 에러 메시지는 아래 한 줄이다.

running with swap on is not supported, please disable swap!

즉, swap 이 활성화된 상태에서 kubelet이 실행되고 있기 때문에 강제로 종료되고 있었던 것이다. 초기 설정때 껏는데.. 재실행되면서 켜진 모양이다. 😭

❗ Kubernetes 는 왜 swap을 허용하지 않을까?

Kubernetes 는 노드 리소스를 엄격하게 관리하기 위해 메모리 관리 정책을 자체적으로 수행한다. 하지만 swap 이 활성화되어 있으면 다음과 같은 문제가 발생한다.

문제 설명
OOM 판단 불가 메모리가 부족해도 swap으로 빠져나가면 정확한 OOM 판단이 어려움
리소스 예측 불가 Pod의 memory limit가 무의미해짐
성능 저하 디스크 swap I/O로 지연 발생
스케줄링 오류 노드 리소스 사용량이 왜곡됨

그래서 kubelet 은 기본적으로 swap on 상태이면 kubelet 실행을 거부합니다.

✅ 해결 방법 - swap off

현재 swap 상태 확인
아래 명령어 실행시 swap 이 보이면 활성화된 상태다.

swapon --show
# 또는
free -h

swap 즉시 비활성화

sudo swapoff -a

재부팅 후에도 swap 비활성화 유지 (영구 설정)
/etc/fstab 파일을 열어 swap 항목을 주석 처리한다.

# 아래 내용을 주석 처리합니다.
#/swap.img none swap sw 0 0
Share