(O+P)ut

アウトプット



(O+P)ut

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

【Kubernetes】maxSurgeとmaxUnavailableとは?

スポンサーリンク

はじめに

Kubernetesではでデプロイ戦略はいくつかあり以下記事ではローリングアップデート(rollingUpdate)ということで順次新たなバージョンのPodが生成される動きを実践しました。

一方でこのようなデプロイ時の動きの詳細な制御を行うフィールドにmaxSurgemaxUnavailableが存在します。

本記事ではこのフィールドが何を指しているのかについて分かりやすく解説しました。

コマンド実行環境
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"15",...

Podの数が一時的にレプリカ数を上下する

実際に上の記事ではPodの生成と消去が同時に走ることで指定したレプリカ数(=10)から一時的に外れています。

$ kubectl.exe get pods
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-54f57cf6bf-h8bss   1/1     Running             0          6m48s
nginx-deployment-54f57cf6bf-lv9bc   1/1     Running             0          6m48s
nginx-deployment-54f57cf6bf-mb6m4   1/1     Running             0          6m48s
nginx-deployment-54f57cf6bf-n2hpj   1/1     Running             0          6m48s
nginx-deployment-54f57cf6bf-rw28f   0/1     Terminating         0          6m48s
nginx-deployment-54f57cf6bf-tnkl6   1/1     Running             0          6m48s
nginx-deployment-54f57cf6bf-v4mv7   1/1     Running             0          6m48s
nginx-deployment-54f57cf6bf-vbqlr   0/1     Terminating         0          6m48s
nginx-deployment-54f57cf6bf-vvntn   1/1     Running             0          6m48s
nginx-deployment-54f57cf6bf-xxh2n   1/1     Running             0          6m48s
nginx-deployment-64f4c47bf8-hdlh9   0/1     ContainerCreating   0          7s
nginx-deployment-64f4c47bf8-jn7jk   0/1     ContainerCreating   0          7s
nginx-deployment-64f4c47bf8-pm4t6   0/1     ContainerCreating   0          7s
nginx-deployment-64f4c47bf8-sjg8z   0/1     ContainerCreating   0          7s
nginx-deployment-64f4c47bf8-zq8qf   0/1     ContainerCreating   0          7s

ただ、例えば想定より少ないPod数になるということは提供しているサービスのリソースが減ることに繋がり、想定より多いPod数になるということはノードのリソースをより利用することになります

そして、このPod数の一時的な上下をコントロールするために指定するのがdeployment.spec.strategy.rollingUpdateのフィールドである「maxSurgeとmaxUnavailable」です。

maxSurgeとは?

explainコマンドでは以下のように説明されていますが

$ kubectl explain deployment.spec.strategy.rollingUpdate
...
   maxSurge     <string>
     The maximum number of pods that can be scheduled above the desired number of pods. 

要するに「レプリカ数を上回って新しいPodを作成を許容する数」です。

ノードのリソースがシビアな場合はここを少ない値にしておきます。(デフォルトは25%)
このデフォルトが25%というのはどういうことか言うと、10個のPodを別バージョンでデプロイした時に新しいPodが10個の25%ということで3個生成されます。逆に、ここを100%にしていれば一気に10個生成されます。

指定方法としては以下のように記入します。

rollingUpdate:
 maxSurge: 25%

maxUnavailableとは?

explainコマンドでは以下のように説明されていますが

$ kubectl explain deployment.spec.strategy.rollingUpdate
...
 maxUnavailable       <string>
     The maximum number of pods that can be unavailable during the update.

要するに「レプリカ数を下回って古いPodの削除を許容する数」です。

提供するサービスのパフォーマンス要求がシビアな場合はここを少ない値にしておきます。(デフォルトは25%)
このデフォルトが25%というのはどういうことか言うと、10個のPodを別バージョンでデプロイした時に古いPodが10個の25%ということで2個削除されます。逆に、ここを0%にしていれば一つも削除されません。

指定方法としては以下のように記入します。

rollingUpdate:
 maxUnavailable: 25%

終わりに

maxSurgeとmaxUnavailableは、アップデートを行うデプロイ時の新規Podと現行Podの生成/削除を制御する値です。
数値の意味を考えれば分かりますが、どちらも0に指定するとPod数の上下の振れが許容できなくなるのでそのような設定はできないことも併せて覚えておくと意味を忘れないためにも良いと思います。

以上、ご参考になれば幸いです。