Deployment 爲 Pod 和 ReplicaSet(下一代 Replication Controller)提供聲明式更新,有了Deployment之後我們就不再單獨的使用RC和RS了。 您只需要在 Deployment 中描述您想要的目標狀態是什麼,Deployment controller 就會幫您將 Pod 和 ReplicaSet 的實際狀態改變到您的目標狀態。 Deployment集成了上線部署、滾動升級、創建副本、暫停上線任務,恢復上線任務,回滾到以前某一版本(成功/穩定)的Deployment等功能,在某種程度上,Deployment可以幫我們實現無人值守的上線,大大降低我們的上線過程的複雜溝通、操作風險。
一、創建Deployment
Deployment對象的創建同樣是一開YAML的配置文件。
[root@k8s-01 ~]# cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.13.12
ports:
- containerPort: 80
可以發現,這裏我特意在鏡像中指定了一下nginx的版本,以方便後面升級的時候做對比。
使用kubectl創建Deployment
[root@k8s-01 ~]# kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
查看Deployment
[root@k8s-01 ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 16s
- UP-TO-DATE 的 replica 的數目已經達到了配置中要求的數目。
- CURRENT 的 replica 數表示 Deployment 管理的 replica 數量
- AVAILABLE 的 replica 數是當前可用的 replica 數量。
查看RS和pod
[root@k8s-01 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-56689dc4b8 3 3 3 29s
[root@k8s-01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-56689dc4b8-9v72r 1/1 Running 1 26m
nginx-deployment-56689dc4b8-mt4n2 1/1 Running 1 26m
nginx-deployment-56689dc4b8-twlx2 1/1 Running 1 26m
查看Deployment擴展信息
[root@k8s-01 ~]# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 3/3 3 3 28m nginx nginx:1.13.12 app=nginx
查看pod的lables
[root@k8s-01 ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-deployment-56689dc4b8-9v72r 1/1 Running 1 30m app=nginx,pod-template-hash=56689dc4b8
nginx-deployment-56689dc4b8-mt4n2 1/1 Running 1 30m app=nginx,pod-template-hash=56689dc4b8
nginx-deployment-56689dc4b8-twlx2 1/1 Running 1 30m app=nginx,pod-template-hash=56689dc4b8
注意: pod-template-has
這個 label 不是用戶指定的!
注意上面示例輸出中的 pod label 裏的 pod-template-hash label。當 Deployment 創建或者接管 ReplicaSet 時,Deployment controller 會自動爲 Pod 添加 pod-template-hash label。這樣做的目的是防止 Deployment 的子ReplicaSet 的 pod 名字重複。通過將 ReplicaSet 的 PodTemplate 進行哈希散列,使用生成的哈希值作爲 label 的值,並添加到 ReplicaSet selector 裏、 pod template label 和 ReplicaSet 管理中的 Pod 上。
二、更新Deployment
更新Deployment,並增加–recode參數
[root@k8s-01 ~]# kubectl set image deployment nginx-deployment nginx=nginx:1.14.2 --record
deployment.apps/nginx-deployment image updated
查看更新狀態
[root@k8s-01 ~]# kubectl rollout status deployment nginx-deployment
deployment "nginx-deployment" successfully rolled out
查看更新後的Deploymnet
[root@k8s-01 ~]# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 3/3 3 3 49m nginx nginx:1.14.2 app=nginx
可以看到,一開始定義的nginx版本是1.13.12,現在已經變成了1.14.2 。
三、Deployment升級歷史
查看升級歷史
[root@k8s-01 ~]# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployment nginx-deployment nginx=nginx:1.14.2 --record=true
因爲我們創建 Deployment 的時候使用了–record參數可以記錄命令,我們可以很方便的查看每次 revision 的變化。可以看到有兩次的歷史記錄。
查看單個revision 的詳細信息:
[root@k8s-01 ~]# kubectl rollout history deployment nginx-deployment --revision=1
deployment.apps/nginx-deployment with revision #1
Pod Template:
Labels: app=nginx
pod-template-hash=56689dc4b8
Containers:
nginx:
Image: nginx:1.13.12
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
四、Deployment版本回滾
回滾到上一個版本
[root@k8s-01 ~]# kubectl rollout undo deployment nginx-deployment
deployment.apps/nginx-deployment rolled back
[root@k8s-01 ~]# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 3/3 3 3 54m nginx nginx:1.13.12 app=nginx
很神奇吧,可以直接進行回滾,真是太舒服了。
還可以使用--revision
參數指定某個歷史版本:
[root@k8s-01 ~]# kubectl rollout undo deployment nginx-deployment --to-revision=2
deployment.apps/nginx-deployment rolled back
[root@k8s-01 ~]# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 3/3 3 3 57m nginx nginx:1.14.2 app=nginx
注意:版本號在Deployment的升級歷史中查找
五、Deployment擴容
[root@k8s-01 ~]# kubectl scale deployment nginx-deployment --replicas 2
deployment.apps/nginx-deployment scaled
[root@k8s-01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-574b87c764-b6jhm 1/1 Running 0 3m25s
nginx-deployment-574b87c764-tgsb8 1/1 Running 0 3m24s
[root@k8s-01 ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 63m
[root@k8s-01 ~]# kubectl scale deployment nginx-deployment --replicas 4
deployment.apps/nginx-deployment scaled
[root@k8s-01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-574b87c764-7sw2x 1/1 Running 0 3s
nginx-deployment-574b87c764-9mnmn 1/1 Running 0 3s
nginx-deployment-574b87c764-b6jhm 1/1 Running 0 3m36s
nginx-deployment-574b87c764-tgsb8 1/1 Running 0 3m35s
[root@k8s-01 ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 4/4 4 4 64m