4.1.2 NGINX Ingress Controller에서 PATH 기반 라우팅
PATH 기반 기본 라우팅 테스트
가장 기본적인 라우팅으로 URL PATH에 따라 라우팅 서비스를 달리하는 경우입니다.
테스트를 위한 샘플 앱을 배포합니다.
배경 색깔이 다른 두개의 웹페이지를 배포합니다.
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
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
- 참고
- 기존 annotations kubernetes.io/ingress.class: nginx 에서 ingressClassName: nginx 변경
- Deprecating the Ingress Class Annotation
작성한
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
앞서 확인한 ingress controller의 EXTERNAL IP로 접속하여 결과를 확인합니다.
/blue 요청
/green 요청
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에서 라우팅을 위해서만 사용하고, 실제 앱의 동작을 위해는 수정이 필요한 경우에 사용합니다.
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 변경
앞선
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
앞서 확인한 ingress controller의 EXTERNAL IP로 접속하여 결과를 확인합니다.
~~/blue 요청
- 라우팅된 앱에서는 /blue가 빠지고 /로만 수신됨
~~/blue/abc 요청
- 라우팅된 앱에서는 /blue가 빠지고 /abc로만 수신됨
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.