[第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についてイメージできるようになりました。 他にもチュートリアルの種類が何種類かあるので、もう少しやってみようと思います。ベーシックチュートリアルは今回が最終回です。最後までお付き合いいただきありがとうございました!!
他の回はこちら