
Ingress는 HTTP, HTTPS 등 네트워크 Layer 7에 대한 설정을 담당하는 리소스이다. Ingress의 가장 기본적인 역할은 외부 HTTP 호출에 대한 트래픽을 처리한다.
이를테면, 부하 분산, TLS 종료, 도메인 기반 라우팅 기능 등을 제공한다.
Ingress는 쿠버네티스 내부 서비스에 외부 접근 가능한 URL을 부여함으로써 일반 사용자들이 쉽게 접근할 수 있는 통로를 제공한다.
Ingress에는 그에 맞는 Ingress Controller가 존재하며, Ingress Controller는 Ingress에 정의된 트래픽 라우팅 규칙을 보고 라우팅을 수행한다.

Ingress 리소스 자체로는 어떠한 프로그램이 작동하는 코드가 아니라 트래픽 처리에 대한 정보를 담고 있는 정의(또는 규칙)에 가깝다.
실제로 Ingress의 규칙을 읽고 외부 트래픽을 Service로 라우팅하는 주체는 Ingress Controller이다. 앞서 쿠버네티스 컨트롤러에 대해서 살펴봤듯이, 쿠버네티스 리소스는 해당 리소스에 대응하는 리소스 컨트롤러가 존재한다.
Ingress도 마찬가지로 Ingress Controller가 존재한다.
Ingress Controller는 쿠버네티스 내장 컨트롤러와는 다르게 명시적으로 컨트롤러를 설치해야 하며, 여러 구현제 중 목적에 맞게 선택이 가능하다.
| 이름 | 아키텍처 유형 | 주요 특징 | 장점 | 단점 |
|---|---|---|---|---|
| NGINX Ingress Controller | 리버스 프록시 기반 | Kubernetes에서 가장 널리 사용됨, 커뮤니티 및 공식 버전 존재 | 안정성 높음, 문서 및 예제 풍부 | 복잡한 설정 시 ConfigMap, Annotations 혼용으로 관리 어려움 |
| HAProxy Ingress | 리버스 프록시 기반 | 고성능 TCP/HTTP 로드 밸런싱 제공 | 낮은 지연 시간, 동시 연결 처리 우수 | 설정이 다른 Ingress Controller보다 상대적으로 복잡할 수 있음 |
| AWS ALB Ingress Controller | 클라우드 로드밸런서 기반 | AWS Application Load Balancer를 Ingress로 활용 | AWS 서비스와의 완벽한 통합, 자동 SSL 인증서 관리 | AWS에 종속적, 설정에 제한이 있음 |
| Ambassador | API Gateway 기반 | Envoy 기반, 마이크로서비스에 특화된 기능 제공 | gRPC 지원, 트래픽 분할 및 필터링, 서비스 메시 연동 쉬움 | 리소스 사용량이 높을 수 있음, 복잡한 설정 |
| Kong Ingress Controller | API Gateway 기반 | API 관리 기능 포함 (Rate limiting, Auth 등), DB 및 DB-less 모드 지원 | 다양한 플러그인, API 보안/정책 관리에 적합 | 설정 난이도 높음, 초기 러닝커브 존재 |
| Traefik | 동적 구성 리버스 프록시 | 자동 서비스 디스커버리, UI 대시보드 제공 | 간단한 설정, Let's Encrypt 자동 통합 | 매우 큰 트래픽에는 성능 이슈 가능 |
helm을 이용하여 nginx를 설치해보자
네임스페이스 생성
kubectl create ns ctrl
nginx helm repo 설치
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
nginx 설치
helm install nginx-ingress ingress-nginx/ingress-nginx \
--version 4.8.3 \
--namespace ctrl --create-namespace \
--set controller.service.type=NodePort

