Kubernetes の Replica 数を減らした時に削除される Pod は「生成日時がより新しい Pod」
普段、Kubernetes の Deployment を使って、一種類の Pod (≒ コンテナ) を複数個作り、冗長稼動させている。
1つの Deployment から作成される Pod の個数は、deployment.yaml
内の spec.replicas
プロパティに指定した数値で決まる。replicas: 5
とすれば5個の Pod が作られるし、後で replicas: 3
と変更して kubectl apply
すれば、5個稼動している Pod のうち2個の Pod が破棄されて、3個の Pod で稼動するように環境が変更できる。
今回の本題は、ReplicaSet の個数が減らされた時に、どの Pod が破棄されるのか、という点。
結論から言えば、Pod の作成日時が新しいもの (= AGE
が若いもの) から優先的に削除される、という仕様になっている。
- 参考 : Kubernetes: how to scale my pods - Stack Overflow
- Scale Down した時に古い Pod が優先的に残されていることが読み取れる
この仕様の該当コードが以下。
- 参考 : kubernetes/controller_utils.go at release-1.11 · kubernetes/kubernetes · GitHub
- 作成日時がない Pod (
Empty creation time pods
) を優先的に破棄し、その次に作成日時がより新しい Pod (newer pods
) を特定して優先的に破棄する、というコードになっている
- 作成日時がない Pod (
なぜこういう仕様なのか、という疑問や議論は、以下で行われている。
- 参考 : kubernetes - Why does scaling down a deployment seem to always remove the newest pods? - Stack Overflow
- 参考 : Scale down a deployment by removing specific pods · Issue #45509 · kubernetes/kubernetes · GitHub
作成日時が古い Pod をできるだけ残そうとするのは、それだけウォームアップができている安定した Pod だと判断できるからだ、ということらしい。
一方で、「ずっと稼動している Pod は、キャッシュを大量に蓄えていたりするから、古い Pod こそ優先的に破棄させた方が綺麗なんじゃないか?」という考え方もあるようだ。
個人的には、うまくキャッシュとかができている古い Pod が残ってくれる動きがデフォルトなのは嬉しい。もしも古い Pod の動きがおかしくなったら kubectl delete pod
で破棄してしまえば良いだけだし〜。