[Kubernetes] Calico: calico/node is not ready: BIRD is not ready: BGP not established

bluewhale·2022년 3월 11일
0

kubernetes

목록 보기
11/11

TL; DR

$ sudo firewall-cmd --permanent --zone=public --add-port=179/tcp
$ sudo firewall-cmd --reload

새롭게 운영하는 쿠버네티스 클러스터에서 CNI로 calico를 사용하였습니다. 그러나, calico-nodereadiness-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? BGP?

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들이 주고 받은 피어링 계약을 기반으로 패킷을 보낼 최적 경로를 계산합니다. 일반적으로 네트워크 홉이 가장 작은 경로가 선택됩니다.

BGP in Calico

Ssup2 blog, IP-in-IP, GRE Tunneling

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

Reference

profile
안녕하세요

0개의 댓글