(AS-IS) AWS ALB - Ingress - Service - Pod
(TO-BE) AWS NLB - Ingress Nginx - Service - Pod
기존에 EKS ALB 와 Ingress 를 사용하여 Path-based Routing 을 적용했으나,
한 도메인으로 여러 Back End , Front End 서비스를 운영해야하는 환경이었으므로 정규식을 이용한 Rewrite 기능이 필요해졌습니다. (23-08 기준, ALB ingress는 rewrite를 지원하지 않습니다.)
1. Nginx Ingress Controller 설치
따라서 NLB 로 변경후 ssl key 는 NLB 에 적용했으며, Nginx Ingress Controller 를 추가로 설치했습니다.
자주 쓰이는 Nginx Ingress Controller 는 2종류가 있는데, (1) kubernetes 에서 개발한 kubernetes/ingress-nginx
(2) nginx 에서 개발한 nginxinc/kubernetes-ingress with NGINX 이다.
모두 nginx 기반으로 하고 약간의 차이가 있다.
# helm repo 추가
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# helm install
helm install ingress-nginx ingress-nginx \
--namespace ingress-nginx --create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io\/aws-load-balancer-scheme"=internet-facing \
-f values.yaml --version 4.7.1
# https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/service/nlb/#network-load-balancer
2. Ingress Nginx Rewrite
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
ingressClassName: nginx
rules:
- host: seulseul.com
http:
paths:
- path: /api/.*
pathType: ImplementationSpecific
backend:
service:
name: demo-svc
port:
number: 8080
위 Ingress는 seulseul.com/api로 온 요청을 demo-svc 로 보냅니다. (seulseul.com/api-> demo-svc 의 /api)
하위 경로를 내부 서비스의 root로 보내려면 (seulseul.com/api -> demo-svc의 / )
nginx ingress annotation 중 rewrite-target을 사용합니다.
Rewrite 적용
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress-2
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
ingressClassName: nginx
rules:
- host: seulseul.com
http:
paths:
- path: /api/(.+)
pathType: ImplementationSpecific
backend:
service:
name: demo-svc
port:
number: 8080
ingress path 설정은 다음과 같이 (.*) regexp(정규식) 매칭을 사용했다.
정규식의 capture group → 보통 () 로 구분되는 그룹, (.*) 하나만 있어 $1 (첫번째 캡쳐 그룹)을 rewrite 대상으로 백엔드 서비스에 넘겨줄 수 있다.
만약 api/(/|$)(.*) 라면
(/|$) -> $1
(.*) -> $2
가 placeholder 가 된다.
일부 백엔드 서비스에서는 노출된 URL이 수신 규칙의 지정된 경로와 다를 수 있다.
이 때 rewrite-target 설정을 서비스에서 예상하는 경로로 설정할 수 있다.
nginx.ingress.kubernetes.io/rewrite-target: /$1
이와 유사하게 애플리케이션 루트가 " / " 가 아닌 다른 경로에 노출되어 리디렉션되어야 하는 경우에 아래와 같이 app-root 어노테이션을 사용 할 수 있따.
nginx.ingress.kubernetes.io/app-root: "/api"
app-root 어노테이션은 해당 host 에 모두 적용되므로, 주의해야한다.
참고
- https://devocean.sk.com/blog/techBoardDetail.do?ID=163593
'Kubernetes' 카테고리의 다른 글
containerd 에 Private Registry Credential 설정 (aka config.toml) (0) | 2024.07.01 |
---|---|
[kubectl] krew - Kubernetes Plugin Manager (0) | 2023.07.10 |
vCluster (Multi-Tenancy in Kubernetes) (0) | 2023.07.10 |
[kubectl] kubectx + kubens 설정 및 자동 완성 (0) | 2023.07.09 |
nginx ingress controller tcp 설정 (0) | 2022.12.26 |