経緯
KubernetesはIngressを使うことでサービスをクラスタの外部に公開することができますが、外部に公開したいパスとサービスの実際のパスが異なるケースがあります。例えば、サービスはコンテキストパスが/
ですが、外部公開する場合は/hoge
としてアクセスさせたいケースです。例えば、Ingressでは/
はデフォルトバックエンドのために使うべきとされていますので、/
を使いたくない場合があります。
方法
アプリ内URIの相対パス化
常識的なことかもしれませんが、アプリ内で使われるURIは/a/b
のような絶対パスではなく、現在のURIからの相対パス、例えば/a
にいる場合は単にb
とします。このあたりはフレームワークやテンプレートエンジンの仕様に依存しますので確認ください。
Ingressのマニフェストでrewrite-targetを指定
sample-svcサービスに/sampleでアクセスするとsample-svcの/と見なす定義です(ややこしい)。rewrite-targetアノテーションを使います。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: sample-ingress
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /sample
backend:
serviceName: sample-svc
servicePort: 8080
以上です。