Pod networking
파드들이 어떻게 주소가 할당되고 어떻게 서로 통신할까, 클러스터 내부, 외부에서 파드에서 돌고 있는 서비스에 어떻게 접근할까? 우선 쿠버네티스는 이것들에 대해 자체적으로 solution을 제공하지는 않는다.
쿠버네티스는 모든 파드들이 uniqu한 ip 주소를 가지고 해당 ip를 통해 같은 node의 모든 pod들이 서로 통신할 수 있도록 한다.
- 노드에 컨테이너가 생성되면 네트워크 namespace를 생성한다. 쿠버네티스는 통신을 위해 namespace를 network에 붙인다. 여기서 말하는 네트워크는 bridge network를 말하고, 즉, 각 노드에 bridge network를 생성한다.
- 각 bridge network, bridge interface에 ip 주소를 할당한다.
- 컨테이너를 네트워크에 붙인다. pipe 또는 virtual network cable을 사용한다. ip link add 명령어를 통해 생성할 수 있다. → pod들이 unique ip를 가졌으며 서로 통신할 수 있다. 다른 노드의 pod와 통신하기 위해서는 아래의 과정이 필요하다,
- routing table을 이용해 모든 호스트에 대해 route를 구성한다.
- 위 과정을 manual하게 script로 정의하지 않고 자동으로 하기위해 CNI가 도입되었다, CNI 표준에 맞추어 정의하면, 실제로는 CNI를 통해 위 과정이 수행된다.
CNI in kubernetes
kubelet 정보를 통해 CNI 설정 정보를 확인할 수 있다.
ps-aux | grep kubelet
- —network-plugin=cni : kubelet 실행시 받은 CNI 설정 정보
- —cni-bin-dir : cni 플러그인 디렉토리
- —cni-conf-dir : cni 설정 파일 디렉토리
→ kubelet은 해당 정보들로 cni script의 add 명령어를 수행해 네트워크를 구성하게 된다.
CNI weave
routing table은 수많은 entry를 지원할 수 없다. 클러스터 내 노드가 엄청 많고 각 노드에 파드가 엄청 많은 환경에서는 다른 솔루션이 필요하다. 이를 weave 등 CNI plugin을 통해 해결할 수 있다.