TheKoguryo's 기술 블로그

 Version 2023.11.20

4.1.2 NGINX Ingress Controller에서 PATH 기반 라우팅

PATH 기반 기본 라우팅 테스트

가장 기본적인 라우팅으로 URL PATH에 따라 라우팅 서비스를 달리하는 경우입니다.

  1. 테스트를 위한 샘플 앱을 배포합니다.

    배경 색깔이 다른 두개의 웹페이지를 배포합니다.

    kubectl create deployment nginx-blue --image=thekoguryo/nginx-hello:blue
    kubectl expose deployment nginx-blue --name nginx-blue-svc --port 80
    kubectl create deployment nginx-green --image=thekoguryo/nginx-hello:green
    kubectl expose deployment nginx-green --name nginx-green-svc --port 80
    
  2. ingress 설정 YAML(path-basic.yaml)을 작성합니다.

    • /blue 요청은 nginx-blue-svc 로 라우팅
    • /green 요청은 nginx-green-svc로 라우팅
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-path-basic
    spec:
      ingressClassName: nginx
      rules:
      - http:
          paths:
          - path: /blue
            pathType: Prefix
            backend:
              service:
                name: nginx-blue-svc
                port:
                  number: 80
      - http:
          paths:
          - path: /green
            pathType: Prefix
            backend:
              service:
                name: nginx-green-svc
                port:
                  number: 80
    
  3. 작성한 path-basic.yaml을 배포합니다.

    $ kubectl apply -f path-basic.yaml
    ingress.networking.k8s.io/ingress-path-basic created
    $ kubectl get ingress
    NAME                 CLASS   HOSTS   ADDRESS          PORTS   AGE
    ingress-path-basic   nginx   *       152.xx.xxx.xxx   80      4m53s
    
  4. 앞서 확인한 ingress controller의 EXTERNAL IP로 접속하여 결과를 확인합니다.

    • /blue 요청

      image-20230628235000846

    • /green 요청

      image-20230628235030666

    • POD 정보 확인

      정의한 PATH에 따라 각각 blue, green 앱이 배포된 POD로 라우팅 된 것을 웹페이지 배경색 및 POD IP로 알 수 있습니다.

      $ kubectl get pod -o wide
      NAME                          READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
      nginx-blue-565656fd64-bcc8x   1/1     Running   0          19m   10.244.1.4   10.0.10.207   <none>           <none>
      nginx-green-8c6dc77b6-29kl9   1/1     Running   0          19m   10.244.0.5   10.0.10.239   <none>           <none>
      

Rewrite Target

URL PATH 라우팅 결과를 보면 /blue, /green의 Path가 최종 라우팅 되어 실행되는 앱으로 그대로 전달되는 것을 알 수 있습니다. ingress controller에서 라우팅을 위해서만 사용하고, 실제 앱의 동작을 위해는 수정이 필요한 경우에 사용합니다.

  1. ingress 설정 YAML(path-rewrite-target.yaml)을 작성합니다.

    • path: /blue -> /blue(/|$)(.*) 로 변경
    • annotation 추가: nginx.ingress.kubernetes.io/rewrite-target: /$2
    • 예시
      • ~~/blue -> ~~/ 로 앱으로 전달
      • ~~/blue/abc -> ~~/abc 로 앱으로 전달
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-path-rewrite-target
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$2
    spec:
      ingressClassName: nginx
      rules:
      - http:
          paths:
          - path: /blue(/|$)(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: nginx-blue-svc
                port:
                  number: 80
      - http:
          paths:
          - path: /green(/|$)(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: nginx-green-svc
                port:
                  number: 80
    
    • 참고
      • pathType: Prefix인 경우 path에 와이드 카드가 있는 경우 경고문구가 출력됨. 이를 위해 pathType: ImplementationSpecific 변경
  2. 앞선 path-basic.yaml를 삭제하고 path-rewrite-target.yaml를 배포합니다.

    $ kubectl delete -f path-basic.yaml 
    ingress.networking.k8s.io "ingress-path-basic" deleted
    $ kubectl apply -f path-rewrite-target.yaml 
    ingress.networking.k8s.io/ingress-path-rewrite-target created
    $ kubectl get ingress
    NAME                          CLASS   HOSTS   ADDRESS          PORTS   AGE
    ingress-path-rewrite-target   nginx   *       152.xx.xxx.xxx   80      82s
    
  3. 앞서 확인한 ingress controller의 EXTERNAL IP로 접속하여 결과를 확인합니다.

    • ~~/blue 요청

      • 라우팅된 앱에서는 /blue가 빠지고 /로만 수신됨

      image-20230629001254518

    • ~~/blue/abc 요청

      • 라우팅된 앱에서는 /blue가 빠지고 /abc로만 수신됨

      image-20230629001317782



이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 5 Dec 2021