GKE (K8S)

이재홍·2022년 5월 22일
0

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에서 실행해준다.

  • kubectl get pod : 실행중인 pod 조회
  • kubectl get pod 파드이름 -o yaml : 파드의 야몰파일 조회(컨테이너 상태의 name 복사)
  • kubectl get deployment : 배포이름 조회
  • kubectl set image deployment/배포이름 배포된컨테이너(이미지)이름=컨테이너레지스트리의 최신버전 이미지 : GUI로 배포를 클릭하지 않아도 자동으로 재배포
  • kubectl logs 파드이름 -f : 파드의 로그조회(-f는 계속 조회)
  • kubectl rollout restart deployment/배포이름 : 배포 재시작

LB처럼 Ingress를 만들어서 https인증과 함께 도메인을 연결할 수 있다.
이때 헬스체커가 / 루트경로로 서버상태를 확인하므로 그래프큐엘을 썼을 경우에도 루트경로를 만들어주어야한다.

  • 쿠버네티스에서 롤링배포를 해주지만 도커 컨테이너가 생기고 서버가 실행되기까지의 시간동안 접속이 안될 수 있기에 yaml파일에서 추가설정을 해준다.
 spec:
 	minReadySeconds: 100

옵션을 추가해줘서 롤링배포시 새로운컨테이너가 동작하고있더라도 기존의 컨테이너를 바로 다운시키지않고 100초간 유지시킨후 종료시킨다.

0개의 댓글