본문으로 건너뛰기

Pod 네트워크

Pod 네트워크

요구 사항

  • 쿠버네티스 클러스터 구축 시 노드 간 통신은 정해진 포트만 열어놓는다면 기본적으로 쿠버네티스 안에 내장되어있지만, Pod간 통신은 내장되어있지 않고 별도의 네트워크 솔루션으로 해결해야한다.
    • 실제로 CNI를 설치하지 않고 마스터 노드에 워커 노드를 join 시켜보면 join까지는 되지만, NotReady 상태일 것이다.
  • 이러한 네트워크 솔루션은 다음과 같은 요구사항을 만족해야한다.
    • 모든 Pod는 고유한 IP를 가져야 한다.
    • 같은 노드 내의 Pod끼리든 다른 노드에 있는 Pod와도 NAT 없이 직접 통신 가능해야 한다.

수동으로 한다면?

  • 위와 같은 요구사항을 만족하기 위해 이러한 네트워크 설정을 수동으로 한다면 어떤 정이 필요할까?
  • 아래와 같은 예시로 확인해보자.

노드 및 브리지 설정

  • 노드 환경: 3개의 노드가 192.168.1.0 대역의 네트워크로 연결되어 있다고 가정하자.
  • 브리지 생성: 각 노드 내부에 컨테이너와의 연결을 위한 가상 브리지 네트워크를 생성한다.
  • 서브넷 할당: 각 노드 별로 다른 서브넷 대역(Pod 대역)을 할당하여 Pod 끼리의 IP 충돌을 방지한다.
    • Node 1: 10.244.1.0/24
    • Node 2: 10.244.2.0/24
    • Node 3: 10.244.3.0/24

컨테이너 연결(컨테이너가 생성될 때마다 수행)

  1. veth 생성: 가상 케이블인 veth pair를 생성한다.
  2. 연결: 한쪽 끝은 Pod(컨테이너)의 네임스페이스에, 다른 쪽 끝은 노드의 브리지에 연결한다.
  3. IP 할당: 해당 노드의 서브넷 대역에서 남는 IP를 할당하고 네트워크 인터페이스를 활성화한다.

라우팅(다른 노드에 있는 Pod와 통신 위함)

  • 서브넷 대역에 따라 어떤 노드로 가야하는지에 대해 각 노드의 라우팅 테이블에 설정한다.

CNI

  • 수천 개의 Pod가 생성되고 삭제될 때마다 위 과정을 수동으로 하는 것은 불가능하다.
  • 이에 CNI가 이러한 모든 작업들을 자동으로 해준다.
  • 작동 방식
    1. Pod가 생성되면 컨테이너 런타임이 CNI 플러그인을 호출한다.
      • 정확하게는 kubelet->CRI -> 컨테이너 런타임 -> CNI 플러그인
    2. 이때 ADD 명령과 함께 컨테이너 정보를 전달한다.
    3. CNI 플러그인은 위의 과정들을 모두 자동으로 수행한다.

레퍼런스