Kubernetes

Nginx Ingress Rewirte & AWS Load Balancer Controller

seulseul 2023. 9. 12. 02:54

(AS-IS)  AWS ALB  - Ingress - Service - Pod

(TO-BEAWS 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