본문 바로가기
K8S

Kubernetes hostNetwork & externalTrafficPolicy - AWS ALB, NLB 에서 사용하는가?

by Rainbound-IT 2026. 1. 26.
반응형

 

 


1. hostNetwork

1.1 개요

hostNetwork: true는 Pod가 호스트(노드)의 네트워크 네임스페이스를 직접 사용하도록 하는 설정.

 

1.2 동작 비교

hostNetwork: false (기본값)

 

 

hostNetwork: true

 

1.3 설정 예시

apiVersion: v1
kind: Pod
metadata:
  name: hostnetwork-pod
spec:
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet  # hostNetwork 사용 시 필수
  containers:
  - name: app
    image: nginx
    ports:
    - containerPort: 80  # 노드의 80 포트에 직접 바인딩

1.4 특징 비교

항목  hostNetwork: false hostNetwork: true
IP 주소 Pod IP (CNI 할당) 노드 IP
포트 바인딩 Pod 네임스페이스 내 노드에 직접 바인딩
DNS 클러스터 DNS 자동 dnsPolicy 별도 설정 필요
네트워크 격리 격리됨 격리 없음
포트 충돌 없음 같은 노드에서 동일 포트 사용 불가

1.5 사용 사례

사례   
CNI 플러그인 네트워크 설정 전에 실행 필요
NGINX Ingress Controller 노드의 80/443 포트 직접 사용
kube-proxy 노드 네트워크 직접 조작
모니터링 에이전트 노드 네트워크 메트릭 수집
Node Exporter 노드 레벨 메트릭 노출

1.6 보안 고려사항

# ⚠️ 보안 위험: Pod Security Standards에서 금지
spec:
  hostNetwork: true   # ❌ Baseline/Restricted 정책 위반
  hostPID: true       # ❌ 호스트 프로세스 접근
  hostIPC: true       # ❌ 호스트 IPC 접근

위험 요소:

  • 노드의 네트워크 트래픽 가로채기 가능
  • NetworkPolicy 우회
  • 다른 Pod/Service에 직접 접근 가능
  • 포트 충돌 위험 (같은 노드에서 동일 포트 사용 불가)

1.7 DaemonSet + hostNetwork 예시 (NGINX Ingress)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-ingress
spec:
  selector:
    matchLabels:
      app: nginx-ingress
  template:
    metadata:
      labels:
        app: nginx-ingress
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - name: nginx-ingress
        image: nginx/nginx-ingress
        ports:
        - containerPort: 80
          hostPort: 80
        - containerPort: 443
          hostPort: 443

2. externalTrafficPolicy

2.1 개요

externalTrafficPolicy는 외부 트래픽이 Service 백엔드로 라우팅되는 방식을 제어.

2.2 정책 비교

Cluster (기본값)

 

 

특징

  • ⚠️ Source IP 손실: Pod는 Node1 IP를 봄
  • 장점: 모든 노드로 트래픽 분산 가능

Local

 

특징

  • Source IP 보존: Pod는 203.0.113.50을 봄
  • ⚠️ 단점: Pod 없는 노드는 트래픽 거부

2.3 상세 비교

항목  Cluster (기본)  Local
Source IP SNAT됨 (노드 IP로 변경) 보존됨
트래픽 분배 모든 노드의 Pod로 분배 로컬 노드의 Pod로만
로드밸런싱 균등 분배 불균등 가능
가용성 모든 노드에서 수신 Pod 있는 노드만 수신
네트워크 홉 추가 홉 가능 최소 홉
지연시간 상대적으로 높음 낮음

2.4 설정 예시

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer          # 또는 NodePort
  externalTrafficPolicy: Local  # Source IP 보존
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080

2.5 Health Check (Local 정책)

externalTrafficPolicy: Local 설정 시 자동으로 healthCheckNodePort 생성:

# healthCheckNodePort 확인
$ kubectl get svc my-service -o yaml | grep healthCheckNodePort
  healthCheckNodePort: 32122

# Pod가 있는 노드
$ curl localhost:32122/healthz
{
  "service": { "namespace": "default", "name": "my-service" },
  "localEndpoints": 1
}  # ✅ 트래픽 수신

# Pod가 없는 노드
$ curl localhost:32122/healthz
{
  "service": { "namespace": "default", "name": "my-service" },
  "localEndpoints": 0
}  # ❌ 트래픽 거부

2.6 적용 가능 Service Type

Service Type externalTrafficPolicy 지원 비고
ClusterIP 내부 전용, 항상 Source IP 보존
NodePort Local 시 해당 노드 Pod로만 라우팅
LoadBalancer Health check로 자동 노드 선별
ExternalName DNS CNAME만 반환

2.7 사용 시나리오

Cluster 권장

  • Pod가 소수의 노드에만 있는 경우
  • 균등한 로드밸런싱이 중요한 경우
  • Source IP가 필요 없는 경우

Local 권장

  • Source IP 보존 필수 (로깅, 보안, 지역 기반 서비스)
  • 지연시간 최소화 필요
  • WAF/방화벽 앞에 위치한 서비스
  • Pod가 모든/대부분 노드에 분산된 경우 (DaemonSet)

3. 요약

3.1 hostNetwork 요약

