29일 노션
local : 내 컴퓨터에서만 접근할 수 있는 localhost
dev : 프론트 + 백 합쳐서 테스트 가능한 환경 , 실제 환경에서 테스트하며 개발 가능
prod : 개발 완성한 다음 실제로 서비스를 배포하고 운영하는 환경.
stage : ver1이 배포되고 서비스가 운영중일 때, prod환경과 동일하게 stage환경을 만들고 배포, 실서비스 수준으로 배포함.
Dockerfile
docker-compose.yaml
파일을 각각 환경에 맞게 만들어 준다.
GCP인스턴스는 구글에서 하나의 컴퓨터를 빌려 그 컴퓨터에 서버를 배포 - 그 안에 도커 컨테이너로 백엔드 서버와 DB를 띄우는것.
인스턴스만들기
GCP 콘솔 > 프로젝트 선택 > Compute Engine > VM인스턴스 > 인스턴스 만들기
인스턴스에 도커 설치
만들어진 인스턴스 컴퓨터의 터미널 접속 > 도커 설치 > 도커에 사용자 추가 > 깃클론으로 파일 다운 > .env 파일 만들기
방화벽 열어주기
GCP콘솔에서 VPC네트워크 > 방화벽 > 방화벽 규칙 만들기 > 이름/태그 동일하게, 소스IP범위는 0.0.0./0(누구나 접속 가능), tcp 3000 포트 > VM인스턴스 > 인스턴스 수정 > 네트워크 태그 부분에 태그 붙여서 저장 > http://ip주소:3000/graphql 접속
SQL > 만들기 > MYSQL 선택 > SQL 인스턴스 생성 후 nest서버와 연결 위해 연결 메뉴 선택
VPC피어링
연결메뉴 > 비공개 IP 선택 > 네트워크 default > 연결설정 - API 사용 설정 - 자동으로 할당된 IP 범위 사용 > 저장 > 데이터베이스 - 데이터베이스 만들기 > 이름:myproject
접속 테스트
SQL 개요 > 비공개 IP주소 복사 후 app.module.ts의 typeorm 모듈 호스트 변경
도메인과 백엔드 서버 연결
GCP > 네트워크 서비스 > Cloud DNS > API 사용 > 영역 만들기 > DNS이름을 구매한 도메인 이름과 일치하게 지정 > 도메인 구입곳으로 이동 후 네임서버 변경 > 소유자 인증 > GCP 콘솔에서 dig 도메인이름 NS
로 변경 확인 > Cloud DNS화면 > 레코드 세트 추가 > VM인스턴스의 외부 IP주소 복사 > 레코드 모음 만들기에서 A레코드 유형 선택 후 IPv4 주소 입력, 만들기 > dig 도메인이름 A
> http://도메인:3000/graphql 접속
30일 노션
Compute Engine > 인스턴스 그룹 > 비관리형 인스턴스 그룹 선택 > 네트워크 defult, 인스턴스 추가에 아까 만든 인스턴스 선택 > 만들기
로드밸런서(HTTP)
네트워크 서비스 > 부하분산 만들기 > HTTP(S)부하 분산 구성 시작 > 로드밸런스 기준 외부 트래픽이 프론트엔드, 내보내주는 곳이 백엔드 > 프론트엔드 구성 클릭 > IP 주소: 임시, IP주소 만들기 : 이름 만들고 완성 > 백엔드 구성 클릭 > 백엔드 서비스 만들기 > 인스턴스 그룹에서 만든 인스턴스 선택 > 포트 3000-브라우저에서 주소만 적어서 접속해도됨- > 상태 확인 > 생성 > 포트 3000 > 만들기 > 로드밸런서 이름 적고 만들기 > 1of1 뜨면 정상 > http://로드밸런서IP주소/graphql 접속 > 도메인 주소 접속 위해 DNS A레코드 변경 > 네트워크 서비스 > Cloud DNS > A 레코드 수정 > 로드밸런서 IP 주소 변경 후 저장 > http://도메인:3000/graphql 접속
로드밸런서(HTTPS)
GCP 콘솔 > 네트워크 서비스 > 부하분산 만들기 > HTTP(S)부하 분산 구성 시작 > 백엔드 구성 기존에 만든 서비스 선택 > 프론트엔드 구성 클릭 > 프로토콜 HTTPS선택 > 고정 IP 주소 만들어둔것 선택 -기존 HTTP로드밸런서 IP 주소와 같게- > 인증서 만들기 > 구글 관리 인증서 만들기 > 구매한 도메인 주소 입력 > 만들기 > 완료 > 부하분산기 이름 적고 만들기 클릭 > 만들어진 로드 밸런서에서 프런트엔드 인증서 클릭 시 인증서 상태가 PROVISIONING 에서 ACTIVE로 변경되면 > https://도메인:3000/graphql 접속
http리다이렉트
http로 요청해도 https로 리다이렉트 되도록 설정
네트워크 서비스 > 부하분산 > http로드밸런서 선택 > 수정 > 호스트 및 경로 규칙 클릭 > 고급호스트 및 경로 규칙, 다른 호스트/경로로 클라이언트 리디렉션, 프리픽스 리디렉션, HTTPS리디렉션 사용설정(안될때 이거 빼기) > 업데이트 > http://도메인:3000/graphql 접속시 https 로 리다이렉트 되는지 확인
31일 노션
쿠버네티스는 컨테이너 운영을 자동화하기 위한 도구. 컨테이너 오케스트레이션 도구라 하며, 많은 수의 컨테이너를 협조적으로 연동시키기 위한 통합 시스템이며 이 컨테이너를 다루기 위한 API 및 명령행 도구등이 함께 제공. 컨테이너 이용한 애플리케이션 배포 외에 다양한 운영 관리 업무 자동화 가능 - 도커 호스트 관리, 서버 리소스 여유 고려한 컨테이너 배치, 스케일링, 여러 개의 컨테이너 그룹에 대한 로드밸런싱, 헬스 체크 등 -
쿠버네티스의 리소스란 애플리케이션을 구성하는 부품과 같은 것으로 노드, 네임스페이스, 파드 등
클러스터 쿠버네티스의 여러 리소스를 관리하기 위한 집합체. 가장 큰 개념은 노드, 클러스터의 관리 대상으로 등록된 도커 호스트로 도커 컨테이너가 배치되는 대상. 쿠버네티스 클러스터 전체를 관리하는 서버인 마스터가 적어도 하나 이상 있어야 함.
마스터노드 쿠버네티스 클러스터 전체를 컨트롤하는 역할, API서버, 스케줄러, 컨드롤러 매니저, etcd 등
Example
쿠버네티스는 클러스터 안에 가상 클러스터를 또 만들 수 있음. 클러스터 안의 가상 클러스터를 네임스페이스라 함. 클러스터를 처음 구축하면, default, docker, kube-public, kube-system 의 네임스페이스가 이미 만들어져 있음. 전체 클러스터에서 리소스 구분 용도라고 생각하면 됨.
컨테이너가 모인 집합체의 단위, 적어도 하나 이상의 컨테이너-도커 컨테이너-로 이루어짐. 쿠버네티스를 도커와 함께 사용한다면 파드는 컨테이너 하나 혹은 컨테이너의 집합체
쿠버네티스에서는 결합이 강한 컨테이너를 파드로 묶어 일괄 배포
한 팟 안의 컨테이너는 모두 같은 노드에 배치. 즉, 팟 하나가 여러 노드에 걸쳐 배치될 수 없음
쿠버네티스 - 로드밸런서
쿠버네티스를 통해 부화 분산 역할을 진행할 수 있음. 두가지의 차이점은 실행 환경.
쿠버네티스는 클러스터라는 큰 컴퓨터 안에서 도커 컨테이너가 실행되기 때문에 가상컴퓨터를 실행하지 않아도 분산 가능.
도커 이미지를 저장하고 배포하는 표준 방법. 리포지토리에 저장된 도커 이미지의 엑세스 제어 및 보안 개선에 도움이 됨. 이미지 배포를 관리하고 애플리케이션 개발 워크플로와 통합할 수 있음.
gcloud를 설치해 구글클라우드 컨테이너 레지스트리에 이미지를 push할것.
Google Container Registry > yaml파일 수정 image: [지역]/[프로젝트 ID]/[디렉토리명]:버전
> 프로젝트 docker compose -f docker-compose.prod.yaml build > docker compose -f docker-compose.prod.yaml push > container registry에 이미지 업로드 확인
Kubernetes Engine > 클러스터 > 만들기 > GKE Autopilot으로 구성 -쿠버네티스가 파드 개수 조절- 옵션 없이 클러스터 구성해 만들기
클러스터 배포 버튼 클릭 > 기존 컨테이너 이미지 클릭 후 이미지 경로 선택 > .env 파일의 환경변수 모두 작성 > 어플리케이션 이름 변경 후 배포 > 상태 OK 확인
만든 클러스터 내부로 이동 > 작업부하 > 배포 > 이미지경로 mysql:latest, 환경변수 mysql_password, mysql명 작성 후 배포
LB Service로 http 공개
작업부하 > deployment선택 - 백엔드 > 노출 > 포트 매핑 > 부하분산기 선택 > 외부 엔드포인트 생성
작업부하 > deployment선택 - 데이터베이스 > 노출 > 포트 3306 3306 구성, 클러스터 IP 선택 > app.module.ts 파일의 호스트를 클러스터 IP로 수정 후 태그 변경해서 push
클러스터 > 연결버튼 클릭 > CLOUD SHELL에서 실행
버튼 클릭 > 엔터로 접속 > kubectl get pod > kubectl get deployment > kubectl set image deployment/[실행중인 deployment 명] [배포된 image name]=[cotainer registry에 등록된 image]
입력시 다시 배포하지 않아도 자동으로 재배포 가능 > kubectl get pod 조회해 pending에서 running 될때까지 기다림 > kubectl logs 실행중인 deployment 명 으로 확인
31일 노션
여러 서비스들 앞에서 스마트라우터 역할을 하거나 클러스터의 진입점 역할을 함. 기본 GKE Ingress 컨트롤러는 HTTP(S) 로드 밸런서를 만들어줌. 이것은 백엔드 서비스로 경로와 서브도메인 기반 라우팅을 모두 지원함.
Secure Socket Layer : 인터넷을 통해 전달되는 정보 보안의 안전한 거래를 하기 위해 넷스케이프사에서 개발한 인터넷 통신 규약 프로토콜
Transport Layer Security : SSL3.0을 기초로 IETF가 만든 프로토콜로 SSL3.0보다 안전하고 프로토콜의 스펙을 더 정확하고 안정성을 높임
kubernetes engine > 서비스 및 수신 > 외부 부하 분산기 체크 후 인그레스 만들기 > 인그레스 이름 적고 HTTP(S) 부하분산기 선택 > Host and path rules 구성 > frontend configuration 프로토콜을 https 로 변경 후 인증서 제작 > 구글 인증서로 create > 만들기 > 해당 IP 주소로 접속이 가능하면 성공✨ > 인증서 ACTIVATE 상태에서 SSL인증을 위해 DNS와 인그레스 연결 > A 레코드를 인그레스의 IP 주소로 수정 > https로 접속된것을 확인
Cloud SQL 로 배포한 부분과 Kubernetes 백엔드 pod 연동 > Cloud SQL 에서 비공개 IP 주소 복사 > app.module.ts 수정 - 컨트롤러, 프로바이더 주석처리 해제 - > 버전 업 > 도커 빌드, 푸시 > 클라우드 쉘에서 실행 후 kubectl set image deployment/[실행중인 deployment 명] [배포된 image name]=[cotainer registry에 등록된 image]
입력해서 자동으로 재배포 > db였던 파드 삭제