[第4回]Kubernetesの公式チュートリアルをやって基本を抑える -アプリのアップデート-[最終回]
コンニチハ、千葉です。
Kubernetesを勉強中です。Kubernetesは簡単に使えて、かつコンテナのデプロイや可用性を向上することができます。高度なことを簡単に使えるようにテクノロジーが注ぎ込まれています。 チュートリアルでは、クラスタの起動からアプリケーションのデプロイ、確認、公開、アップデートまで基本的なライフサイクルを身につけられます。分量が多いので数回に分けてやってきましたが、今回が最終回です。
範囲
*の箇所が第4回の範囲です。
- クラスターの作成
- アプリケーションのデプロイ
- アプリケーションの確認
- アプリケーションの公開
- アプリケーションのスケールアウト
- *アプリケーションのアップデート
他の回はこちら
アプリケーションのアップデート
kubernetesでは、ゼロダウンタイムアップデートをサポートしており、これはローリングアップデートで行われます。Podを段階的に更新し、ゼロダウンタイムを実現します。デフォルトでは1Podずつローリングアップデートされます。オプリョンにより、数やパーセンテージを指定できます。また、ロールバックをすることもできます。
このチュートリアルでは、デプロイされたアプリケーションのアップデートとロールバックを学びます。
アプリケーションのバージョンを更新する
deploymentのリストと実行しているpodの一覧を表示します。
1 2 3 4 5 6 7 | $ kubectl get deploymentsNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEkubernetes-bootcamp 2 2 2 2 5d$ kubectl get podsNAME READY STATUS RESTARTS AGEkubernetes-bootcamp-5c69669756-64czk 1/1 Running 1 5dkubernetes-bootcamp-5c69669756-8hlj6 1/1 Running 1 5d |
describeを実行し、image versioを確認します。gcr.io/google-samples/kubernetes-bootcamp:v1となっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ kubectl describe podsName: kubernetes-bootcamp-5c69669756-64czkNamespace: defaultNode: minikube/10.0.2.15Start Time: Wed, 09 May 2018 08:11:28 +0900Labels: app=v1 pod-template-hash=1725225312 run=kubernetes-bootcampAnnotations: <none>Status: RunningIP: 172.17.0.5Controlled By: ReplicaSet/kubernetes-bootcamp-5c69669756Containers: kubernetes-bootcamp: Container ID: docker://3ac0aa5263e78911992b4ce8d8b79e74c6467b052419b38d9567328519f251a7 Image: gcr.io/google-samples/kubernetes-bootcamp:v1・・・略 |
set imageを使って、アプリケーションのバージョンをアップデートします。このコマンドでローリングアップデートによりアプリケーションがバージョンアップします。
1 2 3 4 5 6 7 8 9 10 11 12 13 | $ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2deployment "kubernetes-bootcamp" image updated古いバージョンがターミネートされつつ、新しいアプリケーションが実行されているのを確認します。$ kubectl get podsNAME READY STATUS RESTARTS AGEkubernetes-bootcamp-7799cbcb86-c7zzv 1/1 Terminating 0 1mkubernetes-bootcamp-7799cbcb86-wx9k7 1/1 Running 0 1mkubernetes-bootcamp-854649945-5v7ch 0/1 ContainerCreating 0 4skubernetes-bootcamp-854649945-fz4wl 0/1 ContainerCreating 0 4s |
アップデートの検証
最初に起動しているアプリケーションを確認し、接続IPとポートを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $ kubectl describe services/kubernetes-bootcampName: kubernetes-bootcampNamespace: defaultLabels: run=kubernetes-bootcampAnnotations: <none>Selector: run=kubernetes-bootcampType: NodePortIP: 10.103.8.134Port: <unset> 8080/TCPTargetPort: 8080/TCPNodePort: <unset> 32455/TCPEndpoints: 172.17.0.6:8080Session Affinity: NoneExternal Traffic Policy: ClusterEvents: <none> |
環境変数にポート番号を設定し、curlで接続してみます。デプロイされたアプリのバージョンがv2になっていることを確認します。
1 2 3 4 5 | $ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')$ echo NODE_PORT=$NODE_PORTNODE_PORT=32455$ curl $(minikube ip):$NODE_PORTHello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7799cbcb86-wx9k7 | v=2 |
rolloutコマンドでもアップデートの状態をリアルタイムで確認できます。コマンドを実行すると進捗が表示されます。
1 2 3 4 5 6 | $ kubectl rollout status deployments/kubernetes-bootcampWaiting 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になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ kubectl describe podsName: kubernetes-bootcamp-7799cbcb86-kw6zrNamespace: defaultNode: minikube/10.0.2.15Start Time: Tue, 15 May 2018 00:15:57 +0900Labels: pod-template-hash=3355767642 run=kubernetes-bootcampAnnotations: <none>Status: RunningIP: 172.17.0.6Controlled By: ReplicaSet/kubernetes-bootcamp-7799cbcb86Containers: kubernetes-bootcamp: Container ID: docker://ff6e5117f0646dd12a24572c1b25ff4481e1bc4b667f54a8d707e84272a17ffe Image: jocatalin/kubernetes-bootcamp:v2・・・略 |
アプリケーションのロールバック
v10のアプリケーションを実行します。
1 2 | $ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10deployment "kubernetes-bootcamp" image updated |
deploymentのステータスを確認します。
1 2 3 | $ kubectl get deploymentsNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEkubernetes-bootcamp 2 3 2 1 5d |
何かの誤りで、DESIREDで指定した数がAVAILABLEになりません。AVAILABLEは1のままです。 podの一覧を取得します。
1 2 3 4 5 | $ kubectl get podsNAME READY STATUS RESTARTS AGEkubernetes-bootcamp-5f76cd7b94-6n68h 0/1 ImagePullBackOff 0 5mkubernetes-bootcamp-5f76cd7b94-bfcjs 0/1 ImagePullBackOff 0 5mkubernetes-bootcamp-7799cbcb86-kw6zr 1/1 Running 0 11m |
ステータスがImagePullBackOff(イメージがダウンロードできていない状態)になっています。
なぜなたらアップデートしているv10イメージは存在しません。rolloutコマンドを使ってロールバックします。
1 2 | $ kubectl rollout undo deployments/kubernetes-bootcampdeployment "kubernetes-bootcamp" |
前のイメージが実行されpodが起動しました。
1 2 3 4 | $ kubectl get podsNAME READY STATUS RESTARTS AGEkubernetes-bootcamp-7799cbcb86-kw6zr 1/1 Running 0 16mkubernetes-bootcamp-7799cbcb86-kxr72 1/1 Running 0 16s |
実行されているアプリケーションを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ kubectl describe podsName: kubernetes-bootcamp-7799cbcb86-kw6zrNamespace: defaultNode: minikube/10.0.2.15Start Time: Tue, 15 May 2018 00:15:57 +0900Labels: pod-template-hash=3355767642 run=kubernetes-bootcampAnnotations: <none>Status: RunningIP: 172.17.0.6Controlled By: ReplicaSet/kubernetes-bootcamp-7799cbcb86Containers: kubernetes-bootcamp: Container ID: docker://ff6e5117f0646dd12a24572c1b25ff4481e1bc4b667f54a8d707e84272a17ffe Image: jocatalin/kubernetes-bootcamp:v2・・・略 |
v2が実行されており、ロールバックが成功しているのがわかります。
最後に
今回はアプリケーションのローリングアップデートとロールバックを試しました。 4回に渡り、kubernetesのベーシックチュートリアルをやりました。基本的なことをつかめたので、やる前よりkubernetesについてイメージできるようになりました。 他にもチュートリアルの種類が何種類かあるので、もう少しやってみようと思います。ベーシックチュートリアルは今回が最終回です。最後までお付き合いいただきありがとうございました!!
他の回はこちら