항목  설명
목적 Pod가 노드의 네트워크 네임스페이스 직접 사용
IP 노드 IP 사용
포트 노드에 직접 바인딩
격리 없음 (보안 위험)
사용 사례 CNI, Ingress Controller, kube-proxy, 모니터링
필수 설정 dnsPolicy: ClusterFirstWithHostNet

3.2 externalTrafficPolicy 요약

정책  Source IP  트래픽 분배 지연시간
Cluster 손실 (SNAT) 균등 높음
Local 보존 불균등 낮음

3.3 AWS ALB/NLB에서의 필요 여부

구성  hostNetwork  externalTrafficPolicy
ALB + IP mode ❌ 불필요 ❌ 무관
ALB + Instance mode ❌ 불필요 Local (Source IP 보존 시)
NLB + IP mode ❌ 불필요 ❌ 무관
NLB + Instance mode ❌ 불필요 Local (Source IP 보존 시)
NGINX Ingress 선택적 사용 Service 타입에 따라

4. AWS ALB/NLB 사용 시 필요 여부

4.1 결론: IP Mode 사용 시 둘 다 불필요

일반적인 AWS EKS 웹 서비스에서 ALB/NLB + IP mode를 사용하면:

설정  필요 여부 이유
hostNetwork ❌ 불필요 ALB/NLB가 Pod IP로 직접 연결
externalTrafficPolicy ❌ 무관 Service를 거치지 않음

4.2 왜 필요 없는가?

전통적인 방식 (필요한 경우):

Client → LB → Node → Service (kube-proxy) → Pod
                     ~~~~~~~~
                     여기서 SNAT 발생 → externalTrafficPolicy 필요

AWS ALB/NLB IP Mode (불필요한 경우):

Client → ALB/NLB → Pod IP 직접
                   ↑
         Service, NodePort, kube-proxy 안 거침

4.3 상세 설명

hostNetwork가 불필요한 이유

구성  트래픽 경로 hostNetwork 필요?
NGINX Ingress Client → NLB → Node:80 → NGINX Pod → Backend 선택적 (노드 포트 직접 사용 시)
AWS ALB Client → ALB → Pod IP 직접 ❌ 불필요
AWS NLB (IP) Client → NLB → Pod IP 직접 ❌ 불필요

AWS ALB/NLB는 Pod IP로 직접 트래픽을 전송하므로 노드의 포트에 바인딩할 필요가 없습니다.

 

externalTrafficPolicy가 무관한 이유

구성  Service 경유 externalTrafficPolicy 영향?
NodePort Service ✅ 경유 ✅ 영향 있음
ALB Instance mode ✅ 경유 (NodePort) ✅ 영향 있음
ALB IP mode ❌ 안 거침 ❌ 무관
NLB IP mode ❌ 안 거침 ❌ 무관

IP mode에서 Service는 Pod 선택자 역할만 하고, 실제 트래픽은 Service를 거치지 않습니다.

4.4 Source IP 확인 방법

LB 타입 Target Type Source IP 확인 방법
ALB IP X-Forwarded-For 헤더
NLB IP TCP 소켓에서 직접 확인 (보존됨)
ALB/NLB Instance + Local 각각 위와 동일

 

ALB 예시 (X-Forwarded-For):

# Python/Flask
client_ip = request.headers.get('X-Forwarded-For', '').split(',')[0].strip()

// Node.js/Express
app.set('trust proxy', true);
const clientIP = req.ip;

 

NLB IP Mode 예시 (직접 보존):

# Python - TCP 소켓에서 직접 확인 가능
client_ip = request.remote_addr  # 실제 클라이언트 IP

 

4.5 권장 구성

일반적인 AWS EKS 웹 서비스:

# ALB Ingress - 이것만 있으면 됨
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app
  annotations:
    alb.ingress.kubernetes.io/target-type: ip  # 기본값, IP mode 사용
    alb.ingress.kubernetes.io/scheme: internet-facing
spec:
  ingressClassName: alb
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-svc  # ClusterIP로 충분
            port:
              number: 80

---
# Service - ClusterIP로 충분 (Pod 선택자 역할만)
apiVersion: v1
kind: Service
metadata:
  name: my-app-svc
spec:
  type: ClusterIP  # NodePort 불필요
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
  # externalTrafficPolicy 설정 불필요 (ClusterIP에는 해당 안 됨)

핵심: hostNetwork, externalTrafficPolicy 모두 신경 쓸 필요 없음

4.6 언제 필요한가?

상황  hostNetwork  externalTrafficPolicy
AWS ALB/NLB + IP mode
AWS ALB/NLB + Instance mode Local (Source IP 보존 시)
NGINX Ingress Controller 선택적 (성능 목적) Service 타입에 따라
On-premise / Bare-metal 상황에 따라 Local (Source IP 보존 시)
MetalLB Local 권장

4.7 요약

 

 

 

항목  AWS ALB/NLB + IP Mode
hostNetwork ❌ 불필요
externalTrafficPolicy ❌ 무관
Service Type ClusterIP로 충분
Source IP (ALB) X-Forwarded-For 헤더
Source IP (NLB) TCP 소켓에서 직접 보존
결론 복잡한 네트워크 설정 없이 간단 구성 ✅
반응형

댓글