반응형
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 소켓에서 직접 보존 |
| 결론 | 복잡한 네트워크 설정 없이 간단 구성 ✅ |
반응형
'K8S' 카테고리의 다른 글
| Kubernetes AWS ALB/NLB 구성 yaml (0) | 2026.01.26 |
|---|---|
| Kubernetes Windows 지원: 기능 비교와 스케줄링 방식 정리 (0) | 2026.01.23 |
| 쿠버네티스 캐스케이딩 삭제(Cascading Deletion) (0) | 2026.01.22 |
| Kubernetes는 가상화 도구인가? (0) | 2026.01.22 |
| Kubernetes에서 Stateful 앱에 Blue-Green 배포를 적용할 수 있을까? (0) | 2026.01.19 |
댓글