쿠버네티스의 파드 네트워킹
쿠버네티스는 도커와는 달리 파드단위로 컨테이너들을 관리한다. 파드는 여러개의 컨테이너로 구성 될 수 있는데 컨테이너들은 모두 동일한 IP를 부여받을 수 있다.
1) 싱글 노드에서의 Pod to Pod 통신
결론 : 네트워크 인터페이스 (= kubenet 혹은 CNI)를 통하여 파드에 할당되어 있는 고유한 IP주소로 통신할 수 있다.
2) 멀티 노드에서의 Pod to Pod 통신
결론 : 오버레이 네트워크 기능을 구현하기 위해 CNI를 설치하고 라우터를 경유하여 통신하게 된다.
Pod → veth → CNI(Flannel) → eth0 → 라우터(=VPC) → eth1 → CNI(Flannel) → veth → Pod
여기서 오버레이 네트워크 기능에는 가상 네트워크 인터페이스, 브릿지 네트워크, 라우터의 라우팅 Rule의 조합을 일컬어 오버레이 네트워크라고 한다.
CNI의 필요성
아래의 그림처럼 기존의 도커 네트워크 구조로 여러 노드를 구성하게 되면 해당 노드에서 생성된 도커 브릿지(docker0)의 IP는 두 노드 둘 다 172.17.0.1의 IP를 갖게 될 것이다. 이 경우 해당 IP로 요청이 왔을 때 노드1과 노드2 중 어떤 노드의 파드로 패킷이 가야하는지 알 수 없다.
이런 문제를 해결하기 위해 쿠버네티스에서는 CNI라는 네트워크 인터페이스를 추가적으로 설치한다. CNI는 호스트 네트워크 인터페이스의 각종 네트워크 기능들(iptables, 커널 라우팅, 터널링, 브릿지)을 사용하게 해준다.
즉, CNI가 커널 라우팅 기능과 동적 라우팅 기능으로 외부 라우터에 각 호스트 사이 라우팅을 정의해둔것이다!
이런 CNI의 역할 덕분에 라우터의 라우팅 테이블에 노드 끼리의 Rule이 추가가 되고 이를 통해서 서로간의 파드끼리 통신할 수 있게 된다. 다시한번 CNI가 무엇이고 어떤 역할을 해주는지 정리해보자.
CNI란?
Container Network Interface의 약어로 쿠버네티스 네트워크에 오버레이 네트워크를 구성해주고 파드와 호스트 인터페이스를 연결해주는 부분을 별도의 모듈로 분리한 플러그인이다.
CNI의 기능
- 커널 라우팅
- 동적 라우팅
- Pod 인터페이스 생성 및 IP, Subnet, Routing Table 설정
- Proxy ARP 기능
Weave와 같은 CNI plugin을 쓸수도 있다.
Deploy Weave plugin
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
※ 네트워크 커맨드
ip link : 네트워크 인터페이스의 상태를 관리하거나 출력
ip addr : IP 주소에 관한 정보를 수정하거나 출력
ip addr add 192.168.1.10/24 dev eth0
ip route : 라우팅 테이블을 변경하거나 출력
ip route add 192.168.1.10/24 via 192.168.2.1
cat /proc/sys/net/ipv4/ip_forward
arp : arp테이블
netstat -plnt
netstat -rn : 라우팅테이블 출력
route add default gw 192.168.0.1 : 라우팅 설정
ifconfig : 인터페이스 상세내역을 보여줌
cat /etc/network/interfaces : 인터페이스 역할을 보여줌
'PaaS > Kubernetes' 카테고리의 다른 글
(Kubernetes) DNS (0) | 2021.04.07 |
---|---|
(Kubernetes) Service (0) | 2021.04.06 |
(Kubernetes) Storage And Volume (0) | 2021.04.04 |
(Kubernetes) Network Policy (0) | 2021.04.03 |
(Kubernetes) Security Context (0) | 2021.04.03 |