Traffine I/O

日本語

2022-06-22

Kubernetesのデプロイメント

Kubernetesのデプロイメントとは

デプロイメントは、ユーザーが一連のレプリカPodを管理するための仕組みです。各デプロイメントに対して新しいReplicaSetの作成を処理する更新モデルを表しています。同時に、古いReplicaSetの古いPodをスケールダウンし、新しいReplicaSetの新しいPodをスケールアップします。この段階的な移行により、スムーズで効率的な更新プロセスが実現されます。

デプロイメントは、新しいPodの作成、既存のPodの更新、またはアプリケーションの要件に応じてスケールアップやスケールダウンする場合に非常に便利です。さらに、Kubernetesのデプロイメントは、前のデプロイメントにロールバックする機能も提供しており、アプリケーションの管理において強力なシステムとなっています。

Kubernetesでのデプロイメントの作成

Kubernetesでのデプロイメントの作成を行います。

Minikubeの起動

デプロイメントを始める前に、Minikubeが実行されていることを確認する必要があります。次のコマンドでMinikubeを起動します。

bash
$ minikube start

Podのデプロイメントの開始

次に、kubectl create deploymentコマンドを使用してデプロイメントを作成します。この場合、helloworldというサンプルアプリケーションをデプロイします。

--imageフラグは、このデプロイメントでのPod作成に使用するDockerイメージを指定するために使用されます。以下がコマンドです。

bash
$ kubectl create deployment --image gcr.io/google-samples/hello-app:1.0 helloworld

deployment.apps/helloworld created

このコマンドにより、Kubernetesは指定したイメージをコンテナレジストリから取得し、アプリケーションの単一のインスタンスであるPodを開始します。

デプロイメントの一覧表示

デプロイメントが作成されたら、kubectl get deploymentコマンドを使用して現在のコンテキストで実行中の全てのデプロイメントを一覧表示できます。以下がコマンドです。

bash
$ kubectl get deployment

NAME         READY   UP-TO-DATE   AVAILABLE   AGE
helloworld   1/1     1            1           2m35s

このコマンドは、新しく作成したhelloworldデプロイメントを含む全てのデプロイメントのリストを表示します。

デプロイメントのスケールアップ

Kubernetesでは、デプロイメントを簡単にスケールアップまたはスケールダウンすることができます。これは、トラフィックの急増やオフピーク時のリソース使用量の削減に非常に役立ちます。

helloworldデプロイメント内のPodの数を5に増やしてみます。kubectl scaleコマンドを使用してこれを実現できます。

bash
$ kubectl scale --replicas=5 deploy/helloworld

このコマンドは、helloworldPodの5つのレプリカを指定しています。Kubernetesはその後、追加のPodをスケジュールして開始し、helloworld Podの総数を5に増やします。再度kubectl get deploymentコマンドを使用して確認できます。

bash
$ kubectl get deployment

NAME         READY   UP-TO-DATE   AVAILABLE   AGE
helloworld   5/5     5            5           2m35s

デプロイメントへのローリングアップデートの実装

Kubernetesのデプロイメントにローリングアップデートを実装する方法を見てみます。ローリングアップデートは、新しいPodインスタンスで徐々にPodを更新することにより、デプロイメントのアップデートをゼロダウンタイムで行うことができます。

今、5つのhelloworld Podがあります。

bash
$ 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デプロイメントのイメージを変更してみます。

bash
$ kubectl set image deploy/helloworld hello-app=gcr.io/google-samples/hello-app:2.0

このコマンドは、helloworld Podのhello-appコンテナのイメージをバージョン2.0に更新します。Kubernetesは新しいReplicaSetを作成し、新しいレプリカの数を増やす一方、古いレプリカの数を減らします。

bash
$ 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デプロイメントの履歴を確認できます。

bash
$ kubectl rollout history deploy/helloworld

deployment.apps/helloworld
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

このコマンドにより、デプロイメントのリビジョンの履歴と各リビジョンで発生した変更が表示されます。

デプロイメントのロールバックの実行

helloworldデプロイメントを以前のリビジョンにロールバックする必要がある場合は、kubectl rollout undoコマンドを使用できます。

bash
$ kubectl rollout undo deploy/helloworld

deployment.apps/helloworld rolled back

このコマンドは、最後のデプロイメントを元に戻します。この場合、hello-appコンテナのイメージを以前のバージョンに戻します。

bash
$ 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コマンドを使用します。

bash
$ kubectl delete deploy helloworld

このコマンドにより、Kubernetesクラスタからデプロイメントと関連する全てのリソースが削除され、未使用のリソースが残らないようになります。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!