Deployment介紹
為了更好地解決服務編排的問題甸陌,k8s在V1.2版本開始湘捎,引入了deployment控制器钟沛,值得一提的是,這種控制器并不直接管理pod伏穆,
而是通過管理replicaset來間接管理pod拘泞,即:deployment管理replicaset,replicaset管理pod枕扫。所以deployment比replicaset的功能更強大陪腌。
deployment的主要功能有下面幾個:
- 支持replicaset的所有功能
- 支持發(fā)布的停止、繼續(xù)
- 支持版本的滾動更新和版本回退
deployment的資源清單文件
apiVersion: apps/v1 #版本號
kind: Deployment #類型
metadata: #元數(shù)據(jù)
name: #rs名稱
namespace: #所屬命名空間
labels: #標簽
controller: deploy
spec: #詳情描述
replicas: #副本數(shù)量
revisionHistoryLimit: #保留歷史版本烟瞧,默認是10
paused: #暫停部署诗鸭,默認是false
progressDeadlineSeconds: #部署超時時間(s),默認是600
strategy: #策略
type: RollingUpdates #滾動更新策略
rollingUpdate: #滾動更新
maxSurge: #最大額外可以存在的副本數(shù)燕刻,可以為百分比只泼,也可以為整數(shù)
maxUnavaliable: #最大不可用狀態(tài)的pod的最大值剖笙,可以為百分比卵洗,也可以為整數(shù)
selector: #選擇器,通過它指定該控制器管理哪些pod
matchLabels: #Labels匹配規(guī)則
app: nginx-pod
matchExpressions: #Expression匹配規(guī)則
- {key: app, operator: In, values: [nginx-pod]}
template: #模板弥咪,當副本數(shù)量不足時过蹂,會根據(jù)下面的模板創(chuàng)建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
創(chuàng)建deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
使用配置文件
[root@master ~]# kubectl create -f pc-deployment.yaml
deployment.apps/pc-deployment created
[root@master ~]# kubectl get deploy -n dev -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
pc-deployment 3/3 3 3 16s nginx nginx:1.17.1 app=nginx-pod
查看deployment控制的rs和pod,發(fā)現(xiàn)rs是在deployment之后加了一段字符串聚至,而pod是在rs之后加了一段字符串
[root@master ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-5d89bdfbf9 3 3 3 2m13s
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-5d89bdfbf9-k8j9n 1/1 Running 0 2m42s
pc-deployment-5d89bdfbf9-vw87k 1/1 Running 0 2m42s
pc-deployment-5d89bdfbf9-x7nsm 1/1 Running 0 2m42s
deployment功能
擴縮容
方式一:命令行
kubectl scale deploy deploy名稱 --replicas=pod數(shù)量 -n 命名空間
通過命令行變更pod數(shù)量為5個
[root@master ~]# kubectl scale deploy pc-deployment --replicas=5 -n dev
deployment.apps/pc-deployment scaled
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-5d89bdfbf9-bhcns 1/1 Running 0 83s
pc-deployment-5d89bdfbf9-cfls7 1/1 Running 0 83s
pc-deployment-5d89bdfbf9-k8j9n 1/1 Running 0 8m54s
pc-deployment-5d89bdfbf9-vw87k 1/1 Running 0 8m54s
pc-deployment-5d89bdfbf9-x7nsm 1/1 Running 0 8m54s
方式二:編輯deploy文件
kubectl edit deploy deploy名字 -n 命名空間
通過編輯deploy文件編輯pod數(shù)量為3個
[root@master ~]# kubectl edit deploy pc-deployment -n dev
找到replicas酷勺,將其數(shù)量改為3
spec:
progressDeadlineSeconds: 600
replicas: 3
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-5d89bdfbf9-k8j9n 1/1 Running 0 15m
pc-deployment-5d89bdfbf9-vw87k 1/1 Running 0 15m
pc-deployment-5d89bdfbf9-x7nsm 1/1 Running 0 15m
鏡像更新
deployment支持兩種鏡像更新策略:重建更新和滾動更新(默認),可以通過strategy選項進行配置
strategy:指定新的pod替換舊的pod的策略扳躬,支持兩個屬性:
type:指定策略類型脆诉,支持兩種策略
Recreate:在創(chuàng)建出新的pod之前會先殺掉所有已存在的pod
RollingUpdate:滾動更新,就是殺死一部分贷币,就啟動一部分击胜,在更新過程中,存在兩個版本pod
rollingUpdate:當type為RollingUpdate時生效役纹,用于為RollingUpdate設置參數(shù)偶摔,支持兩個屬性
maxUnavailable:用來指定在升級過程中不可用pod的最大數(shù)量,默認為25%
maxSurge:用來指定在升級過程中可以超過期望的pod的最大數(shù)量促脉,默認為25%
重建更新
編輯pc-deployment.yaml辰斋,在spec節(jié)點下添加更新策略
spec:
strategy: #策略
type: Recreate #重建更新策略
[root@master ~]# vim pc-deployment.yaml
[root@master ~]# kubectl apply -f pc-deployment.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
deployment.apps/pc-deployment configured
創(chuàng)建deploy進行驗證
#首先記錄原本的pod名
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-5d89bdfbf9-bqf86 1/1 Running 0 8s
pc-deployment-5d89bdfbf9-kz6jt 1/1 Running 0 8s
pc-deployment-5d89bdfbf9-z7d9z 1/1 Running 0 8s
#更改pod鏡像
[root@master ~]# kubectl set image deploy pc-deployment nginx=nginx:1.17.2 -n dev
deployment.apps/pc-deployment image updated
#再次查看鏡像
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-675d469f8b-b9rwd 1/1 Running 0 27s
pc-deployment-675d469f8b-kc7rr 1/1 Running 0 27s
pc-deployment-675d469f8b-kxgkq 1/1 Running 0 27s
發(fā)現(xiàn)pod鏡像已經(jīng)改變了
滾動更新
編輯pc-deployment.yaml策州,在spec節(jié)點下添加滾動更新策略(也可以把strategy去掉,因為默認滾動更新策略)
strategy:
type: RollingUpdate #滾動更新策略
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
[root@master ~]# vim pc-deployment.yaml
[root@master ~]# kubectl apply -f pc-deployment.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
deployment.apps/pc-deployment configured
創(chuàng)建deploy進行驗證
#記錄以前的pod
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-5d89bdfbf9-526wf 1/1 Running 0 61s
pc-deployment-5d89bdfbf9-b5x5v 1/1 Running 0 64s
pc-deployment-5d89bdfbf9-kc7hb 1/1 Running 0 59s
#更新鏡像
[root@master ~]# kubectl set image deploy pc-deployment nginx=nginx:1.17.2 -n dev
deployment.apps/pc-deployment image updated
#查看pod狀態(tài)
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-5d89bdfbf9-526wf 0/1 Terminating 0 2m2s
pc-deployment-5d89bdfbf9-b5x5v 1/1 Running 0 2m5s
pc-deployment-5d89bdfbf9-kc7hb 0/1 Terminating 0 2m
pc-deployment-675d469f8b-7vw6x 1/1 Running 0 3s
pc-deployment-675d469f8b-rzq82 0/1 ContainerCreating 0 2s
pc-deployment-675d469f8b-zk4fs 1/1 Running 0 5s
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-675d469f8b-7vw6x 1/1 Running 0 38s
pc-deployment-675d469f8b-rzq82 1/1 Running 0 37s
pc-deployment-675d469f8b-zk4fs 1/1 Running 0 40s
發(fā)現(xiàn)pod是舊的一遍停止新的一邊創(chuàng)建宫仗,最后全變成了新的
滾動更新的過程
鏡像更新中rs的變化
前期準備:
#重建deployment
[root@master ~]# kubectl delete -f pc-deployment.yaml
deployment.apps "pc-deployment" deleted
#添加record參數(shù)够挂,表明創(chuàng)建時記錄
[root@master ~]# kubectl create -f pc-deployment.yaml --record
deployment.apps/pc-deployment created
[root@master ~]# kubectl get deploy,rs,pod -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/pc-deployment 3/3 3 3 81s
NAME DESIRED CURRENT READY AGE
replicaset.apps/pc-deployment-5d89bdfbf9 3 3 3 81s
NAME READY STATUS RESTARTS AGE
pod/pc-deployment-5d89bdfbf9-4bg2j 1/1 Running 0 81s
pod/pc-deployment-5d89bdfbf9-gbt95 1/1 Running 0 81s
pod/pc-deployment-5d89bdfbf9-tstlh 1/1 Running 0 81s
新建兩個xshell窗口,用于監(jiān)聽rs和pod藕夫,在2窗口中監(jiān)聽rs下硕,3窗口中監(jiān)聽pod
#在2窗口中輸入
[root@master ~]# kubectl get rs -n dev -w
NAME DESIRED CURRENT READY AGE
pc-deployment-5d89bdfbf9 3 3 3 6m18s
#在3窗口中輸入
[root@master ~]# kubectl get pod -n dev -w
NAME READY STATUS RESTARTS AGE
pc-deployment-5d89bdfbf9-4bg2j 1/1 Running 0 6m56s
pc-deployment-5d89bdfbf9-gbt95 1/1 Running 0 6m56s
pc-deployment-5d89bdfbf9-tstlh 1/1 Running 0 6m56s
在1窗口中改變pod鏡像
[root@master ~]# kubectl set image deploy pc-deployment nginx=nginx:1.17.2 -n dev
deployment.apps/pc-deployment image updated
查看3窗口中pod的變化,發(fā)現(xiàn)序號5開頭的pod在逐漸暫停汁胆,序號6開頭的pod在逐漸創(chuàng)建
查看2窗口中rs的變化梭姓,可以看見序號5開頭的rs的pod數(shù)在減少嫩码,序號6開頭的rs的pod數(shù)在增加
在1窗口中查看最終rs變化誉尖,發(fā)現(xiàn)原來的rs依舊存在,只是pod數(shù)量變?yōu)榱?,而后又新產(chǎn)生了一個rs烘挫,pod數(shù)量為3,其實這就是deployment能夠進行版本回退的奧妙所在喇颁,后面會詳細解釋
[root@master ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-5d89bdfbf9 0 0 0 11m
pc-deployment-675d469f8b 3 3 3 3m12s
版本回退
deployment支持版本升級過程中的暫停,繼續(xù)功能以及版本回退等諸多功能橡卤,下面具體來看
kubectl rollout:版本升級相關功能柜与,支持下面的選項:
- status:顯示當前升級狀態(tài)
- history:顯示升級歷史記錄
- pause:暫停版本升級過程
- resume:繼續(xù)已經(jīng)暫停的版本升級過程
- restart:重啟版本升級過程
- undo:回滾到上一級版本(可以使用--to-revision回滾到指定版本)
#查看升級狀態(tài)
[root@master ~]# kubectl rollout status deploy pc-deployment -n dev
deployment "pc-deployment" successfully rolled out
#查看升級歷史(注意:如果只顯示版本號說明一開始使用yaml創(chuàng)建文件的時候沒有加上--record命令)
[root@master ~]# kubectl rollout history deploy pc-deployment -n dev
deployment.apps/pc-deployment
REVISION CHANGE-CAUSE
1 kubectl create --filename=pc-deployment.yaml --record=true
2 kubectl create --filename=pc-deployment.yaml --record=true
#版本回滾
#這里使用--to-revision=1回滾到1版本,如果省略這個選項驹溃,則會回退到上個版本
[root@master ~]# kubectl rollout undo deploy pc-deployment --to-revision=1 -n dev
deployment.apps/pc-deployment rolled back
#查看是否回滾成功蚊惯,發(fā)現(xiàn)5序號開頭的rs被啟動了
[root@master ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-5d89bdfbf9 3 3 3 31m
pc-deployment-675d469f8b 0 0 0 22m
金絲雀發(fā)布
deployment支持更新過程中的控制俱诸,如"暫停(pause)"或"繼續(xù)(resume)"更新操作
比如有一批新的pod資源創(chuàng)建完成后立即暫停更新過程寓调,此時,僅存在一部分新版本的應用余黎,主體部分還是舊的版本重窟。然后,再篩選一小部分的用戶請求路由到新的pod應用惧财,繼續(xù)觀察能否穩(wěn)定地按期望的方式運行巡扇。確定沒問題之后再繼續(xù)完成余下的pod資源滾動更新,否則立即回滾更新操作垮衷。這就是所謂的金絲雀發(fā)布厅翔。
#更新deployment版本,并配置暫停deployment
[root@master ~]# kubectl set image deploy pc-deployment nginx=nginx:1.17.2 -n dev && kubectl rollout pause deploy pc-deployment -n dev
deployment.apps/pc-deployment image updated
deployment.apps/pc-deployment paused
#查看rs搀突,發(fā)現(xiàn)老版本rs沒有減少知给,新版本rs增加一個
[root@master ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-5d89bdfbf9 3 3 3 44m
pc-deployment-675d469f8b 1 1 1 35m
#在窗口2中查看deploy狀態(tài),發(fā)現(xiàn)deploy正在等待更新且已經(jīng)有1個更新好了
[root@master ~]# kubectl rollout status deploy pc-deployment -n dev
Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
#在窗口1中繼續(xù)deploy的更新
[root@master ~]# kubectl rollout resume deploy pc-deployment -n dev
deployment.apps/pc-deployment resumed
#查看窗口2的狀態(tài)
Waiting for deployment spec update to be observed...
Waiting for deployment spec update to be observed...
Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "pc-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "pc-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "pc-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "pc-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "pc-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "pc-deployment" successfully rolled out
#在窗口1查看rs更新結(jié)果描姚,發(fā)現(xiàn)老版本均停止涩赢,新版本已經(jīng)創(chuàng)建好
[root@master ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-5d89bdfbf9 0 0 0 49m
pc-deployment-675d469f8b 3 3 3 40m