K8s Pod 控制器介紹及應(yīng)用示例
Kubernetes 官方文檔:Pod 控制器
Pod控制器介紹
Pod是kubernetes的最小管理單元,在kubernetes中,按照pod的創(chuàng)建方式可以將其分為兩類(lèi):
-
自主式pod:kubernetes直接創(chuàng)建出來(lái)的Pod,這種pod刪除后就沒(méi)有了,也不會(huì)重建
-
控制器創(chuàng)建的pod:kubernetes通過(guò)控制器創(chuàng)建的pod,這種pod刪除了之后還會(huì)自動(dòng)重建
什么是Pod控制器Pod控制器是管理pod的中間層,使用Pod控制器之后,只需要告訴Pod控制器,想要多少個(gè)什么樣的Pod就可以了,它會(huì)創(chuàng)建出滿(mǎn)足條件的Pod并確保每一個(gè)Pod資源處于用戶(hù)期望的目標(biāo)狀態(tài)。如果Pod資源在運(yùn)行中出現(xiàn)故障,它會(huì)基于指定策略重新編排Pod。
在kubernetes中,有很多類(lèi)型的pod控制器,每種都有自己的適合的場(chǎng)景,常見(jiàn)的有下面這些:
-
ReplicationController:比較原始的pod控制器,已經(jīng)被廢棄,由ReplicaSet替代
-
ReplicaSet:保證副本數(shù)量一直維持在期望值,并支持pod數(shù)量擴(kuò)縮容,鏡像版本升級(jí)
-
Deployment:通過(guò)控制ReplicaSet來(lái)控制Pod,并支持滾動(dòng)升級(jí)、回退版本
-
Horizontal Pod Autoscaler:可以根據(jù)集群負(fù)載自動(dòng)水平調(diào)整Pod的數(shù)量,實(shí)現(xiàn)削峰填谷
-
DaemonSet:在集群中的指定Node上運(yùn)行且僅運(yùn)行一個(gè)副本,一般用于守護(hù)進(jìn)程類(lèi)的任務(wù)
-
Job:它創(chuàng)建出來(lái)的pod只要完成任務(wù)就立即退出,不需要重啟或重建,用于執(zhí)行一次性任務(wù)
-
Cronjob:它創(chuàng)建的Pod負(fù)責(zé)周期性任務(wù)控制,不需要持續(xù)后臺(tái)運(yùn)行
-
StatefulSet:管理有狀態(tài)應(yīng)用
ReplicaSet(RS)
ReplicaSet的主要作用是保證一定數(shù)量的pod正常運(yùn)行,它會(huì)持續(xù)監(jiān)聽(tīng)這些Pod的運(yùn)行狀態(tài),一旦Pod發(fā)生故障,就會(huì)重啟或重建。同時(shí)它還支持對(duì)pod數(shù)量的擴(kuò)縮容和鏡像版本的升降級(jí)。

