Ingressのpath設定でリクエストを振り分ける際にURLのrewriteを行ったのでメモ。
設定がコントローラーにより異なるようです。
リンク
kubernetes-ingress
annotationsにnginx.ingress.kubernetes.io/rewrite-targetを設定すると良いようです。
rewrite-targetに/を指定する事により、/v2アクセス時にservice2の/(インデックスルート)にアクセスします。
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
Nginx Ingress Controller
kubernetes-ingressと同様にnginx.ingress.kubernetes.io/rewrite-targetで指定できるようです。
- Git Hub
nghttpx Ingress Controller
zlab社製のnghttpxはingress.zlab.co.jp/path-configにpathのrewrite処理を記載する必要があります。
詳細はドキュメントが参考になります。
以下の設定では、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
Traefik Controller (Rancher, k3s)
k3s環境ではIngressControllerにTraefieがデフォルトで適用されます。
今までのIngressControllerと異なり、MIddlewareというCRDのデプロイが別途必要になります。
以下、/v2アクセス時にservice2の/(インデックスルート)にアクセスする例となります。
apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: name: replacepathregex-service2 namespace: test-namespace spec: replacePathRegex: regex: ^/v2/(.*) replacement: /$1
annotationsにtraefik.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