一、deployment部署控制器概念
? ? ? ? 在學(xué)習(xí)rc和rs控制器資源時(shí),我們指導(dǎo),這兩個(gè)資源都是控制pod的副本數(shù)量的,但是,他們兩個(gè)有個(gè)缺點(diǎn),就是在部署新版本pod或者回滾代碼的時(shí)候,需要先apply資源清單,然后再刪除現(xiàn)有pod,通過(guò)資源控制,重新拉取新的pod來(lái)實(shí)現(xiàn)回滾或者迭代升級(jí);
? ? ? ? 那么deployment部署控制器資源,就因此而誕生了;
? ? ? ? deployments資源,實(shí)際上就是用來(lái)專門部署業(yè)務(wù)代碼的控制器,專門用于企業(yè)業(yè)務(wù)代碼的升級(jí)和回滾;
? ? ? ? 所以,這個(gè)資源非常的重要;
? ? ? ? deployment部署控制器,實(shí)際上控制的是rs副本控制器,如果說(shuō)rs副本控制器是控制pod的副本數(shù)量的,那么deployment就是專門控制rs控制器資源的;
二、deployment資源的清單編寫
? ? ? ? deployment資源與replicaset資源的清單編寫方式?jīng)]什么區(qū)別,只是kind的類型換成deployment就可以了,就實(shí)現(xiàn)了資源清單的編輯;
[root@k8s231 deployment]# cat dm.yaml?
apiVersion: apps/v1
kind: Deployment
metadata:
? name: dm01
spec:
? #控制pod的副本數(shù)量
? replicas: 7
? #指定標(biāo)簽選擇器,基于標(biāo)簽匹配pod
? selector:
? ? #聲明基于標(biāo)簽匹配pod;
? ? matchLabels:
? ? ? k8s: xinjizhiwa
? #pod的編寫,定義pod模板;
? template:
? ? metadata:
? ? ? name: pod01
? ? ? labels:
? ? ? ? k8s: xinjizhiwa
? ? spec:
? ? ? containers:
? ? ? - name: c1
? ? ? ? image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v1
? ? ? ? ports:
? ? ? ? - containerPort: 80
[root@k8s231 deployment]# kubectl apply -f dm.yaml
?三、小結(jié)
我們先以查看標(biāo)簽的方式,查看一下pod,可以看到下圖中,多出來(lái)一個(gè)自動(dòng)生成的標(biāo)簽;
[root@k8s231 deployment]# kubectl get pods --show-labels
deployment:是用來(lái)部署服務(wù)的一個(gè)資源,是常見的,企業(yè)中經(jīng)常用的資源控制器;
功能:
? ? ? ? 1,管理rs資源,通過(guò)rs資源管理pod;
? ? ? ? 2,它劇本上線部署、副本設(shè)置、滾動(dòng)升級(jí)、回滾等功能;
? ? ? ? 3,它也提供了聲明式更新,可以使用apply命令進(jìn)行更新鏡像版本之類的能力‘
使用場(chǎng)景:企業(yè)部署迭代應(yīng)用
原理:
????????通過(guò)“標(biāo)簽”管理,實(shí)現(xiàn)rs資源的控制,它會(huì)在自動(dòng)創(chuàng)建rs的過(guò)程中給rs自動(dòng)生成一個(gè)特有的標(biāo)簽(專屬于deployment),當(dāng)apply更新清單的時(shí)候,它會(huì)通過(guò)標(biāo)簽選定是使用歷史的rs還是重新創(chuàng)建rs;
四、deployment實(shí)現(xiàn)升級(jí)和回滾
1,編輯deployment資源清單(v1版本)
[root@k8s231 deployment]# cat dm.yaml?
apiVersion: apps/v1
kind: Deployment
metadata:
? name: dm01
spec:
? #控制pod的副本數(shù)量
? replicas: 7
? #指定標(biāo)簽選擇器,基于標(biāo)簽匹配pod
? selector:
? ? #聲明基于標(biāo)簽匹配pod;
? ? matchLabels:
? ? ? k8s: xinjizhiwa
? #pod的編寫,定義pod模板;
? template:
? ? metadata:
? ? ? name: pod01
? ? ? labels:
? ? ? ? k8s: xinjizhiwa
? ? spec:
? ? ? containers:
? ? ? - name: c1
? ? ? ? image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v1
? ? ? ? ports:
? ? ? ? - containerPort: 80
2,創(chuàng)建deploy資源(V1)
[root@k8s231 deployment]# kubectl apply -f dm.yaml?
3,創(chuàng)建service資源用于訪問
· 編輯svc資源清單
[root@k8s231 deployment]# vim svc.yaml
apiVersion: v1
kind: Service
metadata:
? name: svc01
spec:
? type: NodePort
? selector:
? ? k8s: xinjizhiwa
? ClusterIP: 10.200.200.200
? ports:
? - port: 99
? ? targetPort: 80
? ? nodePort: 31000
· 創(chuàng)建svc資源
[root@k8s231 deployment]# kubectl apply -f svc.yaml
· 瀏覽器訪問
4,修改deploy清單中pod鏡像版本為V2
[root@k8s231 deployment]# cat dm.yaml?
apiVersion: apps/v1
kind: Deployment
metadata:
? name: dm01
spec:
? replicas: 7
? selector:
? ? matchLabels:
? ? ? k8s: xinjizhiwa
? template:
? ? metadata:
? ? ? name: pod01
? ? ? labels:
? ? ? ? k8s: xinjizhiwa
? ? spec:
? ? ? containers:
? ? ? - name: c1? ? ? ?#將鏡像版本修改為V2
? ? ? ? image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v2
? ? ? ? ports:
? ? ? ? - containerPort: 80
5,重新apply一下deploy資源
[root@k8s231 deployment]# kubectl apply -f dm.yaml
6,瀏覽器刷新查看是否迭代成功
發(fā)現(xiàn),版本已經(jīng)更新;
7,小結(jié)
? ? ? ? deployment,不需要?jiǎng)h除原有的pod,只需要apply重新更新一下資源清單,即可實(shí)現(xiàn)產(chǎn)品迭代,同比與rc和rs資源,優(yōu)勢(shì)明顯;
? ? ? ? deployment資源,在apply升級(jí)后,是又重新創(chuàng)建了rs資源,也就是再升級(jí)的過(guò)程中,有兩個(gè)rs資源;
? ? ? ? 每修改一次鏡像,就創(chuàng)建一個(gè)rs資源,我們選擇使用哪個(gè)鏡像,就會(huì)將這個(gè)鏡像創(chuàng)建相應(yīng)的pod副本數(shù),不是用的,就逐漸歸零;
五、deployment的升級(jí)策略
? ? ? ? 什么事升級(jí)策略?就是升級(jí)時(shí)過(guò)程的控制策略;
1,編輯資源清單
[root@k8s231 deployment]# cat dm.yaml?
apiVersion: apps/v1
kind: Deployment
metadata:
? name: dm01
spec:
? #聲明設(shè)置升級(jí)策略
? strategy:
? ? #設(shè)置升級(jí)的策略類型,類型有兩種;
? ? #第一種:Recreate:先停止所有pod,再批量創(chuàng)建新的pod;生產(chǎn)環(huán)境不建議使用,因?yàn)橛脩粼诖藭r(shí)會(huì)訪問不到服務(wù);
? ? #第二種:RollingUpdate:滾動(dòng)更新,即實(shí)現(xiàn)部分更新,逐漸替換掉原有的pod,也就是默認(rèn)的策略;
? ? type: RollingUpdate
? ? #如果設(shè)置了滾動(dòng)更新RollingUpdate類型,還需要設(shè)置更新的策略;
? ? rollingUpdate:
? ? ? #在原有pod副本數(shù)量的基礎(chǔ)上,多啟動(dòng)pod的數(shù)量(也就是說(shuō),更新過(guò)程中同時(shí)可以存在2+副本數(shù)個(gè)pod,新舊版本一起)
? ? ? maxSurge: 2
? ? ? #在升級(jí)的過(guò)程中最大不可訪問的pod的數(shù)量(也就是說(shuō),pod副本數(shù)-1的數(shù)量可以被訪問)
? ? ? maxUnavailable: 1
? replicas: 7
? selector:
? ? matchLabels:
? ? ? k8s: xinjizhiwa
? template:
? ? metadata:
? ? ? name: pod01
? ? ? labels:
? ? ? ? k8s: xinjizhiwa
? ? spec:
? ? ? containers:
? ? ? - name: c1
? ? ? ? image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v2
? ? ? ? ports:
? ? ? ? - containerPort: 80
2,升級(jí)創(chuàng)建資源
[root@k8s231 deployment]# kubectl apply -f dm.yaml
六、藍(lán)綠發(fā)布
1,概念
? ? ? ? 藍(lán)綠發(fā)布,就是準(zhǔn)備兩套代碼,不需要停止老版本(不影響上一個(gè)版本的用戶訪問),而是在另一套環(huán)境中部署新版本然后進(jìn)行測(cè)試,測(cè)試通過(guò)后將用戶流量切換到新的版本,其特點(diǎn)是業(yè)務(wù)沒有終端,升級(jí)風(fēng)險(xiǎn)相對(duì)較??;
? ? ? ? 實(shí)現(xiàn)方式:
? ? ? ? 1,部署當(dāng)前版本代碼
? ? ? ? 2,部署svc資源
? ? ? ? 3,部署新版本使用新的deployment名稱,新的標(biāo)簽
? ? ? ? 4,切換svc標(biāo)簽到新的pod中實(shí)現(xiàn)業(yè)務(wù)切換;
2,準(zhǔn)備“藍(lán)環(huán)境”版本v1
· 編輯deployment資源清單
[root@k8s231 deployment]# cat dm.yaml?
apiVersion: apps/v1
kind: Deployment
metadata:
? name: dm01
spec:
? replicas: 7
? selector:
? ? matchLabels:
? ? ? k8s: xinjizhiwa
? template:
? ? metadata:
? ? ? name: pod01
? ? ? labels:
? ? ? ? k8s: xinjizhiwa
? ? spec:
? ? ? containers:
? ? ? - name: c1
? ? ? ? image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v1
? ? ? ? ports:
? ? ? ? - containerPort: 80
· 編輯svc資源
[root@k8s231 deployment]# cat svc.yaml?
apiVersion: v1
kind: Service
metadata:
? name: svc01
spec:
? type: NodePort
? selector:
? ? k8s: xinjizhiwa
? clusterIP: 10.200.200.200
? ports:
? - port: 99
? ? targetPort: 80
? ? nodePort: 31000
· 創(chuàng)建svc與deployment資源(藍(lán)環(huán)境的)
[root@k8s231 deployment]# kubectl apply -f dm.yaml
[root@k8s231 deployment]# kubectl apply -f svc.yaml
· 瀏覽器訪問
藍(lán)環(huán)境v1準(zhǔn)備完畢
3,準(zhǔn)備“綠環(huán)境”v2
· 編輯deployment資源清單
[root@k8s231 deployment]# vim dm-green.yaml?
apiVersion: apps/v1
kind: Deployment
metadata:
? name: dm02
spec:
? replicas: 7
? selector:
? ? matchLabels:
? ? ? k8s: k8s
? template:
? ? metadata:
? ? ? name: pod01
? ? ? labels:
? ? ? ? k8s: k8s
? ? spec:
? ? ? containers:
? ? ? - name: c1
? ? ? ? image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v2
? ? ? ? ports:
? ? ? ? - containerPort: 80
· 創(chuàng)建deployment資源(綠環(huán)境的)
[root@k8s231 deployment]# kubectl apply -f dm-green.yaml
4,切換svc資源的標(biāo)簽,讓其指向新版本
· 修改svc資源清單
[root@k8s231 deployment]# cat svc.yaml?
apiVersion: v1
kind: Service
metadata:
? name: svc01
spec:
? type: NodePort
? selector:? ? #修改標(biāo)簽,指向新的pod標(biāo)簽
? ? k8s: k8s
? clusterIP: 10.200.200.200
? ports:
? - port: 99
? ? targetPort: 80
? ? nodePort: 31000
· 重新apply資源清單(svc)
[root@k8s231 deployment]# kubectl apply -f svc.yaml
5,瀏覽器訪問測(cè)試
可見,切換新版本成功;
七、灰度發(fā)布(金絲雀發(fā)布)
? ? ? ? 實(shí)現(xiàn)的機(jī)制:
? ? ? ? 1,部署老版本,使用多副本(模擬正式環(huán)境)
? ? ? ? 2,部署svc,匹配標(biāo)簽
? ? ? ? 3,部署新版本,標(biāo)簽與老版本標(biāo)簽一致(讓svc能夠訪問到,副本從0開始)
? ? ? ? 4,灰度版本測(cè)試沒有問題,將恢復(fù)版本的副本數(shù)量,逐漸調(diào)高增加為生產(chǎn)數(shù)量;
? ? ? ? 5,將舊版本逐漸調(diào)低至0,此時(shí)流量全部跑到了新版本上;
1,部署老版本
[root@k8s231 deployment]# vim dm.yaml?
apiVersion: apps/v1
kind: Deployment
metadata:
? name: dm01
spec:
? replicas: 7
? selector:
? ? matchLabels:
? ? ? k8s: k8s
? template:
? ? metadata:
? ? ? name: pod01
? ? ? labels:
? ? ? ? k8s: xinjizhiwa
? ? spec:
? ? ? containers:
? ? ? - name: c1
? ? ? ? image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v1
? ? ? ? ports:
? ? ? ? - containerPort: 80
[root@k8s231 deployment]# kubectl apply -f dm.yaml
2,部署新版本
[root@k8s231 deployment]# cat dm-green.yaml?
apiVersion: apps/v1
kind: Deployment
metadata:
? name: dm02
spec:? #副本設(shè)置為0;
? replicas: 0
? selector:
? ? matchLabels:
? ? ? k8s: k8s
? template:
? ? metadata:
? ? ? name: pod01
? ? ? labels:
? ? ? ? k8s: k8s
? ? spec:
? ? ? containers:
? ? ? - name: c1
? ? ? ? image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v2
? ? ? ? ports:
? ? ? ? - containerPort: 80
[root@k8s231 deployment]# kubectl apply -f dm-green.yaml
3,部署svc
[root@k8s231 deployment]# cat svc.yaml?
apiVersion: v1
kind: Service
metadata:
? name: svc01
spec:
? type: NodePort
? selector:
? ? k8s: k8s
? clusterIP: 10.200.200.200
? ports:
? - port: 99
? ? targetPort: 80
? ? nodePort: 31000
[root@k8s231 deployment]# kubectl apply -f svc.yaml
4,將新版本的副本逐漸調(diào)高
5,將舊版本的副本逐漸調(diào)低
至此,灰度發(fā)布,學(xué)習(xí)完畢;
? ? ? ? 灰度發(fā)布就是讓新舊版本,一起上線,舊版本和新版本讓用戶隨機(jī)訪問到,然后沒有業(yè)務(wù)問題之后,逐漸調(diào)高新版本副本數(shù)量,逐漸調(diào)低舊版本副本數(shù)量,從而達(dá)到灰度發(fā)布;
#########################################文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-832613.html
至此,deployment部署控制器學(xué)習(xí)完畢;
#########################################
接下來(lái),我們需要拿一個(gè)案例,來(lái)整體回顧一下,我們學(xué)過(guò)的知識(shí);
#########################################
接下來(lái),就是k8s的進(jìn)階學(xué)習(xí)了,你準(zhǔn)備好了嗎?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-832613.html
到了這里,關(guān)于15-k8s控制器資源-deployment/部署控制器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!