触れる内容
- ingress-nginx-controller(NGINX ingressではない)
- クライアントから送られるHTTPリクエストのCookieでルーティング先のServiceを変える
- ingressリソースのannotationsにnginxの設定を追記する
- nginxでif文を使う
触れないこと
- sticky session
どうしても見つからなかったので書き残します。
誰かの役に立ちますように。
ですが、このやり方が正しいとは正直思えないので、スマートな方法を探しております。
目的
- Podのデプロイを行った後、想定通りに動作しているかを確認したい。
- イメージとしてはBlue/Greenデプロイを行ってBlueからGreenへの切り替え前に動作確認を行いたい。
- 稼働中のServiceと同じパスでアクセスしたい。
実装
こちらのページでnginxのifと、条件分岐を参考にしました。
https://qiita.com/ukitazume/items/ab1c929783e87227e466
ingressのannotationsにnginx.confのif文をそのままぶち込みます。
if else
が使えなかったり、&&
や||
なども使用できないのでif文で判定し、trueならフラグ文字列を追加します。
最終的な転送先Serviceは$proxy_upstream_name
にsetする部分で定義します。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-example
annotations:
set $routing A;
# Cookieにcolor=greenが含まれていたらフラグ文字Gをセットする
if ($http_cookie ~* "color=green") {
set $routing G;
}
# ホストヘッダにexampleenv.com が含まれていたらフラグ文字Hを追加する
if ($host ~* exampleenv.com) {
set $routing "${routing}H";
}
# Cookieとホストヘッダの条件に一致している場合にingress-nginx-controllerからServiceへ転送する
if ($test = GH) {
set $proxy_upstream_name "default-service1-80; # [Namespace]-[serviceName]-[PortNumber]のフォーマットで記述
}
spec:
rules:
- host: "exampleenv.com"
http:
paths:
- pathType: Prefix
path: "/bar"
backend:
service:
name: service1
port:
number: 80
おわりに
ingress-nginxのOSSコミュニティからすると「そんな使い方は想定していないぞ!」と怒られそうではありますが、
一つのingress-nginx-controllerで複数のNamespaceへCookieの内容を条件に振り分けを行うにはこれしか思いつかなかったです。
istioのVirtualServiceやDelegeteのイメージで書けたらすっごい楽なんですがねえ。。。
といった状況です!
もっと良いやり方があればぜひ教えてください!