【Kubernetes】ローリングアップデートでのminReadySecondsとreadinessProbe
はじめに
Kubernetesでローリングアップデートをする時に、readinessProbe
とminReadySeconds
を設定するとどう動くのか気になったので実際に試してみました。
readinessProbe
readinessProbe
は、コンテナがリクエストに応答できるかを判断する設定です。
readinessProbe.initialDelaySeconds
で最初にチェックするまでの待機時間を、readinessProbe.periodSeconds
でチェックする間隔を設定できます。
1readinessProbe:
2 tcpSocket: # ポートによるチェック
3 port: 80
4 initialDelaySeconds: 30 # 最初にチェックするまでの待機時間
5 periodSeconds: 60 # チェックする頻度
【Kubernetes】LivenessProbeとReadinessProbeを試してみる
:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。
minReadySeconds
minReadySeconds
は、Deploymentで新しく作成されたPodが利用可能と見なされるまでに必要な最小時間の設定です。
デフォルトの値は0
です。つまり、PodがREADYになるとすぐDeploymentから利用可能とみなされます。
ローリングアップデートでどうなるか
実際にreadinessProbe
とminReadySeconds
を設定してローリングアップデートをするとどうなるか試してみます。
Deployment
Deploymentのマニフェストdeployment.yml
は下記の通りです。readinessProbe
とminReadySeconds
を設定しています。
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: myapp
5spec:
6 replicas: 2
7 minReadySeconds: 100 # READYとなったPodが揃ってから100秒待つ
8 selector:
9 matchLabels:
10 app: myapp
11 template:
12 metadata:
13 labels:
14 app: myapp
15 spec:
16 containers:
17 - name: nginx
18 image: nginx:1.21
19 readinessProbe:
20 tcpSocket:
21 port: 80
22 initialDelaySeconds: 10 # 最初にチェックするまで10秒待つ
23 periodSeconds: 10
マニフェストを適用します。
1kubectl apply -f deployment.yml
PodとDeploymentの確認
Podを確認してみるとinitialDelaySeconds
とperiodSeconds
後にREADYになっていることがわかります。
おそらく
periodSeonds
ごとにチェックはするが最初のinitialDelaySeonds
間は待つので、下記のような結果になっているのだと思います。
1❯ kubectl get pod -w
2NAME READY STATUS RESTARTS AGE
3myapp-79cb479965-9vd7q 0/1 Running 0 4s
4myapp-79cb479965-kdzbq 0/1 Running 0 4s
5myapp-79cb479965-9vd7q 1/1 Running 0 21s # initialDelaySeconds+periodSeonds待ってからREADY
6myapp-79cb479965-kdzbq 1/1 Running 0 21s # initialDelaySeconds+periodSedonds待ってからREADY
Deploymentの方を確認してみると、READYとなったPodが2つになってもminReadySeconds
待ってからAVAILABLEになっているのがわかります。
1❯ kubectl get deploy -w
2NAME READY UP-TO-DATE AVAILABLE AGE
3myapp 0/2 0 0 0s
4myapp 0/2 2 0 1s
5myapp 1/2 2 0 21s
6myapp 2/2 2 0 21s # READYが揃ってもAVAILABLEにならない
7myapp 2/2 2 2 2m # minReadySeconds待ってからAVAILABLE
マニフェストの変更(ローリングアップデート)
マニフェストのイメージを下記の様に変更して、Podをローリングアップデートさせます。
1image: nginx:1.20
1kubectl apply -f deployment.yml
ローリングアップデートの設定はデフォルトなので、レプリカが2つの場合は1つずつアップデートされています。
【Kubernetes】ローリングアップデートをやってみる
:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。
PodとDeploymentの確認
PodがREADYとなるまで先ほどと同じ時間が経過してからREADYとなっています。ただし、レプリカが3つ揃っても古いPodが削除されるまで約100秒ほど時間が経っています。
1❯ kubectl get pod -w
2NAME READY STATUS RESTARTS AGE
3myapp-587cddb9b-pp22q 0/1 Running 0 3s
4myapp-79cb479965-9vd7q 1/1 Running 0 3m51s
5myapp-79cb479965-kdzbq 1/1 Running 0 3m51s
6myapp-587cddb9b-pp22q 1/1 Running 0 20s
7myapp-79cb479965-9vd7q 1/1 Terminating 0 5m48s # Podが3つ揃ってから100秒ほど待っている
8myapp-587cddb9b-2khcb 0/1 ContainerCreating 0 0s
9myapp-79cb479965-9vd7q 0/1 Terminating 0 5m49s
10myapp-587cddb9b-2khcb 0/1 Running 0 1s
11myapp-79cb479965-9vd7q 0/1 Terminating 0 5m57s
12myapp-587cddb9b-2khcb 1/1 Running 0 20s
13myapp-79cb479965-kdzbq 1/1 Terminating 0 7m48s # Podが3つ揃ってから100秒ほど待っている
14myapp-79cb479965-kdzbq 0/1 Terminating 0 7m48s
15myapp-79cb479965-kdzbq 0/1 Terminating 0 7m50s
Deploymentを確認するとREADYとなったPodが3つ揃ってもminReadySeconds
待っていることがわかります。
1❯ kubectl get deploy -w
2NAME READY UP-TO-DATE AVAILABLE AGE
3myapp 2/2 2 2 3m46s
4myapp 2/2 2 2 3m48s
5myapp 2/2 0 2 3m48s
6myapp 2/2 1 2 3m48s
7myapp 3/2 1 2 4m8s
8myapp 3/2 1 3 5m48s # READYとなるPodが揃ってもminReadySeconds待つ
9myapp 2/2 1 2 5m48s # minReadySeconds経過したらPodを減らす
10myapp 2/2 2 2 5m48s
11myapp 3/2 2 2 6m8s
12myapp 3/2 2 3 7m48s
13myapp 2/2 2 2 7m48s
まとめ
readinessProbe
でPodがREADYになってからminReadySeconds
で利用可能になるまで待つ- ローリングアップデートではPodがREADYになっても
minReadySeconds
待ってから古いPodが終了する
参考
- deployment rollingupdate readiness minReadyseconds · Issue #78360 · kubernetes/kubernetes
- Deployments | Kubernetes
- Liveness Probe、Readiness ProbeおよびStartup Probeを使用する | Kubernetes
- Deployment | Kubernetes