Kubernetes

[ Kans 3 Study - 3w ] 2. Calico Component

su''@ 2024. 9. 21. 14:57
CloudNetaStudy - Kubernets Networtk 3기 실습 스터디 게시글입니다.

 

1. Calico CNI 알아보기

 

[ Calico Component ]

 

칼리코는 쿠버네티스 플랫폼을 포함해 다양한 플랫폼에서 워크로드의 네트워크 통신과 네트워크 보안 기능을 제공한다.

쿠버네티스 CNI 를 준수하여, 파드를 위한 네트워크 통신 환경을 마련해준다.

 

    • Calico components - Docs

 

 

1. Calico datastore

칼리코 동작과 관련된 설정 정보(네트워크, 네트워크 정책 설정 등)가 calico datasore에 저장한다.
- 저장소는 쿠버네티스 api 저장소(default) 혹은 etcd를 선택할 수 있다.

2. felix

calico datastore로부터 가져온 설정 정보에 맞게 host의 인터페이스, 라우팅 테이블, iptables(kube-proxy 모드에 따라 ipvs가 될  수 있음)을 관리해 패킷이 지정된 pod에 정확하게 전달될 수 있게 한다. 클러스터의 network policy를 위반한 패킷이 전송되지 않게 차단하는 ACL 기능도 제공한다.

 

3. bird - 링크

BGP 클라이언트 역할을 담당한다. felix가 route 정보를 linux kerner fib에 추가할 때 이를 다른 노드에 공유하는 route distribution 기능이 우선된다.  bird는 라우팅 프로토콜 동작을 하는 데몬이며, 해당 노드의 파드 네트워크 대역을 BGP 라우팅 프로토콜을 통해 광고하는데 이를 통해 노드는 각 노드들의 파드 네트워크 대역 정보를 전파 및 전달 받는다.

 

4. confd 

가벼운 오픈소스 설정 변경 관리 툴로 Calico Datastore를 모니터링해 업데이트된 내용(BGP 설정, IPAM 정보 등)이 있을 경우, BIRD 설정 파일을 생성하여 BIRD가 새로운 설정을 Load할 수 있게한다.
calico global 설정과 BGP 설정 변경 시 BIRD에 적용해준다.


5. Calico CNI Plugin 

- k8s 에 calico 네트워킹 환경을 제공한다.
Cluster Networking을 위한 CNI 플러그인으로 Spec이 정해져 있으며 Node마다 실행파일 형식으로 제공된다. 

 

6. Calico IPAM plugin 

클러스터 내에서 파드에 할당할 IP 대역으로 칼리코는 자체의 IPAM 플러그인을 제공하며 기본값으로 사용한다. 

 

7. calico-kube-controllers 

calico 동작 관련 감시(watch)한다.

 

8. calicoctl 

calico 오브젝트를 CRUD 할 수 있다. (즉 datastore 접근 가능)

 


 

[ Calico 구성요소 확인 ]

  • 참고 

 

# 버전 확인
## kdd 의미는 쿠버네티스 API 를 데이터저장소로 사용 : k8s API datastore(kdd)
calicoctl version

# calico 관련 정보 확인
kubectl get daemonset -n kube-system
kubectl get pod -n kube-system -l k8s-app=calico-node -owide

kubectl get deploy -n kube-system calico-kube-controllers
kubectl get pod -n kube-system -l k8s-app=calico-kube-controllers -owide

# 칼리코 IPAM 정보 확인 : 칼리코 CNI 를 사용한 파드가 생성된 노드에 podCIDR 네트워크 대역 확인 - 링크
calicoctl ipam show

# Block 는 각 노드에 할당된 podCIDR 정보
calicoctl ipam show --show-blocks
calicoctl ipam show --show-borrowed
calicoctl ipam show --show-configuration
## strictAffinity True 설정 시 : 각 노드는 할당된 IP 블록에서만 IP 주소를 사용, 특정 pod들에 해당해둔 pod ip/mac을 고정할경우, 해당 대역들을 무작위로 배치하는 IPAM 대역에서 제외 -> 이로써 중복으로 같은 IP 할당 방지
## strictAffinity False 설정 시 : 노드가 부족한 경우 다른 노드에서 IP를 공유 가능
## When StrictAffinity is true, borrowing IP addresses is not allowed - https://docs.tigera.io/calico/latest/reference/resources/ipamconfig
## 관련 코드
### https://github.com/projectcalico/libcalico-go/blob/v3.9.0-0.dev/lib/ipam/ipam.go
### https://github.com/projectcalico/libcalico-go/blob/v3.9.0-0.dev/lib/ipam/ipam_types.go#L78

