Minikube上にFastAPIをデプロイしてみた

本記事はKubernetesを使ってFastAPIをデプロイし、ブラウザから確認ができるようになることを目的としました。

ソースコード

Docker

Kubernetesのpodで動かすコンテナイメージを準備します。

今回は既に作ってある簡単なFastAPIサーバで動くコンテナを下記に用意しました。 yusekita/sample-fastapi:latest

Minikube

本記事ではローカルにMinikubeを使っていくので、
Minikubeの環境が揃っていることが前提となります。

MacにMinikubeをインストールしてみた

Pod

まずはコンテナを動作させるPodのマニフェストファイルを用意していきます。

ファイル名はfastapi-bod.yamlです。

apiVersion: v1
kind: Pod
metadata:
  name: sample-fastapi-pod
spec:
  containers:
  - name: sample-fastapi-container
    image: yusekita/sample-fastapi

下記コマンドでデプロイ・確認ができます。

$ kubectl apply -f fastapi-bod.yaml
pod/sample-fastapi-pod created
$ kubectl get pods
NAME                 READY   STATUS    RESTARTS   AGE
sample-fastapi-pod   1/1     Running   0          22s

コンテナにログインしたい場合もdockerと同じような形で行えます。

$ kubectl exec -it sample-fastapi-pod /bin/bash
docker@sample-fastapi-pod:/server$

Deployment

Deploymentは複数のReplicaSetを管理します。
ReplicaSetはPodの数を維持するリソースです。

下記はpodを3つ維持するようにマニフェストファイルを作成しています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fastapi-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: fastapi-deployment
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: fastapi-deployment
    spec:
      containers:
      - image: yusekita/sample-fastapi:latest
        imagePullPolicy: Always
        name: sample-fastapi-container

デプロイ・確認していきます。

$ kubectl apply -f fastapi-deployment.yaml
deployment.apps/fastapi-deployment created
$ kubectl get deployments
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
fastapi-deployment   3/3     3            3           3m55s
$ kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
fastapi-deployment-69bf8bf696-6dwv7   1/1     Running   0          4m14s
fastapi-deployment-69bf8bf696-fz8sf   1/1     Running   0          4m14s
fastapi-deployment-69bf8bf696-x44n6   1/1     Running   0          4m14s

Service

Serviceのタイプについては今回は外部との接続を図るため、NodePortを設定します。

また、上記で作成したDeploymentに対してServiceを適用したいので、
selectorにfastapi-deploymentを指定します。

apiVersion: v1
kind: Service
metadata:
  name: fastapi-service
spec:
  type: NodePort
  ports:
  - name: http-port
    protocol: TCP
    port: 8000
    targetPort: 8000
    nodePort: 30000
  selector:
    app: fastapi-deployment

Serviceのデプロイ後、minikubeのipを取得し、ブラウザから確認してみます。

$ kubectl apply -f fastapi-service.yaml
service/fastapi-service created
$ minikube ip
XXX.XXX.XX.X
$ curl XXX.XXX.XX.X:30000
{"message":"Hello World"}

リソースの一括デプロイ

最後に今まで作成したDeploymentとServiceを一括でデプロイする方法を紹介します。

ディレクトリとファイル構成は以下のように配置します。
今回はmanifests配下にマニフェストファイルを配置します。

$ tree
.
├── Dockerfile
├── app
│   ├── Pipfile
│   ├── Pipfile.lock
│   └── main.py
└── manifests
    ├── fastapi-deployment.yaml
    └── fastapi-service.yaml

manifests配下のマニフェストファイル全てデプロイするには-fオプションにmanifestsを指定するだけになります。
また指定したディレクトリ以下を再起的に実行したい場合は-Rオプションを追加する必要があります。

$ kubectl apply -f ./manifests
$ kubectl apply -f ./manifests -R