✅ LoadBalancer 대신 NodePort 타입으로 배포했습니다.
앞서 Ingress Controller를 설치했으니 Ingress를 생성해보자
kubectl run mynginx --image nginx --expose --port 80
Ingress 리소스를 다음과 같이 정의한다.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: mynginx
spec:
rules:
- host: my-example-domain.com
http:
paths:
- path: /
backend:
serviceName: mynginx
servicePort: 80
annotations: 메타정보를 저장하기 위한 property이다. label과 비슷하지만 리소스를 필터하지는 못한다. 메타 데이터를 저장하는 용도로만 사용된다.
여기서는 Ingress Controller에게 메타정보를 전달할 목적으로 사용됐다.rules: 외부 트래픽을 어떻게 처리할지 정의한다.rules[0].host: 특정 도메인으로 들어오는 트래픽에 대해 라우팅을 정의한다. 생략 시 모든 호스트 트래픽을 처리한다.rules[0].http.paths[0].path: Ingress path를 정의한다.(path based routing)rules[0].http.paths[0].backend: Ingress의 트래픽을 받을 Service 및 포트를 정의한다.도메인 기반 라우팅의 경우
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: apache-domain
spec:
rules:
- host: apache.my-example-domain.com # 서브 도메인
http:
paths:
- path: /
backend:
serviceName: apache
servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: nginx-domain
spec:
rules:
- host: nginx.my-example-domain.com # 서브 도메인
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 80
path-based-routing 이전에 서브 도메인으로 위와 같이 도메인 기반 라우팅을 처리할 수도 있다.
Ingress 리소스에는 간단한 HTTP Authentication 기능을 추가할 수 있다.
Basic Authentication은 간단한 유저 ID, 비밀번호를 HTTP 해더로 전달하여 인증한다. 헤더에 user, password를 콜론으로 붂은 다음 base64로 인코딩하여 전달한다.
Authorization: Basic $base64(user:password)
인증 정보 생성
우선 ID/PW 정보를 담은 htpasswd 파일을 생성한다. htpasswd는 Apache utils에 포함되어 있다.
# apache2-utils 설치 (Ubuntu 기준)
sudo apt-get install apache2-utils
# username: testuser, password: testpass
htpasswd -c auth testuser
Secret 생성
이제 생성한 auth 파일을 Secret으로 생성하자.
kubectl create secret generic basic-auth \
--from-file=auth \
-n ctrl
Ingress에 인증 설정 추가
Ingress 리소스에 인증 어노테이션을 추가한다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mynginx
namespace: ctrl
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
spec:
rules:
- host: my-example-domain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mynginx
port:
number: 80
TLS를 사용하면 HTTPS 기반의 보안 통신이 가능하다. Nginx Ingress에 TLS를 적용하려면 인증서와 키가 필요하고, 이를 무료로 발급해주는 CertBot(Let’s Encrypt)을 활용할 수 있다.
이 가이드는 nginx-ingress 컨트롤러를 Helm으로 설치했고, 외부에서 NodePort 또는 LoadBalancer 타입으로 접근 가능하다는 전제 하에 작성했다.
먼저, Ingress 도메인이 외부에서 접근 가능해야 하고, 도메인의 DNS A 레코드가 클러스터 노드의 IP를 가리켜야 한다.
예: my-example-domain.com → 123.123.123.123
cert-manager는 인증서 발급 및 갱신을 자동화해주는 컨트롤러이다.
# cert-manager CRDs 설치
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.3/cert-manager.crds.yaml
# Helm repo 추가 및 설치
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.14.3
Let’s Encrypt에서 인증서를 발급받기 위한 ClusterIssuer를 생성한다.
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: your-email@example.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
kubectl apply -f cluster-issuer.yaml
Ingress 리소스에서 TLS 설정과 함께 인증서 자동 생성을 요청할 수 있다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mynginx-tls
namespace: ctrl
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- my-example-domain.com
secretName: mynginx-tls-secret # 생성될 Secret 이름
rules:
- host: my-example-domain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mynginx
port:
number: 80
TLS가 정상 적용되면 HTTPS로 접근 시 인증서가 적용된 것을 확인할 수 있다.
🔐 자동 인증서 갱신도 cert-manager가 관리한다. Let’s Encrypt의 기본 유효기간은 90일이며, cert-manager가 이를 자동으로 갱신해준다.