배포 복습

한결·2022년 2월 26일
0

Study

목록 보기
8/13

29일 노션

배포환경의 4단계

local : 내 컴퓨터에서만 접근할 수 있는 localhost

dev : 프론트 + 백 합쳐서 테스트 가능한 환경 , 실제 환경에서 테스트하며 개발 가능

prod : 개발 완성한 다음 실제로 서비스를 배포하고 운영하는 환경. 

stage : ver1이 배포되고 서비스가 운영중일 때, prod환경과 동일하게 stage환경을 만들고 배포, 실서비스 수준으로 배포함.

Dockerfile
docker-compose.yaml
파일을 각각 환경에 맞게 만들어 준다.

GCP 인스턴스 배포

GCP인스턴스는 구글에서 하나의 컴퓨터를 빌려 그 컴퓨터에 서버를 배포 - 그 안에 도커 컨테이너로 백엔드 서버와 DB를 띄우는것.

인스턴스만들기
GCP 콘솔 > 프로젝트 선택 > Compute Engine > VM인스턴스 > 인스턴스 만들기

인스턴스에 도커 설치
만들어진 인스턴스 컴퓨터의 터미널 접속 > 도커 설치 > 도커에 사용자 추가 > 깃클론으로 파일 다운 > .env 파일 만들기

방화벽 열어주기
GCP콘솔에서 VPC네트워크 > 방화벽 > 방화벽 규칙 만들기 > 이름/태그 동일하게, 소스IP범위는 0.0.0./0(누구나 접속 가능), tcp 3000 포트 > VM인스턴스 > 인스턴스 수정 > 네트워크 태그 부분에 태그 붙여서 저장 > http://ip주소:3000/graphql 접속

MYSQL 클라우드 SQL 배포

SQL > 만들기 > MYSQL 선택 > SQL 인스턴스 생성 후 nest서버와 연결 위해 연결 메뉴 선택

VPC피어링
연결메뉴 > 비공개 IP 선택 > 네트워크 default > 연결설정 - API 사용 설정 - 자동으로 할당된 IP 범위 사용 > 저장 > 데이터베이스 - 데이터베이스 만들기 > 이름:myproject

접속 테스트
SQL 개요 > 비공개 IP주소 복사 후 app.module.ts의 typeorm 모듈 호스트 변경

DNS연결

도메인과 백엔드 서버 연결
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일 노션

Kubernetes

쿠버네티스는 컨테이너 운영을 자동화하기 위한 도구. 컨테이너 오케스트레이션 도구라 하며, 많은 수의 컨테이너를 협조적으로 연동시키기 위한 통합 시스템이며 이 컨테이너를 다루기 위한 API 및 명령행 도구등이 함께 제공. 컨테이너 이용한 애플리케이션 배포 외에 다양한 운영 관리 업무 자동화 가능 - 도커 호스트 관리, 서버 리소스 여유 고려한 컨테이너 배치, 스케일링, 여러 개의 컨테이너 그룹에 대한 로드밸런싱, 헬스 체크 등 -
쿠버네티스의 리소스란 애플리케이션을 구성하는 부품과 같은 것으로 노드, 네임스페이스, 파드 등
클러스터 쿠버네티스의 여러 리소스를 관리하기 위한 집합체. 가장 큰 개념은 노드, 클러스터의 관리 대상으로 등록된 도커 호스트로 도커 컨테이너가 배치되는 대상. 쿠버네티스 클러스터 전체를 관리하는 서버인 마스터가 적어도 하나 이상 있어야 함.

노드 & 마스터노드

마스터노드 쿠버네티스 클러스터 전체를 컨트롤하는 역할, API서버, 스케줄러, 컨드롤러 매니저, etcd 등

  • API 서버(명령, 통신 관련) : 모든 명령과 통신을 API 통해서 함. 모든 기능 REST API 로 제공, 그에 따른 명령 처리
  • Etec(정보 저장) : 클러스터의 데이터베이스 역할, 서버로 설정값이나 클러스터의 상태 저장. 분산형 Key/Value형식, 오픈소스, 빠른 응답과 신뢰성등의 장점
  • 스케줄러(리소스들 할당할지 선정) : 파드나 서비스들을 적절한 노드에 저장하게 정리해주는 역할
  • 컨트롤러 매니저(RC, SC, VC, NC 관리) : Replica controller, Service controller, Volume Controller, Node controller를 생성하고 각 노드에 배포하여 관리
    노드 마스터노드에 의해 주어진 명령어를 받고 실제 워크로드에 생성하여 서비스하는 컴포넌트, Kubelet, kube-proxy, cAdvisor 와  컨테이너 런타임으로 구성
  • Kubelet(통신) : 노드에 배포되는 에이전트, 마스터의 API 서버와 통신하면서 노드가 수행해야 할 명령을 받아 수행, 반대로 노드의 상태 등을 마스터로 전달
  • Kube-proxy(노드 안에 트래픽 정리) : 노드로 들어오는 네트워크 트래픽을 적절한 컨테이너로 라우팅, 로드밸런싱등을 노드로 들어오고 나가는 네트워크 트래픽을 프록시함. 노드와 마스터간의 네트워크 통신 관리
  • container runtime : 파드 통해 배포된 컨테이너 실행. 컨테이너 런타임은 보통 도커컨테이너를 생각
  • cAdvisor(모니터링) : 각 노드에서 기동되는 모니터링 에이전트, 노드 내에서 가동되는 컨테이너들의 상태와 성능등에 정보를 수집해 마스터에게 전달

