猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

Kubernetes チュートリアルで「ローリングアップデート」を学ぶ

f:id:yoshiki_utakata:20210626215710p:plain

はじめに

前回、アプリケーションのスケールアップ/ダウンをやりましたが、その知識を使って、アプリケーションの「ローリングアップデート」をやります。

kubernetes.io

ローリングアップデートとは

例えば、Pod が2つある場合、

  • 片方の Pod を止めて、そこに最新版のアプリケーションをデプロイし、起動
  • 今度は別の方の Pod を止めて、そこに最新版のアプリケーションをデプロイし、起動

とすることで、サービスを停止させることなく、アプリケーションを更新する手法です。

実際にやってみる

Kubernetes チュートリアルの Kubernetes では、すでに4つのレプリカが動いている状態になっています。

$ kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   4/4     4            4           2m6s
$ kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-fb5c67579-8dps9   1/1     Running   0          119s
kubernetes-bootcamp-fb5c67579-b4pkj   1/1     Running   0          119s
kubernetes-bootcamp-fb5c67579-lcmzf   1/1     Running   0          119s
kubernetes-bootcamp-fb5c67579-lhxjp   1/1     Running   0          119s

kubectl describe pods すると、結果は長いが、 Image は gcr.io/google-samples/kubernetes-bootcamp:v1 になっていることがわかります。

これを v2 にします。

$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment.apps/kubernetes-bootcamp image updated

このコマンドを実行すると、 v1 が動いていた Pod が Terminating になり、 v2 の Pod が4台立ち上がります。

$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment.apps/kubernetes-bootcamp image updated

これでまだ終了ではありません。

動作確認してみて、アップデートを完了するか、ロールバックをするかを選択します。

チュートリアルでは curl で動作確認していますが、ここでは省略します。

アップデートの完了

動作確認して、問題なければ、アップデートを完了させます。

$ kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out

すると、 Terminate されていた古いコンテナが終了し、デプロイが完了した状態になります。

$ kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-7d44784b7c-28gcq   1/1     Running   0          5m13s
kubernetes-bootcamp-7d44784b7c-7vmvv   1/1     Running   0          5m16s
kubernetes-bootcamp-7d44784b7c-cfpzd   1/1     Running   0          5m16s
kubernetes-bootcamp-7d44784b7c-wrhvk   1/1     Running   0          5m13s

ロールバック

逆に巻き戻ししたい場合を試します。

v10 のアプリケーションをデプロイしようと試みます。

$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10
deployment.apps/kubernetes-bootcamp image updated

実は、v10 というコンテナは無いので、デプロイに失敗します。

deployments を確認します。

$ kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   3/4     2            3           9m45s

4台必要なところ、3台しか立ち上がってないことがわかります。

Pod の状態を確認してみると

$ kubectl get pods
NAME                                   READY   STATUS             RESTARTS   AGE
kubernetes-bootcamp-59b7598c77-8vkqs   0/1     ImagePullBackOff   0          27s
kubernetes-bootcamp-59b7598c77-l9gr9   0/1     ImagePullBackOff   0          27s
kubernetes-bootcamp-7d44784b7c-28gcq   1/1     Terminating        0          6m18s
kubernetes-bootcamp-7d44784b7c-7vmvv   1/1     Running            0          6m21s
kubernetes-bootcamp-7d44784b7c-cfpzd   1/1     Running            0          6m21s
kubernetes-bootcamp-7d44784b7c-wrhvk   1/1     Running            0          6m18s

ImagePullBackOff というのは、イメージの pull に失敗したということです。

(これ、なぜ ImagePullBackOff が2つ出ているのかはわからないのですが)、1つの Pod を終了させて、新しいイメージをデプロイしようとしたが、イメージの pull に失敗、そこでデプロイが止まってしまっています。

この場合は、 rollout を実行すると、古い Pod が再び立ち上がります。

$ kubectl get pods
NAME                                   READY   STATUS        RESTARTS   AGE
kubernetes-bootcamp-59b7598c77-8vkqs   0/1     Terminating   0          4m
kubernetes-bootcamp-59b7598c77-l9gr9   0/1     Terminating   0          4m
kubernetes-bootcamp-7d44784b7c-4rdzz   1/1     Running       0          16s
kubernetes-bootcamp-7d44784b7c-7vmvv   1/1     Running       0          9m54s
kubernetes-bootcamp-7d44784b7c-cfpzd   1/1     Running       0          9m54s
kubernetes-bootcamp-7d44784b7c-wrhvk   1/1     Running       0          9m51s

4つの Pod が起動した状態になりました。

チュートリアルにはここまでしかないのですが、この状態で、 rollout status すると、 Terminating な Pod が消えます。

$ kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out

$ kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-7d44784b7c-4rdzz   1/1     Running   0          81s
kubernetes-bootcamp-7d44784b7c-7vmvv   1/1     Running   0          10m
kubernetes-bootcamp-7d44784b7c-cfpzd   1/1     Running   0          10m
kubernetes-bootcamp-7d44784b7c-wrhvk   1/1     Running   0          10m

こんな感じで、 Kubernetes を使うとかんたんにローリングアップデートができます。