一、什麼是Deployment對象
明明ReplicaSet已經可以控制pod的數量了,為什麼還需要Deployment?
簡單的說,Deployment控制ReplicaSet的多個版本,ReplicaSet控制Pod個數

Deploymen實際上一個兩層控制器,遵循一種滾動更新的方式來實更新現有的容器,這個能力的實作,依賴的就是ReplicaSet這個對象
當我們修改了Deployment對象後,Deployment控制器會使用修改後的模闆,建立一個新的ReplicaSet對象,這時候有兩個RelicaSet對象,
Deployment通過控制ReplicaSet對象的pod數量來達到滾動更新的效果
例如A和B,如果最終設定的pod數都是3,通過A-1,B+1這樣的方式,直到A的pod數量變為0,最終 達到了滾動更新的目的。
同時,因為存在多個ReplicaSet,讓復原成為了可能
二、使用示例
示例yaml檔案
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,指定了滾動更新的政策
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
...
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
檢視deployments
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 副本個數
三、檢視曆史和復原
檢視曆史版本
kubectl rollout history deployment ${name}
deployment.extensions/demo2
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
4 <none>
檢視指定版本
kubectl rollout history deployment ${name} --revision=${version}
復原到上一版本
kubectl rollout undo deployment ${name}
復原到指定版本
kubectl rollout undo deployment ${name} --to-revision=${version}