1) 最小APIコード(3ファイル)
dev-portal-k8s/ の直下に以下を作成してください。
api/app/main.py
from fastapi import FastAPI
app = FastAPI(title="Dev Portal Backend", version="0.0.1")
@app.get("/fields/health")
async def health():
return {"status": "ok"}
api/requirements.txt
fastapi==0.115.0
uvicorn[standard]==0.30.6
api/Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY api/requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r /app/requirements.txt
COPY api/app /app/app
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
参考:ディレクトリは
dev-portal-k8s/api/...になる想定です。
2) コンテナをビルドして minikube にロード
# dev-portal-k8s/ から
docker build -t dev-portal-api:v0 .
minikube image load dev-portal-api:v0
3) K8s マニフェスト(Deployment / Service / Ingress)
以下3つのファイルを このまま 作成してください。
k8s/dev/api-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dev-portal-api
namespace: dev
spec:
replicas: 1
selector:
matchLabels:
app: dev-portal-api
template:
metadata:
labels:
app: dev-portal-api
spec:
containers:
- name: api
image: dev-portal-api:v0
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8000
readinessProbe:
httpGet:
path: /fields/health
port: http
initialDelaySeconds: 3
periodSeconds: 5
livenessProbe:
httpGet:
path: /fields/health
port: http
initialDelaySeconds: 5
periodSeconds: 10
k8s/dev/api-service.yaml
apiVersion: v1
kind: Service
metadata:
name: dev-portal-api
namespace: dev
spec:
selector:
app: dev-portal-api
ports:
- name: http
port: 8000
targetPort: 8000
type: ClusterIP
k8s/dev/ingress-api.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dev-portal-api
namespace: dev
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: api.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: dev-portal-api
port:
number: 8000
事前に
minikube addons enable ingressと/etc/hostsの127.0.0.1 api.local設定を済ませてください(済ならOK)。
4) 適用&確認(dev-portal-k8s/ から)
# 既に作ってある ns を流用
kubectl -n dev apply -f k8s/dev/api-deployment.yaml
kubectl -n dev apply -f k8s/dev/api-service.yaml
kubectl -n dev apply -f k8s/dev/ingress-api.yaml
# 起動確認
kubectl -n dev rollout status deploy/dev-portal-api --timeout=120s
kubectl -n dev get pods,svc,ingress
# 動作確認(Ingress 経由)
curl -s http://api.local/fields/health
# → {"status":"ok"} が返ればOK(ブラウザで http://api.local/docs はこの段階では未提供)
5) 片付け(必要なら)
kubectl -n dev delete -f k8s/dev/ingress-api.yaml --ignore-not-found
kubectl -n dev delete -f k8s/dev/api-service.yaml --ignore-not-found
kubectl -n dev delete -f k8s/dev/api-deployment.yaml --ignore-not-found
ここまで通れば Milestone 3 完了です。
コメントを残す