Calico는 아래의 구성요소들을 통해 Kubernetes에서의 네트워크 통신 기능을 제공한다.
Kubernetes API Server로부터 pod, namespace, 네트워크 정책 등 클러스터의 네트워크 리소스를 주기적으로 조회하여 새로운 네트워크 정책이 생성된 것을 감지한 후 Calico datastore를 업데이트한다.
Calico datastore는 Kubernetes API datastore(kdd) 혹은 ETCD 중 하나를 선택할 수 있다. calico-kube-controllers에 의해 전달된 정책이 Calico datastore에 기록된다.
기록되는 정책은 아래와 같다.
사용자는 calicoctl cli를 통해 Calico datastore에 저장된 리소스를 조회하거나 업데이트 할 수 있다.
Kubernetes 클러스터 내에서 pod가 생성될 때, 해당 pod의 네트워크 인터페이스를 생성하고, Pod와 네트워크의 가상 네트워크 브릿지 / overlay 네트워크를 설정함으로써 네트워크 트래픽을 관리하는 플러그인이다.
pod에 IP를 할당/회수/관리하는 플러그인으로 CNI Plugin에 의해 pod의 네트워크 인터페이스가 설정되면, CNI IPAM Plugin이 Calico datastore에 저장되어 있는 Pod Pool을 기반으로 Pod에 IP를 할당한다.
pod가 삭제되면 해당 IP 주소를 회수하여 Calico datastore에 업데이트함으로써 IP가 재사용될 수 있도록 관리한다.
calico-node-pod는 클러스터에서 daemonset으로 뜨는 네트워크 플러그인으로, 각 노드에서 네트워크 트래픽을 제어하고, Calico 네트워크 정책을 적용한다. Calico Node 내의 bird, felix, confd 프로그램에 의해 동작한다.
Calico에서 BGP 라우팅을 담당하는 오픈 소스 소프트웨어 라우팅 데몬 프로그램으로, 노드의 pod CIDR을 BGP 라우팅 프로토콜을 통해 다른 노드에 광고한다. 이를 통해 다른 노드의 pod 대역과 통신 할 수 있다.
Calico의 네트워크 정책 엔진으로 bird로 학습한 다른 노드의 pod CIDR을 host의 라우팅 테이블에 업데이트하며, IPtables 규칙 설정 관리를 한다.
Calico 구성 관리 도구로, Calico에서 BGP와 관련된 설정을 관리하고, Calico의 구성 파일을 동적으로 업데이트 한다.
또한 Calico datastore에서 네트워크 설정을 가져와 Calico BGP 설정을 조정한다. (e.g. 클러스터에 새로운 노드 추가 시 라우팅 구성 업데이트)
calicoctl version에는 Cluster Type항목이 있는데, 현재 어떤 구성을 사용 중인지를 알 수 있다. 아래 테스트에서는 k8s, bgp routeing, kubeadm, kdd(kubernetes api - calico datastore)을 사용 중인 것을 확인할 수 있다.
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# calicoctl version
Client Version: v3.28.1
Git commit: 601856343
Cluster Version: v3.28.1
Cluster Type: k8s,bgp,kubeadm,kdd
calico-node는 각 노드에 daemonset으로 떠있다.
calico-node의 IP를 보면 Host의 eth0 IP와 동일한데, 이는 Host의 네트워크 네임스페이스와 calico-node pod의 네트워크 네임스페이스가 동일하기 때문이다.
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# kubectl get daemonset -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
calico-node 4 4 4 4 4 kubernetes.io/os=linux 6m47s
kube-proxy 4 4 4 4 4 kubernetes.io/os=linux 13m
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# kubectl get pod -n kube-system -l k8s-app=calico-node -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
calico-node-q2b9f 1/1 Running 0 16m 192.168.10.10 k8s-m <none> <none>
calico-node-t2njm 1/1 Running 0 16m 192.168.10.102 k8s-w2 <none> <none>
calico-node-vkmct 1/1 Running 0 16m 192.168.20.100 k8s-w0 <none> <none>
calico-node-vw2wk 1/1 Running 0 16m 192.168.10.101 k8s-w1 <none> <none>
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
inet 192.168.10.10 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::6b:2dff:feb1:1e03 prefixlen 64 scopeid 0x20<link>
ether 02:6b:2d:b1:1e:03 txqueuelen 1000 (Ethernet)
RX packets 467466 bytes 674909756 (674.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 60071 bytes 10813763 (10.8 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
현재 calico가 어떠한 IPAM을 사용 중인지는 설정에서 확인할 수 있다.
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# cat /etc/cni/net.d/10-calico.conflist | jq
...
"plugins": [
{
"type": "calico",
"log_level": "info",
"log_file_path": "/var/log/calico/cni/cni.log",
"datastore_type": "kubernetes",
"nodename": "k8s-m",
"mtu": 0,
"ipam": {
"type": "calico-ipam"
},
"policy": {
"type": "k8s"
},
...
Node의 pod CIDR대역을 확인하고, Cluster의 다른 노드들이 파드에 할당하기 위해 가지고 있는 대역인 Block을 확인해본다.
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# calicoctl ipam show
+----------+---------------+-----------+------------+--------------+
| GROUPING | CIDR | IPS TOTAL | IPS IN USE | IPS FREE |
+----------+---------------+-----------+------------+--------------+
| IP Pool | 172.16.0.0/16 | 65536 | 7 (0%) | 65529 (100%) |
+----------+---------------+-----------+------------+--------------+
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}' ;echo
172.16.0.0/24 172.16.1.0/24 172.16.3.0/24 172.16.2.0/24
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# calicoctl ipam show --show-blocks
+----------+-----------------+-----------+------------+--------------+
| GROUPING | CIDR | IPS TOTAL | IPS IN USE | IPS FREE |
+----------+-----------------+-----------+------------+--------------+
| IP Pool | 172.16.0.0/16 | 65536 | 7 (0%) | 65529 (100%) |
| Block | 172.16.116.0/24 | 256 | 1 (0%) | 255 (100%) |
| Block | 172.16.158.0/24 | 256 | 1 (0%) | 255 (100%) |
| Block | 172.16.184.0/24 | 256 | 1 (0%) | 255 (100%) |
| Block | 172.16.34.0/24 | 256 | 4 (2%) | 252 (98%) |
+----------+-----------------+-----------+------------+--------------+
위에서 보이는 Block CIDR은 각 노드의 tunl0 인터페이스 IP이다.
# k8s-m
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# ifconfig tunl0
tunl0: flags=193<UP,RUNNING,NOARP> mtu 8981
inet 172.16.116.0 netmask 255.255.255.255
tunnel txqueuelen 1000 (IPIP Tunnel)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# k8s-w0
root@k8s-w0:~# ifconfig tunl0
tunl0: flags=193<UP,RUNNING,NOARP> mtu 8981
inet 172.16.34.0 netmask 255.255.255.255
tunnel txqueuelen 1000 (IPIP Tunnel)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# k8s-w1
root@k8s-w1:~# ifconfig tunl0
tunl0: flags=193<UP,RUNNING,NOARP> mtu 8981
inet 172.16.158.0 netmask 255.255.255.255
tunnel txqueuelen 1000 (IPIP Tunnel)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# k8s-w2
root@k8s-w2:~# ifconfig tunl0
tunl0: flags=193<UP,RUNNING,NOARP> mtu 8981
inet 172.16.184.0 netmask 255.255.255.255
tunnel txqueuelen 1000 (IPIP Tunnel)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
추가 설정을 확인해본다.
calicoctl의 StrictAffinity PROPERTY의 값이 true일 경우, 노드가 자신의 IP Pool에서 할당 가능한 주소를 모두 사용했을 경우, 다른 노드의 IP 주소 대역을 빌려 올 수 있는데, 이 때 빌려온 주소는 --show-borrowd 플래그로 표시된다.
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# calicoctl ipam show --show-borrowed
+----+----------------+-------+-------------+------+--------------+
| IP | BORROWING-NODE | BLOCK | BLOCK OWNER | TYPE | ALLOCATED-TO |
+----+----------------+-------+-------------+------+--------------+
+----+----------------+-------+-------------+------+--------------+
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# calicoctl ipam show --show-configuration
+--------------------+-------+
| PROPERTY | VALUE |
+--------------------+-------+
| StrictAffinity | false |
| AutoAllocateBlocks | true |
| MaxBlocksPerHost | 0 |
+--------------------+-------+
Bird를 통해 어떤 노드와 BGP통신 연결이 되어 있는지 확인한다. 해당 노드를 제외한 나머지 노드들(BGP Peer) 정보를 확인할 수 있다.
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# calicoctl node status
Calico process is running.
IPv4 BGP status
+----------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+----------------+-------------------+-------+----------+-------------+
| 192.168.20.100 | node-to-node mesh | up | 03:51:03 | Established |
| 192.168.10.101 | node-to-node mesh | up | 03:51:04 | Established |
| 192.168.10.102 | node-to-node mesh | up | 03:51:04 | Established |
+----------------+-------------------+-------+----------+-------------+
IPv6 BGP status
No IPv6 peers found.
BGP통신 연결 확인은 Bird에서 주기적으로 각 노드(Peer Router)에 살아있음을 알리는 메세지를 주고 받으면서 확인하게 된다.(BGP Keepalive)
BGP Message의 종류에 대해 좀 더 자세히 확인하고, 패킷 캡처를 통해 모니터링 해본다.
BGP Message Type에는 Open, Update, Notification, Keepalive, Route-Refresh 가 있다.
TCP 연결이 된 BGP Peer 간에 최초로 주고받는 메세지이다. 주로, 자신의 정보를 알리기 위한 메세지이다.
이미 Peer관계를 확립한 Peer Router 상호 간에 새롭게 나타난 경로 정보에 대한 광고, 혹은 이전에 알려진 경로에 대한 취소에 사용되는 메세지이다.
어떠한 에러가 발생했을 때 혹은 연결을 닫고자 할 때, 보내는 BGP 메세지이다. 해당 메세지가 보내진 후 연결 세션이 끊어진다.
BGP Open Message에 대한 응답으로, 다른 노드(Peer Router)에 자신이 살아있음을 알리는 주기적인 19바이트의 BGP 메세지이다.
다른 노드(Peer Router)에게 Routing 정보를 다시 보내도록 요청하는 메세지이다.
BGP Message는 bird의 port인 TCP 179를 사용한다.
root@k8s-w1:~# netstat -tnlp | grep bird
tcp 0 0 0.0.0.0:179 0.0.0.0:* LISTEN 3698/bird
BGP가 사용하는 인터페이스는 eth0이다.
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# calicoctl node status
Calico process is running.
IPv4 BGP status
+----------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+----------------+-------------------+-------+----------+-------------+
| 192.168.20.100 | node-to-node mesh | up | 03:51:03 | Established |
| 192.168.10.101 | node-to-node mesh | up | 03:51:04 | Established |
| 192.168.10.102 | node-to-node mesh | up | 03:51:04 | Established |
+----------------+-------------------+-------+----------+-------------+
root@k8s-w1:~# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
inet 192.168.10.101 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::5f:26ff:fe41:132b prefixlen 64 scopeid 0x20<link>
ether 02:5f:26:41:13:2b txqueuelen 1000 (Ethernet)
RX packets 458793 bytes 667403787 (667.4 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 66191 bytes 5712673 (5.7 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
아래 명령어를 사용하여 패킷을 캡처하고, calico-node 파드 하나를 삭제한다. calico-node를 삭제하고 다시 생성되는 과정에서, BGP 세션을 설정하고 네트워크 정보를 업데이트하는 BGP Open, Update, Keepalive 메세지를 확인할 수 있다.
root@k8s-w1:~# tcpdump -i eth0 'tcp port 179' -vvv -w bgp_update_capture.pcap
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# kubectl get pod -A -o wide | grep calico-node
kube-system calico-node-7fbzp 1/1 Running 0 58m 192.168.10.101 k8s-w1 <none> <none>
kube-system calico-node-nvqnx 1/1 Running 0 58m 192.168.10.102 k8s-w2 <none> <none>
kube-system calico-node-wbx5r 1/1 Running 0 58m 192.168.20.100 k8s-w0 <none> <none>
kube-system calico-node-xr6vl 1/1 Running 0 58m 192.168.10.10 k8s-m <none> <none>
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# kubectl delete pod calico-node-nvqnx -n kube-system --force
패킷캡처 내역
OPEN Message
OPEN Message의 ASN은 별도의 설정을 하지 않았을 때 default 값이 64512이다.
https://docs.tigera.io/calico/latest/reference/resources/bgpconfig#:~:text=true-,asNumber,-The%20default%20local
UPDATE Message
Keepalive Message
클러스터가 사용하는 ip 대역 정보와 calico Mode 정보를 확인한다.
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED DISABLEBGPEXPORT SELECTOR
default-ipv4-ippool 172.16.0.0/16 true Always Never false false all()
calico를 통해서 할당받은 Pod의 정보를 출력한다. host network 네임스페이스를 사용하는 Pod들은 출력되지 않는다.
각 Pod가 어떠한 노드에 떠있는지, 어떠한 인터페이스에 연결되었는지, 어떤 IP를 할당 받았는지 등 Pod의 Endpoint 정보를 확인할 수 있다.
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# calicoctl get wep -A -o wide
NAMESPACE NAME WORKLOAD NODE NETWORKS INTERFACE PROFILES NATS
kube-system k8s--w0-k8s-calico--kube--controllers--77d59654f4--pjmtr-eth0 calico-kube-controllers-77d59654f4-pjmtr k8s-w0 172.16.34.1/32 cali2b966b54fdf kns.kube-system,ksa.kube-system.calico-kube-controllers
kube-system k8s--w0-k8s-coredns--55cb58b774--5ttdh-eth0 coredns-55cb58b774-5ttdh k8s-w0 172.16.34.3/32 cali8aed9290dbd kns.kube-system,ksa.kube-system.coredns
kube-system k8s--w0-k8s-coredns--55cb58b774--7x77t-eth0 coredns-55cb58b774-7x77t k8s-w0 172.16.34.2/32 calic153b0d7173 kns.kube-system,ksa.kube-system.coredns
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# kubectl get pod -n kube-system -o wide | grep 172
calico-kube-controllers-77d59654f4-pjmtr 1/1 Running 0 78m 172.16.34.1 k8s-w0 <none> <none>
coredns-55cb58b774-5ttdh 1/1 Running 0 85m 172.16.34.3 k8s-w0 <none> <none>
coredns-55cb58b774-7x77t 1/1 Running 0 85m 172.16.34.2 k8s-w0 <none> <none>
Node에 calico-node를 구성하는 프로세스가 떠 있는 것을 확인할 수 있다.
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# ps axf
...
4063 ? Ss 0:00 \_ /usr/local/bin/runsvdir -P /etc/service/enabled
4137 ? Ss 0:00 \_ runsv node-status-reporter
4159 ? Sl 0:00 | \_ calico-node -status-reporter
4138 ? Ss 0:00 \_ runsv bird6
4339 ? S 0:00 | \_ bird6 -R -s /var/run/calico/bird6.ctl -d -c /etc/calico/confd/config/bird6.cfg
4139 ? Ss 0:00 \_ runsv bird
4340 ? S 0:00 | \_ bird -R -s /var/run/calico/bird.ctl -d -c /etc/calico/confd/config/bird.cfg
4140 ? Ss 0:00 \_ runsv felix
4145 ? Sl 0:50 | \_ calico-node -felix
4141 ? Ss 0:00 \_ runsv cni
4149 ? Sl 0:00 | \_ calico-node -monitor-token
4142 ? Ss 0:00 \_ runsv confd
4150 ? Sl 0:00 | \_ calico-node -confd
4143 ? Ss 0:00 \_ runsv monitor-addresses
4146 ? Sl 0:00 | \_ calico-node -monitor-addresses
4144 ? Ss 0:00 \_ runsv allocate-tunnel-addrs
4151 ? Sl 0:00 \_ calico-node -allocate-tunnel-addrs
felix는 bird를 통해 얻은 정보를 기반으로 iptables를 업데이트 한다.
Pod를 하나 추가해보면서 iptables룰 추가를 모니터링해보면, Pod에 연결된 cali interface와 관련된 iptables rule이 추가되는 것을 확인할 수 있다.
# pod 추가 이전
root@k8s-w0:~# iptables -t filter -S | grep cali | wc -l
117
root@k8s-w0:~# iptables -t nat -S | grep cali | wc -l
15
# pod 추가 이후
root@k8s-w0:~# iptables -t filter -S | grep cali | wc -l
147
root@k8s-w0:~# iptables -t nat -S | grep cali | wc -l
15
# pod wep 확인
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# calicoctl get wep -A
NAMESPACE WORKLOAD NODE NETWORKS INTERFACE
default pod1 k8s-w1 172.16.158.1/32 calice0906292e2
default pod2 k8s-w0 172.16.34.4/32 calibd2348b4f67
kube-system calico-kube-controllers-77d59654f4-pjmtr k8s-w0 172.16.34.1/32 cali2b966b54fdf
kube-system coredns-55cb58b774-5ttdh k8s-w0 172.16.34.3/32 cali8aed9290dbd
kube-system coredns-55cb58b774-7x77t k8s-w0 172.16.34.2/32 calic153b0d7173
# 추가된 pod iptables rule 확인
root@k8s-w0:~# iptables -v --numeric --table filter --list cali-tw-calibd2348b4f67
Chain cali-tw-calibd2348b4f67 (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 /* cali:XbY6-cDccVq4BXbw */ ctstate RELATED,ESTABLISHED
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 /* cali:N4hE4yZtnqCjJbJL */ ctstate INVALID
0 0 MARK all -- * * 0.0.0.0/0 0.0.0.0/0 /* cali:9XJDTASzmA98NbgL */ MARK and 0xfffcffff
0 0 cali-pri-kns.default all -- * * 0.0.0.0/0 0.0.0.0/0 /* cali:B21wAo2MmHxTE20i */
0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 /* cali:z0vNGDZb9fZZTnBN */ /* Return if profile accepted */
0 0 cali-pri-ksa.default.default all -- * * 0.0.0.0/0 0.0.0.0/0 /* cali:Xs37buFlu3zcQDO1 */
0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 /* cali:TQSFKOw4Wln6EBF3 */ /* Return if profile accepted */
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 /* cali:GlPBajbc7Ht3AzxB */ /* Drop if no profiles matched */
calico-node에 직접 접속하여 bird 라우팅 정보를 확인해본다.
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# kubectl get pod -n kube-system -l k8s-app=calico-node -o name
pod/calico-node-7fbzp
pod/calico-node-klzj6
pod/calico-node-wbx5r
pod/calico-node-x7j6w
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# kubectl exec -it calico-node-7fbzp -n kube-system -- birdcl
Defaulted container "calico-node" out of: calico-node, upgrade-ipam (init), install-cni (init), mount-bpffs (init)
BIRD v0.3.3+birdv1.6.8 ready.
bird> show route
0.0.0.0/0 via 192.168.10.1 on eth0 [kernel1 06:01:14] * (10)
172.16.184.0/24 via 192.168.10.102 on eth0 [Mesh_192_168_10_102 06:01:15] * (100/0) [i]
172.16.158.5/32 dev cali1f7bbbd982a [kernel1 08:10:55] * (10)
192.168.0.2/32 via 192.168.10.1 on eth0 [kernel1 06:01:14] * (10)
192.168.10.0/24 dev eth0 [direct1 06:01:13] * (240)
192.168.10.1/32 dev eth0 [kernel1 06:01:14] * (10)
172.16.158.0/24 blackhole [static1 06:01:13] * (200)
172.16.158.0/32 dev tunl0 [direct1 06:01:13] * (240)
172.16.116.0/24 via 192.168.10.10 on eth0 [Mesh_192_168_10_10 06:01:15] * (100/0) [i]
172.16.34.0/24 via 192.168.10.1 on eth0 [Mesh_192_168_20_100 06:01:15 from 192.168.20.100] * (100/?) [i]
bird> show protocol
name proto table state since info
static1 Static master up 06:01:13
kernel1 Kernel master up 06:01:13
device1 Device master up 06:01:13
direct1 Direct master up 06:01:13
Mesh_192_168_10_10 BGP master up 08:13:47 Established
Mesh_192_168_20_100 BGP master up 06:01:15 Established
Mesh_192_168_10_102 BGP master up 06:59:50 Established
bird> show route all
0.0.0.0/0 via 192.168.10.1 on eth0 [kernel1 06:01:14] * (10)
Type: inherit unicast univ
Kernel.source: 16
Kernel.metric: 100
Kernel.prefsrc: 192.168.10.101
172.16.184.0/24 via 192.168.10.102 on eth0 [Mesh_192_168_10_102 06:01:15] * (100/0) [i]
Type: BGP unicast univ
BGP.origin: IGP
BGP.as_path:
BGP.next_hop: 192.168.10.102
BGP.local_pref: 100
...
bird> show status
BIRD v0.3.3+birdv1.6.8
Router ID is 192.168.10.101
Current server time is 2024-09-21 12:57:08
Last reboot on 2024-09-21 06:01:13
Last reconfiguration on 2024-09-21 06:01:13
Daemon is up and running
bird.cfg 파일 설정을 확인해본다.
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# crictl ps | grep calico
8d8b4ac833d53 8bbeb9e1ee328 5 hours ago Running calico-node 0 25ce6edc0464c calico-node-klzj6
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# ps -ef | grep bird.cfg
root 48060 47880 0 17:13 ? 00:00:01 bird -R -s /var/run/calico/bird.ctl -d -c /etc/calico/confd/config/bird.cfg
root 134271 134145 0 21:48 pts/1 00:00:00 grep bird.cfg
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-m:~# find / -name bird.cfg
/run/containerd/io.containerd.runtime.v2.task/k8s.io/8d8b4ac833d5307a3ab2ca69313ce5d4e50a8ef0ac2af1c16de6102075e1de22/rootfs/etc/calico/confd/config/bird.cfg
/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/64/fs/etc/calico/confd/config/bird.cfg