Docker, nginx,FastAPI를 사용한 로드 밸런싱(load balancing)

LST·2023년 8월 28일
0

Docker, nginx 를 사용하여 FastAPI 앱 로드 밸런싱 구현

목표 : 80번 포트로 접근하면 리버스프록시를 사용하여 8000번 포트와 8001번 포트의 앱을 번갈아가며 연결한다.

로드 밸런싱

부하분산 또는 로드 밸런싱(load balancing)은 컴퓨터 네트워크 기술의 일종으로 둘 혹은 셋이상의 중앙처리장치 혹은 저장장치와 같은 컴퓨터 자원들에게 작업을 나누는 것을 의미한다.

즉 여러 서버가 트래픽을 나눠 처리하는 것이다. 따라서 실제 로드 밸런싱을 해보려면 서버 여러대를 사용해야 하지만 비용문제도 있고 간단하게 구현해보기 위해 하나의 서버처럼 작동하는 컨테이너를 사용하여 로드 밸런싱을 구현했다. 실제로 로드 밸런싱을 한다고 하면 하나의 서버에서 굳이 자원을 나눠서 로드 밸런싱을 하는 의미가 없다고 생각한다.

파일 구조

load_balancing
├── Dockerfile
├── main.py
├── docker-compose.yml
├── requirements.txt
└── nginx
    └── Dockerfile
    └── default.conf

main.py

docker-compose 파일에서 환경변수를 사용하여 두 가지 버전을 나타내기 위해 getenv를 사용하였다.

@app.get("/")
def root():
    return {"version": os.getenv("VERSION")}

Dockerfile

requirements.txt 파일은 프로젝트에서 사용한 라이브러리 목록을 저장한 파일이다. 만드는 방법은 간단하니 구글링ㄱㄱ

FROM python:3.10

WORKDIR /code

COPY ./requirements.txt /code/requirements.txt

RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

Docker-compose.yml

  • 두 가지 버전의 앱을 구분하기 위해 + 이후에 동일한 파일로 무중단 배포를 구현하기 위해 environment를 통해 환경변수를 설정.
  • fastapi 앱은 기본값으로 8000번 포트로 실행하고 두 앱이 각각 다른 컨테이너에서 실행되기 때문에 둘다 8000번 포트로 실행해도 상관없지만 쉽게 구분하기 위해 하나는 기본값으로 하나는 8001번으로 열어준다.
  • 외부에서 80번 포트를 제외하고 다른 포트로는 접근 못하게 하기 위해 fastapi 에는 port 설정을 하지 않는다.
version: '3.7'
services:
  fastapi:
    build:
      context: .
      dockerfile: Dockerfile
    command: uvicorn main:app --host 0.0.0.0
    volumes:
      - ./:/code
    environment:
      - VERSION=old version
  fastapi2:
    build:
      context: .
      dockerfile: Dockerfile
    command: uvicorn main:app --host 0.0.0.0 --port=8001
    volumes:
      - ./:/code
    environment:
      - VERSION=new version
  nginx:
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 80:80
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

nginx/dockerfile

nginx 이미지를 베이스 이미지로 사용하고 작성한 설정파일을 복사한다.

FROM nginx
COPY ./default.conf /etc/nginx/conf.d/default.conf

nginx/default.conf

upstream에 있는 fastapi, fastapi2 는 docker-compose 파일에서 작성한 서비스 이름이다. nginx에서는 upstream을 사용해 로드 밸런싱 대상 서버를 지정할 수 있다(고 한다). 기본적으로 round-robin 알고리즘이고 다양한 알고리즘을 사용할 수 있다.

upstream backend {
	// 여기에 알고리즘 추가
    server fastapi:8000;
    server fastapi2:8001;
}
server {
    listen 80;

    location / {
        proxy_pass http://backend;
    }
}

실행

docker-compose up --build -d

위 명령어를 통해 docker-compose를 실행하면 3개의 컨테이너가 뜬다.

localhost:80 에 처음 접속하면 old veersion 이 출력된다

그리고 새로고침을 통해 한번 더 접속하면 new version 이 출력된다

이후 새로고침 할때마다 version이 바뀌면서 출력된다.
또한 localhost의 8000번이나 8001번 포트는 연결이 안된다.

0개의 댓글

관련 채용 정보