Kubernetes에서 Service 객체는 클러스터 내 Pod로 트래픽을 전달하는 핵심 요소입니다.
특히, 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를 알 수 없음.
- 부하 분산이 자동으로 이루어짐.
트래픽 흐름
- 클라이언트가 NodePort(예: 32300)로 요청을 보냄.
- 요청이 클러스터 내의 아무 노드로 전달될 수 있음.
- kube-proxy가 해당 노드에서 요청을 받아 서비스의 Endpoint 중 하나로 전달.
- 트래픽이 Pod로 전달됨 (Pod가 다른 노드에 있을 수도 있음).
- 응답이 요청을 받은 노드를 통해 클라이언트로 반환됨.
예제 (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가 없는 노드에서는 트래픽을 거부.
트래픽 흐름
- 클라이언트가 NodePort(예: 32300)로 요청을 보냄.
- 요청이 Pod가 실행 중인 노드로만 전달됨.
- 해당 노드의 kube-proxy가 Pod로 트래픽을 전달.
- 응답이 클라이언트로 직접 반환됨.
예제 (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를 사용하면 좋다.
'쿠버네티스' 카테고리의 다른 글
PV, PVC, StorageClass 실습 (0) | 2025.03.13 |
---|---|
Storage 3대장 이해하기 (4/4) - Object Storage (0) | 2025.03.07 |
Storage 3대장 이해하기 (3/4) - File Storage (0) | 2025.02.26 |
kubectl 사용자 별 권한 설정하기 (0) | 2025.02.24 |
Storage 3대장 이해하기 (2/4) - Block Storage (0) | 2025.02.21 |