Kubernetes Ingress 설명 — 라우팅, TLS, 그리고 실제 예시
Source: Dev.to
Ingress는 클러스터를 위한 스마트한 HTTP 진입점입니다. 트래픽 라우팅을 서비스 노출과 분리하고 TLS를 중앙에서 관리할 수 있게 해줍니다.
인그레스가 중요한 이유
| 문제 | 인그레스 없이 발생하는 상황 |
|---|---|
| 서비스 노출 | 모든 서비스는 자체 NodePort 또는 LoadBalancer가 필요합니다. |
| 비용 | 100개의 서비스 → 100개의 LoadBalancer → 100개의 공용 IP → 100개의 별도 청구 항목. |
| 라우팅 로직 | 쿠버네티스 외부에서 처리(외부 LB, 수동 DNS). 쿠버네티스는 가시성이나 제어가 없습니다. |
| TLS 관리 | 각 서비스마다 자체 인증서가 필요 → 갱신, 교체, 구성 시 오류가 발생하기 쉽습니다. |
인그레스는 위 모든 문제를 해결하며 단일 레이어‑7(HTTP/HTTPS) 진입점을 제공하여:
- 호스트 및/또는 경로별로 트래픽 라우팅
- 중앙에서 TLS 종료(HTTPS)
- 적절한 서비스로 트래픽 전달
⚠️ 인그레스는 선언형 리소스일 뿐입니다. 실제 트래픽을 처리하려면 Ingress Controller(NGINX, Traefik, HAProxy, 클라우드‑전용 컨트롤러 등)가 필요합니다.
Ingress 작동 방식 (다이어그램)
Client (Browser)
↓
Ingress Controller (NGINX / Traefik / …)
↓
Ingress Rules (host / path / TLS)
↓
Service (stable endpoint)
↓
Pods (managed by Deployment)
Source: …
Ingress 기본 – YAML 예시
1️⃣ 간단한 Host‑Based Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
spec:
rules:
- host: app.sharon.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
What it does
app.sharon.com에 대한 트래픽을 수신합니다.- 모든 요청을 Service
app-service로 라우팅합니다. - Service 가 트래픽을 해당 Pods 로 로드밸런싱합니다.
2️⃣ Path‑Based Routing (다중 Service)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-app-ingress
spec:
rules:
- host: sharon.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Routing behaviour
| Request | Service |
|---|---|
sharon.com/api | api-service |
sharon.com/web | web-service |
3️⃣ Host‑Based Routing (다중 도메인)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: host-ingress
spec:
rules:
- host: api.sharon.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- host: web.sharon.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Routing behaviour
| Hostname | Service |
|---|---|
api.sharon.com | api-service |
web.sharon.com | web-service |
4️⃣ TLS 종료와 Secret 사용
도메인당 한 번씩 TLS secret을 생성합니다:
kubectl create secret tls app-tls \
--cert=cert.pem \
--key=key.pem
Secret을 사용하는 Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
spec:
tls:
- hosts:
- app.sharon.com
secretName: app-tls
rules:
- host: app.sharon.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
What it does
- Ingress Controller에서 HTTPS를 종료합니다.
- 클러스터 내부 트래픽은 HTTP 그대로 유지됩니다(Pods에서 TLS 설정 불필요).
- 인증서는 중앙에서 관리되며, Service마다 별도로 관리하지 않아도 됩니다.
Ingress vs. LoadBalancer (기능 비교)
| Feature | Ingress | LoadBalancer |
|---|---|---|
| OSI Layer | L7 (HTTP/HTTPS) | L4 (TCP/UDP) |
| Routing | 호스트 및 경로 기반 | 없음 (단일 Service) |
| TLS | 예 (중앙 비밀) | 제한적 (LB당) |
| Cost | 낮음 – 단일 외부 로드밸런서 | 높음 – Service당 하나의 LB |
| Scalability | 높음 (하나의 엔트리 뒤에 다수 Service) | 제한적 (Service당 하나의 LB) |
| Typical Use‑case | HTTP/HTTPS 애플리케이션 | 비 HTTP 워크로드 또는 간단한 노출 |
Common Pitfalls (What NOT to Do)
- Creating Ingress without an Ingress Controller – the resource will never become active.
- Using a LoadBalancer for every Service – unnecessary cost and complexity.
- Forgetting DNS configuration – the hostnames in Ingress rules must resolve to the Ingress Controller’s external IP.
- Mixing Service exposure and routing logic – keep Service type (
ClusterIP) separate from Ingress routing. - Managing TLS separately for each Service – defeats the purpose of central TLS termination.
Ingress를 사용해야 할 때
- HTTP/HTTPS 애플리케이션을 실행할 때.
- 도메인 또는 경로별 라우팅이 필요할 때 (멀티‑테넌트 또는 마이크로‑서비스 아키텍처).
- 중앙 집중식 TLS 관리를 원할 때 (도메인당 하나의 시크릿).
- 단일 외부 IP를 공유하여 클라우드 로드밸런서 비용을 절감하고 싶을 때.
엔드‑투‑엔드 흐름 (전체 그림)
Internet
|
v
DNS (domain → external IP of Ingress Controller)
|
v
Ingress Controller (NGINX / Traefik / …)
|
v
Ingress Rules (host / path / TLS)
|
v
Service (ClusterIP – stable endpoint)
|
v
Pods (managed by Deployment / ReplicaSet)
Healthy Ingress 설정을 위한 빠른 체크리스트
- Ingress Controller 배포 (NGINX, Traefik, HAProxy, 클라우드‑전용 등).
- DNS 레코드 생성 – 도메인을 컨트롤러의 외부 IP에 매핑.
- Ingress 리소스 정의 – 필요한 host/path 규칙 포함.
- TLS 시크릿 생성 (HTTPS가 필요할 경우) 및 Ingress 스펙에 참조.
- Service를
ClusterIP로 설정 – 외부 노출이 필요 없음. - 트래픽 확인 –
curl/브라우저로 올바른 Pod에 도달하는지, TLS 종료가 정상인지 (openssl s_client -connect …) 확인.
TL;DR
- Ingress = 여러 Service를 위한 단일, 스마트한 HTTP 진입점.
- Ingress Controller = Ingress 규칙을 실제로 동작하게 하는 엔진.
- 장점: 비용 효율적, 중앙 집중 라우팅, TLS 관리.
클러스터링을 즐기세요! 🚀
각 서비스마다 자체 TLS 인증서가 필요합니다.
인증서는 갱신·교체·서비스별 설정이 필요합니다.
수십 개 서비스에 대한 HTTPS 관리는 오류가 발생하기 쉽고 확장하기 어렵습니다.
Ingress는 프로덕션 환경에서 선택 사항이 아니라, Kubernetes에서 HTTP 트래픽을 제어하는 컨트롤 플레인입니다.