[GCP] Node.js(NestJS) 클라우드 배포 : (5) Kubernetes - Cluster와 Deployment 생성하기
이번 포스팅에서는 오토 스케일링과 무중단 배포를 위해서, GCP 인스턴스를 쿠버네티스 클러스터를 사용해서 생성하고 관리하는 과정을 다루어 보려고 한다.
쿠버네티스에 관한 내용은 아래 포스팅에 남겨두었으니 참고하면 좋을 것 같다.
https://sjh9708.tistory.com/99
쿠버네티스 클러스터 생성하기
클러스터는 쿠버네티스가 관리하는 전체 시스템을 의미하며, 클러스터에는 여러 대의 서버, 가상 머신으로 구성된 노드들이 포함된다.
컴퓨팅 -> Kubernetes Engine을 클릭한 후 만들기를 클릭하여 생성 과정을 거쳐보자.
참고로 Kubernetes Cluster은 유지비용이 일반적인 VM 인스턴스보다 높다는 것을 참고하자.
사진에는 없지만, 만들기를 클릭하면 클러스터 모드를 선택하라고 나올 것이다.
- Standard : 쿠버네티스 셋팅을 본인이 직접 관리하는 방식
- Autopilot : 쿠버네티스 셋팅을 구글이 관리해주는 방식
필자처럼 DevOps를 다루는 기술이 미흡하다면 구글에게 관리를 맡기는 Autopilot 방식을 채택하는 것이 현명할 것이고, 팀 내에 유능한 DevOps 개발자가 있다면 Standard를 선택하여 직접 쿠버네티스 구성을 작성하고 관리하면 된다.
그래서 Autopilot을 선택하고 넘어갔다.
클러스터의 이름과 리전을 선택해주고 넘어가자.
네트워킹과 기타 설정은 차후에 할 수 있으므로 생략하였다.
생성된 클러스터를 확인해주자.
클러스터에 데이터베이스 작업 Deployment 생성하기
원래 일반적으로 쿠버네티스 클러스터에 데이터베이스를 배포할 때에는 많은 사항들을 고려해야 한다. 왜냐하면, 오토 스케일링을 통해 노드의 개수가 늘어나게 되면, 각각의 노드들, 즉 다른 컴퓨터에서 작동되는 컨테이너들이 다수가 생성될 텐데, 데이터베이스의 공유 리소스는 각각의 노드들이 공유할 수 있어야 하기 때문이다. 따라서, DevOps 개발자들의 역량이 필요하거나, GCP 측에서 제공하는 Cloud SQL을 사용하는 것이 일반적이다.
하지만 현재 포스팅에서는 단순히 데이터베이스 컨테이너를 만들어, Deployment를 생성해 보는 것을 다루어보겠다. 실무에서는 해당 과정만으로는 안 되고 상기 사항을 고려하도록 하자.
Kubernetes Engine -> 작업 부하 -> 배포를 들어가주자.
기존에 존재하는 컨테이너 이미지인 mariadb:latest를 사용할 것이므로, 기존 컨테이너 이미지를 선택하고,
환경 변수에 데이터베이스 Connection에 필요한 내용들을 채워주도록 하자.
배포 이름을 작성해주고, 클러스터는 방금 만들었던 클러스와 연결시켜주도록 하자.
YAML 보기를 클릭하면, GCP가 자동으로 생성해준 Kubernetes의 설정 파일 yaml 파일을 볼 수 있다.
Pod가 묶인 단위를 Deployment라고 부른다. 처음에는 비정상 상태이나, 시간이 지나면 초록색 불로 정상 상태로 전환되니, 이를 확인해보자.
실행중인 Pod / 총 Pod 수는 사용량이 작아지만 줄어들고, 많아지만 자동으로 늘어나게 된다.
클러스터에 Node.js(NestJS) 작업 배포하기
1. Container Registry에 Docker Image 등록하기
Docker Registry는 Docker 이미지를 저장하고 배포하는 표준 방법이다.
개발자는 고유한 Docker Registry를 설정하거나 Docker Hub, 클라우드 내의 Google Cloud 컨테이너 레지스트리 등과 같은 호스팅된 Docker Registry 서비스를 사용할 수 있으며, 이미지를 해당 Registry에 Push하거나 Pull 하면서 저장 및 사용할 수 있다.
우리는 이미지를 GCP Container Registry에 등록하여 사용해 보도록 하자.
Docker-compose 작성하기
▶ docker-compose.k8s.prod.yaml
version: "3.7" #Docker-compose 버전, 2버전과 3버전은 차이가 큼
services:
my-backend:
image: asia.gcr.io/cool-freehold-377205/my-backend-name:0.5 #레지스트리 리전/프로젝트ID/이름:버전, 버전은 반드시 배포할 때마다 바꿔서 해주어야 클라우드가 배포를 인식함
platform: linux/x86_64
build:
context: .
dockerfile: Dockerfile
NestJS 프로젝트를 컨테이너 빌드시키기 위해서 프로젝트가 위치한 로컬 컴퓨터에서 Docker-compose 파일을 작성하였다.
이 때 image에, 레지스트리 리전/프로젝트ID/컨테이너 이름:버전을 명시해주어야, GCP의 Conatiner Registry에 이미지를 등록할 수 있다. 그리고 배포 이후 버전이 바뀌지 않으면, 일련의 변경 이후 다시 배포하려고 하면 작동하지 않으므로, 배포 시 마다 버전을 바꾸어 주어야 한다.
GCP 인증하기
GCP Conatiner Registry를 사용하기 위해서 로컬 컴퓨터에서의 인증을 거쳐야 한다.
gcloud auth configure-docker
이미지 빌드 및 푸시
이미지를 빌드하고 push 명령어를 통해 Container Registry에 업로드시켜보자.
docker-compose -f docker-compose.k8s.prod.yaml build
docker-compose -f docker-compose.k8s.prod.yaml push
Container Registry 확인하기
GCP의 Container Registry를 찾아 확인해보면, 배포한 이미지가 있는 것을 확인해 볼 수 있다.
2. 클러스터에 NestJS 작업 Deployment 생성하기
마찬가지로 NestJS 프로젝트의 Deployment를 생성해보겠다. Kubernetes Engine -> 작업 부하 -> 배포를 들어가주자.
이번에는 Container Registry에 등록했던 이미지를 사용할 것이므로 기존 컨테이너 이미지 -> 컨테이너 이미지 선택을 클릭하여 방금 등록한 이미지를 선택해주자.
env 파일을 생성하는 것 대신, Deployment를 생성하는 과정에서 환경변수를 설정할 수 있다.
방금 배포해두었던 데이터베이스 Deployment의 Connection 정보를 담아주었다.
마찬가지로 위에서 만들었던 클러스터와 연결해주어 Deployment 생성을 마쳐주자.
이번 포스팅에서는 클러스터와 Deployment들을 생성하는 과정까지 마쳤으니, 다음 포스팅에서 클러스터 내부에 접속해보고, 네트워크 설정을 해보는 과정을 다루어보겠다.
'Cloud > GCP' 카테고리의 다른 글
[GCP] Node.js(NestJS) 클라우드 배포 : (7) Kubernetes Ingress HTTPS 적용과 도메인 연결 (0) | 2023.09.24 |
---|---|
[GCP] Node.js(NestJS) 클라우드 배포 : (6) Kubernetes - 명령어와 네트워크 설정 (0) | 2023.09.24 |
[GCP] Node.js(NestJS) 클라우드 배포 : (4) 로드밸런서와 HTTPS 적용 (0) | 2023.09.10 |
[GCP] Node.js(NestJS) 클라우드 배포 : (3) 도메인 연결 (0) | 2023.09.10 |
[GCP] Node.js(NestJS) 클라우드 배포 : (2) VM 인스턴스 데이터베이스로 Cloud SQL 이용하기 (0) | 2023.09.04 |