(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 에 모두 적용되므로, 주의해야한다.
참고
Network Load Balancer - AWS Load Balancer Controller
AWS Load Balancer Controller supports LoadBalancerClass feature since v2.4.0 release for Kubernetes v1.22+ clusters. LoadBalancerClass feature provides a CloudProvider agnostic way of offloading the reconciliation for Kubernetes Services resources of type
kubernetes-sigs.github.io
AWS Load Balancer Controller 추가 기능 설치 - Amazon EKS
배포된 차트는 보안 업데이트를 자동으로 수신하지 않습니다. 새 차트가 사용 가능해지면 수동으로 업그레이드해야 합니다. 업그레이드 시 이전 명령에서 install을 upgrade로 변경하되, 이전 명령
docs.aws.amazon.com
Understanding Nginx Server and Location Block Selection Algorithms | DigitalOcean
www.digitalocean.com
- 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 |