[트러블슈팅] VM Ubuntu22.04에서 Kubernetes

Evie·2024년 12월 5일
post-thumbnail

오류 설명

k8s를 띄우기 위해 kubeadm reset과 init을 반복해서 kube-apiserver가 계속 죽는 현상이 발생했습니다.

환경

OS : Windows 11
VM : Oracle VirtualBox (포트바인딩으로 로컬 ssh에서 접속했습니다)
VM-OS : Ubuntu 22.04

해결 과정

1. 로그 확인 (원인 탐색)

제일 첫 번째로 sudo journalctl -u kubelet 명령어를 통해 로그를 확인했습니다.
응답으로 /var/lib/kubelet/config.yaml 파일을 찾을 수 없다고 나와서 ls 명령어를 통해 확인했으나 해당 위치에 파일이 멀쩡하게 있었고, 권한도 잘 지정되어있었기에 오류의 원인이 아닌 것 같았습니다.

그 다음으로는 tail /var/log/syslog를 확인했습니다.
그랬더니 꽤 의미있는 수확이 나왔습니다.

user@admin:~$ tail /var/log/syslog
2024-12-05T01:25:09.872122+00:00 admin kubelet[5923]: 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.
2024-12-05T01:25:09.872732+00:00 admin kubelet[5923]: 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.
2024-12-05T01:25:09.872752+00:00 admin kubelet[5923]: E1205 01:25:09.872261 5923 run.go:74] "command failed" err="failed to parse kubelet flag: unknown flag: --container-runtime"
2024-12-05T01:25:09.874984+00:00 admin systemd[1]: kubelet.service: Main process exited, code=exited, status=1/FAILURE
2024-12-05T01:25:09.875440+00:00 admin systemd[1]: kubelet.service: Failed with result 'exit-code'.

이 플래그들의 잘못된 사용이 원인이었음을 알 수 있었으나, 해당 플래그들이 위치한 파일을 찾으려면 다른 부분을 확인해야 했습니다.

2. 원인 제거

파일을 확인하기 위해 systemctl status kubelet을 입력, 다음의 결과를 얻었습니다.

user@admin:~$ 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 Thu 2024-12-05 01:27:02 UTC; 5s ago
Docs: https://kubernetes.io/docs/
Process: 6018 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=1/FAILURE)
Main PID: 6018 (code=exited, status=1/FAILURE)
CPU: 163ms

결과에서 눈여겨봐야 할 부분은 Drop-In 부분입니다. 해당 부분에서 파일 경로는 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf인데, 이 파일에 접근해보면 ENV가 작성되어있습니다.
제 경우에는 아래와 같이 작성되어 있었습니다.

# Note: This dropin only works with kubeadm and kubelet v1.11+

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

이제 Deprecated되었거나 unknown인 플래그들을 지우러 찾아가주면 됩니다.

user@admin:~$ sudo vim /var/lib/kubelet/kubeadm-flags.env

user@admin:~$ sudo vim /etc/default/kubelet

결과

sudo kubeadm reset -f로 초기화해주고, sudo kubeadm init --pod-network-cidr=192.168.0.0/16으로 새로 띄워주면


성공적으로 잘 돌아가는 모습을 확인할 수 있습니다.

마무리

참고 자료

profile
끄적그적

0개의 댓글