LoginSignup
0
1

More than 1 year has passed since last update.

ingress-nginxでCookieを使ったルーティング

Posted at

触れる内容

  • 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のイメージで書けたらすっごい楽なんですがねえ。。。
といった状況です!

もっと良いやり方があればぜひ教えてください!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1