[CKA] Kubernetes Ingress와 경로 재작성
Ingress Controller와 Ingress 리소스의 역할, 경로 우선순위와 NGINX rewrite-target 사용법을 정리합니다.
Ingress는 HTTP와 HTTPS 요청을 호스트와 경로 규칙에 따라 Service로 보냅니다. Ingress 리소스는 규칙을 선언하고, Ingress Controller가 그 규칙을 실제 프록시나 로드 밸런서 설정으로 구현합니다. 따라서 리소스만 만들고 Controller를 설치하지 않으면 트래픽이 처리되지 않습니다.
기본 경로 규칙
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shop
spec:
rules:
- host: shop.example.com
http:
paths:
- path: /wear
pathType: Prefix
backend:
service:
name: wear-service
port:
number: 80
Exact는 경로 전체가 정확히 같을 때, Prefix는 /로 나눈 경로 요소가 접두 경로와 일치할 때 매칭됩니다. 여러 경로가 맞으면 가장 긴 경로가 우선하고, 길이까지 같으면 Exact가 Prefix보다 우선합니다. ImplementationSpecific의 해석은 IngressClass와 Controller 구현에 달려 있습니다.
NGINX 경로 재작성
백엔드 애플리케이션이 /만 처리하지만 외부에는 /pay로 공개해야 한다면 NGINX Ingress의 rewrite-target을 사용할 수 있습니다.
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
하위 경로까지 보존하려면 정규식과 캡처 그룹을 함께 사용합니다.
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- path: /app(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: app-service
port:
number: 80
이 구성에서 /app/api/users는 백엔드에 /api/users로 전달됩니다. Ingress의 Service 참조는 같은 네임스페이스를 대상으로 하므로 다른 네임스페이스의 Service를 연결하려면 리소스 배치나 지원되는 교차 네임스페이스 방식을 따로 설계해야 합니다.