program_language 및 궁금한것/kubernetes

kubeadm init error - kubelet nodes not found

jinsiri 2023. 8. 31. 20:03

2주 정도를 이 에러를 찾아 헤메였습니다.
 
kubeadm init을 할때 나는 "nodes not found" 제 서버의 hostname을 못찾는다는 에러였죠..
치열하게 구글에 검색도 해보았지만.. 원하는 답은 찾을 수 없었습니다.

결론은 kubeadm reset, init을 반복하며 kubelet 설정이 꼬인 문제였습니다.
 
에러 발생부터 해결까지 과정은 아래와 같습니다
 
kubernetes 셋팅을 하면서 kubeadm reset과 init을 반복했었습니다. external etcd 설정도 추가보구요.
처음 몇번은 잘 동작되어 join 문구까지 나왔는데 어느순간(?) 아래와 같은 에러가 납니다.
error execution phase upload-config/kubelet: Error writing Crisocket information for the control-plane node "host명" not found
 
--v=5 옵션을 줘서 더 자세히 보면... kubelet쪽에서 node를 못찾는것 같습니다.
 
 
그래서 제가 했던 작업은..
 
hostname이 제대로 설정되어 있는지 체크
hostname 소문자로 변경
containerd cgroup 설정 체크
cgroup2 설정 체크...
containerd, kubelet log 보기 등
 
삽질만 열심히 했습니다.
 
 
그러던중
systemctl status kubelet을 조회하며 이상한 점을 발견했습니다.
다른 블로그 글을 보면 아래와 같이 Drop-In이 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 하나로 잡혀있고
CGroup설정도 제대로 되어 있었습니다.

 kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since Mon 2022-02-28 19:43:49 EST; 5h 42min ago
     Docs: https://kubernetes.io/docs/
 Main PID: 91537 (kubelet)
    Tasks: 14 (limit: 23812)
   Memory: 50.6M
   CGroup: /system.slice/kubelet.service
           └─91537 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubecon>

 
하지만 제 kubelet은 Drop-In이 두개파일을 참조하게 되어 있는데다가 CGrop도 뭔가 달랐습니다.

kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf
/etc/systemd/system/kubelet.service.d
└─20-etcd-service-manager.conf
Active: active (running) since Thu 2023-08-31 10:56:16 KST; 6min ago
Docs: https://kubernetes.io/docs/
Main PID: 114150 (kubelet)
Tasks: 40 (limit: 408104)
Memory: 49.2M
CGroup: /system.slice/kubelet.service
└─114150 /usr/bin/kubelet --address=127.0.0.1 --pod-manifest-path=/etc/kubernetes/manifests --cgroup-driver=systemd

 
systemctl cat kubelet로 조회해보니 총 3개 파일이 나오더라구요. 정상적이라면 2개가 나와야 하는데 말이죠.
 
찾아보니 /etc/systemd/system/kubelet.service.d/ 폴더 하위의 파일들은 우선순위가 높아서 이 파일이 적용 된다고 합니다.
그래서 10-kubeadm.conf파일 대신 20-etcd-service-manager.conf파일이 적용된 것이죠.

systemctl cat kubelet

# /usr/lib/systemd/system/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target

# /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# 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/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

# /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf
[Service]
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
ExecStart=
#  Replace "systemd" with the cgroup driver of your container runtime. The default value in the kubelet is "cgroupfs".
ExecStart=/usr/bin/kubelet --address=127.0.0.1 --pod-manifest-path=/etc/kubernetes/manifests --cgroup-driver=systemd
Restart=always

 
20-etcd-service-manager.conf 파일을 삭제해주고 kubelet 재시작을 해줬습니다.

rm -rf 20-etcd-service-manager.conf

systemctl daemon-reload
systemctl restart kubelet
systemctl status kubelet

systemctl status kubelet으로 조회하니 정상 출력되는것을 확인 후  kubeadm reset, init을 진행하니 정상적으로 동작하였습니다.
 
2주묵은 체증이 내려갔군요. 후우..

반응형