본문 바로가기
IT 잡지식/DevOps

[CKA] KodeKloud - Rolling Updates and Rollbacks

by 쯀리♥️ 2024. 7. 1.

안녕하세요, 쯀리입니다.

오늘은 Application Lifecycle에서 Rolling Updates and Rollbacks에 관해 알아보는 시간을 가져보겠습니다.
Kubernetes에서 Rolling Update를 빼먹을순 없죠. 핵심 개념에 대해 알아보겠습니다. 

https://kubernetes.io/docs/tutorials/kubernetes-basics/update/update-intro/

 

Performing a Rolling Update

Perform a rolling update using kubectl.

kubernetes.io

 

 

 


 

Rolling Updates and Rollbacks

Rolling Updates (무중단 배)

Rolling Updates는 애플리케이션의 새로운 버전을 점진적으로 배포하여, 서비스의 가용성을 유지하면서 새로운 버전으로 전환하는 방법입니다. 운영중인 Pod를 순차적으로 교체하는 방식

주요 특징

  • 중단 없는 배포: 애플리케이션의 새로운 버전을 배포하면서, 기존 버전의 인스턴스 일부만 교체합니다. 모든 인스턴스를 한 번에 교체하지 않기 때문에, 서비스 중단 없이 배포가 가능합니다.
  • 점진적 배포: 새로운 버전의 인스턴스를 하나씩 추가하고, 기존 버전의 인스턴스를 하나씩 제거하는 방식으로 점진적으로 배포가 진행됩니다

 

Rollbacks

Rollbacks는 문제가 발생했을 때 애플리케이션을 이전 버전으로 되돌리는 기능입니다. 배포 중 오류가 발생하거나 버그가 발견되었을 때 유용합니다.

주요 특징

  • 빠른 복구: 새로운 버전 배포 중 문제가 발생하면 즉시 이전 버전으로 되돌릴 수 있습니다.
  • 버전 관리: 쿠버네티스는 배포 이력을 관리하기 때문에, 특정 버전으로 쉽게 롤백할 수 있습니다.

Quiz

1. We have deployed a simple web application. Inspect the PODs and the Services
Wait for the application to fully deploy and view the application using the link called Webapp Portal above your terminal.

controlplane ~ ➜  k get pods
NAME                       READY   STATUS    RESTARTS   AGE
frontend-f8d68f98f-9zsbk   1/1     Running   0          43s
frontend-f8d68f98f-dsvgk   1/1     Running   0          43s
frontend-f8d68f98f-p7gf4   1/1     Running   0          43s
frontend-f8d68f98f-6ts77   1/1     Running   0          43s

 

2. What is the current color of the web application?
Access the Webapp Portal.

Blue - 파랑색이네요!

3. Run the script named curl-test.sh to send multiple requests to test the web application. Take a note of the output.
Execute the script at /root/curl-test.sh.

for i in {1..35}; do
   kubectl exec --namespace=kube-public curl -- sh -c 'test=`wget -qO- -T 2  http://webapp-service.default.svc.cluster.local:8080/info 2>&1` && echo "$test OK" || echo "Failed"';
   echo ""
done

sh의 의미를 파악해보겠습니다.

이 스크립트는 1부터 35까지의 숫자를 반복하면서 아래의 작업을 수행합니다:

  1. kubectl exec 명령어를 사용하여 kube-public 네임스페이스에 있는 curl이라는 이름의 파드 내에서 명령어를 실행합니다.
  2. sh -c 옵션을 사용하여 셸 명령어를 실행합니다.
  3. wget 명령어를 사용하여 http://webapp-service.default.svc.cluster.local:8080/info URL에 HTTP 요청을 보냅니다.
  4. HTTP 요청이 성공하면, 응답 내용을 출력하고 "OK"라고 덧붙입니다.
  5. HTTP 요청이 실패하면 "Failed"라고 출력합니다.
  6. 각 요청 후 빈 줄을 출력합니다.
controlplane ~ ➜  ./curl-test.sh 
Hello, Application Version: v1 ; Color: blue OK
...

E0701 14:21:13.089690    9403 websocket.go:296] Unknown stream id 1, discarding message
Hello, Application Version: v1 ; Color: blue OK
....

 

4. Inspect the deployment and identify the number of PODs deployed by it.
해당 deployment를 확인해보고 replica가 몇개인지 확인해보겠습니다.

controlplane ~ ➜  k describe deploy frontend
Name:                   frontend
Namespace:              default
CreationTimestamp:      Mon, 01 Jul 2024 14:16:23 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               name=webapp
Replicas:               4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        20

답: 4

5. What container image is used to deploy the applications?

controlplane ~ ➜  k describe deploy frontend | grep Image
    Image:         kodekloud/webapp-color:v1

kodekloud/webapp-color:v1

6. Inspect the deployment and identify the current strategy.

controlplane ~ ➜  k describe deploy frontend | grep Strategy
StrategyType:           RollingUpdate
RollingUpdateStrategy:  25% max unavailable, 25% max surge

