목차
- Build APP - Container image
- Deploy APP
- Check APP
- Expose APP
- Scale APP
- Update APP
Update APP
이 문서는 Rolling Update / Rollback APP 에 대한 방법을 포함하고 있습니다.
Update Source
아래와 같이 Source 를 UPDATE 가 되었습니다.
신규 Build 및 Image Push 는 build app flask
를 확인하여 진행합니다.
diff --git a/main.py b/main.py
index 2b9f022..9b347b4 100755
--- a/main.py
+++ b/main.py
@@ -8,7 +8,7 @@ podname = os.uname()[1]
@app.route("/")
def index():
- return " Container LAB | POD Working : " + podname + " | v=1\n"
+ return " Container LAB | POD Working : " + podname + " | v=2\n"
if __name__ == "__main__":
app.run(host="0.0.0.0", port="80")
시간 관계상 Push 된 이미지를 사용할 것입니다.
- Container Image Tag :
han0495/flask-example-app:v2
Rolling Update
아래 명령을 통해 기존에 v1
에서 v2
로 image 를 변경하여 Rolling Update 해보겠습니다.
- 기존 정보
$ kubectl describe deployments flask-example-app ... Pod Template: Labels: app=flask-example-app Containers: flask-example-app: Image: han0495/flask-example-app:v1 << Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none>
- Change image
$ kubectl set image deployments flask-example-app flask-example-app=han0495/flask-example-app:v2
- Rolling Update 상태 확인
- 상태 확인
$ kubectl rollout status deployments flask-example-app Waiting for deployment "flask-example-app" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "flask-example-app" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "flask-example-app" rollout to finish: 1 old replicas are pending termination... deployment "flask-example-app" successfully rolled out
- 실제 서비스 확인
$ while true; do curl 192.168.200.110:32296; done Container LAB | POD Working : flask-example-app-959c5f88d-k95wk | v=1 Container LAB | POD Working : flask-example-app-959c5f88d-b62j5 | v=1 Container LAB | POD Working : flask-example-app-677cbdd665-mhpqs | v=2 Container LAB | POD Working : flask-example-app-677cbdd665-wwmf8 | v=2 Container LAB | POD Working : flask-example-app-959c5f88d-b62j5 | v=1 Container LAB | POD Working : flask-example-app-677cbdd665-mhpqs | v=2 Container LAB | POD Working : flask-example-app-677cbdd665-wwmf8 | v=2 Container LAB | POD Working : flask-example-app-677cbdd665-mhpqs | v=2 Container LAB | POD Working : flask-example-app-959c5f88d-k95wk | v=1 ...
- 상태 확인
- 변경 확인
$ kubectl describe deployments flask-example-app Name: flask-example-app Namespace: default CreationTimestamp: Wed, 09 Sep 2020 15:37:59 +0900 Labels: app=flask-example-app Annotations: deployment.kubernetes.io/revision: 2 Selector: app=flask-example-app Replicas: 5 desired | 5 updated | 5 total | 5 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=flask-example-app Containers: flask-example-app: Image: han0495/flask-example-app:v2 <<< 변경됨 Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: flask-example-app-677cbdd665 (5/5 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 19m deployment-controller Scaled up replica set flask-example-app-959c5f88d to 5 Normal ScalingReplicaSet 3m31s deployment-controller Scaled up replica set flask-example-app-677cbdd665 to 2 Normal ScalingReplicaSet 3m31s deployment-controller Scaled down replica set flask-example-app-959c5f88d to 4 Normal ScalingReplicaSet 3m30s deployment-controller Scaled up replica set flask-example-app-677cbdd665 to 3 Normal ScalingReplicaSet 2m59s deployment-controller Scaled down replica set flask-example-app-959c5f88d to 3 Normal ScalingReplicaSet 2m58s deployment-controller Scaled up replica set flask-example-app-677cbdd665 to 4 Normal ScalingReplicaSet 2m56s deployment-controller Scaled down replica set flask-example-app-959c5f88d to 2 Normal ScalingReplicaSet 2m55s deployment-controller Scaled up replica set flask-example-app-677cbdd665 to 5 Normal ScalingReplicaSet 2m50s deployment-controller Scaled down replica set flask-example-app-959c5f88d to 1 Normal ScalingReplicaSet 2m3s deployment-controller Scaled down replica set flask-example-app-959c5f88d to 0
Rollback APP
Rollback 은 배포된 APP 에 문제가 있을 때, 다시 이전 이미지로 배포 해야 되는 경우 사용하는 방법입니다.
(꼭 문제가 있어야 사용이 가능한 것은 아님, 주 목적은 이전 버전으로 Rollback 하기 위함입니다.)
먼저 아래 명령어를 통해 Rolling Update 를 다시 진행합니다.
$ kubectl set image deployments flask-example-app flask-example-app=han0495/flask-example-app:v99
어떤 일이 발생될까요?
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
flask-example-app-677cbdd665-mhpqs 1/1 Running 0 8m33s
flask-example-app-677cbdd665-wwmf8 1/1 Running 0 8m33s
flask-example-app-677cbdd665-x95tn 1/1 Running 0 8m31s
flask-example-app-677cbdd665-754fq 1/1 Running 0 7m59s
flask-example-app-79f5875dcf-26pvs 0/1 ImagePullBackOff 0 38s
flask-example-app-79f5875dcf-thxmx 0/1 ImagePullBackOff 0 38s
flask-example-app-79f5875dcf-jmwpv 0/1 ErrImagePull 0 38s
Image 에 v99
라는 TAG 는 없으므로 ImagePull 에서 Error 가 발생되면서 서비스 배포가 정상적으로 진행이 안됩니다.
- Rollback 진행
- 현재 상태 확인
$ kubectl rollout history deployment flask-example-app deployment.apps/flask-example-app REVISION CHANGE-CAUSE 1 <none> 2 <none> 3 <none> < 현재 버전
- Rollback 진행
$ kubectl rollout undo deployment flask-example-app deployment.apps/flask-example-app rolled back
- Rollback 확인
$ kubectl describe deployments.apps flask-example-app Name: flask-example-app Namespace: default CreationTimestamp: Wed, 09 Sep 2020 15:37:59 +0900 Labels: app=flask-example-app Annotations: deployment.kubernetes.io/revision: 4 Selector: app=flask-example-app Replicas: 5 desired | 5 updated | 5 total | 5 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=flask-example-app Containers: flask-example-app: Image: han0495/flask-example-app:v2 << Port: <none> Host Port: <none>
- 현재 상태 확인
v1
로 돌아가기- Rollback 수행
$ kubectl rollout undo deployment flask-example-app --to-revision=1
- 서비스 확인
$ while true; do curl 192.168.200.110:32296; done Container LAB | POD Working : flask-example-app-959c5f88d-rjbqc | v=1 Container LAB | POD Working : flask-example-app-959c5f88d-sgrfk | v=1 Container LAB | POD Working : flask-example-app-959c5f88d-sgrfk | v=1 Container LAB | POD Working : flask-example-app-959c5f88d-rjbqc | v=1 Container LAB | POD Working : flask-example-app-677cbdd665-wwmf8 | v=2 << Container LAB | POD Working : flask-example-app-959c5f88d-sgrfk | v=1 Container LAB | POD Working : flask-example-app-677cbdd665-wwmf8 | v=2 << Container LAB | POD Working : flask-example-app-959c5f88d-rjbqc | v=1 Container LAB | POD Working : flask-example-app-959c5f88d-l7zjp | v=1 Container LAB | POD Working : flask-example-app-959c5f88d-sgrfk | v=1 Container LAB | POD Working : flask-example-app-959c5f88d-l7zjp | v=1
- Rollback 완료
$ kubectl describe deployments.apps flask-example-app Name: flask-example-app Namespace: default CreationTimestamp: Wed, 09 Sep 2020 15:37:59 +0900 Labels: app=flask-example-app Annotations: deployment.kubernetes.io/revision: 5 Selector: app=flask-example-app Replicas: 5 desired | 5 updated | 5 total | 5 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=flask-example-app Containers: flask-example-app: Image: han0495/flask-example-app:v1 Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none>
- Rollback 수행