一、什么是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}