Post

[Kubernetes] Ingress와 Service 트래픽 흐름 완전 정리: NLB → Traefik → Pod

📌 들어가며

이번 글에서는 외부 사용자의 요청이 NLB → Traefik → 애플리케이션 Pod까지 도달하는 전체 트래픽 흐름을 단계별로 추적한다. 왜 Service가 2개 필요한지, Ingress와 Ingress Controller가 어떻게 협력하는지, 실제 패킷이 어느 IP·포트를 거치는지 정리한다.

한 줄 요약NLB → NodePort(traefik) → Traefik Pod → (Ingress 규칙 확인) → ClusterIP Service → Application Pod. 외부 진입(NodePort)과 내부 연결(ClusterIP), 두 종류의 Service가 각자 역할을 나눠 맡는다.


1. 전체 아키텍처

flowchart TD
    User(("사용자"))
    NLB["AWS NLB (L4, :443)"]
    Node["Worker Node<br/>NodePort :30001"]
    T["Traefik Pod<br/>(TLS 종료·Ingress 매칭)"]
    Svc["my-app-service<br/>(ClusterIP :80)"]
    Pod["App Pod :8080"]
    User -- "DNS → NLB IP" --> NLB
    NLB -- "TCP :30001" --> Node
    Node -- "kube-proxy" --> T
    T -- "host+path 규칙" --> Svc
    Svc -- "kube-proxy" --> Pod

2. Service 2개의 역할

Service타입역할
traefikNodePort외부(NLB) → Traefik Pod 진입점
my-app-serviceClusterIPTraefik → 애플리케이션 Pod 내부 연결
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Service 1 — Traefik (NodePort, 외부 진입)
kind: Service
metadata:
  name: traefik
  namespace: api-gateway-system
spec:
  type: NodePort
  selector: {app: traefik}
  ports:
  - name: websecure
    port: 443
    targetPort: 8443
    nodePort: 31443
---
# Service 2 — App (ClusterIP, 내부 연결)
kind: Service
metadata:
  name: my-app-service
spec:
  type: ClusterIP
  selector: {app: my-app}
  ports:
  - {port: 80, targetPort: 8080}

💡 왜 2개인가 — NLB는 클러스터 외부에 있으므로 진입점(Traefik)은 NodePort로 노출해야 한다. 반면 앱 Service는 Traefik(내부)만 접근하면 되므로 ClusterIP로 충분하고, 외부에 열 이유가 없다. 역할이 다르니 타입도 다르다.


3. Ingress = 라우팅 지시서

Ingress는 트래픽을 직접 받지 않는다. Traefik(Controller)이 읽고 적용하는 규칙(설정 파일)일 뿐이다.

항목IngressIngress Controller
종류쿠버네티스 리소스(설정)실제 Pod(프로그램)
역할“어디로 보낼지” 규칙규칙 읽고 라우팅 실행
위치etcd 저장Worker Node 실행
1
2
3
4
5
6
7
8
9
10
kind: Ingress
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service: {name: my-app-service, port: {number: 80}}
1
2
3
4
요청: https://myapp.example.com/api/users
→ Traefik: host=myapp.example.com, path=/api 매칭
→ Ingress 규칙: my-app-service:80으로 보내라
→ 프록시

4. HTTPS 패킷 흐름 (실무 주 사용)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[사용자] curl https://myapp.example.com/api/users
  ↓ DNS: myapp.example.com → 52.78.123.45 (NLB)
[NLB] 52.78.123.45:443  → Target Group :30001
  ↓
[Worker Node] 10.0.1.10:30001 (NodePort)
  ↓ kube-proxy(iptables)
[Service: traefik] port:443 → targetPort:websecure
  ↓
[Traefik Pod] 10.244.1.5:8443
  ↓ TLS 종료 + Ingress 규칙 확인(host/path)
[Service: my-app-service] ClusterIP 10.100.50.20:80
  ↓ kube-proxy
[App Pod] 10.244.2.15:8080
  ↓ 응답 역순 반환

💡 TLS 종료는 Traefik Pod에서 이뤄진다. NLB는 L4라서 암호화된 TCP를 그대로 통과시키고, Traefik이 인증서로 복호화한 뒤 Ingress 규칙을 매칭한다. 그래서 NLB에는 인증서가 필요 없다.


5. NLB vs ALB & Traefik 포트

항목NLB(L4)ALB(L7)
계층TCP/UDPHTTP/HTTPS
성능매우 빠름(백만 RPS)상대적 느림
라우팅IP/PortHost/Path/Header
SSL 종료Traefik에서ALB에서 가능

Traefik Service 포트 구성(HyperCloud):

이름NodePortPort역할
web3000080HTTP 진입
websecure30001443HTTPS 진입
traefik309009000Dashboard
metrics319589100Prometheus

💡 targetPort를 번호 대신 이름(websecure)으로 지정하면, Traefik 컨테이너 포트 번호가 바뀌어도 Service를 안 고쳐도 된다. 이름 기반 매칭이 유지보수에 유리하다.


6. 트러블슈팅 — 단계별 추적

문제는 사용자→Pod 경로를 순서대로 짚어 나간다.

1
2
3
4
5
6
7
nslookup myapp.example.com                          # ① DNS → NLB
# ② AWS 콘솔: Target Group Health
kubectl get svc -n api-gateway-system traefik       # ③ Node → Traefik Service
kubectl describe ingress my-app-ingress -n default  # ④ Traefik → Service(규칙)
kubectl get endpoints my-app-service -n default     # ⑤ Service → Pod(Endpoint)
kubectl logs -n api-gateway-system <traefik-pod> | grep -i ingress  # ⑥ 규칙 인식?
curl -v https://myapp.example.com                   # ⑦ 실제 연결

⚠️ Endpoint가 비어 있으면 Service의 selector가 Pod 라벨과 안 맞거나 Pod가 Ready가 아니다. kubectl get endpoints가 비었으면 트래픽이 Pod까지 못 가므로, 라벨 매칭과 Readiness부터 확인한다.


7. 각 구성 요소 역할 정리

구성 요소역할
NLB외부→클러스터 진입 L4 로드밸런서
NodePort Service(traefik)NLB ↔ Traefik Pod 연결
Traefik PodIngress Controller(L7 라우팅·TLS 종료)
Ingress 리소스Traefik에 주는 라우팅 규칙(etcd)
ClusterIP ServiceTraefik ↔ 앱 Pod 내부 연결
Application Pod실제 애플리케이션

📝 정리

1
2
3
4
5
6
트래픽 흐름
├─ 경로   NLB → NodePort(traefik) → Traefik Pod → ClusterIP → App Pod
├─ Service NodePort(외부진입) + ClusterIP(내부연결)
├─ Ingress 규칙(설정) ≠ Controller(Traefik Pod)
├─ TLS    Traefik Pod에서 종료(NLB는 통과)
└─ 진단   DNS→NLB→Node→Traefik→Endpoint→Pod 순
개념한 줄 정의
NodePort Service외부 진입점(Traefik)
ClusterIP Service내부 연결(앱)
TLS 종료Traefik Pod에서 복호화

전체 흐름의 핵심은 두 종류의 Service(외부 NodePort + 내부 ClusterIP)가 역할을 나누고, Traefik이 TLS 종료와 Ingress 규칙 매칭을 담당한다는 것이다. 문제가 생기면 DNS부터 Pod까지 경로를 순서대로 짚으면 원인을 빠르게 좁힐 수 있다.


🔗 참고

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.