본 포스트는 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
kubectl의 explain 커맨드는 배포 관련 객체를 알려준다.
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