Kubernetes学习之Deployment控制器
一、認(rèn)識Deployment控制器
Deployment控制器為Pod和Replica Set控制器提供聲明式的更新;你只需要在Deployment中描述你想要的目標(biāo)狀態(tài)是什么,Deployment Controller就會幫你將Pod和Relica Set控制器的實(shí)際狀態(tài)改變到你的目標(biāo)狀態(tài)。你也可以定義一個(gè)新的Deployment,也可以創(chuàng)建一個(gè)新的替換舊的Deployment控制器。
當(dāng)我們在使用Deployment控制器做滾動更新時(shí),Deployment控制器首先會創(chuàng)建出一個(gè)新的ReplicaSet控制器,在新的ReplicaSet控制器上創(chuàng)建出新的Pod;并且通過一定的頻率,將老的ReplicaSet控制器上的Pod發(fā)送退出信號;但是無論如何更新,老的ReplicaSet控制器上的Pod副本數(shù)和新的ReplicaSet副本數(shù)必須要滿足Deployment控制器所規(guī)定的數(shù)量;當(dāng)老的ReplicaSet控制器中的Pod被用戶訪問完畢時(shí),便會退出;新的用戶訪問會被調(diào)度到新的ReplicaSet控制器下的Pod上。
二、Deployment典型的應(yīng)用場景如下
- 使用Deployment控制器來創(chuàng)建ReplicaSet,ReplicationSet在后臺創(chuàng)建Pod;檢查啟動狀態(tài),看它是成功還是失敗。
- 通過更新Deployment控制器中的PodTemplateSpec字段來聲明Pod的新狀態(tài)。這會創(chuàng)建一個(gè)新的ReplicationSet,Deployment控制器會按照自己所控制的速率將Pod從舊的ReplicaSet中移動到新的ReplicaSet中。
- 如果當(dāng)前狀態(tài)不穩(wěn)定,回滾到之前的Deployment revision,每次回滾都會更新Deployment的revision。
- 支持動態(tài)擴(kuò)縮容,擴(kuò)容Deployment控制器以滿足更高的負(fù)載。
- 暫停Deployment控制器來應(yīng)用PodTemplateSpec的多個(gè)修復(fù),然后恢復(fù)上線。
- 根據(jù)Deployment控制器的狀態(tài)來判斷上線是否失敗了。
- 定時(shí)清理不必要的ReplicaSet
三、Deployment使用操作
1)創(chuàng)建Deployment資源
]# cat deploy-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deploynamespace: default spec: replicas: 3selector:matchLabels:app: myapprelease: canarytemplate:metadata:labels:app: myapprelease: canaryspec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80]# kubectl apply -f deploy-demo.yaml deployment.apps/myapp-deploy created2)查看Deployment資源
]# kubectl get deploy -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR myapp-deploy 3/3 3 3 2m35s myapp ikubernetes/myapp:v1 app=myapp,release=canary]# kubectl get rs -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR myapp-deploy-65fb6c8459 3 3 3 2m43s myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canary]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES myapp-deploy-65fb6c8459-bkcbj 1/1 Running 0 3m49s 10.244.1.28 node1 <none> <none> myapp-deploy-65fb6c8459-c44fs 1/1 Running 0 3m49s 10.244.1.27 node1 <none> <none> myapp-deploy-65fb6c8459-fbbl7 1/1 Running 0 3m49s 10.244.2.10 node2 <none> <none>3)訪問pod資源
]# curl 10.244.1.28 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>]# curl 10.244.1.27 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>]# curl 10.244.2.10 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>4)查看Deoloyment和ReplicaSet的詳細(xì)信息
]# kubectl describe deployment myapp-deploy Name: myapp-deploy Namespace: default CreationTimestamp: Sun, 26 Jul 2020 13:50:09 +0800 Labels: <none> Annotations: deployment.kubernetes.io/revision: 1 Selector: app=myapp,release=canary Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template:Labels: app=myapprelease=canaryContainers:myapp:Image: ikubernetes/myapp:v1Port: 80/TCPHost Port: 0/TCPEnvironment: <none>Mounts: <none>Volumes: <none> Conditions:Type Status Reason---- ------ ------Progressing True NewReplicaSetAvailableAvailable True MinimumReplicasAvailable OldReplicaSets: <none> NewReplicaSet: myapp-deploy-65fb6c8459 (3/3 replicas created) Events:Type Reason Age From Message---- ------ ---- ---- -------Normal ScalingReplicaSet 6m21s deployment-controller Scaled up replica set myapp-deploy-65fb6c8459 to 3]# kubectl describe rs myapp-deploy-65fb6c8459 Name: myapp-deploy-65fb6c8459 Namespace: default Selector: app=myapp,pod-template-hash=65fb6c8459,release=canary Labels: app=myapppod-template-hash=65fb6c8459release=canary Annotations: deployment.kubernetes.io/desired-replicas: 3deployment.kubernetes.io/max-replicas: 4deployment.kubernetes.io/revision: 1 Controlled By: Deployment/myapp-deploy Replicas: 3 current / 3 desired Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template:Labels: app=myapppod-template-hash=65fb6c8459release=canaryContainers:myapp:Image: ikubernetes/myapp:v1Port: 80/TCPHost Port: 0/TCPEnvironment: <none>Mounts: <none>Volumes: <none> Events:Type Reason Age From Message---- ------ ---- ---- -------Normal SuccessfulCreate 8m8s replicaset-controller Created pod: myapp-deploy-65fb6c8459-c44fsNormal SuccessfulCreate 8m8s replicaset-controller Created pod: myapp-deploy-65fb6c8459-bkcbjNormal SuccessfulCreate 8m8s replicaset-controller Created pod: myapp-deploy-65fb6c8459-fbbl75)動態(tài)擴(kuò)容Pod副本集
]# kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}' deployment.apps/myapp-deploy patched]# kubectl get pods -w NAME READY STATUS RESTARTS AGE myapp-deploy-65fb6c8459-bkcbj 1/1 Running 0 9m21s myapp-deploy-65fb6c8459-c44fs 1/1 Running 0 9m21s myapp-deploy-65fb6c8459-fbbl7 1/1 Running 0 9m21smyapp-deploy-65fb6c8459-2wkfq 0/1 Pending 0 0s myapp-deploy-65fb6c8459-vtrzk 0/1 Pending 0 0s myapp-deploy-65fb6c8459-2wkfq 0/1 Pending 0 0s myapp-deploy-65fb6c8459-vtrzk 0/1 Pending 0 0s myapp-deploy-65fb6c8459-2wkfq 0/1 ContainerCreating 0 0s myapp-deploy-65fb6c8459-vtrzk 0/1 ContainerCreating 0 0s myapp-deploy-65fb6c8459-vtrzk 1/1 Running 0 2s myapp-deploy-65fb6c8459-2wkfq 1/1 Running 0 2sDeployment控制器中的Pod資源副本集已經(jīng)被動態(tài)的創(chuàng)建出來,并且不影響原有的Pod資源
6)動態(tài)縮容Pod副本集
]# kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":2}}' deployment.apps/myapp-deploy patched[root@master label]# kubectl get pods -w NAME READY STATUS RESTARTS AGE myapp-deploy-65fb6c8459-2wkfq 1/1 Running 0 112s myapp-deploy-65fb6c8459-bkcbj 1/1 Running 0 12m myapp-deploy-65fb6c8459-c44fs 1/1 Running 0 12m myapp-deploy-65fb6c8459-fbbl7 1/1 Running 0 12m myapp-deploy-65fb6c8459-vtrzk 1/1 Running 0 112smyapp-deploy-65fb6c8459-c44fs 1/1 Terminating 0 13m myapp-deploy-65fb6c8459-2wkfq 1/1 Terminating 0 3m16s myapp-deploy-65fb6c8459-vtrzk 1/1 Terminating 0 3m16s myapp-deploy-65fb6c8459-vtrzk 0/1 Terminating 0 3m19s myapp-deploy-65fb6c8459-2wkfq 0/1 Terminating 0 3m19s myapp-deploy-65fb6c8459-c44fs 0/1 Terminating 0 13m myapp-deploy-65fb6c8459-2wkfq 0/1 Terminating 0 3m20s myapp-deploy-65fb6c8459-2wkfq 0/1 Terminating 0 3m20s myapp-deploy-65fb6c8459-c44fs 0/1 Terminating 0 13m myapp-deploy-65fb6c8459-c44fs 0/1 Terminating 0 13m myapp-deploy-65fb6c8459-vtrzk 0/1 Terminating 0 3m20s myapp-deploy-65fb6c8459-vtrzk 0/1 Terminating 0 3m20sDeployment控制器已經(jīng)平滑退出了三個(gè)副本集,來滿足用戶所定義的Pod副本數(shù)量
7)滾動更新Pod鏡像
]# kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v2 deployment.apps/myapp-deploy image updated]# kubectl get rs -w NAME DESIRED CURRENT READY AGE myapp-deploy-65fb6c8459 2 2 2 18mmyapp-deploy-559ff5c66 1 0 0 0s myapp-deploy-559ff5c66 1 0 0 0s myapp-deploy-559ff5c66 1 1 0 0s myapp-deploy-559ff5c66 1 1 1 3s myapp-deploy-65fb6c8459 1 2 2 18m myapp-deploy-559ff5c66 2 1 1 3s myapp-deploy-65fb6c8459 1 2 2 18m myapp-deploy-559ff5c66 2 1 1 3s myapp-deploy-559ff5c66 2 2 1 3s myapp-deploy-65fb6c8459 1 1 1 18m myapp-deploy-559ff5c66 2 2 2 4s myapp-deploy-65fb6c8459 0 1 1 18m myapp-deploy-65fb6c8459 0 1 1 18m myapp-deploy-65fb6c8459 0 0 0 18m]# kubectl get pods -w NAME READY STATUS RESTARTS AGE myapp-deploy-65fb6c8459-bkcbj 1/1 Running 0 15m myapp-deploy-65fb6c8459-fbbl7 1/1 Running 0 15mmyapp-deploy-559ff5c66-gmgfn 0/1 Pending 0 0s myapp-deploy-559ff5c66-gmgfn 0/1 Pending 0 0s myapp-deploy-559ff5c66-gmgfn 0/1 ContainerCreating 0 0s myapp-deploy-559ff5c66-gmgfn 1/1 Running 0 3s myapp-deploy-65fb6c8459-bkcbj 1/1 Terminating 0 18m myapp-deploy-559ff5c66-2sqtc 0/1 Pending 0 0s myapp-deploy-559ff5c66-2sqtc 0/1 Pending 0 0s myapp-deploy-559ff5c66-2sqtc 0/1 ContainerCreating 0 0s myapp-deploy-65fb6c8459-bkcbj 0/1 Terminating 0 18m myapp-deploy-559ff5c66-2sqtc 1/1 Running 0 1s myapp-deploy-65fb6c8459-fbbl7 1/1 Terminating 0 18m myapp-deploy-65fb6c8459-fbbl7 0/1 Terminating 0 18m myapp-deploy-65fb6c8459-bkcbj 0/1 Terminating 0 18m myapp-deploy-65fb6c8459-bkcbj 0/1 Terminating 0 18m myapp-deploy-65fb6c8459-fbbl7 0/1 Terminating 0 18m myapp-deploy-65fb6c8459-fbbl7 0/1 Terminating 0 18m]# kubectl get rs -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR myapp-deploy-559ff5c66 2 2 2 5m22s myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=559ff5c66,release=canary myapp-deploy-65fb6c8459 0 0 0 24m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canary通過監(jiān)視ReplicaSet控制器和Pod資源,可以看見整個(gè)Deployment控制器更新的操作;首先Depliyment控制器會創(chuàng)建一個(gè)新的ReplicaSet控制器,并在此控制器上創(chuàng)建新的Pod資源對象,然后平滑退出舊的ReplicaSet控制器上的Pod資源;雖然Pod資源被創(chuàng)建調(diào)度到了新的ReplicaSet控制器上,但是老的ReplicaSet控制器并不會退出,因?yàn)橛脩艨赡軙龌貪L操作,Deployment通過此來做回滾歷史版本。
8)訪問新的Pod資源對象
]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES myapp-deploy-559ff5c66-5zv6t 1/1 Running 0 23s 10.244.1.35 node1 <none> <none> myapp-deploy-559ff5c66-v9qdf 1/1 Running 0 24s 10.244.1.34 node1 <none> <none>]# curl 10.244.1.35 Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>]# curl 10.244.1.34 Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>9)查看滾動更新歷史
]# kubectl rollout history deployment deployment.apps/myapp-deploy REVISION CHANGE-CAUSE 1 <none> 2 <none>10)回滾Pod鏡像版本
]# kubectl rollout undo deployment/myapp-deploy --to-revision=1 deployment.apps/myapp-deploy rolled back]# kubectl get rs -w -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR myapp-deploy-559ff5c66 2 2 2 8m16s myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=559ff5c66,release=canary myapp-deploy-65fb6c8459 0 0 0 27m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canarymyapp-deploy-65fb6c8459 0 0 0 29m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canary myapp-deploy-65fb6c8459 1 0 0 29m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canary myapp-deploy-65fb6c8459 1 0 0 29m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canary myapp-deploy-65fb6c8459 1 1 0 29m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canary myapp-deploy-65fb6c8459 1 1 1 29m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canary myapp-deploy-559ff5c66 1 2 2 10m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=559ff5c66,release=canary myapp-deploy-65fb6c8459 2 1 1 29m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canary myapp-deploy-559ff5c66 1 2 2 10m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=559ff5c66,release=canary myapp-deploy-65fb6c8459 2 1 1 29m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canary myapp-deploy-65fb6c8459 2 2 1 29m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canary myapp-deploy-559ff5c66 1 1 1 10m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=559ff5c66,release=canary myapp-deploy-65fb6c8459 2 2 2 29m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canary myapp-deploy-559ff5c66 0 1 1 10m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=559ff5c66,release=canary myapp-deploy-559ff5c66 0 1 1 10m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=559ff5c66,release=canary myapp-deploy-559ff5c66 0 0 0 10m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=559ff5c66,release=canary]# kubectl get pods -w NAME READY STATUS RESTARTS AGE myapp-deploy-559ff5c66-2sqtc 1/1 Running 0 7m54s myapp-deploy-559ff5c66-gmgfn 1/1 Running 0 7m57smyapp-deploy-65fb6c8459-ds9fg 0/1 Pending 0 0s myapp-deploy-65fb6c8459-ds9fg 0/1 Pending 0 0s myapp-deploy-65fb6c8459-ds9fg 0/1 ContainerCreating 0 0s myapp-deploy-65fb6c8459-ds9fg 1/1 Running 0 1s myapp-deploy-559ff5c66-2sqtc 1/1 Terminating 0 10m myapp-deploy-65fb6c8459-q6kn9 0/1 Pending 0 0s myapp-deploy-65fb6c8459-q6kn9 0/1 Pending 0 0s myapp-deploy-65fb6c8459-q6kn9 0/1 ContainerCreating 0 0s myapp-deploy-559ff5c66-2sqtc 0/1 Terminating 0 10m myapp-deploy-65fb6c8459-q6kn9 1/1 Running 0 2s myapp-deploy-559ff5c66-gmgfn 1/1 Terminating 0 10m myapp-deploy-559ff5c66-gmgfn 0/1 Terminating 0 10m myapp-deploy-559ff5c66-gmgfn 0/1 Terminating 0 10m myapp-deploy-559ff5c66-gmgfn 0/1 Terminating 0 10m myapp-deploy-559ff5c66-2sqtc 0/1 Terminating 0 10m myapp-deploy-559ff5c66-2sqtc 0/1 Terminating 0 10m11)查看滾動后狀態(tài)與歷史
]# kubectl rollout status deployment/myapp-deploy deployment "myapp-deploy" successfully rolled out]# kubectl rollout history deployment deployment.apps/myapp-deploy REVISION CHANGE-CAUSE 2 <none> 3 <none>]# kubectl get rs -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR myapp-deploy-559ff5c66 0 0 0 14m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=559ff5c66,release=canary myapp-deploy-65fb6c8459 2 2 2 32m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65fb6c8459,release=canary12)訪問回滾后的Pod資源
]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES myapp-deploy-65fb6c8459-djg6k 1/1 Running 0 54s 10.244.2.12 node2 <none> <none> myapp-deploy-65fb6c8459-jp7hc 1/1 Running 0 53s 10.244.1.36 node1 <none> <none>]# curl 10.244.2.12 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>]# curl 10.244.1.36 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>13)暫停與恢復(fù)Deployment的回滾
]# kubectl rollout undo deployment/myapp-deploy --to-revision=4 deployment.apps/myapp-deploy rolled back]# kubectl rollout pause deployment/myapp-deploy deployment.apps/myapp-deploy paused]# kubectl rollout resume deployment/myapp-deploy deployment.apps/myapp-deploy resumedDeployment的清理策略:
可以通過設(shè)置.spec.revisonHistoryLimit項(xiàng)來指定Deployment控制器最多保留多少revision歷史記錄,默認(rèn)Deployment控制器會保留所有的revision版本;如果該項(xiàng)設(shè)置為0,則Deployment控制器就不允許做回滾操作了。
總結(jié)
以上是生活随笔為你收集整理的Kubernetes学习之Deployment控制器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模型稳定度指标PSI 释义及计算示例
- 下一篇: 【工业互联网】周剑:工业互联网平台作用机