たねやつの木

Photographs, Keyboards and Programming

【Kubernetesを学ぶ:5日目】FastAPIアプリケーションをKubernetesにデプロイする

こんにちは、たねやつです。

前回、Deploymentというリソースを使えば、自己修復やスケーリングが可能なアプリケーションを定義できることを学びました。 今回は、その知識を実践に移します。Dockerを学ぶで作成し、コンテナ化したFastAPIアプリケーションを、実際にローカルのKubernetesクラスタにデプロイしてみましょう。

前の記事

www.taneyats.com

この記事でできること

  • Dockerイメージをコンテナレジストリにプッシュできるようになる。
  • Deploymentマニフェストを記述し、自作アプリケーションをKubernetesにデプロイできる。
  • kubectlコマンドを使って、デプロイが成功したことを確認できる。

デプロイまでの流れ

Kubernetesにアプリケーションをデプロイするための基本的な流れは以下の通りです。

  1. アプリケーションをコンテナイメージ化する: Dockerfileを書き、docker buildでイメージを作成します。(Dockerを学ぶで完了)
  2. コンテナイメージをレジストリにプッシュする: Kubernetesクラスタがイメージを取得できるように、ビルドしたイメージをDocker HubやGitLab Container Registryなどのコンテナレジストリにアップロード(プッシュ)します。
  3. マニフェストファイルを作成する: アプリケーションをDeploymentとして定義するYAMLファイルを作成します。
  4. マニフェストをクラスタに適用する: 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から参照できるイメージの準備ができました。

Minikubeには、ローカルのDockerデーモンが持つイメージを直接使えるようにする`minikube image load`という便利なコマンドもあります。今回は、より本番に近い流れを体験するためにレジストリを使います。

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 deploymentREADY2/2になっていること、get podsで2つのPodがRunning状態になっていることが確認できれば、デプロイは成功です!

kubectl describe deployment fastapi-deploymentを実行すれば、イメージのプルやPodの作成といった一連のイベントの流れを追うこともできます。

最後に

今回は、自作のアプリケーションイメージをコンテナレジストリに登録し、それをKubernetes上にDeploymentとしてデプロイする、という一連の流れを体験しました。 しかし、現状ではまだPodはクラスタの内部に閉じており、外部からアクセスすることができません。

次回は、クラスタの外部にいる私たちがAPIにアクセスできるようにするための「窓口」の役割を果たす、Serviceリソースについて学びます。

次の記事

www.taneyats.com