JOOHUUN
쿠버네티스(Kubernetes, k8s) | fastapi 앱 배포 본문
미니쿠베를 사용해서 로컬에서 fastapi 기반 앱을 배포하는 과정입니다. 미니쿠베, 도커 설치과정은 포함되어 있지 않습니다.
1. fastapi 기반 앱 이미지 빌드
먼저 미니쿠베환경에 도커이미지를 빌드 할 수 있도록 아래 명령어를 입력합니다.
eval $(minikube docker-env)
# app/main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello FastAPI"}
# requirements.txt
fastapi==0.100.0
uvicorn==0.22.0
# Dockerifle
FROM python:3.10
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app
EXPOSE 8080
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]
간단한 fastapi앱을 작성하고, 도커파일 작성 후 이미지로 빌드 합니다.
# 이미지 빌드
docker build -t myfastapi-app .
2. 쿠버네티스에 서비스 배포
- 이제 빌드한 이미지를 사용해서 미니쿠버 환경에서 실행하기 위한 deployment 와 service를 생성합니다.
1) 디플로이먼트(Deployment)
: 레플리카셋, 포드의 배포를 관리, 앱의 버전을 관리
# deployment-fastapi.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myfastapi-app
labels:
app: myfastapi-app
spec:
replicas: 1
selector:
matchLabels:
app: myfastapi-app
template:
metadata:
labels:
app: myfastapi-app
spec:
containers:
- name: myfastapi-app
image: myfastapi-app:latest
ports:
- containerPort: 8080
imagePullPolicy: IfNotPresent
디플로이먼트 생성
- pods와 replicaset이 함께 생성됩니다.
kubectl apply -f deployment-fastapi.yml
kubectl get deployment
2) 서비스(Service)
: 파드를 연결 하고 외부에 노출해서 사용자들이 접근 가능하게 하거나, 다른 디플로이먼트들과 접근 가능하게함
# service-fastapi.yml
apiVersion: v1
kind: Service
metadata:
name: myfastapi-app-svc
spec:
selector:
app: myfastapi-app
ports:
- protocol: "TCP"
port: 80
targetPort: 8080
type: LoadBalancer
서비스 생성
kubectl apply -f service.fastapi.yml
kubectl get service myfastapi-app-svc
<서비스포트80:노드포트32029> 로 매핑되어 생성되었습니다.
서비스 포트는 쿠버네티스 클로스터 내에서 듣고 있는 네트워크 포트를 의미 합니다. 쿠버네티스 클러스터 내에서는 이 서비스를 10.107.128.141:80으로 접근 할 수 있습니다.
노드 포트는, 이 서비스가 클러스터 외부에서 접근할 수 있도록 쿠버네티스 클로스터의 모든 노드에서 열리는 포트입니다. 외부에서는 노드IP:32029 로 이 서비스에 접근 할 수 있습니다.
서비스 접근
- 클러스터내의 리소스를 로컬에서 접근하기 위해 포트포워딩을 합니다.
kubectl port-forward service/myfastapi-app-svc 8080:80
http://localhost:8080 으로 접속 가능하게 됩니다.
Comments