본문 바로가기

쿠버네티스

externalTrafficPolicy 활용 하기

Kubernetes에서 Service 객체는 클러스터 내 Pod로 트래픽을 전달하는 핵심 요소입니다.

특히, externalTrafficPolicy 옵션은 클러스터 외부에서 유입되는 트래픽을 어떻게 처리할지 결정 합니다.

 

 

 

 

이번 글에서는 externalTrafficPolicy 설정값에 따른 동작 방식과 다양한 활용사례에 대해 알아보겠습니다. 

 

 

externalTrafficPolicy 활용 하기

 

 

목 차

 

externalTrafficPolicy란?

externalTrafficPolicy는 NodePort 또는 LoadBalancer 타입의 Service에서만 사용 가능하며, 외부에서 들어오는 트래픽을 어떤 방식으로 클러스터 내부로 전달할지 결정하는 역할을 합니다.

 

externalTrafficPolicy 의 옵션에 따른 동작 방식을 정리하면 다음과 같습니다. 

옵션 동작 방식
Cluster (default) 모든 노드에서 트래픽을 받음.
트래픽 전달 시 SNAT 수행
Local Pod가 있는 노드에서만 트래픽을 받음.
클라이언트의 IP 유지 (SNAT 없음)

 


 

externalTrafficPolicy 설정값에 따른 동작 특징

(1) externalTrafficPolicy: Cluster (기본값)

특징

  • 모든 노드에서 외부 트래픽을 받을 수 있음.
  • kube-proxy가 클러스터 내 다른 노드의 Pod로 트래픽을 전달할 수도 있음.
  • SNAT 변환이 이루어지므로, Pod는 클라이언트의 원래 IP를 알 수 없음.
  • 부하 분산이 자동으로 이루어짐.

트래픽 흐름

  1. 클라이언트가 NodePort(예: 32300)로 요청을 보냄.
  2. 요청이 클러스터 내의 아무 노드로 전달될 수 있음.
  3. kube-proxy가 해당 노드에서 요청을 받아 서비스의 Endpoint 중 하나로 전달.
  4. 트래픽이 Pod로 전달됨 (Pod가 다른 노드에 있을 수도 있음).
  5. 응답이 요청을 받은 노드를 통해 클라이언트로 반환됨.

예제 (externalTrafficPolicy: Cluster)

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
spec:
  type: NodePort
  externalTrafficPolicy: Cluster  # 기본값
  ports:
    - port: 80
      targetPort: 80
      nodePort: 32300
  selector:
    app: ingress-nginx

 

장점

  • 트래픽을 모든 노드에서 받을 수 있어 고가용성이 보장됨.
  • 로드밸런서가 특정 노드를 인식하지 않아도 트래픽이 자동으로 분산됨.

단점

  • SNAT이 수행되므로, 클라이언트의 원래 IP 주소가 보이지 않음.
  • Pod가 없는 노드에서도 트래픽을 받아 추가적인 네트워크 홉이 발생할 수 있음.

 

 

 

(2) externalTrafficPolicy: Local

특징

  • Pod가 있는 노드에서만 트래픽을 수락.
  • 트래픽을 받은 노드에서만 kube-proxy가 Pod로 전달.
  • 클라이언트의 실제 IP 주소가 유지됨 (SNAT 없음).
  • Pod가 없는 노드에서는 트래픽을 거부.

트래픽 흐름

  1. 클라이언트가 NodePort(예: 32300)로 요청을 보냄.
  2. 요청이 Pod가 실행 중인 노드로만 전달됨.
  3. 해당 노드의 kube-proxy가 Pod로 트래픽을 전달.
  4. 응답이 클라이언트로 직접 반환됨.

예제 (externalTrafficPolicy: Local)

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
spec:
  type: NodePort
  externalTrafficPolicy: Local
  ports:
    - port: 80
      targetPort: 80
      nodePort: 32300
  selector:
    app: ingress-nginx

 

장점

  • 클라이언트의 원래 IP 주소를 Pod에서 확인할 수 있음.
  • 불필요한 네트워크 홉을 줄여 네트워크 성능이 향상됨.
  • Ingress Controller, L7 로드밸런서와 함께 사용할 때 유용.

단점

  • Pod가 없는 노드로 트래픽이 전달되면, 응답을 받지 못함.
  • 로드밸런서가 Pod가 있는 노드만 인식해야 함 (헬스 체크 필요).

kube-proxy

kube-proxy는 Kubernetes 클러스터 내에서 서비스 트래픽을 관리하는 핵심 컴포넌트입니다.

주요 기능

  • 워커노드에서 클러스터 내부 및 외부 트래픽을 관리.
  • iptables 또는 IPVS를 사용하여 트래픽을 적절한 Pod로 라우팅.
  • externalTrafficPolicy에 따라 트래픽을 어떻게 전달할지 결정.

트래픽 처리 방식

externalTrafficPolicy 값 kube-proxy 동작 방식
Cluster 모든 노드에서 트래픽을 받아 내부에서 Pod로 전달 (SNAT 수행)
Local Pod가 있는 노드에서만 트래픽을 받아 Pod로 전달 (SNAT 없음)

 


externalTrafficPolicy 활용 사례

(1) Ingress Controller 사용 (Local 모드)

  • L7 로드밸런서가 클라이언트의 실제 IP 주소를 유지하도록 하고 싶을 때.
  • 예제:
    externalTrafficPolicy: Local
  • Nginx Ingress Controller, Traefik, HAProxy 등의 Ingress Controller와 함께 사용하면, 실제 클라이언트 IP를 유지할 수 있음.

 

(2) 클러스터 전체에서 고가용성 서비스 제공 (Cluster 모드)

  • 모든 노드에서 트래픽을 받을 수 있도록 해야 할 때.
  • externalTrafficPolicy: Cluster를 사용하면 모든 노드에서 트래픽을 받을 수 있어 장애에 강한 서비스 구성 가능.

 

(3) NSX, F5 같은 L4 하드웨어 로드밸런서 사용 (Local 모드)

  • NSX-T, F5, Citrix ADC 같은 외부 로드밸런서를 Kubernetes와 연동할 때.
  • Pod가 있는 노드만 트래픽을 받을 수 있도록 설정하여 불필요한 네트워크 홉을 방지.

 


요약 정리

  • externalTrafficPolicy는 클러스터 외부에서 들어오는 트래픽을 처리하는 방법을 결정하는 중요한 설정이다.
  • Cluster 모드: 모든 노드에서 트래픽을 받아서 내부 Pod로 전달 (기본값).
  • Local 모드: Pod가 있는 노드에서만 트래픽을 수락하며, 클라이언트의 원래 IP 유지.
  • kube-proxy가 트래픽을 관리하며, iptables 또는 IPVS를 사용하여 서비스 엔드포인트로 라우팅함.
  • L7 로드밸런서 사용 시 Local을 사용하고, 고가용성이 필요할 때는 Cluster를 사용하면 좋다.