Pod readiness gate
ローリングアップデートで新しい Pod を起動
↓
ヘルスチェックに成功し、新しい Pod が起動後、古い Pod を削除
EKS + ALBの場合 Pod の起動後に AWS Load Balancer Controller によって ALB にアタッチされるというステップがあるため、アタッチが完了するまでに古い Pod が削除されてしまうと処理可能な Pod がなくなり一時的なダウンタイムが発生する可能性がある。
Readiness Gate は AWS Load Balancer Controller でも ALB のターゲットが healthy になってから Pod の status を Ready にする(古い Pod の削除を開始する)という機能である。
Readiness Gate 設定前
下記を参考に、EKS + ALB を構成し、Readiness Gate を設定前の動作を確認しておく。
下記の通り、READINESS GATES のステータスは none です。
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-797bc47df8-g7klt 1/1 Running 0 3m47s 192.168.106.180 fargate-ip-192-168-106-180.ap-northeast-1.compute.internal <none> <none>
nginx-deployment-797bc47df8-gkwmt 1/1 Running 0 4m48s 192.168.185.187 fargate-ip-192-168-185-187.ap-northeast-1.compute.internal <none> <none>
ALB のターゲットグループで新しい Pod の initial が走ると同時に古い Pod の Draining が始まりました。
Readiness Gate 設定後
elbv2.k8s.aws/pod-readiness-gate-inject: enabled
の label を namespace に入れる事で Readiness Gate を有効にします。
apiVersion: v1
kind: Namespace
metadata:
name: readiness
labels:
elbv2.k8s.aws/pod-readiness-gate-inject: enabled
下記の通り、READINESS GATES のステータスは 1/1 です。
kubectl get pod -o wide -n readiness
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-797bc47df8-rkgtg 1/1 Running 0 2m44s 192.168.187.137 fargate-ip-192-168-187-137.ap-northeast-1.compute.internal <none> 1/1
nginx-deployment-797bc47df8-zw6lw 1/1 Running 0 91s 192.168.177.147 fargate-ip-192-168-177-147.ap-northeast-1.compute.internal <none> 1/1
ALB のターゲットグループで healthy にならないと古い Pod が draining に入らないため、期待通りの動作となりました。