OPS

DevOps 스터디 - 인그레스(Ingress) #1

찻잔속청개구리 2025. 4. 27. 13:08
반응형

이번 포스트에서는 Kubernetes에서 외부 요청을 관리하는 핵심 오브젝트인 Ingress 에 대해 정리합니다.
왜 필요한지, 구조는 어떤지, 그리고 실제로 어떻게 설정하고 사용하는지까지 다룹니다.

 

 

✅ Ingress의 기본 기능 3가지

  1. 외부 요청 라우팅
    • 예시: /apple, /apple/red 처럼 특정 경로 요청을 적절한 서비스로 전달
  2. 가상 호스트(Virtual Host) 기반 요청 처리
    • 같은 IP를 쓰더라도 도메인명에 따라 요청을 다르게 라우팅
  3. SSL/TLS 보안 연결 처리
    • 인증서를 쉽게 적용해 HTTPS 통신 처리 가능

🔥 Ingress를 사용하는 이유

  • 단일 진입점
  • Deployment마다 Service 생성 대신, Ingress 하나로 외부 노출 통합 관리 가능
  • 클라이언트는 Ingress URL만 알면 됨
  • 라우팅 정의와 보안 설정은 모두 Ingress 규칙이 책임짐
  • 구조를 간단하고 깔끔하게 만들 수 있음

🛠️ Ingress 구조 (YAML 설명)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
    - host: www.example.com
      http:
        paths:
          - path: /apple
            pathType: Prefix
            backend:
              service:
                name: apple-service
                port:
                  number: 80
 

주요 필드 설명

  • host: 요청 도메인 지정 (여러 host 가능)
  • path: 특정 경로 요청을 어디로 보낼지 정의
  • serviceName, servicePort: 요청을 받을 Service와 포트 지정
  • annotations: 부가 기능 추가 설정 (ex: SSL 리다이렉션, URL 리라이트 등)

주의: Ingress 오브젝트만 생성해도 아무 동작 안 함. 반드시 Ingress Controller가 필요!

 

 


🚀 Nginx-Ingress-Controller란?

Ingress 요청을 실제로 처리하는 대표적인 Ingress Controller입니다.

사용 방법

  1. 공식 GitHub에서 Nginx-Ingress-Controller YAML 파일 배포
  2. LoadBalancer 타입의 Service로 외부 노출
  3. Ingress 리소스 생성해 라우팅 규칙 작성
  4. Ingress 규칙에 따라 트래픽을 Service로 전달
    • 404 Not Found 에러 시: 요청 host를 LoadBalancer DNS 이름이나 설정한 도메인으로 수정해야 함
    • Nginx Ingress Controller는 보통 Service를 거치지 않고 Pod로 직접 bypass 요청 전달함

✍️ 세부 기능 - annotations로 세밀 제어하기

Ingress에 annotations를 추가해 다양한 기능을 세밀하게 조정할 수 있습니다.

 

Nginx-Ingress-Controller 실습

  • host: xx.xx.example.com 도메인에서 요청하는 트래픽을
  • path: /로 보냄 
  • serviceName, servicePort: 요청을 받을 Service는 "example-com"이고, 포트는 80
  • annotations:
    • kubernetes.io/ingress.class: nginx -> 이 Ingress는 "nginx" Ingress Controller가 처리하게 지정
    • nginx.ingress.kubernetes.io/proxy-body-size: 200m -> 클라이언트 요청 본문(body) 크기 제한을 200MB로 설정 (업로드 큰 경우 필요)
    • nginx.ingress.kubernetes.io/proxy-send-timeout: 90 -> 백엔드 서버에 요청 보낼 때, 응답을 기다리는 최대 시간 90초로 설정
    • external-dns.alpha.kubernetes.io/target: internal-xxx.elb.amazonaws.com -> Route53 같은 ExternalDNS에서 이 Ingress가 사용할 ELB 주소 지정 
      ExternalDNS에 대한 내용은 아래 포스트에서 확인가능!
      ExternalDNS
{
  "apiVersion": "networking.k8s.io/v1",
  "kind": "IngressList",
  "metadata": {
    "name": "example-com",
    "namespace": "example",
	...
    "labels": {
      "app.kubernetes.io/instance": "example",
      "app.kubernetes.io/managed-by": "Helm",
      "app.kubernetes.io/name": "example-com",
      "app.kubernetes.io/version": "1.16.0",
      "argocd.argoproj.io/instance": "example",
      "helm.sh/chart": "example-com-0.1.0"
    },
    "annotations": {
      "external-dns.alpha.kubernetes.io/target": "internal-xxx.elb.amazonaws.com",
      "kubectl.kubernetes.io/last-applied-configuration": ...
      "kubernetes.io/ingress.class": "nginx",
      "nginx.ingress.kubernetes.io/proxy-body-size": "200m",
      "nginx.ingress.kubernetes.io/proxy-send-timeout": "90"
    }
  },
  "spec": {
    "rules": [
      {
        "host": "xx.xx.example.com",
        "http": {
          "paths": [
            {
              "path": "/",
              "pathType": "Prefix",
              "backend": {
                "service": {
                  "name": "example-com",
                  "port": {
                    "number": 80
                  }
                }
              }
            }
          ]
        }
      }
    ]
  },
  "status": {
    "loadBalancer": {
      "ingress": [
        {
          "hostname": "dept-example-nlb-nginx-an2-prd-xxx.elb.ap-northeast-2.amazonaws.com"
        }
      ]
    }
  }
}

 

rewrite-target 예시

  • URL을 변환해서 Service로 넘기는 기능
  • 특히 정규 표현식과 함께 유용하게 사용
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /

 

요청 URL 실제 요청 경로
/html /
/html/color/red /color/red

🔒 SSL/TLS 보안 연결 적용 방법

Ingress Controller에서 SSL/TLS 설정을 적용할 수 있습니다.

  • LoadBalancer Service에 ACM 인증서 연결
  • Nginx-Ingress-Controller에 직접 인증서 적용 가능

(※ 상황에 따라 선택)


🛠️ 여러 개의 Ingress Controller 운영하기

  • Nginx-Ingress-Controller 배포 시 --ingress-class 옵션 추가
  • Ingress 리소스에 주석(annotation) 추가
 
metadata:
  annotations:
    kubernetes.io/ingress.class: "custom-nginx"

🧹 정리

항목 내용
Ingress 핵심 역할 외부 요청을 경로/도메인/보안 설정에 따라 라우팅
Controller 필요 여부 필수 (Ingress 리소스만으로는 작동 안 함)
대표 Controller Nginx-Ingress-Controller
주요 부가 기능 rewrite-target, SSL 인증서 적용, 여러 Controller 동시 운영

 

반응형