(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Nginx/Ingress】Sticky sessionsを有効にすることで同一PODに通信を流す

スポンサーリンク

はじめに

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が存在している場合は転送する機構が入っているんですね。

以上です。