Rolling Update방식으로 되어있네요

7. If you were to upgrade the application now what would happen?
Rolling Update방식은 하나씩 작업하는 방식으로 
Pods are updated few at a time 이 정답!

8. Let us try that. Upgrade the application by setting the image on the deployment to kodekloud/webapp-color:v2
Do not delete and re-create the deployment. Only set the new image name for the existing deployment.

controlplane ~ ➜  k edit deploy frontend
### Image를 수정해주겠습니다. 
deployment.apps/frontend edited

controlplane ~ ➜  k get pods
NAME                        READY   STATUS        RESTARTS   AGE
frontend-f8d68f98f-9zsbk    1/1     Running       0          15m
frontend-f8d68f98f-p7gf4    1/1     Running       0          15m
frontend-f8d68f98f-6ts77    1/1     Running       0          15m
frontend-f8d68f98f-dsvgk    1/1     Terminating   0          15m
frontend-69b69fcc6d-cpwfq   1/1     Running       0          18s
frontend-69b69fcc6d-jjtzf   1/1     Running       0          17s'


controlplane ~ ➜  k get pods
NAME                        READY   STATUS    RESTARTS   AGE
frontend-69b69fcc6d-cpwfq   1/1     Running   0          97s
frontend-69b69fcc6d-jjtzf   1/1     Running   0          96s
frontend-69b69fcc6d-t9nk5   1/1     Running   0          74s
frontend-69b69fcc6d-z9dhm   1/1     Running   0          74s

 

하나씩 천천히 Terminating하며 자동으로 새로 올리는 것을 확인해 볼 수 있습니다.

9. Run the script curl-test.sh again. Notice the requests now hit both the old and newer versions. However none of them fail. Execute the script at /root/curl-test.sh.

sh을 실행해보겠습니다.

controlplane ~ ➜  ./curl-test.sh 
Hello, Application Version: v2 ; Color: green OK
Hello, Application Version: v2 ; Color: green OK

....

 

10. Up to how many PODs can be down for upgrade at a time? Consider the current strategy settings and number of PODs - 4
Rolling Update는 하나씩 update되기때문에 정답은 1개입니다.

 

11. Change the deployment strategy to Recreate.
Delete and re-create the deployment if necessary. Only update the strategy type for the existing deployment.

controlplane ~ ➜  k edit deployment frontend
deployment.apps/frontend edited

controlplane ~ ➜  k describe deploy frontend
Name:               frontend
Namespace:          default
CreationTimestamp:  Mon, 01 Jul 2024 14:16:23 +0000
Labels:             <none>
Annotations:        deployment.kubernetes.io/revision: 2
Selector:           name=webapp
Replicas:           4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType:       Recreate
MinReadySeconds:    20
Pod Template:
  Labels:  name=webapp

 

12.Upgrade the application by setting the image on the deployment to kodekloud/webapp-color:v3
Do not delete and re-create the deployment. Only set the new image name for the existing deployment.

이미지를 변경했더니 Pods들을 한번에 모두 삭제하고 다시 올리는 것을 확인 할 수 있습니다. 

 
controlplane ~ ➜  k edit deployment frontend
deployment.apps/frontend edited

controlplane ~ ➜  k get pods
NAME                        READY   STATUS        RESTARTS   AGE
frontend-69b69fcc6d-z9dhm   1/1     Terminating   0          10m
frontend-69b69fcc6d-jjtzf   1/1     Terminating   0          10m
frontend-69b69fcc6d-t9nk5   1/1     Terminating   0          10m
frontend-69b69fcc6d-cpwfq   1/1     Terminating   0          10m


controlplane ~ ➜  k get pods
NAME                        READY   STATUS    RESTARTS   AGE
frontend-7f9fcb55d7-2d922   1/1     Running   0          25s
frontend-7f9fcb55d7-475pq   1/1     Running   0          25s
frontend-7f9fcb55d7-7fdc7   1/1     Running   0          25s
frontend-7f9fcb55d7-4799p   1/1     Running   0          25s
 

13. Run the script curl-test.sh again. Notice the failures. Wait for the new application to be ready. Notice that the requests now do not hit both the versions
Execute the script at /root/curl-test.sh.

새로운 버전으로 업데이트 된 것을 확인할 수 있습니다.

controlplane ~ ➜  ./curl-test.sh 
Hello, Application Version: v3 ; Color: red OK
Hello, Application Version: v3 ; Color: red OK
....

오늘은 Rolling Update와 Recreate 에 관해 어떤 특징을 가지고 있는지에 대해 알아보았습니다.
각 배포 방식을 어떻게 다르게 사용할 것인지는 환경에 따라서 다르겠습니다. 

K8s의 중심이라고 볼 수 있는 Strategy에 관해 알아보았는데요.
다음시간에는 Commands and Arguments에 관해 알아보겠습니다. 

 


참조

 Udemy Labs - Certified Kubernetes Administrator with Practice Tests