본문 바로가기

Infra/Google Cloud

[Google Cloud] Google Study Jam : Managing Deployments Using Kubernetes Engine (1)

728x90
반응형
본 포스트는 2024년 Google Study Jam을 공부하면서 개인적으로 내용을 정리한 포스트 입니다.

 

 

Cloud Shell에 다음명령어를 입력해서 기본 세팅을 한다.

gcloud config set compute/zone ZONE

gsutil -m cp -r gs://spls/gsp053/orchestrate-with-kubernetes .
cd orchestrate-with-kubernetes/kubernetes

gcloud container clusters create bootcamp \
  --machine-type e2-small \
  --num-nodes 3 \
  --scopes "https://www.googleapis.com/auth/projecthosting,storage-rw"

 

Deployments Using Kubernetes Engine - Task 1. Learn about the deployment object

kubectlexplain 커맨드는 배포 관련 객체를 알려준다.

kubectl explain deployment

 

--recursive 옵션을 사용하는 경우 모든 필드를 볼 수 있다.

kubectl explain deployment --recursive

 

kubectl explain deployment.metadata.name

 

Deployments Using Kubernetes Engine - Task 2. Create a deployment

 

deployments/auth.yaml을 vi로 업데이트 한다.

vi deployments/auth.yaml

# Change
...
containers:
- name: auth
  image: "kelseyhightower/auth:1.0.0"
...

# :wq

cat deployments/auth.yaml

 

수정된 yaml 파일로 배포 객체를 만든다.

kubectl create -f deployments/auth.yaml

 

만들어진 배포를 확인

kubectl get deployments

 

배포를 위한 ReplicaSet을 생성하고 확인

kubectl get replicasets

kubectl get pods

 

인증 서비스 생성

kubectl create -f services/auth.yaml

 

hello 배포 객체, 서비스 생성

kubectl create -f deployments/hello.yaml
kubectl create -f services/hello.yaml

 

fronted 배포 및 확인

kubectl create secret generic tls-certs --from-file tls/
kubectl create configmap nginx-frontend-conf --from-file=nginx/frontend.conf
kubectl create -f deployments/frontend.yaml
kubectl create -f services/frontend.yaml

kubectl get services frontend

curl -ks https://<EXTERNAL-IP>

curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`

 

 

스케일링을 위해 spec.replicas 필드를 업데이트한다.

다음 명령을 사용해 필드에 대한 설명을 확인한다.

kubectl explain deployment.spec.replicas

 

replicas 필드는 다음 커맨드로 쉽게 업데이트 할 수 있다.

kubectl scale deployment hello --replicas=5

 

현재 Pod가 확장되었는지 확인(5개)

kubectl get pods | grep hello- | wc -l

 

3개로 축소

kubectl scale deployment hello --replicas=3

 

축소 되었는지 확인

kubectl get pods | grep hello- | wc -l

 

 

Deployments Using Kubernetes Engine - Task 3. Rolling update

Deploy는 Rolling Update 메커니즘을 통해 이미지를 새 버전으로 업데이트하는 것을 지원한다.

배포가 새 버전으로 업데이트되면 새 버전을 만들고 이전 버전의 ReplicaSet 복제본을 줄이는 동시에 새 ReplicaSet 복제본을 천천히 늘린다.

 

배포 업데이트

kubectl edit deployment hello

# image 배포의 컨테이너 섹션에서 다음을 변경한다.
...
containers:
  image: kelseyhightower/hello:2.0.0
...

저장 후 종료

 

업데이트된 배포는 클러스터에 저장되고 Kubernetes는 Rolling Update를 시작한다.

kubectl get replicaset # 새로 Pod을 늘리는것을 확인

kubectl rollout history deployment/hello # 새 항목 확인

 

Rollout을 일시 중지하려면 다음을 실행한다.

kubectl rollout pause deployment/hello

 

 

확인

kubectl rollout status deployment/hello

 

pod에서 직접 확인

kubectl get pods -o jsonpath --template='{range .items[*]}{.metadata.name}{"\t"}{"\t"}{.spec.containers[0].image}{"\n"}{end}'

 

 

Rolling Update를 재개하려면 다음 명령을 실행한다.

kubectl rollout resume deployment/hello

 

완료되면 다음 명령을 실행하여 상태를 확인

kubectl rollout status deployment/hello

 

 

Roll back Update를 위해 다음 명령어를 실행한다.

(Rolling Update를 한 새버전이 버그가 감지 되었을 때)

kubectl rollout undo deployment/hello # 배포 취소

kubectl rollout history deployment/hello # rollback 확인

# Pod가 이전 버전으로 롤백 되었는지 확인
kubectl get pods -o jsonpath --template='{range .items[*]}{.metadata.name}{"\t"}{"\t"}{.spec.containers[0].image}{"\n"}{end}'

 

 

Deployments Using Kubernetes Engine - Task 4. Canary deployments

Canary 배포는 새 버전과 일반적이고 안정적인 배포와 카나리아 배포를 모두 대상으로 하는 서비스를 별도로 배포하는 것으로 구성된다.

 

새 버전에 대한 카나리아 배포를 만든다.

cat deployments/hello-canary.yaml # yaml 확인

kubectl create -f deployments/hello-canary.yaml # 확인

kubectl get deployments # 배포 확인

 

생성된 카나리아 배포를 확인

curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version

이 요청을 여러번 실행 시 일부 요청이 hello 1.0.0에서 처리되고 소수의 요청이 2.0.0에서 처리되는 것을 볼 수 있다.

 

 

Deployments Using Kubernetes Engine - Task 5. Blue-green deployments

 

Rolling Update는 최소한의 오버헤드, 최소한의 성능 영향, 최소한의 다운 타임으로 애플리케이션을 천천히 배포할 수 있기 때문에 이상적이다. 완전히 배포된 후에만 로드 밸런서를 수정하여 새 버전을 가리키도록 하는것이 유익한 경우가 있다.

 

이 경우 Blue-green 배포가 최선의 방법이다.

Blue-green 배포는 두 개의 별도 배포를 생성한다. "블루" 버전은 기존 배포를 사용한다. "그린"버전은 새로운 배포이다.

배포는 라우터 역할을 하는 서비스를 통해 액세스되고 "그린"버전이 가동되면 서비스를 업데이트하여 해당 버전을 사용하도록 전환한다.

 

서비스 업데이트(이 기능의 경우 자동으로 패치되므로 Warring은 무시)

kubectl apply -f services/hello-blue.yaml

 

Green 배포 만들기

kubectl create -f deployments/hello-green.yaml

 

현재 버전이 계속 사용되고 있는지 확인

curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version

 

서비스를 업데이트해서 새 버전(Green)을 가리키도록 한다.

kubectl apply -f services/hello-green.yaml

 

서비스가 업데이트되면 Green 배포가 즉시 사용된다.

curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version

 

Roll back의 경우 "Blue 배포"가 계속 실행되는 동안 서비스를 이전 버전으로 업데이트하기만 하면된다.

kubectl apply -f services/hello-blue.yaml

 

서비스를 업데이트하면 롤백이 성공적으로 완료된다.

curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version

728x90
반응형