はじめに
前回、アプリケーションのスケールアップ/ダウンをやりましたが、その知識を使って、アプリケーションの「ローリングアップデート」をやります。
ローリングアップデートとは
例えば、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 を使うとかんたんにローリングアップデートができます。