【Kubernetes】IngressのURL Rewrite設定
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