Pause, Resume And Scale Kubernetes Deployments - Alibaba Cloud
Maybe your like
By Alwyn Botha, Alibaba Cloud Tech Share Author. Tech Share is Alibaba Cloud's incentive program to encourage the sharing of technical knowledge and best practices within the cloud community.
Pausing, resuming and scaling Deployments are very easy to understand.
We have several commands to show the status of these 3 actions. Unfortunately we will be using the same commands repeatedly so that you can see over time which commands work best for which specific need.
This tutorial consists of 1-2 sentences of descriptions followed by a command to run. Then follows one short snippet of comments and one more command and so on. Each of those steps must be done for the tutorial to work.
Kubectl Rollout Pause
Kubernetes enable you to pause a Deployment. You can then make adjustments to the Deployment and resume it.
Deployments do not need to be paused to make a change. Use pause to pause a Deployment so that you can calmly make several changes ( that are kept in a queue till resume is ordered ).
We start with one normal, working Deployment :
nano myDeployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: busybox-deployment labels: app: busybox spec: replicas: 10 strategy: type: RollingUpdate selector: matchLabels: app: busybox template: metadata: labels: app: busybox spec: containers: - name: busybox image: busybox imagePullPolicy: IfNotPresent command: ['sh', '-c', 'echo Container is Running ; sleep 3600'] terminationGracePeriodSeconds: 0Create the Deployment
kubectl create -f myDeployment.yaml deployment.apps/mydeployment createdJust 2 seconds later the Deployment is complete. ( busybox image already on server, starting such a simple container is very fast - 10 replicas started up simultaneously ... adding to the fast speed. )
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 10 10 10 0 2sCheck the rollout status:
kubectl rollout status deployment.v1.apps/busybox-deployment deployment "busybox-deployment" successfully rolled outDescribe the Deployment :
kubectl describe deployment.extensions/busybox-deployment Name: busybox-deployment CreationTimestamp: Sun, 20 Jan 2019 10:16:11 +0200 Labels: app=busybox Annotations: deployment.kubernetes.io/revision: 1 Selector: app=busybox Replicas: 10 desired | 10 updated | 10 total | 10 available | 0 unavailable StrategyType: RollingUpdate RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=busybox Containers: busybox: Image: busybox Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: busybox-deployment-5d6889b44 (10/10 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 26s deployment-controller Scaled up replica set busybox-deployment-5d6889b44 to 10The previous 3 commands showed a perfectly running 10 Pods Deployment.
Now we pause this Deployment and observe its status.
kubectl rollout pause deployment busybox-deployment deployment.extensions/busybox-deployment pausedget deploy does not actually show this Deployment as paused.
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 10 10 10 10 2m12skubectl rollout status does not actually show this Deployment as paused.
kubectl rollout status deployment.v1.apps/busybox-deployment deployment "busybox-deployment" successfully rolled outThis is a disappointment ... rollout status deployment does NOT show Deployment as being paused.
It shows ROLLOUT status, not DEPLOYMENT status.
Describe deployment :
kubectl describe deployment.extensions/busybox-deployment Name: busybox-deployment CreationTimestamp: Sun, 20 Jan 2019 10:16:11 +0200 Labels: app=busybox Annotations: deployment.kubernetes.io/revision: 1 Selector: app=busybox Replicas: 10 desired | 10 updated | 10 total | 10 available | 0 unavailable StrategyType: RollingUpdate RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=busybox Containers: busybox: Image: busybox Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing Unknown DeploymentPaused OldReplicaSets: <none> NewReplicaSet: busybox-deployment-5d6889b44 (10/10 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 2m28s deployment-controller Scaled up replica set busybox-deployment-5d6889b44 to 10ONLY one line shows that this Deployment is now paused:
Progressing Unknown DeploymentPausedIMPORTANT: ONLY use kubectl describe to reliably find paused Deployments.
Make Changes to Paused Deployment
While a Deployment is paused we can make changes to its Pods.
Change all our replicated Pods to use busybox:1.30-glibc image.
--record the fact that we are using a new image in the Deployment annotations.
kubectl set image deployment.v1.apps/busybox-deployment busybox=busybox:1.30-glibc --record deployment.apps/busybox-deployment image updatedThis specific change is not applied immediately ( Deployment is currently paused ).
While a Deployment is paused we can make changes to its number of replicas.
kubectl scale deployment.v1.apps/busybox-deployment --replicas=5 deployment.apps/busybox-deployment scaledChanges to number of replicas are implemented immediately.
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 5 5 0 5 3m44sImportant: note the up-to-date column ... none of the available / running Pods are up to date. They are all using the busybox image they used at the exact pause command time.
Show list of Pods - they still run old busybox image.
kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS busybox-deployment-5d6889b44-78tq8 1/1 Running 0 4m59s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-7xwds 1/1 Running 0 4m59s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-gjgc5 1/1 Running 0 4m59s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-j47xp 1/1 Running 0 4m59s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-kbh7t 1/1 Running 0 4m59s app=busybox,pod-template-hash=5d6889b44Kubectl Rollout Resume
We need to resume our rollout so that a new set of Pods can be created using the image we requested : busybox:1.30-glibc
kubectl rollout resume deployment busybox-deployment deployment.extensions/busybox-deployment resumed3 seconds later: 3 new Pods at bottom are being created.
kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS busybox-deployment-5d6889b44-78tq8 1/1 Running 0 5m52s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-7xwds 1/1 Running 0 5m52s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-gjgc5 1/1 Running 0 5m52s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-kbh7t 1/1 Running 0 5m52s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-f54b89b4-8xpv2 0/1 ContainerCreating 0 3s app=busybox,pod-template-hash=f54b89b4 busybox-deployment-f54b89b4-lgbxv 0/1 ContainerCreating 0 3s app=busybox,pod-template-hash=f54b89b4 busybox-deployment-f54b89b4-x64m5 0/1 ContainerCreating 0 3s app=busybox,pod-template-hash=f54b89b4another 10 seconds later ...
3 Pods in middle of list are already new.
Pod at the top of list is old. Very easy to determine old versus new: old Pods have older age.
( Freshly created new Pods have young age )
kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS busybox-deployment-5d6889b44-7xwds 1/1 Running 0 6m5s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-f54b89b4-8xpv2 0/1 ContainerCreating 0 16s app=busybox,pod-template-hash=f54b89b4 busybox-deployment-f54b89b4-cbxt4 1/1 Running 0 3s app=busybox,pod-template-hash=f54b89b4 busybox-deployment-f54b89b4-lgbxv 1/1 Running 0 16s app=busybox,pod-template-hash=f54b89b4 busybox-deployment-f54b89b4-qkj2b 1/1 Running 0 4s app=busybox,pod-template-hash=f54b89b4 busybox-deployment-f54b89b4-x64m5 0/1 ContainerCreating 0 16s app=busybox,pod-template-hash=f54b89b4another 10 seconds later ...
All Pods are new ... short running age is the easy giveaway hint.
kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS busybox-deployment-f54b89b4-8xpv2 1/1 Running 0 26s app=busybox,pod-template-hash=f54b89b4 busybox-deployment-f54b89b4-cbxt4 1/1 Running 0 13s app=busybox,pod-template-hash=f54b89b4 busybox-deployment-f54b89b4-lgbxv 1/1 Running 0 26s app=busybox,pod-template-hash=f54b89b4 busybox-deployment-f54b89b4-qkj2b 1/1 Running 0 14s app=busybox,pod-template-hash=f54b89b4 busybox-deployment-f54b89b4-x64m5 1/1 Running 0 26s app=busybox,pod-template-hash=f54b89b4Display Deployment status ... all 5 Pods up to date.
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 5 5 5 5 7m4sNote the last column. Overall age of this Deployment is 7 minutes. Only last 30 seconds used the new busybox image.
Show the rollout history of the Deployment :
kubectl rollout history deployment.v1.apps/busybox-deployment deployment.apps/busybox-deployment REVISION CHANGE-CAUSE 1 <none> 2 kubectl.exe set image deployment.v1.apps/busybox-deployment busybox=busybox:1.30-glibc --record=trueWe see our new busybox image listed as revision 2.
Scaling Paused Deployments
Deployments can be scaled while they are running.
Scaling in this context means changing the number of running identical Pod replicas.
Below is a demo that you can freely scale a paused Deployment :
Current state for reference:
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 5 5 5 5 27mWe have 5 running Pods.
kubectl get pods NAME READY STATUS RESTARTS AGE busybox-deployment-f54b89b4-8xpv2 1/1 Running 0 25m busybox-deployment-f54b89b4-cbxt4 1/1 Running 0 25m busybox-deployment-f54b89b4-lgbxv 1/1 Running 0 25m busybox-deployment-f54b89b4-qkj2b 1/1 Running 0 25m busybox-deployment-f54b89b4-x64m5 1/1 Running 0 25mPause Deployment :
kubectl rollout pause deployment busybox-deployment deployment.extensions/busybox-deployment pausedGet list of Pods:
IMPORTANT: Pausing a Deployment DOES NOT pause its containers.
All Pods still running.
kubectl get pods NAME READY STATUS RESTARTS AGE busybox-deployment-f54b89b4-8xpv2 1/1 Running 0 25m busybox-deployment-f54b89b4-cbxt4 1/1 Running 0 25m busybox-deployment-f54b89b4-lgbxv 1/1 Running 0 25m busybox-deployment-f54b89b4-qkj2b 1/1 Running 0 25m busybox-deployment-f54b89b4-x64m5 1/1 Running 0 25mChange replicas to 2:
kubectl scale deployment.v1.apps/busybox-deployment --replicas=2 deployment.apps/busybox-deployment scaledInvestigate change ... only 2 Pods now running:
kubectl get pods NAME READY STATUS RESTARTS AGE busybox-deployment-f54b89b4-lgbxv 1/1 Running 0 26m busybox-deployment-f54b89b4-qkj2b 1/1 Running 0 25mChange replicas to 6:
kubectl scale deployment.v1.apps/busybox-deployment --replicas=6 deployment.apps/busybox-deployment scaledInvestigate change ... 6 Pods now running:
Four new Pods have an age of only 4 seconds.
kubectl get pods NAME READY STATUS RESTARTS AGE busybox-deployment-f54b89b4-4fw4b 1/1 Running 0 4s busybox-deployment-f54b89b4-lgbxv 1/1 Running 0 26m busybox-deployment-f54b89b4-n952j 1/1 Running 0 4s busybox-deployment-f54b89b4-qkj2b 1/1 Running 0 26m busybox-deployment-f54b89b4-t569g 1/1 Running 0 4s busybox-deployment-f54b89b4-xlwr8 1/1 Running 0 4sLet's change the Pods to all use another different busybox image: busybox:1.30-uclibc
Important: right now the Deployment is paused. It only takes note of the newly desired image. It does not roll out the change immediately - it is waiting for the kubectl rollout resume command.
kubectl set image deployment.v1.apps/busybox-deployment busybox=busybox:1.30-uclibc --record deployment.apps/busybox-deployment image updatedShow list of Pods. They are unaware a change is coming. Still running as before.
kubectl get pods NAME READY STATUS RESTARTS AGE busybox-deployment-f54b89b4-4fw4b 1/1 Running 0 40s busybox-deployment-f54b89b4-lgbxv 1/1 Running 0 26m busybox-deployment-f54b89b4-n952j 1/1 Running 0 40s busybox-deployment-f54b89b4-qkj2b 1/1 Running 0 26m busybox-deployment-f54b89b4-t569g 1/1 Running 0 40s busybox-deployment-f54b89b4-xlwr8 1/1 Running 0 40sThe Deployment status shows ZERO up to date Pods. It is aware a change is pending while Deployment is in a paused state.
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 6 6 0 6 32mRollout history does not show new busybox:1.30-uclibc image pending.
It only shows history of previous and running Deployments status.
kubectl rollout history deployment.v1.apps/busybox-deployment deployment.apps/busybox-deployment REVISION CHANGE-CAUSE 1 <none> 2 kubectl.exe set image deployment.v1.apps/busybox-deployment busybox=busybox:1.30-glibc --record=trueLet's resume the Deployment :
kubectl rollout resume deployment busybox-deployment deployment.extensions/busybox-deployment resumed5 seconds later ... 3 new Pods being created.
kubectl get pods NAME READY STATUS RESTARTS AGE busybox-deployment-6fc48bf75f-92pkn 0/1 ContainerCreating 0 5s busybox-deployment-6fc48bf75f-qv8wv 0/1 ContainerCreating 0 5s busybox-deployment-6fc48bf75f-wgrv5 0/1 ContainerCreating 0 5s busybox-deployment-f54b89b4-4fw4b 1/1 Running 0 3m1s busybox-deployment-f54b89b4-lgbxv 1/1 Running 0 29m busybox-deployment-f54b89b4-n952j 1/1 Running 0 3m1s busybox-deployment-f54b89b4-qkj2b 1/1 Running 0 29m busybox-deployment-f54b89b4-xlwr8 1/1 Running 0 3m1sanother 5 seconds later:
- 3 new Pods running
- 3 new Pods being created
- 2 old Pods running ( at bottom ) waiting for termination
A few seconds later shows all Pods new ( young AGE )
kubectl get pods NAME READY STATUS RESTARTS AGE busybox-deployment-6fc48bf75f-74wlt 1/1 Running 0 15s busybox-deployment-6fc48bf75f-92pkn 1/1 Running 0 21s busybox-deployment-6fc48bf75f-qv8wv 1/1 Running 0 21s busybox-deployment-6fc48bf75f-wgrv5 1/1 Running 0 21s busybox-deployment-6fc48bf75f-xcv5c 1/1 Running 0 13s busybox-deployment-6fc48bf75f-xqmzc 1/1 Running 0 14sAll Pods up to date with desired new busybox image:
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 6 6 6 6 35mHistory now shows new busybox image as revision 3.
kubectl rollout history deployment.v1.apps/busybox-deployment deployment.apps/busybox-deployment REVISION CHANGE-CAUSE 1 <none> 2 kubectl.exe set image deployment.v1.apps/busybox-deployment busybox=busybox:1.30-glibc --record=true 3 kubectl.exe set image deployment.v1.apps/busybox-deployment busybox=busybox:1.30-uclibc --record=trueDescribe Deployment :
kubectl describe deployment.extensions/busybox-deployment Name: busybox-deployment CreationTimestamp: Sun, 20 Jan 2019 10:16:11 +0200 Labels: app=busybox Annotations: deployment.kubernetes.io/revision: 3 kubernetes.io/change-cause: kubectl.exe set image deployment.v1.apps/busybox-deployment busybox=busybox:1.30-uclibc --record=true Selector: app=busybox Replicas: 6 desired | 6 updated | 6 total | 6 available | 0 unavailable StrategyType: RollingUpdate RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=busybox Containers: busybox: Image: busybox:1.30-uclibc Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: busybox-deployment-6fc48bf75f (6/6 replicas created)Note the annotation that shows which image is being used.
Delete Pod.
kubectl delete -f myDeployment.yaml --force --grace-period=0 deployment.apps "busybox-deployment" force deletedKubectl Rollout Undo
Deployments allow you to roll back to any previous revision.
By default it keeps a list of your last 10 revisions.
Let's create our normal test set of 10 Pod replicas :
( First few steps should be boring familiar by now )
nano myDeployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: mydeployment labels: app: busybox spec: replicas: 10 strategy: type: RollingUpdate selector: matchLabels: app: busybox template: metadata: labels: app: busybox spec: containers: - name: busybox image: busybox imagePullPolicy: IfNotPresent command: ['sh', '-c', 'echo Container 1 is Running ; sleep 3600'] terminationGracePeriodSeconds: 0Create the Deployment
kubectl create -f myDeployment.yaml deployment.apps/mydeployment createdShow history:
kubectl rollout history deployment.v1.apps/busybox-deployment deployment.apps/busybox-deployment REVISION CHANGE-CAUSE 1 <none>Show the Pods:
kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS busybox-deployment-5d6889b44-2sb8m 1/1 Running 0 2m1s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-6dtgr 1/1 Running 0 2m1s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-6t94r 1/1 Running 0 2m1s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-7j6bg 1/1 Running 0 2m1s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-8s5lq 1/1 Running 0 2m1s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-dn62f 1/1 Running 0 2m1s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-gpsrv 1/1 Running 0 2m1s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-rxbqx 1/1 Running 0 2m1s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-tvxrn 1/1 Running 0 2m1s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-vt7dd 1/1 Running 0 2m1s app=busybox,pod-template-hash=5d6889b44Show version of busybox running ... to compare against later.
Remember that ... BusyBox v1.30.0
kubectl exec busybox-deployment-5d6889b44-2sb8m -i -t -- /bin/sh / # busybox | head -1 BusyBox v1.30.0 (2018-12-31 18:16:17 UTC) multi-call binary. / # exitChange all Pods to use busybox:1.29.3
kubectl set image deployment.v1.apps/busybox-deployment busybox=busybox:1.29.3 --record deployment.apps/busybox-deployment image updatedInvestigate Pods during rollout process
kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS busybox-deployment-5d6889b44-6dtgr 1/1 Running 0 3m6s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-755956dfff-65vvk 0/1 ContainerCreating 0 4s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-gmlmm 1/1 Running 0 8s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-j2w84 0/1 ContainerCreating 0 4s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-lcjz2 1/1 Running 0 8s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-lfvzn 0/1 ContainerCreating 0 4s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-m4vzz 1/1 Running 0 5s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-mzw75 1/1 Running 0 8s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-njtm2 1/1 Running 0 8s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-nw6nh 1/1 Running 0 8s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-pzbmt 1/1 Running 0 5s app=busybox,pod-template-hash=755956dfffSeconds later ... complete set of 10 fresh new Pods with young age.
kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS busybox-deployment-755956dfff-65vvk 1/1 Running 0 14s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-gmlmm 1/1 Running 0 18s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-j2w84 1/1 Running 0 14s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-lcjz2 1/1 Running 0 18s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-lfvzn 1/1 Running 0 14s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-m4vzz 1/1 Running 0 15s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-mzw75 1/1 Running 0 18s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-njtm2 1/1 Running 0 18s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-nw6nh 1/1 Running 0 18s app=busybox,pod-template-hash=755956dfff busybox-deployment-755956dfff-pzbmt 1/1 Running 0 15s app=busybox,pod-template-hash=755956dfffCheck to make sure the Pods are using version 29.3 busybox:
kubectl exec busybox-deployment-755956dfff-65vvk -i -t -- /bin/sh / # busybox | head -1 BusyBox v1.29.3 (2018-12-24 21:25:20 UTC) multi-call binary. / # exitShow history. New busybox is revision 2.
kubectl rollout history deployment.v1.apps/busybox-deployment deployment.apps/busybox-deployment REVISION CHANGE-CAUSE 1 <none> 2 kubectl.exe set image deployment.v1.apps/busybox-deployment busybox=busybox:1.29.3 --record=trueDescribe shows annotation as expected.
kubectl describe deployment.extensions/busybox-deployment Name: busybox-deployment Namespace: default CreationTimestamp: Sat, 19 Jan 2019 09:10:49 +0200 Labels: app=busybox Annotations: deployment.kubernetes.io/revision: 2 kubernetes.io/change-cause: kubectl.exe set image deployment.v1.apps/busybox-deployment busybox=busybox:1.29.3 --record=trueNOW we undo this latest Deployment.
We undo deployment to revision 1 via flag : --to-revision=1
kubectl rollout undo deployment busybox-deployment --to-revision=1 deployment.extensions/busybox-deployment rolled backFollow state of undo rollout
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 10 13 8 8 10m8 Pods up to date in a few seconds.
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 10 11 10 8 10mStill only 8 Pods up to date.
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 10 10 10 10 10mSeconds later ... all 10 Pods back to the previous version busybox.
kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS busybox-deployment-5d6889b44-4frh6 1/1 Running 0 2m28s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-4kfrf 1/1 Running 0 2m28s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-59qsz 1/1 Running 0 2m26s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-6xmkx 1/1 Running 0 2m26s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-77qnl 1/1 Running 0 2m25s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-7c9xb 1/1 Running 0 2m28s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-8pg76 1/1 Running 0 2m26s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-bjc5s 1/1 Running 0 2m24s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-jnqf5 1/1 Running 0 2m28s app=busybox,pod-template-hash=5d6889b44 busybox-deployment-5d6889b44-z5xql 1/1 Running 0 2m28s app=busybox,pod-template-hash=5d6889b44Check Pods are using busybox version 1.30 ... the number we had to remember.
kubectl exec busybox-deployment-5d6889b44-4frh6 -i -t -- /bin/sh / # busybox | head -1 BusyBox v1.30.0 (2018-12-31 18:16:17 UTC) multi-call binary. / # exitSuccess. kubectl rollout undo deployment correctly rolled back to revision 1.
Delete Deployment
kubectl delete -f myDeployment.yaml --force --grace-period=0 deployment.apps "busybox-deployment" force deletedDeployment Internals
Let's create a Deployment and explore its internals.
nano myDeployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: busybox-deployment labels: app: busybox spec: replicas: 5 strategy: type: RollingUpdate selector: matchLabels: app: busybox template: metadata: labels: app: busybox spec: containers: - name: busybox image: busybox imagePullPolicy: IfNotPresent command: ['sh', '-c', 'echo Container is Running ; sleep 3600'] terminationGracePeriodSeconds: 0Create the Deployment
kubectl create -f myDeployment.yaml pod/mydeployment createdList Deployment status :
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 5 5 5 5 5sA Deployment actually manages a ReplicaSet that runs under its command.
kubectl get rs NAME DESIRED CURRENT READY AGE busybox-deployment-1111111111 5 5 5 14srs is ReplicaSet abbreviation for command line use.
ReplicaSet name starts with name of Deployment. Kubernetes adds a 10 digit random number.
kubectl get pods NAME READY STATUS RESTARTS AGE busybox-deployment-1111111111-6v8qt 1/1 Running 0 19s busybox-deployment-1111111111-fr4q7 1/1 Running 0 19s busybox-deployment-1111111111-p8h2l 1/1 Running 0 19s busybox-deployment-1111111111-pr85v 1/1 Running 0 19s busybox-deployment-1111111111-wt7hh 1/1 Running 0 19sThese Pods run under control of the ReplicaSet. Kubernetes adds 5 digit random number to individual Pod names.
Actual old and new Pods were similar to :
busybox-deployment-568495f8b6-rv8swand busybox-deployment-8659fbc5bf-6v8qt
I changed it to 1111.... and 3333... so it is easy to differentiate in lists below.
- 1111... old, Pods created first
- 3333... new, current fresh Pods
Let's scale to 7 replicas:
- Deployment gets command to scale to 7 replicas
- Deployment sends this command to the ReplicaSet
- ReplicaSet receive command, counts 5 replicas, need 7 so create 2 more Pods.
Deployment now shows 7 running replicas.
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 7 7 7 7 113s ReplicaSets now show 7 running replicas. kubectl get rs NAME DESIRED CURRENT READY AGE busybox-deployment-1111111111 7 7 7 116s Detail of 7 running Pods. kubectl get pods NAME READY STATUS RESTARTS AGE busybox-deployment-1111111111-6v8qt 1/1 Running 0 2m busybox-deployment-1111111111-7bkvx 1/1 Running 0 11s busybox-deployment-1111111111-fr4q7 1/1 Running 0 2m busybox-deployment-1111111111-hj426 1/1 Running 0 11s busybox-deployment-1111111111-p8h2l 1/1 Running 0 2m busybox-deployment-1111111111-pr85v 1/1 Running 0 2m busybox-deployment-1111111111-wt7hh 1/1 Running 0 2mLet's use this busybox image: busybox:1.30-uclibc
- Deployment gets command : kubectl set image ...
- Deployment sends this command to the ReplicaSet
- ReplicaSet receive command, determines all Pods are running wrong version of busybox
- A new set of Pods in the series busybox-deployment-3333333333 gets created
- Some old busybox-deployment-1111111111 Pods are kept running during rolling update
maxUnavailable determines how many old Pods may be unavailable during update
maxSurge determines how many NEW Pods may be created in addition to already running Pods
kubectl set image deployment.v1.apps/busybox-deployment busybox=busybox:1.30-uclibc --record deployment.apps/busybox-deployment image updatedInvestigate status of rolling update:
1111... series keep on doing useful work while update is in progress3333... series ... some new Pods already running3333... series ... some new Pods in process of being created: ContainerCreating
kubectl get pods NAME READY STATUS RESTARTS AGE busybox-deployment-3333333333-2sqcs 0/1 ContainerCreating 0 1s busybox-deployment-3333333333-69xq9 1/1 Running 0 3s busybox-deployment-3333333333-6ph4z 1/1 Running 0 3s busybox-deployment-3333333333-8trbx 0/1 ContainerCreating 0 1s busybox-deployment-3333333333-fmqwv 0/1 ContainerCreating 0 1s busybox-deployment-3333333333-rv8sw 1/1 Running 0 3s busybox-deployment-1111111111-6v8qt 1/1 Running 0 3m36s busybox-deployment-1111111111-fr4q7 1/1 Running 0 3m36s busybox-deployment-1111111111-p8h2l 1/1 Running 0 3m36sA few seconds later and the rolling update is complete. All old 111... Pods deleted.
kubectl get pods NAME READY STATUS RESTARTS AGE busybox-deployment-3333333333-2sqcs 1/1 Running 0 5s busybox-deployment-3333333333-69xq9 1/1 Running 0 7s busybox-deployment-3333333333-6ph4z 1/1 Running 0 7s busybox-deployment-3333333333-8trbx 1/1 Running 0 5s busybox-deployment-3333333333-fmqwv 1/1 Running 0 5s busybox-deployment-3333333333-r2cgc 1/1 Running 0 4s busybox-deployment-3333333333-rv8sw 1/1 Running 0 7s7 new Pods up-to-date and available.
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE busybox-deployment 7 7 7 7 5m8sList of ReplicaSets.
Note the old ReplicaSet is kept in case we need to roll back a Deployment.
kubectl get rs NAME DESIRED CURRENT READY AGE busybox-deployment-3333333333 7 7 7 98s busybox-deployment-1111111111 0 0 0 5m11sFrom https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#revision-history-limit
All old ReplicaSets will be kept by default, consuming resources in etcd and crowding the output of kubectl get rs, if this field is not set.
etcd is the 'database' / key-value data store Kubernetes use to keep track of all its API objects.
etcd keeps at least 3 types of information about all Kubernetes API objects:
- meta data ( data about data ) https://en.wikipedia.org/wiki/Metadata
- Kubernetes uses metadata to keep track of objects and to note object interrelationships ( see below )
- our desired spec ... details of the spec we need for our objects
- the actual status of this specific object
This can be clearly and neatly seen when we run :
kubectl get rs/busybox-deployment-568495f8b6 -o yaml apiVersion: extensions/v1beta1 kind: ReplicaSet metadata: annotations: deployment.kubernetes.io/desired-replicas: "7" deployment.kubernetes.io/max-replicas: "9" deployment.kubernetes.io/revision: "2" kubernetes.io/change-cause: kubectl.exe set image deployment.v1.apps/busybox-deployment busybox=busybox:1.30-uclibc --record=true creationTimestamp: "2019-01-21T07:09:11Z" generation: 6 labels: app: busybox pod-template-hash: 568495f8b6 name: busybox-deployment-568495f8b6 namespace: default ownerReferences: - apiVersion: apps/v1 blockOwnerDeletion: true controller: true kind: Deployment name: busybox-deployment uid: f510ce02-1d4a-11e9-8596-0800270102d2 resourceVersion: "602067" selfLink: /apis/extensions/v1beta1/namespaces/default/replicasets/busybox-deployment-568495f8b6 uid: 73b2480b-1d4b-11e9-8596-0800270102d2 spec: replicas: 7 selector: matchLabels: app: busybox pod-template-hash: 568495f8b6 template: metadata: creationTimestamp: null labels: app: busybox pod-template-hash: 568495f8b6 spec: containers: - command: - sh - -c - echo Container is Running ; sleep 3600 image: busybox:1.30-uclibc imagePullPolicy: IfNotPresent name: busybox resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 0 status: availableReplicas: 7 fullyLabeledReplicas: 7 observedGeneration: 6 readyReplicas: 7 replicas: 7Kubernetes Deployment course complete ... delete Deployment :
kubectl delete -f myDeployment.yaml --force --grace-period=0 pod "mydeployment" force deletedDeleting a Deployment deletes the Deployment itself, underlying ReplicaSets and all its Pods.
Your Turn
Experiment with all the Deployment settings: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#writing-a-deployment-spec
Determine the correct settings for all your production Pods and their controlling Deployments.
Tag » How To Stop All Kubernetes Deployments
-
Stop The Existing Deployments - IBM
-
Stopping And Starting A Kubernetes Cluster And Pods - IBM
-
Kubectl Stop Deployment - Kubernetes - Linux Hint
-
How To Stop All Kubernetes Deployments - Your DevOps Mentor
-
Kubectl Stop - Kubernetes
-
Kubectl Cheat Sheet | Kubernetes
-
Deployments - Kubernetes
-
Kubectl Stop All Pods Code Example
-
Command To Delete All Pods In All Kubernetes Namespaces
-
Using Kubectl Delete | Tutorial And Best Practices - ContainIQ
-
Deploy To Kubernetes - Docker Documentation
-
Graceful Shutdown And Zero Downtime Deployments In Kubernetes
-
Quick Tips: Deleting Kubernetes Pods | By KubeSphere - ITNEXT