この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンニチハ、千葉です。
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についてイメージできるようになりました。 他にもチュートリアルの種類が何種類かあるので、もう少しやってみようと思います。ベーシックチュートリアルは今回が最終回です。最後までお付き合いいただきありがとうございました!!
他の回はこちら