Kubernetes의 네트워크 리소스: Ingress (with ALB)
2025.01.01 - [개발 환경 및 운영/Kubernetes] - Kubernetes의 서비스(Service)
지난 시간에는 Kubernetes의 네트워크 리소스 중 Service의 역할과 종류에 대해 알아보았다. 이번 시간에는 Service와 함께 Kubernetes 네트워크에서 중요한 역할을 하는 Ingress에 대해 알아보자.
Ingress란?
Ingress는 외부 트래픽을 클러스터 내부로 라우팅하는 Kubernetes 리소스이다. 도메인 기반의 HTTP(S) 요청이나 경로 기반 라우팅을 지원하여, 외부 클라이언트가 Kubernetes 내부의 다양한 서비스를 쉽게 이용할 수 있도록 돕는다.
Ingress의 주요 역할
- HTTP(S) 트래픽 라우팅: 외부에서 들어오는 HTTP 또는 HTTPS 트래픽을 Kubernetes 클러스터 내부의 Service로 전달.
- 도메인 기반 라우팅: 하나의 Ingress 리소스에서 도메인 이름에 따라 요청을 다른 서비스로 분기 가능.
- 경로 기반 라우팅: 도메인의 경로(예: /api, /web)에 따라 트래픽을 다양한 서비스로 분산.
- SSL/TLS 종료: HTTPS 요청의 암호화를 Ingress에서 처리하고, 내부 Pod에서는 평문 트래픽을 사용하도록 설정 가능.
- 로드 밸런싱: 트래픽을 적절히 분산하여 클러스터의 안정성과 성능 유지.
Ingress를 사용하는 이유
기본적으로 Service(NodePort 또는 LoadBalancer)를 통해 외부와 통신할 수 있지만, 여러 Service를 운영하는 경우 관리가 복잡해진다. 만일 우리의 애플리케이션이 10개의 deployment로 이루어져 있고, 이 중 5개를 클러스터 외부에 노출해야한다면, 각 deployment에 대응하는 서비스를 5개를 만들어서 서비스의 URL로 접근하는 방법을 떠올릴 수 있다.
이렇게 되면 SSL/TLS 보안 연결이나 라우팅 등을 각각 적용해야 하므로 설정과 관리가 복잡해진다. 이럴때 인그레스 오브젝트로 URL 엔드포인트 하나만 생성하고 클라이언트에서는 하나의 URL로만 접근할 수 있다. 해당 요청은 인그레스에서 정의한 규칙에 따라 처리해 적절한 deployment의 pod으로 전달된다.
Ingress 리소스 예제
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
- host: example.com: 해당 도메인으로 들어오는 요청을 처리.
- path: /: / 경로로 들어오는 요청을 지정된 서비스로 전달. 여러개 path 지정 가능
- service.name 및 service.port: my-service의 80번 포트로 트래픽 전달.
Ingress Controller
인그레스는 단지 요청을 처리하는 규칙을 정의하는 선언 오브젝트일뿐 실제 서버가 아니기 때문에, Ingress 리소스는 Ingress Controller가 있어야만 작동한다. 즉 실제 외부 요청을 받아들이는 것은 Ingress Controller Server이며, 이 서버에서 우리가 정의해놓은 인그레스 규칙을 로드해 사용한다.
주요 ingress controller
- NGINX Ingress Controller: 가장 널리 사용되는 Ingress Controller로 HTTP(S) 트래픽 처리에 적합.
- AWS ALB Ingress Controller: AWS의 Application Load Balancer(ALB)를 활용한 Ingress Controller.
여기서 회사에서 사용하는 ALB에 대해 잠시 알아보고 세부 설정 파트로 넘어가보자.
ALB(Application Load Balancer)
ALB는 HTTP/HTTPS 기반의 트래픽을 관리하는 AWS의 애플리케이션 계층(Layer 7) 로드밸런서이다. Kubernetes에서는 ALB Ingress Controller를 사용하여 AWS ALB를 생성하고 관리할 수 있다.
- Ingress 리소스를 감지하고, 해당 설정에 맞는 ALB를 생성.
- Ingress의 경로 기반 라우팅, SSL/TLS 설정, 도메인 연결을 ALB로 자동 반영.
- Pod의 IP를 Target Group으로 추가하여 트래픽을 Pod로 전달.
ALB의 주요 구성 요소
- 리스너 (Listener): ALB가 수신할 트래픽의 포트와 프로토콜 정의 (예: HTTP 80, HTTPS 443)
- 타겟 그룹 (Target Group): 트래픽이 전달될 Pod 또는 노드의 IP를 그룹으로 관리.
- 리스너 규칙 (Listener Rules): 도메인과 경로에 따라 트래픽을 특정 타겟 그룹으로 전달.
트래픽 흐름 예시
- 클라이언트 → https://my-app.com 요청
- Route53이 해당 도메인을 ALB의 DNS로 매핑.
- ALB의 443 포트(HTTPS) 리스너가 요청을 수신.
- 리스너 규칙에 따라 /api 요청은 API 타겟 그룹으로 전달.
- 타겟 그룹이 Pod으로 트래픽 전달.
Ingress 세부 설정 : annotations
Ingress에는 annotations 라는 항목에 세부설정을 더 넣을 수 있다. ALB에 알아보았으니 아래 회사에서 실제로 사용중인 annotations를 하나씩 보자.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: instance
alb.ingress.kubernetes.io/tags: Environment=production
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
alb.ingress.kubernetes.io/certificate-arn: arn-
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
external-dns.alpha.kubernetes.io/hostname: my-app.com
- kubernetes.io/ingress.class: ALB Ingress Controller 사용 지정.
- alb.ingress.kubernetes.io/scheme: internet-facing (외부 공개) / internal (내부 전용).
- alb.ingress.kubernetes.io/target-type: instance(노드 IP) 또는 ip(Pod IP) 전달 방식.
- alb.ingress.kubernetes.io/tags: ALB 리소스에 태그 추가.
- alb.ingress.kubernetes.io/listen-ports: ALB의 수신 포트 설정 (HTTP 80, HTTPS 443).
- alb.ingress.kubernetes.io/certificate-arn: AWS ACM에서 발급한 SSL 인증서 연결.
- alb.ingress.kubernetes.io/actions.ssl-redirect: HTTP 요청을 HTTPS로 리디렉트.
- external-dns.alpha.kubernetes.io/hostname: ExternalDNS 도구를 사용해 Route53에 DNS 레코드 생성.
정리
Ingress는 Kubernetes 클러스터의 외부 진입점 역할을 하며, 도메인 기반 라우팅, 경로 분기, SSL/TLS 종료 등의 기능을 제공한다.
이러한 기능을 통해 클러스터 내부 애플리케이션의 네트워크를 효율적으로 관리할 수 있다.
다음 시간에는 스토리지 리소스인 PV, PVC로 돌아오겠다.