[第4回]Kubernetesの公式チュートリアルをやって基本を押さえる -アプリのアップデート-[最終回]

コンニチハ、千葉です。

Kubernetesを勉強中です。Kubernetesは簡単に使えて、かつコンテナのデプロイや可用性を向上することができます。高度なことを簡単に使えるようにテクノロジーが注ぎ込まれています。 チュートリアルでは、クラスタの起動からアプリケーションのデプロイ、確認、公開、アップデートまで基本的なライフサイクルを身につけられます。分量が多いので数回に分けてやってきましたが、今回が最終回です。

範囲

*の箇所が第4回の範囲です。

  • クラスターの作成
  • アプリケーションのデプロイ
  • アプリケーションの確認
  • アプリケーションの公開
  • アプリケーションのスケールアウト
  • *アプリケーションのアップデート

他の回はこちら

アプリケーションのアップデート

kubernetesでは、ゼロダウンタイムアップデートをサポートしており、これはローリングアップデートで行われます。Podを段階的に更新し、ゼロダウンタイムを実現します。デフォルトでは1Podずつローリングアップデートされます。オプリョンにより、数やパーセンテージを指定できます。また、ロールバックをすることもできます。

このチュートリアルでは、デプロイされたアプリケーションのアップデートとロールバックを学びます。

アプリケーションのバージョンを更新する

deploymentのリストと実行しているpodの一覧を表示します。

$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   2         2         2            2           5d
$ kubectl get pods
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5c69669756-64czk   1/1       Running   1          5d
kubernetes-bootcamp-5c69669756-8hlj6   1/1       Running   1          5d

describeを実行し、image versioを確認します。gcr.io/google-samples/kubernetes-bootcamp:v1となっています。

$ kubectl describe pods
Name:           kubernetes-bootcamp-5c69669756-64czk
Namespace:      default
Node:           minikube/10.0.2.15
Start Time:     Wed, 09 May 2018 08:11:28 +0900
Labels:         app=v1
                pod-template-hash=1725225312
                run=kubernetes-bootcamp
Annotations:    <none>
Status:         Running
IP:             172.17.0.5
Controlled By:  ReplicaSet/kubernetes-bootcamp-5c69669756
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://3ac0aa5263e78911992b4ce8d8b79e74c6467b052419b38d9567328519f251a7
    Image:          gcr.io/google-samples/kubernetes-bootcamp:v1
・・・略

set imageを使って、アプリケーションのバージョンをアップデートします。このコマンドでローリングアップデートによりアプリケーションがバージョンアップします。

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


古いバージョンがターミネートされつつ、新しいアプリケーションが実行されているのを確認します。


$ kubectl get pods
NAME                                   READY     STATUS              RESTARTS   AGE
kubernetes-bootcamp-7799cbcb86-c7zzv   1/1       Terminating         0          1m
kubernetes-bootcamp-7799cbcb86-wx9k7   1/1       Running             0          1m
kubernetes-bootcamp-854649945-5v7ch    0/1       ContainerCreating   0          4s
kubernetes-bootcamp-854649945-fz4wl    0/1       ContainerCreating   0          4s

アップデートの検証

最初に起動しているアプリケーションを確認し、接続IPとポートを確認します。

$ kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   run=kubernetes-bootcamp
Annotations:              <none>
Selector:                 run=kubernetes-bootcamp
Type:                     NodePort
IP:                       10.103.8.134
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  32455/TCP
Endpoints:                172.17.0.6:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

環境変数にポート番号を設定し、curlで接続してみます。デプロイされたアプリのバージョンがv2になっていることを確認します。

$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=32455
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7799cbcb86-wx9k7 | v=2

rolloutコマンドでもアップデートの状態をリアルタイムで確認できます。コマンドを実行すると進捗が表示されます。

$ kubectl rollout status deployments/kubernetes-bootcamp
Waiting for rollout to finish: 1 old replicas are pending termination...
Waiting for rollout to finish: 1 old replicas are pending termination...
Waiting for rollout to finish: 1 old replicas are pending termination...
Waiting for rollout to finish: 1 of 2 updated replicas are available...
deployment "kubernetes-bootcamp" successfully rolled out

podの現在のバージョンを確認します。v2になっています。

$ kubectl describe pods
Name:           kubernetes-bootcamp-7799cbcb86-kw6zr
Namespace:      default
Node:           minikube/10.0.2.15
Start Time:     Tue, 15 May 2018 00:15:57 +0900
Labels:         pod-template-hash=3355767642
                run=kubernetes-bootcamp
Annotations:    <none>
Status:         Running
IP:             172.17.0.6
Controlled By:  ReplicaSet/kubernetes-bootcamp-7799cbcb86
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://ff6e5117f0646dd12a24572c1b25ff4481e1bc4b667f54a8d707e84272a17ffe
    Image:          jocatalin/kubernetes-bootcamp:v2
・・・略

アプリケーションのロールバック

v10のアプリケーションを実行します。

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

deploymentのステータスを確認します。

$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   2         3         2            1           5d

何かの誤りで、DESIREDで指定した数がAVAILABLEになりません。AVAILABLEは1のままです。 podの一覧を取得します。

$ kubectl get pods
NAME                                   READY     STATUS             RESTARTS   AGE
kubernetes-bootcamp-5f76cd7b94-6n68h   0/1       ImagePullBackOff   0          5m
kubernetes-bootcamp-5f76cd7b94-bfcjs   0/1       ImagePullBackOff   0          5m
kubernetes-bootcamp-7799cbcb86-kw6zr   1/1       Running            0          11m

ステータスがImagePullBackOff(イメージがダウンロードできていない状態)になっています。 なぜなたらアップデートしているv10イメージは存在しません。rolloutコマンドを使ってロールバックします。

$ kubectl rollout undo deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp"

前のイメージが実行されpodが起動しました。

$ kubectl get pods
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-7799cbcb86-kw6zr   1/1       Running   0          16m
kubernetes-bootcamp-7799cbcb86-kxr72   1/1       Running   0          16s

実行されているアプリケーションを確認します。

$ kubectl describe pods
Name:           kubernetes-bootcamp-7799cbcb86-kw6zr
Namespace:      default
Node:           minikube/10.0.2.15
Start Time:     Tue, 15 May 2018 00:15:57 +0900
Labels:         pod-template-hash=3355767642
                run=kubernetes-bootcamp
Annotations:    <none>
Status:         Running
IP:             172.17.0.6
Controlled By:  ReplicaSet/kubernetes-bootcamp-7799cbcb86
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://ff6e5117f0646dd12a24572c1b25ff4481e1bc4b667f54a8d707e84272a17ffe
    Image:          jocatalin/kubernetes-bootcamp:v2
・・・略

v2が実行されており、ロールバックが成功しているのがわかります。

最後に

今回はアプリケーションのローリングアップデートとロールバックを試しました。 4回に渡り、kubernetesのベーシックチュートリアルをやりました。基本的なことをつかめたので、やる前よりkubernetesについてイメージできるようになりました。 他にもチュートリアルの種類が何種類かあるので、もう少しやってみようと思います。ベーシックチュートリアルは今回が最終回です。最後までお付き合いいただきありがとうございました!!

他の回はこちら

参考

https://kubernetes.io/docs/tutorials/kubernetes-basics/