【Kubernetes】IngressのURL Rewrite設定

f:id:tm200:20210908231220p:plain

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