# calico crd 정보로 확인
kubectl get crds
kubectl get ippools
kubectl get ippools default-ipv4-ippool -o jsonpath={.spec} | jq
kubectl get clusterinformations
kubectl get clusterinformations default -o jsonpath={.spec} | jq
kubectl get blockaffinities
kubectl get blockaffinities -o jsonpath="{.items[*].spec}" | jq

Quiz. 바로 위 Calico IPAM 과 아래 출력되는 IPAM 의 차이는 무엇일까요? 우선순위 확인 - 링크 , Flannel 과 차이
- 별도의 IPAM 이 있다면 무엇을 할 수 있을까요? (예. 특정 파드/네임스페이스에 파드의 네트워크 대역을 추가 및 삭제)
1. Kubernetes annotations
2. CNI configuration (Calico IPAM)
3. IP pool node selectors

# host-local IPAM 정보 확인 : k8s-m 노드의 podCIDR 은 host-local 대신 칼리코 IPAM 를 사용함
## 워커 노드마다 할당된 dedicated subnet (podCIDR) 확인
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}' ;echo
kubectl get node k8s-m -o json | jq '.spec.podCIDR'

# CNI Plugin 정보 확인 - 링크
tree /etc/cni/net.d/
cat /etc/cni/net.d/10-calico.conflist | jq
...
			"datastore_type": "kubernetes", # 칼리코 데이터저장소는 쿠버네티스 API 를 사용
      "ipam": { 
          "type": "calico-ipam" # IPAM 은 칼리코 자체 IPAM 을 사용
      },
...

# calicoctl node 정보 확인 : Bird 데몬(BGP)을 통한 BGP 네이버 연결 정보(bgp peer 는 노드의 IP로 연결)
calicoctl node status
calicoctl node checksystem

# ippool 정보 확인 : 클러스터가 사용하는 IP 대역 정보와 칼리코 모드 정보 확인
calicoctl get ippool -o wide

# 파드와 서비스 사용 네트워크 대역 정보 확인 
kubectl cluster-info dump | grep -m 2 -E "cluster-cidr|service-cluster-ip-range"
        "--service-cluster-ip-range=10.200.1.0/24",
        "--cluster-cidr=172.16.0.0/16",

kubectl get cm -n kube-system kubeadm-config -oyaml | grep -i subnet
 podSubnet: 172.16.0.0/16
 serviceSubnet: 10.96.0.0/12

# calico endpoint (파드)의 정보 확인 : WORKLOAD 는 파드 이름이며, 어떤 노드에 배포되었고 IP 와 cali 인터페이스와 연결됨을 확인
calicoctl get workloadEndpoint
calicoctl get workloadEndpoint -A
calicoctl get workloadEndpoint -o wide -A

# 노드에서 컨테이너(프로세스) 확인 : pstree
ps axf
   4405 ?        Sl     0:09 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id dd532e5efaad436ebe7d10cdd3bb2ffe5a2873a0604ce3b
   4425 ?        Ss     0:00  \_ /pause
   4740 ?        Ss     0:00  \_ /usr/local/bin/runsvdir -P /etc/service/enabled
   4811 ?        Ss     0:00      \_ runsv allocate-tunnel-addrs
   4819 ?        Sl     0:00      |   \_ calico-node -allocate-tunnel-addrs
   4812 ?        Ss     0:00      \_ runsv bird
   4994 ?        S      0:00      |   \_ bird -R -s /var/run/calico/bird.ctl -d -c /etc/calico/confd/config/bird.cfg
   4813 ?        Ss     0:00      \_ runsv cni
   4822 ?        Sl     0:00      |   \_ calico-node -monitor-token
   4814 ?        Ss     0:00      \_ runsv bird6
   4993 ?        S      0:00      |   \_ bird6 -R -s /var/run/calico/bird6.ctl -d -c /etc/calico/confd/config/bird6.cfg
   4815 ?        Ss     0:00      \_ runsv confd
   4820 ?        Sl     0:00      |   \_ calico-node -confd
   4816 ?        Ss     0:00      \_ runsv felix
   4824 ?        Sl     0:54      |   \_ calico-node -felix
   4817 ?        Ss     0:00      \_ runsv node-status-reporter
   4823 ?        Sl     0:00      |   \_ calico-node -status-reporter
   4818 ?        Ss     0:00      \_ runsv monitor-addresses
   4825 ?        Sl     0:00          \_ calico-node -monitor-addresses

