쿠버네티스 인그레스(Ingress): 외부 트래픽을 효율적으로 관리하는 방법

**쿠버네티스(Kubernetes) 인그레스(Ingress)**는 클러스터 외부에서 내부 서비스로 트래픽을 라우팅하는 중요한 역할을 합니다. 인그레스를 사용하면 단순한 로드 밸런싱뿐만 아니라, 경로 기반 라우팅, TLS(HTTPS) 설정, 가상 호스트(Virtual Host) 구성 등을 쉽게 설정할 수 있습니다.

이 글에서는 쿠버네티스 인그레스의 개념, 주요 기능, 동작 방식, 설정 방법 및 실전 예제를 상세히 설명합니다.


📌 목차

  1. 쿠버네티스 인그레스란?
  2. 인그레스가 필요한 이유
  3. 인그레스 vs 서비스 (LoadBalancer & NodePort)
  4. 인그레스의 주요 기능
  5. 인그레스 컨트롤러(Ingress Controller)
  6. 인그레스 설정 및 예제
  7. 결론

1. 쿠버네티스 인그레스(Ingress)란?

✅ **인그레스(Ingress)**는 쿠버네티스 클러스터 외부에서 내부 서비스로 트래픽을 라우팅하는 API 객체입니다.
✅ 단순한 외부 접근뿐만 아니라, 도메인 기반 및 경로 기반 트래픽 라우팅을 제공하며, TLS(SSL) 인증서 적용도 가능합니다.

💡 쉽게 말해?
➡️ 인그레스는 쿠버네티스 내부 서비스들을 위한 “스마트”한 HTTP/HTTPS 트래픽 관리 기능을 제공하는 네트워크 게이트웨이입니다.


2. 인그레스가 필요한 이유

쿠버네티스에서 애플리케이션을 외부에서 접근 가능하게 하려면 LoadBalancer 또는 NodePort 서비스를 사용할 수도 있습니다.
하지만, 이 방식에는 다음과 같은 한계가 있습니다.

방법문제점
NodePort– 클러스터의 각 노드에서 특정 포트를 개방해야 함.
– 동적 IP 사용으로 유지보수 어려움.
LoadBalancer– 클라우드 환경에서만 사용 가능.
– 각 서비스마다 별도의 로드 밸런서를 생성해야 하므로 비용이 증가.

인그레스(Ingress)를 사용하면?

  • 하나의 고정 IP 및 도메인 이름으로 여러 서비스에 접근 가능.
  • 경로 기반 라우팅(/api, /dashboard 등) 지원.
  • TLS(SSL) 인증 적용 가능.
  • 클라우드 환경에 상관없이 로컬에서도 실행 가능.

3. 인그레스 vs 서비스 (LoadBalancer & NodePort)

기능NodePortLoadBalancerIngress
외부 접근가능가능가능
로드 밸런싱불가능가능가능
여러 서비스 연결불가능불가능가능
경로 기반 라우팅불가능불가능가능
TLS(HTTPS) 지원불가능가능 (설정 필요)가능 (기본 지원)
클러스터 내에서 실행가능불가능 (클라우드 필요)가능

💡 인그레스는 여러 서비스 간의 트래픽을 효율적으로 관리하는 최적의 방법입니다.


4. 인그레스의 주요 기능

✅ 1) 경로 기반 라우팅(Path-based Routing)

  • URL 경로에 따라 트래픽을 특정 서비스로 라우팅.
<yaml>

rules:
- http:
paths:
- path: /api
backend:
service:
name: api-service
port:
number: 80
- path: /dashboard
backend:
service:
name: dashboard-service
port:
number: 80

🔹 https://example.com/apiapi-service로 이동
🔹 https://example.com/dashboarddashboard-service로 이동


✅ 2) 도메인 기반 라우팅(Host-based Routing)

  • 도메인별로 다른 서비스로 연결 가능.
<yaml>

rules:
- host: api.example.com
http:
paths:
- path: /
backend:
service:
name: api-service
port:
number: 80
- host: dashboard.example.com
http:
paths:
- path: /
backend:
service:
name: dashboard-service
port:
number: 80

🔹 https://api.example.comapi-service
🔹 https://dashboard.example.comdashboard-service


✅ 3) TLS(SSL) 적용

  • HTTPS를 지원하는 SSL 인증서 적용 가능.
<yaml>

tls:
- hosts:
- example.com
secretName: tls-secret

🔹 tls-secretkubectl create secret tls로 생성 가능.

<bash>

kubectl create secret tls tls-secret --cert=cert.pem --key=key.pem

5. 인그레스 컨트롤러(Ingress Controller)

인그레스 리소스를 사용하려면 Ingress Controller가 필요합니다.
쿠버네티스 기본 설치에는 인그레스 컨트롤러가 포함되어 있지 않으므로, 별도로 설치해야 합니다.

인기 있는 Ingress Controller:

  • NGINX Ingress Controller (가장 많이 사용됨)
  • Traefik
  • HAProxy
  • AWS ALB Ingress Controller (AWS 환경)
  • Istio Gateway (Service Mesh)<
<bash>

# NGINX Ingress Controller 설치 (Helm 사용)
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install my-ingress ingress-nginx/ingress-nginx

6. 인그레스 설정 및 예제

🔹 Step 1: 서비스(Service) 생성

먼저, 두 개의 서비스를 생성합니다.

<yaml>

apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
selector:
app: api
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: dashboard-service
spec:
selector:
app: dashboard
ports:
- protocol: TCP
port: 80
targetPort: 8081
<bash>

kubectl apply -f services.yaml

🔹 Step 2: 인그레스(Ingress) 생성

다음으로, 인그레스를 설정하여 하나의 도메인으로 여러 서비스를 연결합니다.

<yaml>

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: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /dashboard
pathType: Prefix
backend:
service:
name: dashboard-service
port:
number: 80
<bash>

kubectl apply -f ingress.yaml

🔹 http://example.com/apiapi-service
🔹 http://example.com/dashboarddashboard-service


7. 결론

쿠버네티스 **인그레스(Ingress)**는 클러스터 외부에서 내부 서비스로 트래픽을 효율적으로 라우팅하는 강력한 기능을 제공합니다.

왜 인그레스를 사용할까?

  • 하나의 고정 IP로 여러 서비스 연결.
  • 경로 및 도메인 기반 트래픽 라우팅 지원.
  • TLS(HTTPS) 인증 적용 가능.
  • 로드 밸런싱 및 외부 접근 최적화.

📌 쿠버네티스를 효과적으로 운영하려면, 인그레스를 적절히 활용하는 것이 필수적입니다! 🚀