ReplicaSet的資源清單文件:
apiVersion: apps/v1 # 版本號(hào)
kind: ReplicaSet # 類(lèi)型
metadata: # 元數(shù)據(jù)
name: # rs名稱(chēng)
namespace: # 所屬命名空間
labels: #標(biāo)簽
controller: rs
spec: # 詳情描述
replicas: 3 # 副本數(shù)量
selector: # 選擇器,通過(guò)它指定該控制器管理哪些pod
matchLabels: # Labels匹配規(guī)則
app: nginx-pod
matchExpressions: # Expressions匹配規(guī)則
- {key: app, operator: In, values: [nginx-pod]}
template: # 模板,當(dāng)副本數(shù)量不足時(shí),會(huì)根據(jù)下面的模板創(chuàng)建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.18.0
ports:
- containerPort: 80
在這里面,需要新了解的配置項(xiàng)就是spec下面幾個(gè)選項(xiàng):
-
replicas:指定副本數(shù)量,其實(shí)就是當(dāng)前rs創(chuàng)建出來(lái)的pod的數(shù)量,默認(rèn)為1
-
selector:選擇器,它的作用是建立pod控制器和pod之間的關(guān)聯(lián)關(guān)系,采用的Label Selector機(jī)制
在pod模板上定義label,在控制器上定義選擇器,就可以表明當(dāng)前控制器能管理哪些pod了
-
template:模板,就是當(dāng)前控制器創(chuàng)建pod所使用的模板板,里面其實(shí)就是前一章學(xué)過(guò)的pod的定義
創(chuàng)建ReplicaSet
創(chuàng)建pc-replicaset.yaml文件,內(nèi)容如下:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: pc-replicaset
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.18.0
# 創(chuàng)建rs
[root@k8s-master01 ~]# kubectl create -f pc-replicaset.yaml
replicaset.apps/pc-replicaset created
# 查看rs
# DESIRED:期望副本數(shù)量
# CURRENT:當(dāng)前副本數(shù)量
# READY:已經(jīng)準(zhǔn)備好提供服務(wù)的副本數(shù)量
[root@k8s-master01 ~]# kubectl get rs pc-replicaset -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 3 3 3 22s nginx nginx:1.18.0 app=nginx-pod
# 查看當(dāng)前控制器創(chuàng)建出來(lái)的pod
# 這里發(fā)現(xiàn)控制器創(chuàng)建出來(lái)的pod的名稱(chēng)是在控制器名稱(chēng)后面拼接了-xxxxx隨機(jī)碼
[root@k8s-master01 ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-replicaset-6vmvt 1/1 Running 0 54s
pc-replicaset-fmb8f 1/1 Running 0 54s
pc-replicaset-snrk2 1/1 Running 0 54s
擴(kuò)縮容
# 編輯rs的副本數(shù)量,修改spec:replicas: 6即可
[root@k8s-master01 ~]# kubectl edit rs pc-replicaset -n dev
replicaset.apps/pc-replicaset edited
# 查看pod
[root@k8s-master01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pc-replicaset-6vmvt 1/1 Running 0 114m
pc-replicaset-cftnp 1/1 Running 0 10s
pc-replicaset-fjlm6 1/1 Running 0 10s
pc-replicaset-fmb8f 1/1 Running 0 114m
pc-replicaset-s2whj 1/1 Running 0 10s
pc-replicaset-snrk2 1/1 Running 0 114m
# 當(dāng)然也可以直接使用命令實(shí)現(xiàn)
# 使用scale命令實(shí)現(xiàn)擴(kuò)縮容, 后面--replicas=n直接指定目標(biāo)數(shù)量即可
[root@k8s-master01 ~]# kubectl scale rs pc-replicaset --replicas=2 -n dev
replicaset.apps/pc-replicaset scaled
# 命令運(yùn)行完畢,立即查看,發(fā)現(xiàn)已經(jīng)有4個(gè)開(kāi)始準(zhǔn)備退出了
[root@k8s-master01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pc-replicaset-6vmvt 0/1 Terminating 0 118m
pc-replicaset-cftnp 0/1 Terminating 0 4m17s
pc-replicaset-fjlm6 0/1 Terminating 0 4m17s
pc-replicaset-fmb8f 1/1 Running 0 118m
pc-replicaset-s2whj 0/1 Terminating 0 4m17s
pc-replicaset-snrk2 1/1 Running 0 118m
#稍等片刻,就只剩下2個(gè)了
[root@k8s-master01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pc-replicaset-fmb8f 1/1 Running 0 119m
pc-replicaset-snrk2 1/1 Running 0 119m
鏡像升級(jí)
# 編輯rs的容器鏡像 - image: nginx:1.182
[root@k8s-master01 ~]# kubectl edit rs pc-replicaset -n dev
replicaset.apps/pc-replicaset edited
# 再次查看,發(fā)現(xiàn)鏡像版本已經(jīng)變更了
[root@k8s-master01 ~]# kubectl get rs -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES ...
pc-replicaset 2 2 2 140m nginx nginx:1.182 ...
# 同樣的道理,也可以使用命令完成這個(gè)工作
# kubectl set image rs rs名稱(chēng) 容器=鏡像版本 -n namespace
[root@k8s-master01 ~]# kubectl set image rs pc-replicaset nginx=nginx:1.18.0 -n dev
replicaset.apps/pc-replicaset image updated
# 再次查看,發(fā)現(xiàn)鏡像版本已經(jīng)變更了
[root@k8s-master01 ~]# kubectl get rs -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES ...
pc-replicaset 2 2 2 145m nginx nginx:1.18.0 ...
刪除ReplicaSet
# 使用kubectl delete命令會(huì)刪除此RS以及它管理的Pod
# 在kubernetes刪除RS前,會(huì)將RS的replicasclear調(diào)整為0,等待所有的Pod被刪除后,在執(zhí)行RS對(duì)象的刪除
[root@k8s-master01 ~]# kubectl delete rs pc-replicaset -n dev
replicaset.apps "pc-replicaset" deleted
[root@k8s-master01 ~]# kubectl get pod -n dev -o wide
No resources found in dev namespace.
# 如果希望僅僅刪除RS對(duì)象(保留Pod),可以使用kubectl delete命令時(shí)添加--cascade=false選項(xiàng)(不推薦)。
[root@k8s-master01 ~]# kubectl delete rs pc-replicaset -n dev --cascade=false
replicaset.apps "pc-replicaset" deleted
[root@k8s-master01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pc-replicaset-cl82j 1/1 Running 0 75s
pc-replicaset-dslhb 1/1 Running 0 75s
# 也可以使用yaml直接刪除(推薦)
[root@k8s-master01 ~]# kubectl delete -f pc-replicaset.yaml
replicaset.apps "pc-replicaset" deleted
Deployment(Deploy)
為了更好的解決服務(wù)編排的問(wèn)題,kubernetes在V1.2版本開(kāi)始,引入了Deployment控制器。值得一提的是,這種控制器并不直接管理pod,而是通過(guò)管理ReplicaSet來(lái)簡(jiǎn)介管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能更加強(qiáng)大。

Deployment主要功能有下面幾個(gè):
-
支持ReplicaSet的所有功能
-
支持發(fā)布的停止、繼續(xù)
-
支持滾動(dòng)升級(jí)和回滾版本
Deployment的資源清單文件:
apiVersion: apps/v1 # 版本號(hào)
kind: Deployment # 類(lèi)型
metadata: # 元數(shù)據(jù)
name: # rs名稱(chēng)
namespace: # 所屬命名空間
labels: #標(biāo)簽
controller: deploy
spec: # 詳情描述
replicas: 3 # 副本數(shù)量
revisionHistoryLimit: 3 # 保留歷史版本
paused: false # 暫停部署,默認(rèn)是false
progressDeadlineSeconds: 600 # 部署超時(shí)時(shí)間(s),默認(rèn)是600
strategy: # 策略
type: RollingUpdate # 滾動(dòng)更新策略
rollingUpdate: # 滾動(dòng)更新
maxSurge: 30% # 最大額外可以存在的副本數(shù),可以為百分比,也可以為整數(shù)
maxUnavailable: 30% # 最大不可用狀態(tài)的 Pod 的最大值,可以為百分比,也可以為整數(shù)
selector: # 選擇器,通過(guò)它指定該控制器管理哪些pod
matchLabels: # Labels匹配規(guī)則
app: nginx-pod
matchExpressions: # Expressions匹配規(guī)則
- {key: app, operator: In, values: [nginx-pod]}
template: # 模板,當(dāng)副本數(shù)量不足時(shí),會(huì)根據(jù)下面的模板創(chuàng)建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.18.0
ports:
- containerPort: 80
創(chuàng)建deployment
創(chuàng)建pc-deployment.yaml,內(nèi)容如下:
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.18.0
# 創(chuàng)建deployment
[root@k8s-master01 ~]# kubectl create -f pc-deployment.yaml --record=true
deployment.apps/pc-deployment created
# 查看deployment
# UP-TO-DATE 最新版本的pod的數(shù)量
# AVAILABLE 當(dāng)前可用的pod的數(shù)量
[root@k8s-master01 ~]# kubectl get deploy pc-deployment -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
pc-deployment 3/3 3 3 15s
# 查看rs
# 發(fā)現(xiàn)rs的名稱(chēng)是在原來(lái)deployment的名字后面添加了一個(gè)10位數(shù)的隨機(jī)串
[root@k8s-master01 ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-6696798b78 3 3 3 23s
# 查看pod
[root@k8s-master01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-6696798b78-d2c8n 1/1 Running 0 107s
pc-deployment-6696798b78-smpvp 1/1 Running 0 107s
pc-deployment-6696798b78-wvjd8 1/1 Running 0 107s
擴(kuò)縮容
# 變更副本數(shù)量為5個(gè)
[root@k8s-master01 ~]# kubectl scale deploy pc-deployment --replicas=5 -n dev
deployment.apps/pc-deployment scaled
# 查看deployment
[root@k8s-master01 ~]# kubectl get deploy pc-deployment -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
pc-deployment 5/5 5 5 2m
# 查看pod
[root@k8s-master01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-6696798b78-d2c8n 1/1 Running 0 4m19s
pc-deployment-6696798b78-jxmdq 1/1 Running 0 94s
pc-deployment-6696798b78-mktqv 1/1 Running 0 93s
pc-deployment-6696798b78-smpvp 1/1 Running 0 4m19s
pc-deployment-6696798b78-wvjd8 1/1 Running 0 4m19s
# 編輯deployment的副本數(shù)量,修改spec:replicas: 4即可
[root@k8s-master01 ~]# kubectl edit deploy pc-deployment -n dev
deployment.apps/pc-deployment edited
# 查看pod
[root@k8s-master01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-6696798b78-d2c8n 1/1 Running 0 5m23s
pc-deployment-6696798b78-jxmdq 1/1 Running 0 2m38s
pc-deployment-6696798b78-smpvp 1/1 Running 0 5m23s
pc-deployment-6696798b78-wvjd8 1/1 Running 0 5m23s
鏡像更新
deployment支持兩種更新策略:重建更新和滾動(dòng)更新,可以通過(guò)strategy指定策略類(lèi)型,支持兩個(gè)屬性:
strategy:指定新的Pod替換舊的Pod的策略, 支持兩個(gè)屬性:
type:指定策略類(lèi)型,支持兩種策略
Recreate:在創(chuàng)建出新的Pod之前會(huì)先殺掉所有已存在的Pod
RollingUpdate:滾動(dòng)更新,就是殺死一部分,就啟動(dòng)一部分,在更新過(guò)程中,存在兩個(gè)版本Pod
rollingUpdate:當(dāng)type為RollingUpdate時(shí)生效,用于為RollingUpdate設(shè)置參數(shù),支持兩個(gè)屬性:
maxUnavailable:用來(lái)指定在升級(jí)過(guò)程中不可用Pod的最大數(shù)量,默認(rèn)為25%。
maxSurge: 用來(lái)指定在升級(jí)過(guò)程中可以超過(guò)期望的Pod的最大數(shù)量,默認(rèn)為25%。
重建更新
- 編輯pc-deployment.yaml,在spec節(jié)點(diǎn)下添加更新策略
spec:
strategy: # 策略
type: Recreate # 重建更新
- 創(chuàng)建deploy進(jìn)行驗(yàn)證
# 變更鏡像
[root@k8s-master01 ~]# kubectl set image deployment pc-deployment nginx=nginx:1.182 -n dev
deployment.apps/pc-deployment image updated
# 觀察升級(jí)過(guò)程
[root@k8s-master01 ~]# kubectl get pods -n dev -w
NAME READY STATUS RESTARTS AGE
pc-deployment-5d89bdfbf9-65qcw 1/1 Running 0 31s
pc-deployment-5d89bdfbf9-w5nzv 1/1 Running 0 31s
pc-deployment-5d89bdfbf9-xpt7w 1/1 Running 0 31s
pc-deployment-5d89bdfbf9-xpt7w 1/1 Terminating 0 41s
pc-deployment-5d89bdfbf9-65qcw 1/1 Terminating 0 41s
pc-deployment-5d89bdfbf9-w5nzv 1/1 Terminating 0 41s
pc-deployment-675d469f8b-grn8z 0/1 Pending 0 0s
pc-deployment-675d469f8b-hbl4v 0/1 Pending 0 0s
pc-deployment-675d469f8b-67nz2 0/1 Pending 0 0s
pc-deployment-675d469f8b-grn8z 0/1 ContainerCreating 0 0s
pc-deployment-675d469f8b-hbl4v 0/1 ContainerCreating 0 0s
pc-deployment-675d469f8b-67nz2 0/1 ContainerCreating 0 0s
pc-deployment-675d469f8b-grn8z 1/1 Running 0 1s
pc-deployment-675d469f8b-67nz2 1/1 Running 0 1s
pc-deployment-675d469f8b-hbl4v 1/1 Running 0 2s
滾動(dòng)更新
- 編輯pc-deployment.yaml,在spec節(jié)點(diǎn)下添加更新策略
spec:
strategy: # 策略
type: RollingUpdate # 滾動(dòng)更新策略
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
- 創(chuàng)建deploy進(jìn)行驗(yàn)證
# 變更鏡像
[root@k8s-master01 ~]# kubectl set image deployment pc-deployment nginx=nginx:1.183 -n dev
deployment.apps/pc-deployment image updated
# 觀察升級(jí)過(guò)程
[root@k8s-master01 ~]# kubectl get pods -n dev -w
NAME READY STATUS RESTARTS AGE
pc-deployment-c848d767-8rbzt 1/1 Running 0 31m
pc-deployment-c848d767-h4p68 1/1 Running 0 31m
pc-deployment-c848d767-hlmz4 1/1 Running 0 31m
pc-deployment-c848d767-rrqcn 1/1 Running 0 31m
pc-deployment-966bf7f44-226rx 0/1 Pending 0 0s
pc-deployment-966bf7f44-226rx 0/1 ContainerCreating 0 0s
pc-deployment-966bf7f44-226rx 1/1 Running 0 1s
pc-deployment-c848d767-h4p68 0/1 Terminating 0 34m
pc-deployment-966bf7f44-cnd44 0/1 Pending 0 0s
pc-deployment-966bf7f44-cnd44 0/1 ContainerCreating 0 0s
pc-deployment-966bf7f44-cnd44 1/1 Running 0 2s
pc-deployment-c848d767-hlmz4 0/1 Terminating 0 34m
pc-deployment-966bf7f44-px48p 0/1 Pending 0 0s
pc-deployment-966bf7f44-px48p 0/1 ContainerCreating 0 0s
pc-deployment-966bf7f44-px48p 1/1 Running 0 0s
pc-deployment-c848d767-8rbzt 0/1 Terminating 0 34m
pc-deployment-966bf7f44-dkmqp 0/1 Pending 0 0s
pc-deployment-966bf7f44-dkmqp 0/1 ContainerCreating 0 0s
pc-deployment-966bf7f44-dkmqp 1/1 Running 0 2s
pc-deployment-c848d767-rrqcn 0/1 Terminating 0 34m
# 至此,新版本的pod創(chuàng)建完畢,就版本的pod銷(xiāo)毀完畢
# 中間過(guò)程是滾動(dòng)進(jìn)行的,也就是邊銷(xiāo)毀邊創(chuàng)建
滾動(dòng)更新的過(guò)程:

鏡像更新中rs的變化
# 查看rs,發(fā)現(xiàn)原來(lái)的rs的依舊存在,只是pod數(shù)量變?yōu)榱?,而后又新產(chǎn)生了一個(gè)rs,pod數(shù)量為4
# 其實(shí)這就是deployment能夠進(jìn)行版本回退的奧妙所在,后面會(huì)詳細(xì)解釋
[root@k8s-master01 ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-6696798b78 0 0 0 7m37s
pc-deployment-6696798b11 0 0 0 5m37s
pc-deployment-c848d76789 4 4 4 72s
版本回退
deployment支持版本升級(jí)過(guò)程中的暫停、繼續(xù)功能以及版本回退等諸多功能,下面具體來(lái)看.
kubectl rollout: 版本升級(jí)相關(guān)功能,支持下面的選項(xiàng):
-
status 顯示當(dāng)前升級(jí)狀態(tài)
-
history 顯示 升級(jí)歷史記錄
-
pause 暫停版本升級(jí)過(guò)程
-
resume 繼續(xù)已經(jīng)暫停的版本升級(jí)過(guò)程
-
restart 重啟版本升級(jí)過(guò)程
-
undo 回滾到上一級(jí)版本(可以使用--to-revision回滾到指定版本)
# 查看當(dāng)前升級(jí)版本的狀態(tài)
[root@k8s-master01 ~]# kubectl rollout status deploy pc-deployment -n dev
deployment "pc-deployment" successfully rolled out
# 查看升級(jí)歷史記錄
[root@k8s-master01 ~]# 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
3 kubectl create --filename=pc-deployment.yaml --record=true
# 可以發(fā)現(xiàn)有三次版本記錄,說(shuō)明完成過(guò)兩次升級(jí)
# 版本回滾
# 這里直接使用--to-revision=1回滾到了1版本, 如果省略這個(gè)選項(xiàng),就是回退到上個(gè)版本,就是2版本
[root@k8s-master01 ~]# kubectl rollout undo deployment pc-deployment --to-revision=1 -n dev
deployment.apps/pc-deployment rolled back
# 查看發(fā)現(xiàn),通過(guò)nginx鏡像版本可以發(fā)現(xiàn)到了第一版
[root@k8s-master01 ~]# kubectl get deploy -n dev -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES
pc-deployment 4/4 4 4 74m nginx nginx:1.18.0
# 查看rs,發(fā)現(xiàn)第一個(gè)rs中有4個(gè)pod運(yùn)行,后面兩個(gè)版本的rs中pod為運(yùn)行
# 其實(shí)deployment之所以可是實(shí)現(xiàn)版本的回滾,就是通過(guò)記錄下歷史rs來(lái)實(shí)現(xiàn)的,
# 一旦想回滾到哪個(gè)版本,只需要將當(dāng)前版本pod數(shù)量降為0,然后將回滾版本的pod提升為目標(biāo)數(shù)量就可以了
[root@k8s-master01 ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-6696798b78 4 4 4 78m
pc-deployment-966bf7f44 0 0 0 37m
pc-deployment-c848d767 0 0 0 71m
金絲雀發(fā)布
Deployment控制器支持控制更新過(guò)程中的控制,如“暫停(pause)”或“繼續(xù)(resume)”更新操作。
比如有一批新的Pod資源創(chuàng)建完成后立即暫停更新過(guò)程,此時(shí),僅存在一部分新版本的應(yīng)用,主體部分還是舊的版本。然后,再篩選一小部分的用戶(hù)請(qǐng)求路由到新版本的Pod應(yīng)用,繼續(xù)觀察能否穩(wěn)定地按期望的方式運(yùn)行。確定沒(méi)問(wèn)題之后再繼續(xù)完成余下的Pod資源滾動(dòng)更新,否則立即回滾更新操作。這就是所謂的金絲雀發(fā)布。
# 更新deployment的版本,并配置暫停deployment
[root@k8s-master01 ~]# kubectl set image deploy pc-deployment nginx=nginx:1.184 -n dev && kubectl rollout pause deployment pc-deployment -n dev
deployment.apps/pc-deployment image updated
deployment.apps/pc-deployment paused
#觀察更新?tīng)顟B(tài)
[root@k8s-master01 ~]# kubectl rollout status deploy pc-deployment -n dev
Waiting for deployment "pc-deployment" rollout to finish: 2 out of 4 new replicas have been updated...
# 監(jiān)控更新的過(guò)程,可以看到已經(jīng)新增了一個(gè)資源,但是并未按照預(yù)期的狀態(tài)去刪除一個(gè)舊的資源,就是因?yàn)槭褂昧藀ause暫停命令
[root@k8s-master01 ~]# kubectl get rs -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES
pc-deployment-5d89bdfbf9 3 3 3 19m nginx nginx:1.18.0
pc-deployment-675d469f8b 0 0 0 14m nginx nginx:1.182
pc-deployment-6c9f56fcfb 2 2 2 3m16s nginx nginx:1.184
[root@k8s-master01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-5d89bdfbf9-rj8sq 1/1 Running 0 7m33s
pc-deployment-5d89bdfbf9-ttwgg 1/1 Running 0 7m35s
pc-deployment-5d89bdfbf9-v4wvc 1/1 Running 0 7m34s
pc-deployment-6c9f56fcfb-996rt 1/1 Running 0 3m31s
pc-deployment-6c9f56fcfb-j2gtj 1/1 Running 0 3m31s
# 確保更新的pod沒(méi)問(wèn)題了,繼續(xù)更新
[root@k8s-master01 ~]# kubectl rollout resume deploy pc-deployment -n dev
deployment.apps/pc-deployment resumed
# 查看最后的更新情況
[root@k8s-master01 ~]# kubectl get rs -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES
pc-deployment-5d89bdfbf9 0 0 0 21m nginx nginx:1.18.0
pc-deployment-675d469f8b 0 0 0 16m nginx nginx:1.182
pc-deployment-6c9f56fcfb 4 4 4 5m11s nginx nginx:1.184
[root@k8s-master01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-6c9f56fcfb-7bfwh 1/1 Running 0 37s
pc-deployment-6c9f56fcfb-996rt 1/1 Running 0 5m27s
pc-deployment-6c9f56fcfb-j2gtj 1/1 Running 0 5m27s
pc-deployment-6c9f56fcfb-rf84v 1/1 Running 0 37s
刪除Deployment
# 刪除deployment,其下的rs和pod也將被刪除
[root@k8s-master01 ~]# kubectl delete -f pc-deployment.yaml
deployment.apps "pc-deployment" deleted
Horizontal Pod Autoscaler(HPA)
在前面,已經(jīng)可以實(shí)現(xiàn)通過(guò)手工執(zhí)行kubectl scale命令實(shí)現(xiàn)Pod擴(kuò)容或縮容,但是這顯然不符合Kubernetes的定位目標(biāo)--自動(dòng)化、智能化。 Kubernetes期望可以實(shí)現(xiàn)通過(guò)監(jiān)測(cè)Pod的使用情況,實(shí)現(xiàn)pod數(shù)量的自動(dòng)調(diào)整,于是就產(chǎn)生了Horizontal Pod Autoscaler(HPA)這種控制器。
HPA可以獲取每個(gè)Pod利用率,然后和HPA中定義的指標(biāo)進(jìn)行對(duì)比,同時(shí)計(jì)算出需要伸縮的具體值,最后實(shí)現(xiàn)Pod的數(shù)量的調(diào)整。其實(shí)HPA與之前的Deployment一樣,也屬于一種Kubernetes資源對(duì)象,它通過(guò)追蹤分析RC控制的所有目標(biāo)Pod的負(fù)載變化情況,來(lái)確定是否需要針對(duì)性地調(diào)整目標(biāo)Pod的副本數(shù),這是HPA的實(shí)現(xiàn)原理。

接下來(lái),做一個(gè)實(shí)驗(yàn)
1 安裝metrics-server
metrics-server可以用來(lái)收集集群中的資源使用情況
# 安裝git
[root@k8s-master01 ~]# yum install git -y
# 獲取metrics-server, 注意使用的版本
[root@k8s-master01 ~]# git clone -b v0.3.6 https://github.com/kubernetes-incubator/metrics-server
# 修改deployment, 注意修改的是鏡像和初始化參數(shù)
[root@k8s-master01 ~]# cd /root/metrics-server/deploy/1.8+/
[root@k8s-master01 1.8+]# vim metrics-server-deployment.yaml
按圖中添加下面選項(xiàng)
hostNetwork: true
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
args:
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

# 安裝metrics-server
[root@k8s-master01 1.8+]# kubectl apply -f ./
# 查看pod運(yùn)行情況
[root@k8s-master01 1.8+]# kubectl get pod -n kube-system
metrics-server-6b976979db-2xwbj 1/1 Running 0 90s
# 使用kubectl top node 查看資源使用情況
[root@k8s-master01 1.8+]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master01 289m 14% 1582Mi 54%
k8s-node01 81m 4% 1195Mi 40%
k8s-node02 72m 3% 1211Mi 41%
[root@k8s-master01 1.8+]# kubectl top pod -n kube-system
NAME CPU(cores) MEMORY(bytes)
coredns-6955765f44-7ptsb 3m 9Mi
coredns-6955765f44-vcwr5 3m 8Mi
etcd-master 14m 145Mi
...
# 至此,metrics-server安裝完成
2 準(zhǔn)備deployment和servie
創(chuàng)建pc-hpa-pod.yaml文件,內(nèi)容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: dev
spec:
strategy: # 策略
type: RollingUpdate # 滾動(dòng)更新策略
replicas: 1
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.18.0
resources: # 資源配額
limits: # 限制資源(上限)
cpu: "1" # CPU限制,單位是core數(shù)
requests: # 請(qǐng)求資源(下限)
cpu: "100m" # CPU限制,單位是core數(shù)
# 創(chuàng)建service
[root@k8s-master01 1.8+]# kubectl expose deployment nginx --type=NodePort --port=80 -n dev
# 查看
[root@k8s-master01 1.8+]# kubectl get deployment,pod,svc -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx 1/1 1 1 47s
NAME READY STATUS RESTARTS AGE
pod/nginx-7df9756ccc-bh8dr 1/1 Running 0 47s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx NodePort 10.101.18.29 <none> 80:31830/TCP 35s
3 部署HPA
創(chuàng)建pc-hpa.yaml文件,內(nèi)容如下:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: pc-hpa
namespace: dev
spec:
minReplicas: 1 #最小pod數(shù)量
maxReplicas: 10 #最大pod數(shù)量
targetCPUUtilizationPercentage: 3 # CPU使用率指標(biāo)
scaleTargetRef: # 指定要控制的nginx信息
apiVersion: apps/v1
kind: Deployment
name: nginx
# 創(chuàng)建hpa
[root@k8s-master01 1.8+]# kubectl create -f pc-hpa.yaml
horizontalpodautoscaler.autoscaling/pc-hpa created
# 查看hpa
[root@k8s-master01 1.8+]# kubectl get hpa -n dev
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
pc-hpa Deployment/nginx 0%/3% 1 10 1 62s
4 測(cè)試
使用壓測(cè)工具對(duì)service地址172.16.5.4:31830進(jìn)行壓測(cè),然后通過(guò)控制臺(tái)查看hpa和pod的變化
hpa變化
[root@k8s-master01 ~]# kubectl get hpa -n dev -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
pc-hpa Deployment/nginx 0%/3% 1 10 1 4m11s
pc-hpa Deployment/nginx 0%/3% 1 10 1 5m19s
pc-hpa Deployment/nginx 22%/3% 1 10 1 6m50s
pc-hpa Deployment/nginx 22%/3% 1 10 4 7m5s
pc-hpa Deployment/nginx 22%/3% 1 10 8 7m21s
pc-hpa Deployment/nginx 6%/3% 1 10 8 7m51s
pc-hpa Deployment/nginx 0%/3% 1 10 8 9m6s
pc-hpa Deployment/nginx 0%/3% 1 10 8 13m
pc-hpa Deployment/nginx 0%/3% 1 10 1 14m
deployment變化
[root@k8s-master01 ~]# kubectl get deployment -n dev -w
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 11m
nginx 1/4 1 1 13m
nginx 1/4 1 1 13m
nginx 1/4 1 1 13m
nginx 1/4 4 1 13m
nginx 1/8 4 1 14m
nginx 1/8 4 1 14m
nginx 1/8 4 1 14m
nginx 1/8 8 1 14m
nginx 2/8 8 2 14m
nginx 3/8 8 3 14m
nginx 4/8 8 4 14m
nginx 5/8 8 5 14m
nginx 6/8 8 6 14m
nginx 7/8 8 7 14m
nginx 8/8 8 8 15m
nginx 8/1 8 8 20m
nginx 8/1 8 8 20m
nginx 1/1 1 1 20m
pod變化
[root@k8s-master01 ~]# kubectl get pods -n dev -w
NAME READY STATUS RESTARTS AGE
nginx-7df9756ccc-bh8dr 1/1 Running 0 11m
nginx-7df9756ccc-cpgrv 0/1 Pending 0 0s
nginx-7df9756ccc-8zhwk 0/1 Pending 0 0s
nginx-7df9756ccc-rr9bn 0/1 Pending 0 0s
nginx-7df9756ccc-cpgrv 0/1 ContainerCreating 0 0s
nginx-7df9756ccc-8zhwk 0/1 ContainerCreating 0 0s
nginx-7df9756ccc-rr9bn 0/1 ContainerCreating 0 0s
nginx-7df9756ccc-m9gsj 0/1 Pending 0 0s
nginx-7df9756ccc-g56qb 0/1 Pending 0 0s
nginx-7df9756ccc-sl9c6 0/1 Pending 0 0s
nginx-7df9756ccc-fgst7 0/1 Pending 0 0s
nginx-7df9756ccc-g56qb 0/1 ContainerCreating 0 0s
nginx-7df9756ccc-m9gsj 0/1 ContainerCreating 0 0s
nginx-7df9756ccc-sl9c6 0/1 ContainerCreating 0 0s
nginx-7df9756ccc-fgst7 0/1 ContainerCreating 0 0s
nginx-7df9756ccc-8zhwk 1/1 Running 0 19s
nginx-7df9756ccc-rr9bn 1/1 Running 0 30s
nginx-7df9756ccc-m9gsj 1/1 Running 0 21s
nginx-7df9756ccc-cpgrv 1/1 Running 0 47s
nginx-7df9756ccc-sl9c6 1/1 Running 0 33s
nginx-7df9756ccc-g56qb 1/1 Running 0 48s
nginx-7df9756ccc-fgst7 1/1 Running 0 66s
nginx-7df9756ccc-fgst7 1/1 Terminating 0 6m50s
nginx-7df9756ccc-8zhwk 1/1 Terminating 0 7m5s
nginx-7df9756ccc-cpgrv 1/1 Terminating 0 7m5s
nginx-7df9756ccc-g56qb 1/1 Terminating 0 6m50s
nginx-7df9756ccc-rr9bn 1/1 Terminating 0 7m5s
nginx-7df9756ccc-m9gsj 1/1 Terminating 0 6m50s
nginx-7df9756ccc-sl9c6 1/1 Terminating 0 6m50s
DaemonSet(DS)
DaemonSet類(lèi)型的控制器可以保證在集群中的每一臺(tái)(或指定)節(jié)點(diǎn)上都運(yùn)行一個(gè)副本。一般適用于日志收集、節(jié)點(diǎn)監(jiān)控等場(chǎng)景。也就是說(shuō),如果一個(gè)Pod提供的功能是節(jié)點(diǎn)級(jí)別的(每個(gè)節(jié)點(diǎn)都需要且只需要一個(gè)),那么這類(lèi)Pod就適合使用DaemonSet類(lèi)型的控制器創(chuàng)建。

DaemonSet控制器的特點(diǎn):
-
每當(dāng)向集群中添加一個(gè)節(jié)點(diǎn)時(shí),指定的 Pod 副本也將添加到該節(jié)點(diǎn)上
-
當(dāng)節(jié)點(diǎn)從集群中移除時(shí),Pod 也就被垃圾回收了
下面先來(lái)看下DaemonSet的資源清單文件
apiVersion: apps/v1 # 版本號(hào)
kind: DaemonSet # 類(lèi)型
metadata: # 元數(shù)據(jù)
name: # rs名稱(chēng)
namespace: # 所屬命名空間
labels: #標(biāo)簽
controller: daemonset
spec: # 詳情描述
revisionHistoryLimit: 3 # 保留歷史版本
updateStrategy: # 更新策略
type: RollingUpdate # 滾動(dòng)更新策略
rollingUpdate: # 滾動(dòng)更新
maxUnavailable: 1 # 最大不可用狀態(tài)的 Pod 的最大值,可以為百分比,也可以為整數(shù)
selector: # 選擇器,通過(guò)它指定該控制器管理哪些pod
matchLabels: # Labels匹配規(guī)則
app: nginx-pod
matchExpressions: # Expressions匹配規(guī)則
- {key: app, operator: In, values: [nginx-pod]}
template: # 模板,當(dāng)副本數(shù)量不足時(shí),會(huì)根據(jù)下面的模板創(chuàng)建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.18.0
ports:
- containerPort: 80
創(chuàng)建pc-daemonset.yaml,內(nèi)容如下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: pc-daemonset
namespace: dev
spec:
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.18.0
# 創(chuàng)建daemonset
[root@k8s-master01 ~]# kubectl create -f pc-daemonset.yaml
daemonset.apps/pc-daemonset created
# 查看daemonset
[root@k8s-master01 ~]# kubectl get ds -n dev -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES
pc-daemonset 2 2 2 2 2 24s nginx nginx:1.18.0
# 查看pod,發(fā)現(xiàn)在每個(gè)Node上都運(yùn)行一個(gè)pod
[root@k8s-master01 ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pc-daemonset-9bck8 1/1 Running 0 37s 10.244.1.43 node1
pc-daemonset-k224w 1/1 Running 0 37s 10.244.2.74 node2
# 刪除daemonset
[root@k8s-master01 ~]# kubectl delete -f pc-daemonset.yaml
daemonset.apps "pc-daemonset" deleted
Job
Job,主要用于負(fù)責(zé)批量處理(一次要處理指定數(shù)量任務(wù))短暫的一次性(每個(gè)任務(wù)僅運(yùn)行一次就結(jié)束)任務(wù)。Job特點(diǎn)如下:
- 當(dāng)Job創(chuàng)建的pod執(zhí)行成功結(jié)束時(shí),Job將記錄成功結(jié)束的pod數(shù)量
- 當(dāng)成功結(jié)束的pod達(dá)到指定的數(shù)量時(shí),Job將完成執(zhí)行

Job的資源清單文件:
apiVersion: batch/v1 # 版本號(hào)
kind: Job # 類(lèi)型
metadata: # 元數(shù)據(jù)
name: # rs名稱(chēng)
namespace: # 所屬命名空間
labels: #標(biāo)簽
controller: job
spec: # 詳情描述
completions: 1 # 指定job需要成功運(yùn)行Pods的次數(shù)。默認(rèn)值: 1
parallelism: 1 # 指定job在任一時(shí)刻應(yīng)該并發(fā)運(yùn)行Pods的數(shù)量。默認(rèn)值: 1
activeDeadlineSeconds: 30 # 指定job可運(yùn)行的時(shí)間期限,超過(guò)時(shí)間還未結(jié)束,系統(tǒng)將會(huì)嘗試進(jìn)行終止。
backoffLimit: 6 # 指定job失敗后進(jìn)行重試的次數(shù)。默認(rèn)是6
manualSelector: true # 是否可以使用selector選擇器選擇pod,默認(rèn)是false
selector: # 選擇器,通過(guò)它指定該控制器管理哪些pod
matchLabels: # Labels匹配規(guī)則
app: counter-pod
matchExpressions: # Expressions匹配規(guī)則
- {key: app, operator: In, values: [counter-pod]}
template: # 模板,當(dāng)副本數(shù)量不足時(shí),會(huì)根據(jù)下面的模板創(chuàng)建pod副本
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never # 重啟策略只能設(shè)置為Never或者OnFailure
containers:
- name: counter
image: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 2;done"]
關(guān)于重啟策略設(shè)置的說(shuō)明:
如果指定為OnFailure,則job會(huì)在pod出現(xiàn)故障時(shí)重啟容器,而不是創(chuàng)建pod,failed次數(shù)不變
如果指定為Never,則job會(huì)在pod出現(xiàn)故障時(shí)創(chuàng)建新的pod,并且故障pod不會(huì)消失,也不會(huì)重啟,failed次數(shù)加1
如果指定為Always的話(huà),就意味著一直重啟,意味著job任務(wù)會(huì)重復(fù)去執(zhí)行了,當(dāng)然不對(duì),所以不能設(shè)置為Always
創(chuàng)建pc-job.yaml,內(nèi)容如下:
apiVersion: batch/v1
kind: Job
metadata:
name: pc-job
namespace: dev
spec:
manualSelector: true
selector:
matchLabels:
app: counter-pod
template:
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]
# 創(chuàng)建job
[root@k8s-master01 ~]# kubectl create -f pc-job.yaml
job.batch/pc-job created
# 查看job
[root@k8s-master01 ~]# kubectl get job -n dev -o wide -w
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
pc-job 0/1 21s 21s counter busybox:1.30 app=counter-pod
pc-job 1/1 31s 79s counter busybox:1.30 app=counter-pod
# 通過(guò)觀察pod狀態(tài)可以看到,pod在運(yùn)行完畢任務(wù)后,就會(huì)變成Completed狀態(tài)
[root@k8s-master01 ~]# kubectl get pods -n dev -w
NAME READY STATUS RESTARTS AGE
pc-job-rxg96 1/1 Running 0 29s
pc-job-rxg96 0/1 Completed 0 33s
# 接下來(lái),調(diào)整下pod運(yùn)行的總數(shù)量和并行數(shù)量 即:在spec下設(shè)置下面兩個(gè)選項(xiàng)
# completions: 6 # 指定job需要成功運(yùn)行Pods的次數(shù)為6
# parallelism: 3 # 指定job并發(fā)運(yùn)行Pods的數(shù)量為3
# 然后重新運(yùn)行job,觀察效果,此時(shí)會(huì)發(fā)現(xiàn),job會(huì)每次運(yùn)行3個(gè)pod,總共執(zhí)行了6個(gè)pod
[root@k8s-master01 ~]# kubectl get pods -n dev -w
NAME READY STATUS RESTARTS AGE
pc-job-684ft 1/1 Running 0 5s
pc-job-jhj49 1/1 Running 0 5s
pc-job-pfcvh 1/1 Running 0 5s
pc-job-684ft 0/1 Completed 0 11s
pc-job-v7rhr 0/1 Pending 0 0s
pc-job-v7rhr 0/1 Pending 0 0s
pc-job-v7rhr 0/1 ContainerCreating 0 0s
pc-job-jhj49 0/1 Completed 0 11s
pc-job-fhwf7 0/1 Pending 0 0s
pc-job-fhwf7 0/1 Pending 0 0s
pc-job-pfcvh 0/1 Completed 0 11s
pc-job-5vg2j 0/1 Pending 0 0s
pc-job-fhwf7 0/1 ContainerCreating 0 0s
pc-job-5vg2j 0/1 Pending 0 0s
pc-job-5vg2j 0/1 ContainerCreating 0 0s
pc-job-fhwf7 1/1 Running 0 2s
pc-job-v7rhr 1/1 Running 0 2s
pc-job-5vg2j 1/1 Running 0 3s
pc-job-fhwf7 0/1 Completed 0 12s
pc-job-v7rhr 0/1 Completed 0 12s
pc-job-5vg2j 0/1 Completed 0 12s
# 刪除job
[root@k8s-master01 ~]# kubectl delete -f pc-job.yaml
job.batch "pc-job" deleted
CronJob(CJ)
CronJob控制器以Job控制器資源為其管控對(duì)象,并借助它管理pod資源對(duì)象,Job控制器定義的作業(yè)任務(wù)在其控制器資源創(chuàng)建之后便會(huì)立即執(zhí)行,但CronJob可以以類(lèi)似于Linux操作系統(tǒng)的周期性任務(wù)作業(yè)計(jì)劃的方式控制其運(yùn)行時(shí)間點(diǎn)及重復(fù)運(yùn)行的方式。也就是說(shuō),CronJob可以在特定的時(shí)間點(diǎn)(反復(fù)的)去運(yùn)行job任務(wù)。

CronJob的資源清單文件:
apiVersion: batch/v1beta1 # 版本號(hào)
kind: CronJob # 類(lèi)型
metadata: # 元數(shù)據(jù)
name: # rs名稱(chēng)
namespace: # 所屬命名空間
labels: #標(biāo)簽
controller: cronjob
spec: # 詳情描述
schedule: # cron格式的作業(yè)調(diào)度運(yùn)行時(shí)間點(diǎn),用于控制任務(wù)在什么時(shí)間執(zhí)行
concurrencyPolicy: # 并發(fā)執(zhí)行策略,用于定義前一次作業(yè)運(yùn)行尚未完成時(shí)是否以及如何運(yùn)行后一次的作業(yè)
failedJobHistoryLimit: # 為失敗的任務(wù)執(zhí)行保留的歷史記錄數(shù),默認(rèn)為1
successfulJobHistoryLimit: # 為成功的任務(wù)執(zhí)行保留的歷史記錄數(shù),默認(rèn)為3
startingDeadlineSeconds: # 啟動(dòng)作業(yè)錯(cuò)誤的超時(shí)時(shí)長(zhǎng)
jobTemplate: # job控制器模板,用于為cronjob控制器生成job對(duì)象;下面其實(shí)就是job的定義
metadata:
spec:
completions: 1
parallelism: 1
activeDeadlineSeconds: 30
backoffLimit: 6
manualSelector: true
selector:
matchLabels:
app: counter-pod
matchExpressions: 規(guī)則
- {key: app, operator: In, values: [counter-pod]}
template:
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 20;done"]
需要重點(diǎn)解釋的幾個(gè)選項(xiàng):
schedule: cron表達(dá)式,用于指定任務(wù)的執(zhí)行時(shí)間
*/1 * * * *
<分鐘> <小時(shí)> <日> <月份> <星期>
分鐘 值從 0 到 59.
小時(shí) 值從 0 到 23.
日 值從 1 到 31.
月 值從 1 到 12.
星期 值從 0 到 6, 0 代表星期日
多個(gè)時(shí)間可以用逗號(hào)隔開(kāi); 范圍可以用連字符給出;*可以作為通配符; /表示每...
concurrencyPolicy:
Allow: 允許Jobs并發(fā)運(yùn)行(默認(rèn))
Forbid: 禁止并發(fā)運(yùn)行,如果上一次運(yùn)行尚未完成,則跳過(guò)下一次運(yùn)行
Replace: 替換,取消當(dāng)前正在運(yùn)行的作業(yè)并用新作業(yè)替換它
創(chuàng)建pc-cronjob.yaml,內(nèi)容如下:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: pc-cronjob
namespace: dev
labels:
controller: cronjob
spec:
schedule: "*/1 * * * *"
jobTemplate:
metadata:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]
# 創(chuàng)建cronjob
[root@k8s-master01 ~]# kubectl create -f pc-cronjob.yaml
cronjob.batch/pc-cronjob created
# 查看cronjob
[root@k8s-master01 ~]# kubectl get cronjobs -n dev
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
pc-cronjob */1 * * * * False 0 <none> 6s
# 查看job
[root@k8s-master01 ~]# kubectl get jobs -n dev
NAME COMPLETIONS DURATION AGE
pc-cronjob-1592587800 1/1 28s 3m26s
pc-cronjob-1592587860 1/1 28s 2m26s
pc-cronjob-1592587920 1/1 28s 86s
# 查看pod
[root@k8s-master01 ~]# kubectl get pods -n dev
pc-cronjob-1592587800-x4tsm 0/1 Completed 0 2m24s
pc-cronjob-1592587860-r5gv4 0/1 Completed 0 84s
pc-cronjob-1592587920-9dxxq 1/1 Running 0 24s
# 刪除cronjob
[root@k8s-master01 ~]# kubectl delete -f pc-cronjob.yaml
cronjob.batch "pc-cronjob" deleted
出處:http://www.rzrgm.cn/zhangwencheng
版權(quán):本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出 原文鏈接
浙公網(wǎng)安備 33010602011771號(hào)