데몬셋으로 각 노드에 calico-node 파드가 동작. 해당 파드에 bird, felix, confd 등이 동작 + Calico컨트롤러 파드는 디플로이먼트로 생성

 

calicoctl ipam show # IP 사용 요약을 인쇄 calicoctl ipam show --show-blocks # IP 풀당 총 사용량과 더불어 해당 풀에서 할당된 블록의 사용량 calicoctl ipam show --show-borrowed # 어떤 IP 주소가 어떤 블록에서 어떤 노드에 의해 빌려졌는지와 이를 소비하는 엔터티 calicoctl ipam show --show-configuration # 현재 IPAM 구성

 

 

 

  • bgpconfigurations.crd.projectcalico.org: BGP(경계 게이트웨이 프로토콜)를 위한 설정으로, Calico가 트래픽 라우팅에 사용할 수 있다.
  • networkpolicies.crd.projectcalico.org: 쿠버네티스 파드 간의 네트워크 트래픽을 제어하는 네트워크 정책을 정의한다.
  • ippools.crd.projectcalico.org: 파드에 할당할 IP 주소 범위(IP 풀)를 관리한다.
  • felixconfigurations.crd.projectcalico.org: Calico의 컴포넌트인 Felix와 관련된 설정으로 Felix는 라우팅과 방화벽 규칙을 설정하는 역할을 한다.
  • globalnetworkpolicies.crd.projectcalico.org: 클러스터 전체에 걸쳐 네임스페이스와 상관없이 적용되는 글로벌 네트워크 정책을 정의한다.
  • blockaffinities.crd.projectcalico.org: 노드 간 IP 블록 할당을 추적해서 효율적인 IP 주소 할당을 도와준다.
  • hostendpoints.crd.projectcalico.org: 호스트 네트워크 인터페이스를 나타내며, 네트워크 정책이 파드뿐만 아니라 호스트에도 적용되도록 한다.

CRD를 통해 Calico에 필요한 구성 요소들이 클러스터에 설치되었는지 확인할 수 있고, 네트워크 구성을 어떻게 관리할 수 있는지도 파악할 수 있다.

 

 

- bird가 IPAM의 대역대를 BGP로 통신해 알림

자기 자신을 제외한 노드들의 상태 확인

 

 

 

Calico node의 정보 혹은 ippool이 어떤 cidr를 사용하는지 확인할 수 있다.

ippool은 다른이름으로 여러개 만들어 cidr 지정해 사용 가능하다.

 

 

felix (필릭스)

