【Kubernetes】ローリングアップデートでのminReadySecondsとreadinessProbe

2022.03.01
2024.03.24
Kubernetes
minReadySecondsReadinessProbeRollingUpdate

はじめに

Kubernetesでローリングアップデートをする時に、readinessProbeminReadySecondsを設定するとどう動くのか気になったので実際に試してみました。

readinessProbe

readinessProbeは、コンテナがリクエストに応答できるかを判断する設定です。

readinessProbe.initialDelaySecondsで最初にチェックするまでの待機時間を、readinessProbe.periodSecondsでチェックする間隔を設定できます。

1readinessProbe:
2  tcpSocket:              # ポートによるチェック
3    port: 80
4  initialDelaySeconds: 30 # 最初にチェックするまでの待機時間
5  periodSeconds: 60       # チェックする頻度
【Kubernetes】LivenessProbeとReadinessProbeを試してみる

【Kubernetes】LivenessProbeとReadinessProbeを試してみる

:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。

minReadySeconds

minReadySecondsは、Deploymentで新しく作成されたPodが利用可能と見なされるまでに必要な最小時間の設定です。

デフォルトの値は0です。つまり、PodがREADYになるとすぐDeploymentから利用可能とみなされます。

ローリングアップデートでどうなるか

実際にreadinessProbeminReadySecondsを設定してローリングアップデートをするとどうなるか試してみます。

Deployment

Deploymentのマニフェストdeployment.ymlは下記の通りです。readinessProbeminReadySecondsを設定しています。

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を確認してみるとinitialDelaySecondsperiodSeconds後に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】ローリングアップデートをやってみる

【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が終了する

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee