GCP에서 쿠버네티스를 이용하여 자동으로 무중단배포와 서버컴퓨터 관리를 맡길 수 있다.
쿠버네티스는 클러스터>노드>파드로 구성된다.
가상컴퓨터(인스턴스)를 생성하여 부하를 분산하는 로드밸런서(LB)와 다르게 쿠버네티스는 도커 컨테이너를 이미지로 실행하며 부하를 분산하기에 속도면에서 더 빠르다.
GCP에서 제공하는 쿠버네티스서비스를 이용하기 위해선
Google Cloud SDK를 설치 후 계정에 연결, Container(Docker) Registry에 빌드된 docker image를 push하여 버전을 관리하고, 클러스터 생성 후 image를 배포한다.
version: '3.3'
services:
my_backend:
platform: linux/x86_64 # m1에서 빌드할 경우 호환 안되어 플랫폼 설정
image: asia.gcr.io/codecamp-341008/my_backend:1.0 # 코드 수정시 버전을 올린뒤 재배포해주어야 한다.
build:
context: .
dockerfile: Dockerfile
ports:
- 3000:3000
FROM node:14 # 16버전은 호환이 안되어 낮춤
WORKDIR /my_backend/
COPY ./package.json /my_backend/
COPY ./yarn.lock /my_backend/
RUN yarn install
COPY . /my_backend/
RUN yarn build # 배포환경은 watch하지 않고 빌드한 뒤 dist폴더로 실행시킨다.
CMD yarn start:prod
클러스터를 GKE Autopilot(노드 자동 조절)모드로 지역은 asia-northeast3로 생성해준다.
클러스터에서 배포를 클릭한뒤
기존 컨테이너 이미지에서 해당 버전을 선택한다.
.env파일로 관리하던 환경변수를 쿠버네티스는 배포할때 환경변수를 넣어주므로 직접 입력해준다.
버전을 올리거나할 때 이전 환경변수는 그대로 들어가 있기에 추가된 환경변수만 넣어주면된다.
배포환경이므로 playground나 synchronize등은 모두 false로 해준다.
(배포환경에서는 마이그레이션 및 백은 프론트에서만 접속가능하게 해준다)
클러스터가 이미 생성되어있으므로 새클러스터 만들기가 아닌 배포를 눌러주어 파드를 생성해준다.
mysql의 경우 이미지가 도커허브에 있으므로 이미지경로를 mysql:latest등으로 설정
필요한 환경변수(docker-compose.yaml 파일의 environment로 설정해주었던값)을 입력해준다.
배포가되면 노출을 시켜주어야 하는데
이때 백엔드 서버는 서비스 유형을 부하분산기로하여 외부 접속을 받게하고,
mysql의 경우 서비스유형을 클러스터IP로 한뒤 서비스이름으로 클러스터 내에서 접속가능하게 해줄 수 있다.
하지만 mysql의 경우 cloud sql을 이용하는 것이 더 안정성이 높다. (mydatabase등의 이름으로 서브도메인으로 dns연결까지 해주면 좋음)
쿠버네티스 명령어(쿠버네티스 컨트롤) - 한컴퓨터를 관리하는것이 아니기때문에 쿠버네티스를 cloud shell에서 실행해준다.
LB처럼 Ingress를 만들어서 https인증과 함께 도메인을 연결할 수 있다.
이때 헬스체커가 / 루트경로로 서버상태를 확인하므로 그래프큐엘을 썼을 경우에도 루트경로를 만들어주어야한다.
spec:
minReadySeconds: 100
옵션을 추가해줘서 롤링배포시 새로운컨테이너가 동작하고있더라도 기존의 컨테이너를 바로 다운시키지않고 100초간 유지시킨후 종료시킨다.