# 칼리코 필릭스를 통한 IPTables 규칙 설정 확인
(⎈|HomeLab:default) root@k8s-m:~# iptables -t filter -S | grep cali
-N cali-FORWARD
-N cali-INPUT
-N cali-OUTPUT
-N cali-cidr-block
-N cali-from-hep-forward
-N cali-from-host-endpoint
-N cali-from-wl-dispatch
-N cali-to-hep-forward
-N cali-to-host-endpoint
-N cali-to-wl-dispatch
-N cali-wl-to-host
-A INPUT -m comment --comment "cali:Cz_u1IQiXIMmKD4c" -j cali-INPUT
-A FORWARD -m comment --comment "cali:wUHhoiAYhphO9Mso" -j cali-FORWARD
-A FORWARD -m comment --comment "cali:S93hcgKJrXEqnTfs" -m comment --comment "Policy explicitly accepted packet." -j ACCEPT
-A FORWARD -m comment --comment "cali:mp77cMpurHhyjLrM" -j MARK --set-xmark 0x10000/0x10000
-A OUTPUT -m comment --comment "cali:tVnHkvAo15HuiPy0" -j cali-OUTPUT
-A cali-FORWARD -m comment --comment "cali:vjrMJCRpqwy5oRoX" -j MARK --set-xmark 0x0/0xe0000
-A cali-FORWARD -m comment --comment "cali:A_sPAO0mcxbT9mOV" -j cali-from-hep-forward
-A cali-FORWARD -i cali+ -m comment --comment "cali:8ZoYfO5HKXWbB3pk" -j cali-from-wl-dispatch
-A cali-FORWARD -o cali+ -m comment --comment "cali:jdEuaPBe14V2hutn" -j cali-to-wl-dispatch
-A cali-FORWARD -m comment --comment "cali:12bc6HljsMKsmfr-" -j cali-to-hep-forward
-A cali-FORWARD -m comment --comment "cali:NOSxoaGx8OIstr1z" -j cali-cidr-block
-A cali-INPUT -p ipencap -m comment --comment "cali:PajejrV4aFdkZojI" -m comment --comment "Allow IPIP packets from Calico hosts" -m set --match-set cali40all-hosts-net src -m addrtype --dst-type LOCAL -j ACCEPT
-A cali-INPUT -p ipencap -m comment --comment "cali:_wjq-Yrma8Ly1Svo" -m comment --comment "Drop IPIP packets from non-Calico hosts" -j DROP
-A cali-INPUT -i cali+ -m comment --comment "cali:8TZGxLWh_Eiz66wc" -g cali-wl-to-host
-A cali-INPUT -m comment --comment "cali:6McIeIDvPdL6PE1T" -j ACCEPT
-A cali-INPUT -m comment --comment "cali:YGPbrUms7NId8xVa" -j MARK --set-xmark 0x0/0xf0000
-A cali-INPUT -m comment --comment "cali:2gmY7Bg2i0i84Wk_" -j cali-from-host-endpoint
-A cali-INPUT -m comment --comment "cali:q-Vz2ZT9iGE331LL" -m comment --comment "Host endpoint policy accepted packet." -j ACCEPT
-A cali-OUTPUT -m comment --comment "cali:Mq1_rAdXXH3YkrzW" -j ACCEPT
-A cali-OUTPUT -o cali+ -m comment --comment "cali:69FkRTJDvD5Vu6Vl" -j RETURN
-A cali-OUTPUT -p ipencap -m comment --comment "cali:AnEsmO6bDZbQntWW" -m comment --comment "Allow IPIP packets to other Calico hosts" -m set --match-set cali40all-hosts-net dst -m addrtype --src-type LOCAL -j ACCEPT
-A cali-OUTPUT -m comment --comment "cali:9e9Uf3GU5tX--Lxy" -j MARK --set-xmark 0x0/0xf0000
-A cali-OUTPUT -m comment --comment "cali:0f3LDz_VKuHFaA2K" -m conntrack ! --ctstate DNAT -j cali-to-host-endpoint
-A cali-OUTPUT -m comment --comment "cali:OgU2f8BVEAZ_fwkq" -m comment --comment "Host endpoint policy accepted packet." -j ACCEPT
-A cali-from-wl-dispatch -m comment --comment "cali:zTj6P0TIgYvgz-md" -m comment --comment "Unknown interface" -j DROP
-A cali-to-wl-dispatch -m comment --comment "cali:7KNphB1nNHw80nIO" -m comment --comment "Unknown interface" -j DROP
-A cali-wl-to-host -m comment --comment "cali:Ee9Sbo10IpVujdIY" -j cali-from-wl-dispatch
-A cali-wl-to-host -m comment --comment "cali:nSZbcOoG1xPONxb8" -m comment --comment "Configured DefaultEndpointToHostAction" -j ACCEPT


(⎈|HomeLab:default) root@k8s-m:~# iptables -t nat -S | grep cali
-N cali-OUTPUT
-N cali-POSTROUTING
-N cali-PREROUTING
-N cali-fip-dnat
-N cali-fip-snat
-N cali-nat-outgoing
-A PREROUTING -m comment --comment "cali:6gwbT8clXdHdC1b1" -j cali-PREROUTING
-A OUTPUT -m comment --comment "cali:tVnHkvAo15HuiPy0" -j cali-OUTPUT
-A POSTROUTING -m comment --comment "cali:O3lYWMrLQYEMJtB5" -j cali-POSTROUTING
-A cali-OUTPUT -m comment --comment "cali:GBTAv2p5CwevEyJm" -j cali-fip-dnat
-A cali-POSTROUTING -m comment --comment "cali:Z-c7XtVd2Bq7s_hA" -j cali-fip-snat
-A cali-POSTROUTING -m comment --comment "cali:nYKhEzDlr11Jccal" -j cali-nat-outgoing
-A cali-POSTROUTING -o tunl0 -m comment --comment "cali:SXWvdsbh4Mw7wOln" -m addrtype ! --src-type LOCAL --limit-iface-out -m addrtype --src-type LOCAL -j MASQUERADE --random-fully
-A cali-PREROUTING -m comment --comment "cali:r6XmIziWUJsdOK6Z" -j cali-fip-dnat
-A cali-nat-outgoing -m comment --comment "cali:flqWnvo8yq4ULQLa" -m set --match-set cali40masq-ipam-pools src -m set ! --match-set cali40all-ipam-pools dst -j MASQUERADE --random-fully

 

 

 


 

 

