쿠버네티스 인그레스(Ingress)
Ingress(인그레스) 는 쿠버네티스 클러스터 외부에서 내부 서비스로 HTTP/HTTPS 트래픽을 라우팅하는 API 객체입니다.
즉, 쿠버네티스 내부에 있는 여러 개의 서비스(Service)를 하나의 도메인 또는 URL 기반으로 외부에서 접근 가능하도록 설정할 수 있습니다.
1. 왜 Ingress가 필요할까?
📌 Ingress가 없을 때
쿠버네티스에서 외부로 서비스를 노출하는 일반적인 방법은 다음 2가지입니다.
- NodePort → 클러스터의 모든 노드에서 특정 포트를 개방하여 접근 가능 (
http://<NodeIP>:30000
) - LoadBalancer → 클라우드 프로바이더의 로드 밸런서를 통해 개별 서비스마다 퍼블릭 IP를 할당
📌 Ingress를 사용할 경우
- 하나의 LoadBalancer만 사용하고 여러 개의 서비스에 요청을 라우팅 가능
- 도메인 기반으로 트래픽을 라우팅할 수 있음 (
example.com/api
,example.com/web
) - SSL/TLS 인증서 자동 관리 가능 (Let’s Encrypt 지원)
2. 인그레스 기본 개념
1) 인그레스 컨트롤러(Ingress Controller)
쿠버네티스에서 Ingress 객체 자체는 단순한 규칙일 뿐, 실제로 요청을 처리하지 않습니다.
Ingress를 사용하려면 Ingress Controller가 필요합니다.
일반적으로 많이 사용되는 Ingress Controller는 다음과 같습니다.
✅ NGINX Ingress Controller (가장 많이 사용됨)
✅ Traefik Ingress Controller
✅ HAProxy Ingress Controller
✅ Istio Gateway (서비스 메쉬 용도)
✅ AWS ALB, GCP Ingress Controller (클라우드 환경 전용)
2) Ingress 동작 방식
1️⃣ 사용자가 example.com
에 요청
2️⃣ Ingress Controller가 요청을 가로채고 Ingress 리소스를 참조하여 적절한 서비스로 전달
3️⃣ 서비스(Service)는 해당 Pod로 요청을 전달
📌 예를 들어, example.com/api
는 backend-service
로, example.com/web
은 frontend-service
로 라우팅 가능
3. Ingress 예제
1) 간단한 Ingress 리소스
아래 예제는 example.com
을 web-service
로 라우팅하는 Ingress 설정입니다.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: web-service port: number: 80
방식
- 사용자가
http://example.com
에 접속하면web-service
로 트래픽이 전달됨 nginx.ingress.kubernetes.io/rewrite-target: /
→ URL 경로를/
로 변경
2) 여러 개의 서비스 연결 (도메인 기반)
아래 설정은 example.com
과 api.example.com
을 각각 다른 서비스로 라우팅하는 예제입니다.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: multi-host-ingress spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: frontend-service port: number: 80 - host: api.example.com http: paths: - path: / pathType: Prefix backend: service: name: backend-service port: number: 8080
example.com
으로 들어온 요청은frontend-service
로 전달api.example.com
으로 들어온 요청은backend-service
로 전달
3) 특정 경로에 따라 라우팅
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: path-based-ingress spec: rules: - host: example.com http: paths: - path: /web pathType: Prefix backend: service: name: frontend-service port: number: 80 - path: /api pathType: Prefix backend: service: name: backend-service port: number: 8080
📌 동작 방식
http://example.com/web
→frontend-service
로 요청 전달http://example.com/api
→backend-service
로 요청 전달
4. Ingress TLS (HTTPS 적용)
Ingress는 TLS(SSL 인증서) 를 설정하여 HTTPS를 적용할 수 있습니다.
아래는 Let’s Encrypt를 사용한 HTTPS 설정 예제입니다.
📌 동작 방식
cert-manager
를 사용하여 Let’s Encrypt에서 자동으로 TLS 인증서를 발급example.com
에 대한 TLS 인증서(example-tls
)를 저장하고 HTTPS 활성화
5. Ingress와 LoadBalancer 차이점
비교 항목 | Ingress | LoadBalancer |
---|---|---|
트래픽 라우팅 | 여러 서비스로 라우팅 가능 | 하나의 서비스만 외부 노출 |
사용 비용 | 단일 LoadBalancer 사용 | 서비스마다 LoadBalancer 필요 (비용 증가) |
HTTPS 지원 | TLS/SSL 자동 관리 가능 | 직접 설정 필요 |
사용 예시 | 마이크로서비스, API Gateway | 단일 애플리케이션 노출 |
📌 LoadBalancer는 단일 서비스 노출이 필요할 때 사용
📌 Ingress는 여러 서비스를 단일 엔드포인트에서 관리하고 싶을 때 사용
6. Ingress 설정 방법
1️⃣ Ingress Controller 설치 (예: NGINX Ingress Controller)
2️⃣ Ingress 리소스 생성
3️⃣ Ingress 상태 확인
7. 결론
✅ Ingress는 하나의 엔드포인트로 여러 서비스에 트래픽을 분배할 수 있는 강력한 방법
✅ HTTPS/TLS 적용 가능하여 보안 강화
✅ NodePort 및 LoadBalancer보다 비용 절감 효과
✅ Ingress Controller(NGINX, Traefik 등) 필수 설치
✅ 도메인 및 URL 기반 라우팅이 필요한 경우 적합
🚀 쿠버네티스에서 효율적인 외부 접근을 원한다면 Ingress를 적극 활용하자!