kubelet 이 아래 메시지를 남기면서 노드가 NotReady 로 남는 경우다.
"Container runtime network not ready" networkReady="NetworkReady=false
reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized"
kubelet 은 컨테이너 런타임에게 네트워크 준비 상태를 묻고, 런타임은 /etc/cni/net.d 에서 CNI 설정을 읽어 답한다. 읽을 설정이 없으면 이 메시지가 나온다. 즉 CNI 플러그인이 아직 설정 파일을 깔지 않았다는 뜻이지 kubelet 자체의 결함이 아니다.
클러스터를 막 kubeadm init 한 직후에는 정상적으로 나오는 메시지다. CNI 를 설치하면 사라진다.
kubectl get pods -n kube-system -o wide | grep -Ei 'calico|flannel|cilium|weave'
kubectl logs -n kube-system <cni-pod>
kubectl describe pod -n kube-system <cni-pod>
CrashLoopBackOff 면 로그를, Pending 이면 describe 의 이벤트를 본다. 이미지를 못 받는 폐쇄망 환경이면 ImagePullBackOff 로 나타난다.
CNI 파드 자체가 아예 없으면 CNI 를 설치하지 않은 것이다. 새 노드를 붙였는데 그 노드에만 문제가 있다면 DaemonSet 이 그 노드를 선택하지 못하는 경우다 — 테인트와 nodeSelector 를 본다.
ls -l /etc/cni/net.d/
10-calico.conflist 같은 파일이 있어야 한다. 비어 있으면 CNI 파드가 아직 설치를 못 끝낸 것이다. 반대로 전에 쓰던 CNI 의 설정 파일이 남아 있어 새 CNI 와 충돌하는 경우도 흔하다. CNI 를 교체했다면 이 디렉터리에 옛 파일이 없는지 반드시 확인한다.
ls -l /opt/cni/bin/
bridge · host-local · loopback · portmap 같은 기본 플러그인이 있어야 한다. 일부 배포판·에어갭 환경에서는 containernetworking-plugins 패키지를 따로 설치해야 한다.
grep -E 'cni|Plugin' /var/lib/kubelet/config.yaml /var/lib/kubelet/kubeadm-flags.env
journalctl -u kubelet -n 200 --no-pager
경로를 기본값에서 바꿨다면 컨테이너 런타임 설정도 같이 봐야 한다. containerd 를 쓰면 /etc/containerd/config.toml 의 [plugins."io.containerd.grpc.v1.cri".cni] 아래 conf_dir · bin_dir 가 실제 경로와 맞아야 한다.
systemctl restart containerd
systemctl restart kubelet
--network-plugin=cni · --cni-conf-dir · --cni-bin-dir 같은 kubelet 명령행 플래그는 dockershim 과 함께 제거됐다. Kubernetes 1.24 이후에는 이 플래그를 주면 kubelet 이 기동하지 않으므로, 오래된 문서를 보고 추가하지 않는다. 현재는 CNI 경로를 컨테이너 런타임(containerd · CRI-O) 설정에서 지정한다.