明明ReplicaSet已經能夠控制pod的數量了,爲何還須要Deployment?nginx
簡單的說,Deployment控制ReplicaSet的多個版本,ReplicaSet控制Pod個數
web
Deploymen實際上一個兩層控制器,遵循一種滾動更新的方式來實升級現有的容器,這個能力的實現,依賴的就是ReplicaSet這個對象
當咱們修改了Deployment對象後,Deployment控制器會使用修改後的模板,建立一個新的ReplicaSet對象,這時候有兩個RelicaSet對象,
Deployment經過控制ReplicaSet對象的pod數量來達到滾動升級的效果
例如A和B,若是最終設置的pod數都是3,經過A-1,B+1這樣的方式,直到A的pod數量變爲0,最終 達到了滾動升級的目的。
同時,由於存在多個ReplicaSet,讓回滾成爲了可能api
示例yaml文件app
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
template字段,指定了建立pod的模板
replicas指定了pod的節點數量
還有一個 type: RollingUpdate,指定了滾動升級的策略ide
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: ... strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1
查看deploymentscode
kubectl get deployments demo2 -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR demo2 2/3 3 2 24d demo2 harbor.eoffcn.com/dev/demo2 workload.user.cattle.io/workloadselector=deployment-web-demo2
UP-TO-DATE:當前處於最新版本的 Pod 的個數,所謂最新版本指的是 Pod 的 Spec 部分與 Deployment 裏 Pod 模板裏定義的徹底一致
AVAILABLE:當前已經可用的 Pod 的個數,即:既是 Running 狀態,又是最新版本,而且已經處於 Ready(健康檢查正確)狀態的 Pod 的個數
READY:前處於 Running 狀態的 Pod 的個數/用戶指望的 Pod 副本個數對象
查看歷史版本blog
kubectl rollout history deployment ${name} deployment.extensions/demo2 REVISION CHANGE-CAUSE 1 <none> 2 <none> 3 <none> 4 <none>
查看指定版本get
kubectl rollout history deployment ${name} --revision=${version}
回滾到上一版本io
kubectl rollout undo deployment ${name}
回滾到指定版本
kubectl rollout undo deployment ${name} --to-revision=${version}