[第4回]Kubernetesの公式チュートリアルをやって基本を抑える -アプリのアップデート-[最終回]
コンニチハ、千葉です。
Kubernetesを勉強中です。Kubernetesは簡単に使えて、かつコンテナのデプロイや可用性を向上することができます。高度なことを簡単に使えるようにテクノロジーが注ぎ込まれています。 チュートリアルでは、クラスタの起動からアプリケーションのデプロイ、確認、公開、アップデートまで基本的なライフサイクルを身につけられます。分量が多いので数回に分けてやってきましたが、今回が最終回です。
範囲
*の箇所が第4回の範囲です。
- クラスターの作成
- アプリケーションのデプロイ
- アプリケーションの確認
- アプリケーションの公開
- アプリケーションのスケールアウト
- *アプリケーションのアップデート
他の回はこちら
アプリケーションのアップデート
kubernetesでは、ゼロダウンタイムアップデートをサポートしており、これはローリングアップデートで行われます。Podを段階的に更新し、ゼロダウンタイムを実現します。デフォルトでは1Podずつローリングアップデートされます。オプリョンにより、数やパーセンテージを指定できます。また、ロールバックをすることもできます。
このチュートリアルでは、デプロイされたアプリケーションのアップデートとロールバックを学びます。
アプリケーションのバージョンを更新する
deploymentのリストと実行しているpodの一覧を表示します。
1 2 3 4 5 6 7 | $ 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
となっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ 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
を使って、アプリケーションのバージョンをアップデートします。このコマンドでローリングアップデートによりアプリケーションがバージョンアップします。
1 2 3 4 5 6 7 8 9 10 11 12 13 | $ 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とポートを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $ 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になっていることを確認します。
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_PORT NODE_PORT=32455 $ curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7799cbcb86-wx9k7 | v =2 |
rollout
コマンドでもアップデートの状態をリアルタイムで確認できます。コマンドを実行すると進捗が表示されます。
1 2 3 4 5 6 | $ 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になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ 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のアプリケーションを実行します。
1 2 | $ kubectl set image deployments /kubernetes-bootcamp kubernetes-bootcamp=gcr.io /google-samples/kubernetes-bootcamp :v10 deployment "kubernetes-bootcamp" image updated |
deploymentのステータスを確認します。
1 2 3 | $ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 2 3 2 1 5d |
何かの誤りで、DESIREDで指定した数がAVAILABLEになりません。AVAILABLEは1のままです。 podの一覧を取得します。
1 2 3 4 5 | $ 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
コマンドを使ってロールバックします。
1 2 | $ kubectl rollout undo deployments /kubernetes-bootcamp deployment "kubernetes-bootcamp" |
前のイメージが実行されpodが起動しました。
1 2 3 4 | $ 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 |
実行されているアプリケーションを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ 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についてイメージできるようになりました。 他にもチュートリアルの種類が何種類かあるので、もう少しやってみようと思います。ベーシックチュートリアルは今回が最終回です。最後までお付き合いいただきありがとうございました!!
他の回はこちら