Example

Namespace

쿠버네티스는 클러스터 안에 가상 클러스터를 또 만들 수 있음. 클러스터 안의 가상 클러스터를 네임스페이스라 함. 클러스터를 처음 구축하면, default, docker, kube-public, kube-system 의 네임스페이스가 이미 만들어져 있음. 전체 클러스터에서 리소스 구분 용도라고 생각하면 됨.

Pod

컨테이너가 모인 집합체의 단위, 적어도 하나 이상의 컨테이너-도커 컨테이너-로 이루어짐. 쿠버네티스를 도커와 함께 사용한다면 파드는 컨테이너 하나 혹은 컨테이너의 집합체
쿠버네티스에서는 결합이 강한 컨테이너를 파드로 묶어 일괄 배포

한 팟 안의 컨테이너는 모두 같은 노드에 배치. 즉, 팟 하나가 여러 노드에 걸쳐 배치될 수 없음


쿠버네티스 - 로드밸런서
쿠버네티스를 통해 부화 분산 역할을 진행할 수 있음. 두가지의 차이점은 실행 환경.
쿠버네티스는 클러스터라는 큰 컴퓨터 안에서 도커 컨테이너가 실행되기 때문에 가상컴퓨터를 실행하지 않아도 분산 가능.

docker registry

도커 이미지를 저장하고 배포하는 표준 방법. 리포지토리에 저장된 도커 이미지의 엑세스 제어 및 보안 개선에 도움이 됨. 이미지 배포를 관리하고 애플리케이션 개발 워크플로와 통합할 수 있음.
gcloud를 설치해 구글클라우드 컨테이너 레지스트리에 이미지를 push할것.

Kubernetes Distribute

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 database pod 배포

만든 클러스터 내부로 이동 > 작업부하 > 배포 > 이미지경로 mysql:latest, 환경변수 mysql_password, mysql명 작성 후 배포

publishing a service

LB Service로 http 공개
작업부하 > deployment선택 - 백엔드 > 노출 > 포트 매핑 > 부하분산기 선택 > 외부 엔드포인트 생성
작업부하 > deployment선택 - 데이터베이스 > 노출 > 포트 3306 3306 구성, 클러스터 IP 선택 > app.module.ts 파일의 호스트를 클러스터 IP로 수정 후 태그 변경해서 push

connected to kubernetes cluster

클러스터 > 연결버튼 클릭 > 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일 노션

kubernetes ingress ssl authentication

Ingress

여러 서비스들 앞에서 스마트라우터 역할을 하거나 클러스터의 진입점 역할을 함. 기본 GKE Ingress 컨트롤러는 HTTP(S) 로드 밸런서를 만들어줌. 이것은 백엔드 서비스로 경로와 서브도메인 기반 라우팅을 모두 지원함.

SSL & TLS

Secure Socket Layer : 인터넷을 통해 전달되는 정보 보안의 안전한 거래를 하기 위해 넷스케이프사에서 개발한 인터넷 통신 규약 프로토콜
Transport Layer Security : SSL3.0을 기초로 IETF가 만든 프로토콜로 SSL3.0보다 안전하고 프로토콜의 스펙을 더 정확하고 안정성을 높임

LB Servicedp Ingress 등록해 http 공개

kubernetes engine > 서비스 및 수신 > 외부 부하 분산기 체크 후 인그레스 만들기 > 인그레스 이름 적고 HTTP(S) 부하분산기 선택 > Host and path rules 구성 > frontend configuration 프로토콜을 https 로 변경 후 인증서 제작 > 구글 인증서로 create > 만들기 > 해당 IP 주소로 접속이 가능하면 성공✨ > 인증서 ACTIVATE 상태에서 SSL인증을 위해 DNS와 인그레스 연결 > A 레코드를 인그레스의 IP 주소로 수정 > https로 접속된것을 확인

Detach Kubernetes DB

Cloud SQL 로 배포한 부분과 Kubernetes 백엔드 pod 연동 > Cloud SQL 에서 비공개 IP 주소 복사 > app.module.ts 수정 - 컨트롤러, 프로바이더 주석처리 해제 - > 버전 업 > 도커 빌드, 푸시 > 클라우드 쉘에서 실행 후 kubectl set image deployment/[실행중인 deployment 명] [배포된 image name]=[cotainer registry에 등록된 image]입력해서 자동으로 재배포 > db였던 파드 삭제

0개의 댓글