안녕하세요, 쯀리입니다.
오늘은 Application Lifecycle에서 Rolling Updates and Rollbacks에 관해 알아보는 시간을 가져보겠습니다.
Kubernetes에서 Rolling Update를 빼먹을순 없죠. 핵심 개념에 대해 알아보겠습니다.
https://kubernetes.io/docs/tutorials/kubernetes-basics/update/update-intro/
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까지의 숫자를 반복하면서 아래의 작업을 수행합니다:
- kubectl exec 명령어를 사용하여 kube-public 네임스페이스에 있는 curl이라는 이름의 파드 내에서 명령어를 실행합니다.
- sh -c 옵션을 사용하여 셸 명령어를 실행합니다.
- wget 명령어를 사용하여 http://webapp-service.default.svc.cluster.local:8080/info URL에 HTTP 요청을 보냅니다.
- HTTP 요청이 성공하면, 응답 내용을 출력하고 "OK"라고 덧붙입니다.
- HTTP 요청이 실패하면 "Failed"라고 출력합니다.
- 각 요청 후 빈 줄을 출력합니다.
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
'IT 잡지식 > DevOps' 카테고리의 다른 글
[CKA] KodeKloud - Env Variables (0) | 2024.07.02 |
---|---|
[CKA] KodeKloud - Commands and Arguments (0) | 2024.07.02 |
[CKA] KodeKloud - Managing Application Logs (0) | 2024.06.25 |
[CKA] KodeKloud - Monitor Cluster Components (0) | 2024.06.23 |
[CKA] KodeKloud - Multiple Schedulers (0) | 2024.06.23 |