Kubernetesのデプロイメントとは
デプロイメントは、ユーザーが一連のレプリカPodを管理するための仕組みです。各デプロイメントに対して新しいReplicaSetの作成を処理する更新モデルを表しています。同時に、古いReplicaSetの古いPodをスケールダウンし、新しいReplicaSetの新しいPodをスケールアップします。この段階的な移行により、スムーズで効率的な更新プロセスが実現されます。
デプロイメントは、新しいPodの作成、既存のPodの更新、またはアプリケーションの要件に応じてスケールアップやスケールダウンする場合に非常に便利です。さらに、Kubernetesのデプロイメントは、前のデプロイメントにロールバックする機能も提供しており、アプリケーションの管理において強力なシステムとなっています。
Kubernetesでのデプロイメントの作成
Kubernetesでのデプロイメントの作成を行います。
Minikubeの起動
デプロイメントを始める前に、Minikubeが実行されていることを確認する必要があります。次のコマンドでMinikubeを起動します。
$ minikube start
Podのデプロイメントの開始
次に、kubectl create deployment
コマンドを使用してデプロイメントを作成します。この場合、helloworld
というサンプルアプリケーションをデプロイします。
--image
フラグは、このデプロイメントでのPod作成に使用するDockerイメージを指定するために使用されます。以下がコマンドです。
$ kubectl create deployment --image gcr.io/google-samples/hello-app:1.0 helloworld
deployment.apps/helloworld created
このコマンドにより、Kubernetesは指定したイメージをコンテナレジストリから取得し、アプリケーションの単一のインスタンスであるPodを開始します。
デプロイメントの一覧表示
デプロイメントが作成されたら、kubectl get deployment
コマンドを使用して現在のコンテキストで実行中の全てのデプロイメントを一覧表示できます。以下がコマンドです。
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
helloworld 1/1 1 1 2m35s
このコマンドは、新しく作成したhelloworld
デプロイメントを含む全てのデプロイメントのリストを表示します。
デプロイメントのスケールアップ
Kubernetesでは、デプロイメントを簡単にスケールアップまたはスケールダウンすることができます。これは、トラフィックの急増やオフピーク時のリソース使用量の削減に非常に役立ちます。
helloworld
デプロイメント内のPodの数を5に増やしてみます。kubectl scale
コマンドを使用してこれを実現できます。
$ kubectl scale --replicas=5 deploy/helloworld
このコマンドは、helloworldPodの5つのレプリカを指定しています。Kubernetesはその後、追加のPodをスケジュールして開始し、helloworld
Podの総数を5に増やします。再度kubectl get deployment
コマンドを使用して確認できます。
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
helloworld 5/5 5 5 2m35s
デプロイメントへのローリングアップデートの実装
Kubernetesのデプロイメントにローリングアップデートを実装する方法を見てみます。ローリングアップデートは、新しいPodインスタンスで徐々にPodを更新することにより、デプロイメントのアップデートをゼロダウンタイムで行うことができます。
今、5つのhelloworld
Podがあります。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
helloworld-75db9fdfbc-5n68f 1/1 Running 0 3m23s
helloworld-75db9fdfbc-h5c28 1/1 Running 0 3m23s
helloworld-75db9fdfbc-hm8c5 1/1 Running 0 3m23s
helloworld-75db9fdfbc-skjbw 1/1 Running 0 3m28s
helloworld-75db9fdfbc-zq69x 1/1 Running 0 3m23s
ローリングアップデートは、kubectl set image
コマンドを使用して実装できます。このコマンドはデプロイメントの特定のコンテナのイメージを更新します。helloworld
デプロイメントのイメージを変更してみます。
$ kubectl set image deploy/helloworld hello-app=gcr.io/google-samples/hello-app:2.0
このコマンドは、helloworld
Podのhello-app
コンテナのイメージをバージョン2.0に更新します。Kubernetesは新しいReplicaSetを作成し、新しいレプリカの数を増やす一方、古いレプリカの数を減らします。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
helloworld-75db9fdfbc-h5c28 1/1 Terminating 0 3m33s
helloworld-75db9fdfbc-zq69x 0/1 Terminating 0 3m33s
helloworld-7c6785877d-27n2l 1/1 Running 0 5s
helloworld-7c6785877d-5w67z 1/1 Running 0 6s
helloworld-7c6785877d-9dwzh 1/1 Running 0 6s
helloworld-7c6785877d-ch9fr 1/1 Running 0 6s
helloworld-7c6785877d-pp8g9 0/1 ContainerCreating 0 4s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
helloworld-7c6785877d-27n2l 1/1 Running 0 10s
helloworld-7c6785877d-5w67z 1/1 Running 0 11s
helloworld-7c6785877d-9dwzh 1/1 Running 0 11s
helloworld-7c6785877d-ch9fr 1/1 Running 0 11s
helloworld-7c6785877d-pp8g9 1/1 Running 0 9s
デプロイメントの履歴の確認
kubectl rollout history
コマンドを使用して、helloworld
デプロイメントの履歴を確認できます。
$ kubectl rollout history deploy/helloworld
deployment.apps/helloworld
REVISION CHANGE-CAUSE
1 <none>
2 <none>
このコマンドにより、デプロイメントのリビジョンの履歴と各リビジョンで発生した変更が表示されます。
デプロイメントのロールバックの実行
helloworld
デプロイメントを以前のリビジョンにロールバックする必要がある場合は、kubectl rollout undo
コマンドを使用できます。
$ kubectl rollout undo deploy/helloworld
deployment.apps/helloworld rolled back
このコマンドは、最後のデプロイメントを元に戻します。この場合、hello-app
コンテナのイメージを以前のバージョンに戻します。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
helloworld-75db9fdfbc-4bqbv 1/1 Running 0 2s
helloworld-75db9fdfbc-58z5v 1/1 Running 0 2s
helloworld-75db9fdfbc-6sn7j 0/1 Pending 0 1s
helloworld-75db9fdfbc-8gcd6 0/1 ContainerCreating 0 2s
helloworld-75db9fdfbc-zwq44 0/1 Pending 0 1s
helloworld-7c6785877d-5w67z 1/1 Terminating 0 89s
helloworld-7c6785877d-9dwzh 1/1 Terminating 0 89s
helloworld-7c6785877d-ch9fr 1/1 Running 0 89s
helloworld-7c6785877d-pp8g9 1/1 Running 0 87s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
helloworld-75db9fdfbc-4bqbv 1/1 Running 0 9s
helloworld-75db9fdfbc-58z5v 1/1 Running 0 9s
helloworld-75db9fdfbc-6sn7j 1/1 Running 0 8s
helloworld-75db9fdfbc-8gcd6 1/1 Running 0 9s
helloworld-75db9fdfbc-zwq44 1/1 Running 0 8s
デプロイメントのクリーンアップ
デプロイメントでの全ての操作と実験が完了した後は、作成されたリソースをクリーンアップすることが良いプラクティスです。これにより、システムが整理された状態に保たれます。
helloworld
デプロイメントを削除するには、kubectl delete
コマンドを使用します。
$ kubectl delete deploy helloworld
このコマンドにより、Kubernetesクラスタからデプロイメントと関連する全てのリソースが削除され、未使用のリソースが残らないようになります。