Kubernetes

Kubernetes Ingress Controller

김 정출 2024. 10. 13. 20:30

Kubernetes Ingress Controller

Ingress Controller는 Kubernetes 클러스터에서 HTTP(S) 요청을 처리하고, 외부 트래픽내부 서비스(Pod)로 라우팅하는 중요한 구성 요소입니다. Ingress는 외부 트래픽을 클러스터 내부의 특정 서비스로 유도하는 규칙을 정의한 Kubernetes 리소스입니다. 하지만 이 Ingress 리소스가 동작하려면 실제로 트래픽을 처리하는 Ingress Controller가 필요합니다.


Ingress 및 Ingress Controller의 역할

  • Ingress: HTTP/HTTPS 경로 기반 라우팅, 호스트별 라우팅, TLS/SSL 처리를 포함한 트래픽 라우팅 규칙을 정의합니다.
  • Ingress Controller: 정의된 Ingress 리소스에 따라 클러스터로 들어오는 트래픽을 관리하고, 이를 내부의 적절한 서비스로 전달하는 실제 구현체입니다.

Ingress Controller의 동작 방식

  1. Ingress 리소스 정의: 먼저, 사용자는 Ingress 리소스를 작성합니다. 이 리소스는 외부에서 들어오는 HTTP(S) 트래픽이 어떤 경로(path) 또는 호스트(host)로 들어올 때, 해당 트래픽을 어느 Kubernetes 서비스로 전달할지 규칙을 정의합니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80
  1. Ingress Controller의 설치: 클러스터에 설치된 Ingress Controller가 Ingress 리소스를 감시(watch)하고, 해당 규칙을 기반으로 트래픽을 처리할 준비를 합니다. Ingress Controller는 클러스터 외부에서 들어오는 트래픽을 수신하기 위해 일반적으로 클라우드 로드 밸런서, NodePort, 또는 HostPort 방식을 사용합니다.
  2. 트래픽 처리 및 라우팅:
    • Ingress Controller는 클러스터 외부로부터 들어오는 HTTP/HTTPS 요청을 수신합니다.
    • 요청이 Ingress 리소스에서 정의된 규칙과 일치하면, 해당 요청을 지정된 서비스로 전달합니다.
    • Ingress 리소스에는 여러 경로와 호스트가 정의될 수 있으며, Ingress Controller는 이를 기반으로 적절한 백엔드 서비스로 트래픽을 라우팅합니다.
  3. SSL/TLS 종료: Ingress Controller는 TLS 인증서를 사용하여 HTTPS 트래픽을 처리할 수 있습니다. 이를 통해 외부 트래픽과의 안전한 통신이 가능해집니다. Ingress 리소스에서 tls 섹션을 사용해 TLS 설정을 구성할 수 있습니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  tls:
  - hosts:
    - example.com
    secretName: example-tls
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80
  1. 로드 밸런싱: Ingress Controller는 여러 Pod에 트래픽을 고르게 분산하는 로드 밸런서 역할을 할 수 있습니다. 예를 들어, NGINX Ingress Controller는 클러스터 내부의 여러 Pod로 트래픽을 분산하는 기능을 제공합니다.

Ingress Controller의 주요 기능

  1. HTTP 및 HTTPS 트래픽 처리: Ingress Controller는 HTTP/HTTPS 요청을 처리하고, 외부 클라이언트로부터 클러스터 내부로 트래픽을 라우팅합니다.
  2. 경로 기반 및 호스트 기반 라우팅: Ingress는 도메인 이름(host)이나 경로(path)에 따라 트래픽을 다르게 라우팅할 수 있습니다. 예를 들어, /api 경로로 오는 요청은 한 서비스로, /web 경로로 오는 요청은 다른 서비스로 보낼 수 있습니다.
  3. TLS 종료 (SSL 인증서 지원): Ingress Controller는 HTTPS 요청을 처리할 수 있고, 인증서를 사용해 클러스터로 들어오는 트래픽에 대한 SSL/TLS 종료를 처리합니다.
  4. 로드 밸런싱: Ingress Controller는 요청을 다수의 백엔드 Pod로 균등하게 분산하여 서비스의 가용성과 성능을 높일 수 있습니다.
  5. 리다이렉트 및 URL 재작성: 일부 Ingress Controller는 특정 경로로 들어온 요청을 다른 경로로 리다이렉트하거나, 요청된 URL을 재작성하는 기능을 제공합니다.
  6. 보안 및 인증 처리: Ingress Controller는 기본 인증, IP 화이트리스트, 레이트 리미팅, Web Application Firewall(WAF)와 같은 보안 기능을 제공할 수 있습니다.

Ingress Controller 종류

