Kubernetes Ingress 설명 — 라우팅, TLS, 그리고 실제 예시

발행: (2025년 12월 26일 오후 12:47 GMT+9)
7 min read
원문: Dev.to

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

RequestService
sharon.com/apiapi-service
sharon.com/webweb-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

HostnameService
api.sharon.comapi-service
web.sharon.comweb-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 (기능 비교)

FeatureIngressLoadBalancer
OSI LayerL7 (HTTP/HTTPS)L4 (TCP/UDP)
Routing호스트 및 경로 기반없음 (단일 Service)
TLS예 (중앙 비밀)제한적 (LB당)
Cost낮음 – 단일 외부 로드밸런서높음 – Service당 하나의 LB
Scalability높음 (하나의 엔트리 뒤에 다수 Service)제한적 (Service당 하나의 LB)
Typical Use‑caseHTTP/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 설정을 위한 빠른 체크리스트

  1. Ingress Controller 배포 (NGINX, Traefik, HAProxy, 클라우드‑전용 등).
  2. DNS 레코드 생성 – 도메인을 컨트롤러의 외부 IP에 매핑.
  3. Ingress 리소스 정의 – 필요한 host/path 규칙 포함.
  4. TLS 시크릿 생성 (HTTPS가 필요할 경우) 및 Ingress 스펙에 참조.
  5. Service를 ClusterIP 로 설정 – 외부 노출이 필요 없음.
  6. 트래픽 확인curl/브라우저로 올바른 Pod에 도달하는지, TLS 종료가 정상인지 (openssl s_client -connect …) 확인.

TL;DR

  • Ingress = 여러 Service를 위한 단일, 스마트한 HTTP 진입점.
  • Ingress Controller = Ingress 규칙을 실제로 동작하게 하는 엔진.
  • 장점: 비용 효율적, 중앙 집중 라우팅, TLS 관리.

클러스터링을 즐기세요! 🚀

각 서비스마다 자체 TLS 인증서가 필요합니다.

인증서는 갱신·교체·서비스별 설정이 필요합니다.

수십 개 서비스에 대한 HTTPS 관리는 오류가 발생하기 쉽고 확장하기 어렵습니다.

Ingress는 프로덕션 환경에서 선택 사항이 아니라, Kubernetes에서 HTTP 트래픽을 제어하는 컨트롤 플레인입니다.

Back to Blog

관련 글

더 보기 »