Kubernetes

쿠버네티스 인그레스(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/apibackend-service로, example.com/webfrontend-service로 라우팅 가능


3. Ingress 예제

1) 간단한 Ingress 리소스

아래 예제는 example.comweb-service로 라우팅하는 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: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

방식

  • 사용자가 http://example.com에 접속하면 web-service로 트래픽이 전달됨
  • nginx.ingress.kubernetes.io/rewrite-target: / → URL 경로를 /로 변경

2) 여러 개의 서비스 연결 (도메인 기반)

아래 설정은 example.comapi.example.com을 각각 다른 서비스로 라우팅하는 예제입니다.

yaml
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) 특정 경로에 따라 라우팅

yaml
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/webfrontend-service로 요청 전달
  • http://example.com/apibackend-service로 요청 전달

4. Ingress TLS (HTTPS 적용)

Ingress는 TLS(SSL 인증서) 를 설정하여 HTTPS를 적용할 수 있습니다.
아래는 Let’s Encrypt를 사용한 HTTPS 설정 예제입니다.

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: secure-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  tls:
  - hosts:
    - example.com
    secretName: example-tls
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

📌 동작 방식

  • 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)

bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

2️⃣ Ingress 리소스 생성

bash
kubectl apply -f ingress.yaml

3️⃣ Ingress 상태 확인

bash
kubectl get ingress

7. 결론

✅ Ingress는 하나의 엔드포인트로 여러 서비스에 트래픽을 분배할 수 있는 강력한 방법
✅ HTTPS/TLS 적용 가능하여 보안 강화
✅ NodePort 및 LoadBalancer보다 비용 절감 효과
✅ Ingress Controller(NGINX, Traefik 등) 필수 설치
✅ 도메인 및 URL 기반 라우팅이 필요한 경우 적합

🚀 쿠버네티스에서 효율적인 외부 접근을 원한다면 Ingress를 적극 활용하자!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

error: Content is protected !!