여러 종류의 Ingress Controller가 존재하며, 각기 다른 네트워크 프록시를 기반으로 동작합니다. Kubernetes 환경에서 많이 사용되는 Ingress Controller는 다음과 같습니다:

  1. NGINX Ingress Controller:
    • 가장 많이 사용되는 Ingress Controller 중 하나로, NGINX를 기반으로 합니다.
    • 경량화된 성능과 다채로운 기능(예: SSL/TLS 종료, 경로 및 호스트 기반 라우팅)을 제공합니다.
  2. Traefik Ingress Controller:
    • 경량의 Ingress Controller로, 특히 마이크로서비스 아키텍처에 최적화되어 있습니다.
    • 자동 서비스 디스커버리, HTTP/2 및 gRPC 지원, Let's Encrypt를 통한 TLS 인증 자동화 등 다양한 기능을 제공합니다.
  3. HAProxy Ingress Controller:
    • HAProxy를 기반으로 한 Ingress Controller로, 고성능의 로드 밸런싱 및 프록싱 기능을 제공합니다.
  4. Contour Ingress Controller:
    • Envoy 프록시를 기반으로 한 Ingress Controller로, 고성능 및 확장성을 제공합니다.
    • 멀티 프로토콜 지원과 동적 구성, 높은 성능의 로드 밸런싱을 특징으로 합니다.
  5. AWS ALB Ingress Controller:
    • AWS 환경에서 Elastic Load Balancer(Application Load Balancer)와 통합된 Ingress Controller로, AWS 서비스와의 긴밀한 통합이 특징입니다.

Ingress Controller와 Service의 차이

Ingress Controller와 Service는 모두 Kubernetes에서 트래픽을 처리하는 중요한 요소지만, 그 역할과 적용 범위가 다릅니다.

  • Service: Pod를 외부로 노출하고, 내부 클러스터에서 Pod 간 통신을 가능하게 합니다. 예를 들어, LoadBalancer, NodePort, ClusterIP와 같은 타입이 있습니다. 외부 트래픽을 특정 서비스로 라우팅할 때 주로 사용됩니다.
  • Ingress Controller: HTTP(S) 트래픽을 처리하며, 더 복잡한 라우팅 규칙을 적용합니다. Service보다 더 고급 라우팅 기능을 제공하며, 도메인 이름, 경로 기반으로 트래픽을 분배할 수 있습니다.

Nginx Ingress Controller 배포하기

Kubernetes 클러스터에 NGINX Ingress Controller를 배포하는 과정은 여러 단계로 나눌 수 있습니다. 이를 위해 Helm을 사용할 수도 있고, kubectl 명령어를 통해 직접 배포할 수도 있습니다. 여기서는 Helmkubectl을 사용하는 두 가지 방법을 설명하겠습니다.

  1. Helm을 사용한 NGINX Ingress Controller 배포

Helm은 Kubernetes의 패키지 매니저로, 간단하게 Ingress Controller를 배포하고 관리할 수 있습니다.

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
  1. NGINX Ingress Controller 배포
# Helm 리포지토리 추가
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# NGINX Ingress Controller 설치
helm install nginx-ingress ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace

# 설치 확인
kubectl get pods -n ingress-nginx
---
NAME                                       READY   STATUS    RESTARTS   AGE
nginx-ingress-ingress-nginx-controller-xyz  1/1     Running   0          2m
  1. Ingress 리소스 배포 (예시)

Ingress Controller가 제대로 작동하는지 확인하려면 Ingress 리소스를 만들어 볼 수 있습니다. 예를 들어, 다음과 같이 NGINX Ingress Controller를 통해 서비스를 노출할 수 있습니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80
  1. NGINX Ingress Controller의 External IP 확인

NGINX Ingress Controller가 클러스터 외부에서 접근 가능한지 확인하려면, External IP 주소를 확인해야 합니다. 다음 명령어를 사용하여 Ingress Controller의 External IP를 확인할 수 있습니다.

kubectl get svc -n ingress-nginx
---
NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                      AGE
nginx-ingress-ingress-nginx-controller LoadBalancer 10.0.146.63    34.123.45.67   80:32123/TCP,443:32456/TCP    5m

위 출력에서 EXTERNAL-IP 항목의 값을 사용하여 Ingress를 통해 외부에서 서비스에 접근할 수 있습니다.


결론

  • Ingress Controller는 Ingress 리소스에 정의된 규칙을 기반으로 외부 트래픽을 클러스터 내부의 서비스로 라우팅합니다.
  • 경로 및 호스트 기반 라우팅, SSL/TLS 종료, 로드 밸런싱 등의 기능을 제공합니다.
  • Kubernetes 환경에서 NGINX, Traefik, HAProxy 등의 다양한 Ingress Controller를 사용할 수 있습니다.
  • 결과적으로 Ingress Controller는 Kubernetes 클러스터 외부와 내부 간의 HTTP(S) 트래픽을 제어하고 라우팅하는 데 중요한 역할을 하며, 확장성과 유연성을 제공하는 중요한 네트워크 구성 요소입니다.