Kubernetes Ingress 쉽게 적용하기

1 분 소요

Ingress를 적용할 때 path만 설정할 경우, 외부에서 서비스로 접근하는 URI내부에서 실제 서비스로 요청하는 URI가 달라지면서 오류가 발생하는 경우를 볼 수 있습니다. 여기서 아래와 같이 설정하면 위 두 URI를 일치시킬 수 있습니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ...
  namespace: ...
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
  rules:
  - http:
      paths:
      - path: /mlflow(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: mlflow
            port:
              number: 5000

위 설정은 MLflow의 ingress를 설정했을 때 적용했던 코드입니다. use-regex정규식 설정을 켜고, path/mlflow(/|$)(.\*)과 같이 설정합니다.

(/|$)은 URI에 /가 있는 경우와 없는 경우를 동일하게 처리하기 위한 내용이고, (.\*)rewrite-target에 해당 부분의 경로를 전달하기 위한 부분입니다. /$2를 입력함으로써 path의 두번째 괄호(첫번째는 (/|$), 두번째는 (.\*)) 이후를 전부 rewrite-target에 전달함으로써 외부에서 서비스로 접근하는 URI와 내부에서 실제 서비스로 요청하는 URI가 동일하게 처리됩니다.


위 설정을 이해했다면 아래와 같이 path가 추가돼도 rewrite-target을 동일하게 처리해야함을 알 수 있습니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ...
  namespace: ...
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
  rules:
  - http:
      paths:
      - path: /subpath/mlflow(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: mlflow
            port:
              number: 5000

댓글남기기