本記事はKubernetesを使ってFastAPIをデプロイし、ブラウザから確認ができるようになることを目的としました。
Kubernetesのpodで動かすコンテナイメージを準備します。
今回は既に作ってある簡単なFastAPIサーバで動くコンテナを下記に用意しました。
yusekita/sample-fastapi:latest
本記事ではローカルにMinikubeを使っていくので、
Minikubeの環境が揃っていることが前提となります。
まずはコンテナを動作させる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は複数の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のタイプについては今回は外部との接続を図るため、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