[ (참고) 노드에 파드 1개 생성 시 iptables filter 에 추가되는 정책 (예시) ]

 

파드가 추가되면 배수의 Rule 들이 추가된다

# 파드별 iptables rule 확인
iptables -L -n -v
iptables -v --numeric --table filter --list cali-tw-<자신의 파드에 매핑되는 calice# 인터페이스 이름>
root@k8s-w1:~# iptables -v --numeric --table filter --list cali-tw-calice0906292e2
Chain cali-tw-calice0906292e2 (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:Kyvj-MeWlJ-7Y5Lk */ ctstate RELATED,ESTABLISHED
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* cali:qwQkS1Qk5-0C_6fl */ ctstate INVALID
    0     0 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* cali:D2FNFV7seztTEwpC */ MARK and 0xfffeffff
    0     0 cali-pri-kns.default  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* cali:BkzqwS83rjt9SfBo */
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* cali:iu5U8w6JA_Ay43ur */ /* Return if profile accepted */ mark match 0x10000/0x10000
    0     0 cali-pri-ksa.default.default  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* cali:-EjtVHKYUnymIIJr */
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* cali:mIgqs2n8E2V5NxVE */ /* Return if profile accepted */ mark match 0x10000/0x10000
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* cali:IYUCq-2vz6E2hpfw */ /* Drop if no profiles matched */

 

 


 

 

[  (심화) calico-node 정보 상세 확인  ]

더보기
# calico-node 컨테이너 확인
crictl ps | grep calico

# bird 프로세스 확인
ps -ef | grep bird.cfg
root@k8s-w1:~# ps -ef | grep bird.cfg
root        3094    2950  0 03:30 ?        00:00:01 bird -R -s /var/run/calico/bird.ctl -d -c /etc/calico/confd/config/bird.cfg
root      131712   55657  0 06:37 pts/0    00:00:00 grep --color=auto bird.cfg

# bird.cfg 파일 확인
find / -name bird.cfg
cat /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/61/fs/etc/calico/confd/config/bird.cfg
function apply_communities ()
{
}

# Generated by confd
include "bird_aggr.cfg";
include "bird_ipam.cfg";

router id 192.168.100.101;

# Configure synchronization between routing tables and kernel.
protocol kernel {
  learn;             # Learn all alien routes from the kernel
  persist;           # Don't remove routes on bird shutdown
  scan time 2;       # Scan kernel routing table every 2 seconds
  import all;
  export filter calico_kernel_programming; # Default is export none
  graceful restart;  # Turn on graceful restart to reduce potential flaps in
                     # routes when reloading BIRD configuration.  With a full
                     # automatic mesh, there is no way to prevent BGP from
                     # flapping since multiple nodes update their BGP
                     # configuration at the same time, GR is not guaranteed to
                     # work correctly in this scenario.
  merge paths on;    # Allow export multipath routes (ECMP)
}

# Watch interface up/down events.
protocol device {
  debug { states };
  scan time 2;    # Scan interfaces every 2 seconds
}

protocol direct {
  debug { states };
  interface -"cali*", -"kube-ipvs*", "*"; # Exclude cali* and kube-ipvs* but
                                          # include everything else.  In
                                          # IPVS-mode, kube-proxy creates a
                                          # kube-ipvs0 interface. We exclude
                                          # kube-ipvs0 because this interface
                                          # gets an address for every in use
                                          # cluster IP. We use static routes
                                          # for when we legitimately want to
                                          # export cluster IPs.
}


# Template for all BGP clients
template bgp bgp_template {
  debug { states };
  description "Connection to BGP peer";
  local as 64512;
  multihop;
  gateway recursive; # This should be the default, but just in case.
  import all;        # Import all routes, since we don't know what the upstream
                     # topology is and therefore have to trust the ToR/RR.
  export filter calico_export_to_bgp_peers;  # Only want to export routes for workloads.
  add paths on;
  graceful restart;  # See comment in kernel section about graceful restart.
  connect delay time 2;
  connect retry time 5;
  error wait time 5,30;
}

# ------------- Node-to-node mesh -------------

# For peer /host/k8s-m/ip_addr_v4
protocol bgp Mesh_192_168_100_10 from bgp_template {
  neighbor 192.168.100.10 as 64512;
  source address 192.168.100.101;  # The local address we use for the TCP connection
}

# For peer /host/k8s-w1/ip_addr_v4
# Skipping ourselves (192.168.100.101)

# For peer /host/k8s-w2/ip_addr_v4
protocol bgp Mesh_192_168_100_102 from bgp_template {
  neighbor 192.168.100.102 as 64512;
  source address 192.168.100.101;  # The local address we use for the TCP connection
  passive on; # Mesh is unidirectional, peer will connect to us.
}

# For peer /host/k8s-w3/ip_addr_v4
protocol bgp Mesh_192_168_100_103 from bgp_template {
  neighbor 192.168.100.103 as 64512;
  source address 192.168.100.101;  # The local address we use for the TCP connection
  passive on; # Mesh is unidirectional, peer will connect to us.
}

# ------------- Global peers -------------
# No global peers configured.


# ------------- Node-specific peers -------------

# No node-specific peers configured.

 

[ (심화) calico-node 의 bird 라우팅 정보 확인(birdcl) ] - 링크

더보기
# calico-node 정보 확인 : 컨테이너 네트워크는 host 모드를 사용하여 해당 노드의 네트워크를 사용
kubectl get pod -n kube-system -l k8s-app=calico-node -o wide
kubectl get pod -n kube-system -l k8s-app=calico-node -oname
 
# 각 파드에 exec 로 birdcl 에 정보 확인
for pod in $(kubectl get pod -n kube-system -l k8s-app=calico-node -oname); do echo $pod; kubectl exec $pod -n kube-system -- birdcl show route; echo; done
for pod in $(kubectl get pod -n kube-system -l k8s-app=calico-node -oname); do echo $pod; kubectl exec $pod -n kube-system -- birdcl show route all; echo; done
for pod in $(kubectl get pod -n kube-system -l k8s-app=calico-node -oname); do echo $pod; kubectl exec $pod -n kube-system -- birdcl show status; echo; done

#------------------------------------------
# (옵션) 직접 파드 이름 지정 후 birdcl 로 접속 후 정보 확인
kubectl exec -it $CALICONODE1 -n kube-system -- birdcl
root@k8s-m:~# kubectl exec -it calico-node-95tlj -n kube-system -- birdcl
Defaulted container "calico-node" out of: calico-node, upgrade-ipam (init), install-cni (init), flexvol-driver (init)
BIRD v0.3.3+birdv1.6.8 ready.
bird>

# 라우팅 정보 확인 : 다른 노드로부터 BGP 로 전달받은 네트워크 경로 정보를 아래 빨간색 부분!
show route
bird> show route
0.0.0.0/0          via 10.0.2.2 on enp0s3 [kernel1 04:18:24] * (10)
10.0.2.2/32        dev enp0s3 [kernel1 04:18:24] * (10)
192.168.100.0/24   dev enp0s8 [direct1 04:18:23] * (240)
10.0.2.0/24        dev enp0s3 [direct1 04:18:23] * (240)
172.16.228.64/26   blackhole [static1 04:18:23] * (200)
172.16.228.64/32   dev tunl0 [direct1 04:18:23] * (240)
172.16.197.0/26    via 192.168.100.103 on enp0s8 [Mesh_192_168_100_103 04:20:00] * (100/0) [i]
172.16.46.0/26     via 192.168.100.102 on enp0s8 [Mesh_192_168_100_102 04:19:04] * (100/0) [i]
172.16.29.0/26     via 192.168.100.10 on enp0s8 [Mesh_192_168_100_10 04:18:25] * (100/0) [i]
172.17.0.0/16      dev docker0 [direct1 04:18:23] * (240)

# 기타 확인 명령어
bird> show protocol
bird> show route all
bird> show status

# 빠져나가기
bird> exit