Skip to Content
Infra & DevOpsK8s 1.13->1.14 업그레이드 트러블슈팅
☁️ Infra & DevOps2019년 10월 1일

K8s 1.13->1.14 업그레이드 트러블슈팅

#kubernetes#infra-devops#troubleshooting#flannel#cni

1. 버전 마이너 업그레이드 중 발생한 CNI 장애

사내망에 구축된 온프레미스(On-premise) 쿠버네티스 클러스터를 1.13.x 버전에서 1.14.x 버전으로 kubeadm upgrade 하던 도중, 노드가 Ready 상태로 올라오지 못하고 파드(Pod) 간 통신이 전면 단절되는 크리티컬한 장애가 발생했습니다.

syslogjournalctl -u kubelet 로그를 확인해본 결과, 다음과 같은 에러 메시지가 무한 반복되고 있었습니다.

💡 확인된 에러 로그 메시지 kubelet.go:2192] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

원인 파악

위 에러는 Kubelet이 시작될 때 컨테이너 런타임(Docker)과 CNI(Container Network Interface) 간의 네트워크 설정이 정상적으로 바인딩되지 않았음을 의미합니다. Kubernetes 1.14 버전부터 코어 네트워킹 로직의 요구사항이나 특정 API 스펙이 변경되었는데, 기존 1.13 버전에 맞춰져 설치되었던 구버전 Flannel CNI 데몬셋(DaemonSet)이 호환성 오류를 일으키고 초기화를 완료하지 못해 뻗어버린 것이 원인이었습니다.

3. 매니페스트 수정 및 롤아웃 리커버리 및 구현

기존 쿠버네티스 클러스터 위에서 동작하던 낡은 Flannel 컴포넌트를 1.14 이상을 지원하는 최신 버전의 매니페스트(Manifest)를 통해 업그레이드 재배포해야 합니다.

아래 명령어를 통해 최신 kube-flannel.yml을 적용합니다.

bash
# 1.14 대응 최신 Flannel CNI 플러그인 업그레이드/적용 $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

적용 후 수 분을 기다리면 각 노드의 kube-flannel-ds-* 파드가 새로 롤링되며 재시작되고, Kubelet의 cni config uninitialized 에러가 사라지면서 노드가 정상적으로 Ready 상태로 복구됩니다.

4. 장애 복구 완료 및 교훈

관리형 K8s(EKS, GKE 등)를 사용하면 클라우드 사업자가 알아서 CNI 버전을 호환성 있게 롤링 업데이트 해주지만, 하드웨어 장비에 직접 올린 kubeadm 기반 베어메탈 클러스터는 마이너 업그레이드마다 이처럼 컴포넌트 간 호환성이 깨지는 폭탄을 맞을 수 있다는 점을 실감했습니다. 이후 마이너/메이저 버전 업그레이드 전 CNI 및 CSI 플러그인의 호환성 문서를 최우선으로 체크하는 체크리스트 룰을 사내 스탠다드로 지정하게 되었습니다.

Last updated on