FastAPI는 Python 기반의 웹 프레임워크로, API 개발을 빠르고 효율적으로 할 수 있도록 설계되었다. 성능이 뛰어나고, 타입 힌트를 적극적으로 활용하여 코드의 안정성과 가독성을 높일 수 있다.
rest api 프레임워크를 fastapi로 선택한 후 필요한 일을 정의한다. 여기서는 빠른 구축에 필요한 디버깅용 이미지 생성에 목적을 둔다. 보안, 성능을 위해 release 버전은 구제척으로 항목들이 조정되어야 한다. 예를 들어 user를 root에서 일반 사용자로 조정한다. 또한 상황에 따라 프레임워크 변경도 생각해 볼 수 있다. Spring Boot나 Poem Open API 서버 등 많은 선택지가 있다.
작업 폴더를 하나 생성하고 이동한다. main.py 파일을 생성하고 가장 간단한 소스를 작성한다. main.py테스트를 컨테이너로 빌드하기 전에 로컬에서 테스트 가능하도록 구성한다. 여기서는 Ubuntu 기준으로 구성하였다.
mkdir backend
cd backend
vi main.py
main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def base():
return {"message": "Hello, FastAPI!"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "query": q}
사용할 이미지가 python:3.11-alpine 이므로 로컬 테스트 시 사용할 파이썬 버전을 맞추어 주어야 한다.
sudo apt update
sudo apt-get update
sudo apt install python3-pip
sudo apt install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11
sudo apt install python3.11-dev python3.11-venv python3.11-distutils python3.11-gdbm python3.11-tk python3.11-lib2to3
vagrant@slave1:~/fastapi$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.11 1
update-alternatives: using /usr/bin/python3.11 to provide /usr/bin/python (python) in auto mode
vagrant@slave1:~/fastapi$ python -V
Python 3.11.11
fastapi
uvicorn
vagrant@slave1:~/backend$ vi requirements.txt
vagrant@slave1:~/backend$ pip install -r requirements.txt
uvicorn은 관습이 main.py를 사용하니 조정해 준다.
python3 -m uvicorn main:app --reload &
vagrant@slave1:~/backend$ python3 -m uvicorn main:app --reload &
[1] 72908
vagrant@slave1:~/fastapi$ INFO: Will watch for changes in these directories: ['/home/vagrant/backend']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [72908] using WatchFiles
INFO: Started server process [72910]
INFO: Waiting for application startup.
INFO: Application startup complete.
vagrant@slave1:~/backend$ curl localhost:8000
INFO: 127.0.0.1:47360 - "GET / HTTP/1.1" 200 OK
{"message":"Hello, FastAPI!"}
브라우저 접속 하여 swagger화면을 확인할 수 있다.
Docerfile.backend-dev
FROM python:3.11-alpine
WORKDIR /app
USER root
RUN apk update && \
apk add --no-cache curl vim bash
COPY ./requirements.txt /app
RUN pip install -r requirements.txt
COPY ./main.py /app
EXPOSE 5000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5000"]
sudo docker build . -t backend:0.1 -f Docerfile.backend-dev
vagrant@slave1:~/backend$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
backend 0.1 14d9241593bd 23 hours ago 123MB
vagrant@slave1:~/backend$ sudo docker run -p 5000:5000 backend:0.1
INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit)
vagrant@slave1:~/bff$ curl localhost:5000/
{"message":"Hello, FastAPI!"}
dockerhub 나 pivate 도커 이미지 저장소로 이미지를 PUSH한다.
sudo docker tag backend:0.1 chojeonghak/backend:0.1
sudo docker push chojeonghak/backend:0.1
backend.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
selector:
matchLabels:
app: backend
replicas: 1
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend
image: chojeonghak/backend:0.1
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: backend
labels:
app: backend
spec:
ports:
- port: 5000
protocol: TCP
selector:
app: backend
type: ClusterIP
vagrant@slave1:~/backend$ vi backend.yml
vagrant@slave1:~/backend$ k apply -f backend.yml
deployment.apps/backend created
service/backend created
편의상 노드 포트가 사용하였다. 노드 아이피에 서비스 아이피 확인한 후 브라우저에서 swagger ui 확인이 가능하다.
vagrant@slave1:~/backend$ k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d
backend NodePort 10.105.125.216 <none> 5000:31217/TCP 5m7s
