こんにちは、たねやつです。
前回、Deploymentというリソースを使えば、自己修復やスケーリングが可能なアプリケーションを定義できることを学びました。
今回は、その知識を実践に移します。Dockerを学ぶで作成し、コンテナ化したFastAPIアプリケーションを、実際にローカルのKubernetesクラスタにデプロイしてみましょう。
- 前の記事
- この記事でできること
- デプロイまでの流れ
- 1. コンテナイメージをレジストリにプッシュする
- 2. Deploymentマニフェストの作成
- 3. マニフェストをクラスタに適用する
- 4. デプロイの確認
- 最後に
- 次の記事
前の記事
この記事でできること
- Dockerイメージをコンテナレジストリにプッシュできるようになる。
Deploymentマニフェストを記述し、自作アプリケーションをKubernetesにデプロイできる。kubectlコマンドを使って、デプロイが成功したことを確認できる。
デプロイまでの流れ
Kubernetesにアプリケーションをデプロイするための基本的な流れは以下の通りです。
- アプリケーションをコンテナイメージ化する:
Dockerfileを書き、docker buildでイメージを作成します。(Dockerを学ぶで完了) - コンテナイメージをレジストリにプッシュする: Kubernetesクラスタがイメージを取得できるように、ビルドしたイメージをDocker HubやGitLab Container Registryなどのコンテナレジストリにアップロード(プッシュ)します。
- マニフェストファイルを作成する: アプリケーションを
Deploymentとして定義するYAMLファイルを作成します。 - マニフェストをクラスタに適用する:
kubectl applyコマンドでマニフェストを適用し、デプロイを実行します。
1. コンテナイメージをレジストリにプッシュする
ローカルでビルドしたDockerイメージは、そのPC上でしか使えません。Kubernetesクラスタ(たとえローカルのMinikubeでも)がそのイメージを利用できるようにするには、共有リポジトリであるコンテナレジストリにアップロードする必要があります。
ここでは、GitLabのプロジェクトに紐付いたGitLab Container Registryを使用する例で進めます。
1-1. イメージに適切な名前(タグ)を付ける
レジストリにプッシュするには、イメージ名をレジストリの場所/プロジェクトパス/イメージ名:タグという形式にする必要があります。
docker tagコマンドで、既存のイメージに新しい別名を付けます。
# docker tag <元のイメージ名> <新しいイメージ名> docker tag fastapi-handson-app registry.gitlab.com/あなたのGitLabユーザー名/プロジェクト名/fastapi-handson-app:v1.0
1-2. GitLabにログイン
docker loginコマンドで、GitLab Container Registryにログインします。パスワードの代わりに、GitLabで発行したアクセストークンを使うのが安全で推奨されます。
docker login registry.gitlab.com # Username: あなたのGitLabユーザー名 # Password: アクセストークンを入力
1-3. イメージをプッシュ
docker pushコマンドで、タグを付けたイメージをレジストリにアップロードします。
docker push registry.gitlab.com/あなたのGitLabユーザー名/プロジェクト名/fastapi-app:v1.0
これで、Kubernetesから参照できるイメージの準備ができました。
2. Deploymentマニフェストの作成
次に、このFastAPIアプリケーションをデプロイするためのdeployment.ymlを作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: fastapi-deployment
spec:
replicas: 2
selector:
matchLabels:
app: fastapi
template:
metadata:
labels:
app: fastapi
spec:
containers:
- name: fastapi-container
# ここに、先ほどプッシュしたイメージのパスを記述
image: registry.gitlab.com/あなたのGitLabユーザー名/プロジェクト名/fastapi-app:v1.0
ports:
- containerPort: 80
ポイント
spec.replicas: 2: 同じPodを2つ起動して、冗長性を持たせます。spec.template.spec.containers.image: ここに、先ほどGitLab Container Registryにプッシュした自分のイメージのパスを正確に記述します。
3. マニフェストをクラスタに適用する
いよいよデプロイです。kubectl applyコマンドを使って、作成したマニフェストをクラスタに適用します。
kubectl apply -f deployment.yml
deployment.apps/fastapi-deployment createdのようなメッセージが表示されれば成功です。
4. デプロイの確認
kubectlコマンドを使って、デプロイが正しく行われたか確認しましょう。
# Deploymentの状態を確認 kubectl get deployment fastapi-deployment # 作成されたPodの一覧を確認 (-lオプションでラベルを指定) kubectl get pods -l app=fastapi
get deploymentでREADYが2/2になっていること、get podsで2つのPodがRunning状態になっていることが確認できれば、デプロイは成功です!
kubectl describe deployment fastapi-deploymentを実行すれば、イメージのプルやPodの作成といった一連のイベントの流れを追うこともできます。
最後に
今回は、自作のアプリケーションイメージをコンテナレジストリに登録し、それをKubernetes上にDeploymentとしてデプロイする、という一連の流れを体験しました。
しかし、現状ではまだPodはクラスタの内部に閉じており、外部からアクセスすることができません。
次回は、クラスタの外部にいる私たちがAPIにアクセスできるようにするための「窓口」の役割を果たす、Serviceリソースについて学びます。