Pod 네트워크
Pod 네트워크
요구 사항
- 쿠버네티스 클러스터 구축 시 노드 간 통신은 정해진 포트만 열어놓는다면 기본적으로 쿠버네티스 안에 내장되어있지만,
Pod간 통신은 내장되어있지 않고 별도의 네트워크 솔루션으로 해결해야한다.- 실제로 CNI를 설치하지 않고 마스터 노드에 워커 노드를
join시켜보면join까지는 되지만,NotReady상태일 것이다.
- 실제로 CNI를 설치하지 않고 마스터 노드에 워커 노드를
- 이러한 네트워크 솔루션은 다음과 같은 요구사항을 만족해야한다.
- 모든
Pod는 고유한 IP를 가져야 한다. - 같은 노드 내의
Pod끼리든 다른 노드에 있는Pod와도 NAT 없이 직접 통신 가능해야 한다.
- 모든
수동으로 한다면?
- 위와 같은 요구사항을 만족하기 위해 이러한 네트워크 설정을 수동으로 한다면 어떤 정이 필요할까?
- 아래와 같은 예시로 확인해보자.
노드 및 브리지 설정
- 노드 환경: 3개의 노드가
192.168.1.0대역의 네트워크로 연결되어 있다고 가정하자. - 브리지 생성: 각 노드 내부에 컨테이너와의 연결을 위한 가상 브리지 네트워크를 생성한다.
- 브리지란 각
Pod(컨테이너)와 호스트를 연결하는 일종의 '가상 스위치'이다. - 이와 관련된 글 -> 네트워크 네임스페이스 - 브리지
- 브리지란 각
- 서브넷 할당: 각 노드 별로 다른 서브넷 대역(
Pod대역)을 할당하여Pod끼리의 IP 충돌을 방지한다.- Node 1:
10.244.1.0/24 - Node 2:
10.244.2.0/24 - Node 3:
10.244.3.0/24
- Node 1:
컨테이너 연결(컨테이너가 생성될 때마다 수행)
- veth 생성: 가상 케이블인 veth pair를 생성한다.
- 각
Pod와 브리지를 연결한 '가상 케이블' - 이와 관련된 글 -> 네트워크 네임스페이스 - 가상케이블
- 각
- 연결: 한쪽 끝은
Pod(컨테이너)의 네임스페이스에, 다른 쪽 끝은 노드의 브리지에 연결한다.- 이와 관련된 글 -> 네트워크 네임스페이스 - 브리지
- IP 할당: 해당 노드의 서브넷 대역에서 남는 IP를 할당하고 네트워크 인터페이스를 활성화한다.
- 이와 관련된 글 -> 네트워크 네임스페이스 - 브리지
라우팅(다른 노드에 있는 Pod와 통신 위함)
- 서브넷 대역에 따라 어떤 노드로 가야하는지에 대해 각 노드의 라우팅 테이블에 설정한다.
- 예:
10.244.2.0/24대역으로 가려면192.168.1.12(Node 2의 IP)로 가라는 규칙 - 이와 관련된 글 -> 네트워크 네임스페이스 - 라우팅
- 예:
CNI
- 수천 개의
Pod가 생성되고 삭제될 때마다 위 과정을 수동으로 하는 것은 불가능하다. - 이에 CNI가 이러한 모든 작업들을 자동으로 해준다.
- 작동 방식
Pod가 생성되면 컨테이너 런타임이 CNI 플러그인을 호출한다.- 정확하게는
kubelet->CRI -> 컨테이너 런타임 -> CNI 플러그인
- 정확하게는
- 이때
ADD명령과 함께 컨테이너 정보를 전달한다. - CNI 플러그인은 위의 과정들을 모두 자동으로 수행한다.
레퍼런스
- https://kubernetes.io/ko/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/
- Udemy - Certified Kubernetes Administrator (CKA) with Practice Tests (Mumshad)