【Kubernetes】IngressのURL Rewrite設定

Ingressのpath設定でリクエストを振り分ける際にURLのrewriteを行ったのでメモ。
設定がコントローラーにより異なるようです。

kubernetes-ingress

annotationsnginx.ingress.kubernetes.io/rewrite-targetを設定すると良いようです。
rewrite-targetに/を指定する事により、/v2アクセス時にservice2/(インデックスルート)にアクセスします。

kubernetes.io

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test
  namespace: test-namespace
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /v2
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80
  • Git Hub

github.com

Nginx Ingress Controller

kubernetes-ingressと同様にnginx.ingress.kubernetes.io/rewrite-targetで指定できるようです。

kubernetes.github.io

  • Git Hub

github.com

nghttpx Ingress Controller

zlab社製のnghttpxingress.zlab.co.jp/path-configにpathのrewrite処理を記載する必要があります。
詳細はドキュメントが参考になります。

nghttp2.org

以下の設定では、example.co.jp/v2/アクセス時にservice2/にルーティングされます。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test
  namespace: test-namespace
  annotations:
    ingress.zlab.co.jp/path-config: |
      example.co.jp/v2/:
        mruby: |
          class App
            def on_req(env)
              # `/v2`を削除している
              env.req.path = env.req.path.sub(/^\/[^\/]+/, '')
            end
          end
          App.new

spec:
  rules:
  - http:
      paths:
      # `/v2`も入れないと`example.co.jp/v2`(最後の`/`無し)がNot Foundとなります
      - path: /v2
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80
      - path: /v2/
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80
  • Git Hub

github.com

Traefik Controller (Rancher, k3s)

k3s環境ではIngressControllerにTraefieがデフォルトで適用されます。
今までのIngressControllerと異なり、MIddlewareというCRDのデプロイが別途必要になります。

doc.traefik.io

以下、/v2アクセス時にservice2/(インデックスルート)にアクセスする例となります。

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: replacepathregex-service2
  namespace: test-namespace
spec:
  replacePathRegex:
    regex: ^/v2/(.*)
    replacement: /$1

annotationstraefik.ingress.kubernetes.io/router.middlewaresを指定します。
設定する値は${namespace名}-${Middleware名}@kubernetescrdという形式にする必要があります。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test
  namespace: test-namespace
  annotations:
    traefik.ingress.kubernetes.io/router.middlewares: test-namespace-replacepathregex-service2@kubernetescrd
spec:
  ingressClassName: traefik
  rules:
  - http:
      paths:
      - path: /v2
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80