본문 바로가기
K8S

CNI, Kube-proxy, Service 의 특징 및 통신과정

by Rainbound-IT 2024. 12. 21.
반응형

 

 

1. CNI, kube-proxy, Service의 역할

CNI (Container Network Interface): Pod 네트워킹 담당

  • Pod 간의 네트워크 연결을 설정하고 관리.
  • 각 Pod에 고유 IP를 할당하고, Overlay 네트워크(예: VXLAN) 또는 라우팅 기반 네트워크를 통해 노드 간 트래픽을 지원.
  • 주요 책임:
    • Pod 간 네트워크 트래픽 처리.
    • IP 주소 관리.
    • 네트워크 플러그인 제공(예: Calico, Flannel, Cilium).

Service: 트래픽의 추상화된 접근 경로 제공

  • Pod이 동적으로 생성/삭제되어도 Service를 통해 안정적인 통신 가능.
  • ClusterIP, NodePort, LoadBalancer 등으로 트래픽 라우팅 경로를 제공.
  • 주요 책임:
    • 로드 밸런싱을 통해 여러 Pod으로 트래픽 분배.
    • 클라이언트와 Pod 간 통신 추상화.

kube-proxy: 서비스 트래픽 라우팅

  • Service와 Pod 간의 트래픽을 처리.
  • iptables 또는 IPVS를 통해 네트워크 규칙을 설정하여 트래픽을 적절한 Pod으로 라우팅.
  • 주요 책임:
    • Service의 엔드포인트 관리.
    • 클러스터 내/외부 트래픽 처리.

 

2. 통신 과정

A. Pod 간 통신 (CNI)

  1. Pod 생성:
    • Kubernetes 스케줄러가 Pod을 특정 노드에 할당합니다.
    • CNI 플러그인이 호출되어 해당 Pod에 고유 IP를 할당하고, 네트워크 인터페이스를 설정합니다.
  2. Pod 간 데이터 전송:
    • 동일 노드:
      • Pod들은 동일한 브릿지 네트워크(예: cbr0)를 공유하며, 직접 통신합니다.
    • 다른 노드:
      • CNI 플러그인이 Overlay 네트워크 또는 라우팅 기반 네트워크를 사용해 노드 간 통신을 설정합니다.
      • 예: VXLAN(Flannel), BGP(Calico).

B. Pod과 Service 간 통신 (kube-proxy + Service)

  1. 클라이언트가 Service IP로 요청:
    • 클라이언트(내부 또는 외부)는 Service의 ClusterIP 또는 NodePort로 요청을 보냅니다.
  2. kube-proxy가 요청 처리:
    • kube-proxy는 요청을 받아, Service와 연결된 Endpoints(Back-end Pod)를 참조합니다.
    • iptables 또는 IPVS를 통해 트래픽을 특정 Pod으로 라우팅합니다.
  3. 트래픽 전달:
    • kube-proxy는 CNI를 통해 Pod 간 네트워크를 설정하여 트래픽을 전달합니다.
    • 다른 노드에 있는 Pod으로 트래픽을 전달할 경우, CNI 플러그인이 노드 간 통신을 지원합니다.

C. 노드 외부와 Pod 간 통신

  1. 클라이언트가 외부에서 NodePort로 요청:
    • 클라이언트는 Service의 NodePort를 통해 클러스터 외부에서 접근합니다.
  2. 노드에서 kube-proxy가 요청 처리:
    • kube-proxy는 NodePort를 ClusterIP로 변환하고, Endpoints를 참조하여 요청을 Pod으로 전달합니다.
  3. 트래픽 전달 과정:
    • 동일 노드의 Pod이면 CNI를 통해 직접 전달.
    • 다른 노드의 Pod이면, CNI가 노드 간 Overlay 네트워크 또는 라우팅을 통해 트래픽을 전달.

3. 세부 통신 흐름 예제

Pod 간 통신 (내부 네트워크)

  1. 클라이언트 Pod → 대상 Pod 요청:
    • 클라이언트 Pod는 대상 Pod의 IP로 직접 요청합니다.
    • 동일 노드:
      • Pod들이 동일한 브릿지 네트워크를 공유하며, 직접 통신.
    • 다른 노드:
      • CNI 플러그인이 노드 간 네트워크를 설정하여 트래픽 전달.

Service를 통한 통신 (로드 밸런싱)

  1. 클라이언트 Pod → Service 요청:
    • 클라이언트는 Service의 ClusterIP로 요청.
    • kube-proxy가 요청을 받아, Service와 연결된 Endpoints(Back-end Pod)로 전달.
  2. Service → Pod:
    • kube-proxy는 iptables/IPVS 규칙에 따라 트래픽을 라우팅.
    • 라우팅 대상 Pod이 다른 노드에 있으면, CNI 플러그인이 트래픽 전달을 지원.

클러스터 외부에서 통신

  1. 클라이언트 → NodePort 요청:
    • 외부 클라이언트가 특정 노드의 NodePort로 요청.
    • kube-proxy가 요청을 처리하여 ClusterIP로 변환.
  2. NodePort → Service → Pod:
    • kube-proxy가 Endpoints를 참조하여 적절한 Pod으로 트래픽을 전달.
  3. Pod 응답 → 클라이언트:
    • Pod에서 응답이 클라이언트로 반환.
    • SNAT(Source NAT)가 설정되어, 응답이 클라이언트로 올바르게 전달.

4. 요약

  • CNI는 Pod 간 네트워크를 설정하고 관리하며, 노드 간 통신을 지원합니다.
  • kube-proxy는 Service를 통해 Pod으로 트래픽을 라우팅합니다. 이를 위해 iptables 또는 IPVS를 사용하여 트래픽 규칙을 설정합니다.
  • Service는 ClusterIP, NodePort, LoadBalancer 등을 통해 클라이언트와 Pod 간의 추상화된 통신 경로를 제공합니다.
  • CNI, Service, kube-proxy는 상호 보완적으로 작동하여 Kubernetes 클러스터의 네트워킹을 원활하게 유지합니다.
반응형

댓글