Ssup2 Blog logo Ssup2 Blog

Kubernetes Network Plugin인 Calico를 분석한다.

1. Calico

Calico는 Container, VM 환경에서 L3기반 Virtual Network를 구축하게 도와주는 Tool이다. Calico는 CNI (Container Network Inteface)를 지원하기 때문에 Kubernetes나 Meos에서 Network Plugin으로 동작 할 수 있다.

[그림 1] Calico 구성요소

[그림 1]은 Calico의 구성요소를 나타낸다. 크게 etcd, felix, bird, confd 4가지의 구성요소로 이루어져 있다. etcd는 Kubernete Cluster에서 동작한다. felix, confd, bird는 모든 Kubernetes Host 위에서 동작하는 calico-node Pod안에서 동작한다. calico-node Pod은 Host(Node)의 Network Namespace를 이용하기 때문에 calico-node Pod안에서 동작하는 App은 Host의 Network 설정을 조회하거나 제어 할 수 있다.

1.1 Pod Network with IP-in-IP

[그림 2] Calico IP-in-IP Pod Network

[그림 2]는 IP-in-IP Tunneling 기법을 이용하여 Calico가 설정한 Pod Network를 나타내고 있다. Host의 Network는 10.0.0.0/24이고, Pod Network는 192.168.0.0/24이다. felix는 etcd에 저장된 정보를 바탕으로 각 Host에 Pod Network를 할당한다. 그림에서 Host 1에는 192.168.2.0/24 Network가 할당되었다. 따라서 Host 1에 생긴 Pod A의 IP는 192.168.2.0/24 Network에 속한 IP인 192.168.2.10을 이용한다. Host 2에는 192.168.3.0/24 Network가 할당되었기 때문에 Host 2에 생긴 Pod B의 IP는 192.168.3.0/24 Network에 속한 IP인 192.168.3.10를 이용한다.

felix는 각 Host에 Pod Network를 할당한 후 다른 Host에 할당된 Pod Network로 Packet이 전달되도록 IP-in-IP Tunnel Interface를 생성하고 Routing Table을 추가한다. 그림에서 각 Host의 tunl0 Interface는 서로의 Pod Network를 가리키도록 설정되어 있다. felix는 또한 Pod에 할당된 IP를 Routing Table에 추가하여 Packet이 Pod로 전달되도록 한다.

Pod A에서 Dest IP가 192.168.3.10인 Packet을 보내면, Packet은 calixxx Interface로 나와 Host 1의 Routing Table 규칙에 따라 다시 Routing된다. Packet의 Dest IP가 192.168.3.0/24 Network에 속하기 때문에 Packet은 tunl0 Interface로 전달되고 다시 Host 2로 전달된다. 그 후 Packet은 Host 2의 Routing Table에 따라서 caliyyy Interface에 전달되어 Pod B에게 전달된다.

IP-in-IP를 이용하여 가상의 Pod Network를 만드는 방식이지만, Host의 Routing Table에 Pod IP 정보도 있기 때문에 Host에서도 Pod에게 Packet을 전달할 수 있다. bird도 Host의 Routing Table을 바탕으로 Pod IP를 파악하고 Route Reflector로 전달한다.

2. 참조