はじめに
NGINX Ingress Controllerにはセッションが続いている間は同じクライアントを同じサーバへ誘導する機能(Sticky sessions)が存在します。本記事ではそれを実際に有効にすることで、ブラウザ通信が同一のPodに流れることを実機で確認しました。
環境情報
- NGINX Ingress controller Release: v0.48.1
- Kubernetes: v1.23
事前準備
Deployment, Service, Ingressを用意することでロードバランサのIPに通信を発生させるとNginxのPodに通信が流れるようにしておきます。
$ kubectl get ep test-nginx NAME ENDPOINTS AGE test-nginx 172.30.41.225:80,172.30.41.245:80,172.30.5.57:80 ...
$ kubectl describe ingress test-ingress Name: test-ingress Namespace: default Address: ... Rules: Host Path Backends ---- ---- -------- * / test-nginx:80 (172.30.41.225:80,172.30.41.245:80,172.30.5.57:80) Annotations: kubernetes.io/ingress.class: xx
この状態でブラウザでアクセスを連続して行うとランダムにPodにアクセスログが表示されます。
test-nginx-XX-84xc7 nginx xx - - [...] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleW ebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.134 3.42" "..." test-nginx-XX-tqg4m nginx xx - - [...] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleW ebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.134 3.42" "..>" test-nginx-XX-zc6rk nginx xx - - [...] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleW ebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.134 3.42" "..."
Sticky sessionsを設定する
Ingressのアノテーション部分にcookieに関する情報を以下のようにセットします。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress annotations: kubernetes.io/ingress.class: xx nginx.ingress.kubernetes.io/affinity: cookie nginx.ingress.kubernetes.io/session-cookie-max-age: "172800" ...
この状態でIngressを適用し、curlコマンドで確認すると確かにCookie情報が表示されて
$ curl -I X.X.X.X HTTP/1.1 200 OK ... Content-Type: text/html Content-Length: 612 Connection: keep-alive Set-Cookie: INGRESSCOOKIE=...; Max-Age=172800; Path=/; HttpOnly ...
ブラウザアクセスは同じPodに割り振りされます。
終わりに
NGINX Ingress Controllerのセッションアフィニティ制御について確認しました。
Ingress ControllerがEndpointのIPを保持し、同EndpointにそのPodが存在している場合は転送する機構が入っているんですね。
以上です。