$ sudo firewall-cmd --permanent --zone=public --add-port=179/tcp
$ sudo firewall-cmd --reload
새롭게 운영하는 쿠버네티스 클러스터에서 CNI로 calico
를 사용하였습니다. 그러나, calico-node
의 readiness-probe
가 실패하여 노드가 정상적으로 실행되지 않는 문제를 겪게 되었습니다. 이번 포스팅에서는 해당 문제를 해결하는 내용을 다루었습니다.
$ kubectl get pods -o wide -n kube-system
kube-system calico-node-65tld 0/1 Running 0 3m27s 172.30.1.25 master <none> <none>
문제가 발생한 calico
팟에서 다음과 같은 에러 메시지를 확인할 수 있었습니다.
$ kubectl describe pod calico-node-65tld -n kube-system
...
calico/node is not ready: BIRD is not ready: BGP not established with <node-ip>
BIRD calico
의 모듈 중 하나로, kubernetes의 모든 노드에서 실행되는 BGP 데몬입니다. BGP는 Border Gateway Protocol
의 약자로, 네트워크 상의 A지점에서 B지점으로 가는 최단 경로를 탐색하기 위해 라우터들이 주고받는 라우팅 정보를 정의한 프로토콜입니다. BIRD는 calico
에서 노드 별로 네트워크 라우팅 정보를 갱신합니다.
BGP는 우리가 일상 생활 속에서 사용하고 있는 GPS앱에 비유할 수 있습니다. GPS 기반의 네비게이션 앱들은 사용자가 목적지로 가기 위한 최적의 경로를 내부적으로 분석하여 빠른 길을 알려줍니다. 이와 유사하게, BGP는 거대한 네트워크 망에서 목적지로 갈 수 있는 안전하고 빠른 경로를 계산하기 위해 활용되는 프로토콜이라고 할 수 있습니다. BGP는 대규모 네트워크 그룹(Autonomous System, AS)을 운영하는 대규모 ISP(Ineteret Service Provider)들이 서로의 네트워크 트래픽을 주고 받기 위한 피어링(Peering) 계약을 기반으로 합니다. BGP 라우터는 서로 다른 AS들이 주고 받은 피어링 계약을 기반으로 패킷을 보낼 최적 경로를 계산합니다. 일반적으로 네트워크 홉이 가장 작은 경로가 선택됩니다.
calico
는 라우팅 옵션의 기본 값으로 IP-in-IP
프로토콜을 사용합니다. IP-in-IP
프로토콜은 기존의 IP 헤더에 터널의 IP 주소 정보가 포함된 Outer IP 헤더를 추가하여 터널링을 구현한 프로토콜로, calico
는 이를 활용하여 overlay
네트워크를 구성합니다. calico는 내부적으로 목적지 팟이 위치한 노드를 찾기 위해 BGP 프로토콜이 활용됩니다.
따라서, BGP 피어링을 위해 179번 포트에 대한 방화벽 정책을 허용하여야 합니다.
$ sudo firewall-cmd --permanent --zone=public --add-port=179/tcp
$ sudo firewall-cmd --reload