最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

replicaSet,DaemonSet and Job

2023-07-07 21:23 作者:阿兵云原生  | 我要投稿


ReplicaSet

上一篇講到的 ReplicationController 是用于復(fù)制和在異常的時(shí)候重新調(diào)度節(jié)點(diǎn)的 K8S 組件,后面 K8S 又引入了 ReplicaSet 資源來(lái)替代 ReplicationController

ReplicationController ?和 ReplicaSet 有什么區(qū)別呢?

ReplicationController ?和 ReplicaSet 的行為是完全相同的,但是 ReplicaSet ?的 pod 選擇器表達(dá)能力更強(qiáng)

  • ReplicationController ? 只允許包含某個(gè)標(biāo)簽的匹配 pod

  • ReplicaSet 可以包含特定標(biāo)簽名的 pod ,例如 env=dev 和 env=pro 一起匹配

  • ReplicaSet ?還可以匹配缺少某個(gè)標(biāo)簽的 pod

總之,無(wú)論 ReplicationController ?匹配的標(biāo)簽值是多少,ReplicationController ? 都無(wú)法基于標(biāo)簽名來(lái)進(jìn)行匹配,例如 匹配env=* ?ReplicationController ? 就不行,但是 ?ReplicaSet ?可以

寫一個(gè) ReplicaSet ?Demo

rs 是 ReplicaSet ? 的簡(jiǎn)稱,寫一個(gè) ReplicaSet ? 的 demo

  • api 版本是 apps/v1

此處的 api 版本和之前我們寫到的有些許不一樣,這里解釋一下

此處的 apps 代表的是 api 組的意思

這里的 v1 代表的是 apps 組下的 v1 版本,此處就和我們平時(shí)寫的 路由一樣

  • 副本數(shù) 3 個(gè)

  • 選擇器指定匹配標(biāo)簽為 app=xmt-kubia ,(ReplicationController ? ?是直接寫在 selector 后面)

  • 模板拉取的鏡像是 xiaomotong888/xmtkubia

kubia-rs.yaml

apiVersion:?apps/v1
kind:?ReplicaSet
metadata:
??name:?kubia-rs
spec:
??replicas:?3
??selector:
????matchLabels:
??????app:?xmt-kubia
??template:
????metadata:
??????labels:
????????app:?xmt-kubia
????spec:
??????containers:
??????-?name:?rs-kubia
????????image:?xiaomotong888/xmtkubia
????????ports:
????????-?containerPort:?8080

部署 rs

kubectl create -f kubia-rs.yaml

部署 rs 后,我們可以看到,通過(guò) Kubectl get rs ?查看新建的 rs 基本信息

對(duì)于原本就有的 3 個(gè)標(biāo)簽為 app=xmt-kubia 的 pod 沒(méi)有影響, rs 也沒(méi)有多創(chuàng)建 pod ,這沒(méi)毛病

rs 也是會(huì)去搜索環(huán)境內(nèi)的匹配的標(biāo)簽對(duì)應(yīng)的 pod 個(gè)數(shù),然后和自己配置中的期望做比較,若 期望的大,則增加 pod 數(shù)量,若期望的小,則減少 pod 數(shù)量

感興趣的朋友 也可以使用 kubectl describe 查看一下這個(gè) rs ,和 rc 沒(méi)有什么區(qū)別

ReplicaSet 可以這樣用

上面的例子我我們可以看到的 RepilicaSet 使用 matchLabels 的時(shí)候 好像和 ReplicationController 沒(méi)有什么區(qū)別,那么現(xiàn)在我們可以來(lái)豐富一下我們的選擇,我們可以使用 matchExpressions

例如我們?cè)?yaml 加入 matchExpressions 的時(shí)候,我們可以這樣來(lái)寫

省略多行...
selector:
??matchExpressions:
????-?key:?env
??????operator:?In
??????values:
????????-?dev
省略多行...

例如上面 yaml 代碼段的含義是:

  • 匹配的標(biāo)簽 key 是 env

  • 運(yùn)算符是 In

  • 匹配的 env 對(duì)應(yīng)的 值是有 dev 即可

key

具體的標(biāo)簽 key

operator

運(yùn)算符,有這 4 個(gè)

  • In

Label 的值必須與其中一個(gè)制定的 values 匹配

  • NotIn

Label 的值必須與任何制定的 values 不匹配

  • Exists

pod 必須包含一個(gè)制定的名稱的標(biāo)簽,有沒(méi)有值不關(guān)心,這個(gè)時(shí)候不要指定 values 字段

  • DoesNotExist

pod 的標(biāo)簽名稱不得包含有指定的名稱,這個(gè)時(shí)候不要指定 values 字段

注意

如果我們指定了多個(gè)表達(dá)式,那么需要這些表達(dá)式都是 true 才可以生效,才可以正確匹配

刪除 rs

刪除 rs 的時(shí)候和刪除 rc 的做法是一樣的,默認(rèn)的話都是會(huì)刪除掉 rs 管理的 pod ,如果我們不需要?jiǎng)h除對(duì)應(yīng)的 pod ,那么我們也可以加入 --cascade=false 或者 –cascade=orphan

按照上述方式指定之后,刪除 rs ,就不會(huì)對(duì) pod 有任何影響

DaemonSet

前面說(shuō)到的 ReplicationController ?和 ReplicaSet 都是在 k8s 集群中部署特定的數(shù)量的 pod,但是 pod 具體是運(yùn)行在哪個(gè)節(jié)點(diǎn)上的,不太關(guān)心。

現(xiàn)在我們可以來(lái)分享一個(gè) DaemonSet ,它也是 k8s 中的一種資源

當(dāng)我們希望我們的 pod 正好在每一個(gè)節(jié)點(diǎn)運(yùn)行一個(gè)的時(shí)候,可以使用 DaemonSet 資源來(lái)進(jìn)行管理

DaemonSet 沒(méi)有副本數(shù)的概念,他是檢查每個(gè)節(jié)點(diǎn)里面是否有自己管理的標(biāo)簽對(duì)應(yīng)的 pod,若有就維持,若沒(méi)有就創(chuàng)建

如下是一個(gè) ReplicaSet 和 DaemonSet 管理內(nèi)容和方式的簡(jiǎn)圖:

圖中,我們可以看出 DaemonSet 是每個(gè)節(jié)點(diǎn)分別部署一個(gè) pod ,但是ReplicaSet 只是保證整個(gè)集群中自己管理對(duì)應(yīng)標(biāo)簽的 pod 數(shù)量是 4 個(gè)即可

DaemonSet 的 小案例

DaemonSet 資源也是使用的 apps/v1 ?api 版本

  • 匹配標(biāo)簽 app=ssd

  • pod 模板中我們?cè)O(shè)置該 pod 指定運(yùn)行在 標(biāo)簽為 disk=ssdnode 的節(jié)點(diǎn)上運(yùn)行 ,可以通過(guò) nodeSelector 關(guān)鍵字來(lái)指定

  • 鏡像拉取的是 ?xiaomotong888/xmtkubia

daemonset.yaml

apiVersion:?apps/v1
kind:?DaemonSet
metadata:
??name:?kubia-ds
spec:
??selector:
????matchLabels:
??????app:?ssd
??template:
????metadata:
??????labels:
????????app:?ssd
????spec:
??????nodeSelector:
????????disk:?ssdnode
??????containers:
??????-?name:?rs-kubia
????????image:?xiaomotong888/xmtkubia
????????ports:
????????-?containerPort:?8080

部署 DaemonSet

我們使用命令部署 DaemonSet

kubectl create -f daemonset.yaml

查看 ds 的信息, ds 是 DaemonSet 的簡(jiǎn)稱

kubectl get ds

使用命令查看 node 節(jié)點(diǎn)情況

kubectl get nodes

通過(guò)上圖我們可以看出,部署完 DaemonSet 資源之后,每一項(xiàng)參數(shù)都是 0

原因是,DaemonSet ?查找環(huán)境中沒(méi)有標(biāo)簽是 disk=ssdnode 的節(jié)點(diǎn)

給指定的 node 加上標(biāo)簽 disk=ssdnode

kubectl label node minikube disk=ssdnode

加上標(biāo)簽之后,我們可以看到上述圖片, ?DaemonSet 資源的各項(xiàng)參數(shù)變成了 1,查看 pod 的時(shí)候,也看到了對(duì)應(yīng)的 pod 資源

此處演示使用的是 minikube ,因此只有一個(gè) 節(jié)點(diǎn)

再次修改 node 的標(biāo)簽

我們?cè)俅涡薷?node 標(biāo)簽,那么之前的 pod 是不是會(huì)被終止掉呢?我們來(lái)試試吧

kubectl label node minikube disk=hddnode --overwrite

果然沒(méi)毛病老鐵,當(dāng)我們修改環(huán)境中指定節(jié)點(diǎn)的標(biāo)簽后,由于 DaemonSet ?資源搜索環(huán)境中沒(méi)有自己配置中指定的標(biāo)簽對(duì)應(yīng)的節(jié)點(diǎn),因此,剛才的 pod 就會(huì)被銷毀掉

Job

再來(lái)介紹一下 k8s 中的 Job 資源

Job 資源是運(yùn)行我們運(yùn)行一種 pod,一旦程序運(yùn)行 ok,pod 就會(huì)推出,job 就結(jié)束了,他不會(huì)重啟 pod

當(dāng)然,job 管理的 pod ,如果在運(yùn)行過(guò)程中,發(fā)生了異常,我們是可以配置 Job 重啟 pod 的

如下畫了一個(gè) ReplicaSet 和 Job 管理 pod 的簡(jiǎn)圖:

上圖中我們可以看到,被 ReplicaSet 和 Job 資源管理的 pod,當(dāng)節(jié)點(diǎn)發(fā)生異?;蛘?pod 自身發(fā)生異常的時(shí)候,這些 pod 是會(huì)被重啟的,不需要人為的去操作

但是沒(méi)有被上述資源管理的 pod,一旦發(fā)生異常,就沒(méi)有人負(fù)責(zé)重啟了

Job 案例

創(chuàng)建一個(gè) Job 的資源,也是通過(guò) yaml 的方式

  • 類型為 Job

  • 模板中的重啟策略設(shè)置為 失敗的時(shí)候重啟 restartPolicy: OnFailure此處的策略不能設(shè)置為 Always,設(shè)置成 Always 是會(huì)總是重啟 pod 的

  • 拉取的鏡像是 luksa/batch-job

這個(gè)鏡像是 docker hub 上的鏡像,拉出來(lái)程序啟動(dòng)之后,運(yùn)行 2 分鐘會(huì)結(jié)束程序

myjob.yaml

apiVersion:?batch/v1
kind:?Job
metadata:
??name:?batchjob
spec:
??template:
????metadata:
??????labels:
????????app:?batchjob-xmt
????spec:
??????restartPolicy:?OnFailure
??????containers:
??????-?name:?xmt-kubia-batch
????????image:?luksa/batch-job

部署 Job

kubectl create -f myjob.yaml

可以看到 Job 資源已經(jīng)部署成功了,且 pod 已經(jīng)是在創(chuàng)建中了

pod 運(yùn)行過(guò)程中,我們查看一下這個(gè) pod 的日志

kubectl logs -f batchjob-gpckc

可以看到程序有開始日志的輸出

image-20211226174557691

等到 pod 運(yùn)行 2 分鐘左右的時(shí)候,我們可以繼續(xù)查看日,程序已經(jīng)成功結(jié)束了,且我們的 pod 也進(jìn)行了 Completed 狀態(tài) ,該 Job 也結(jié)束了

上述說(shuō)到的 Job 資源,也可以設(shè)置多個(gè) pod 實(shí)例,可以設(shè)置多個(gè) pod 實(shí)例并行運(yùn)行,也可以設(shè)置串行運(yùn)行,就看我們的業(yè)務(wù)需求是什么樣的了

串行的話,我們可以這樣來(lái)寫 yaml:

在定義 Job 資源的時(shí)候,配置上 ?completions 即可, Job 資源就會(huì)一個(gè)挨著一個(gè)的創(chuàng)建 pod 運(yùn)行,pod 運(yùn)行結(jié)束后,再創(chuàng)建下一個(gè) pod

apiVersion:?batch/v1
kind:?Job
metadata:
??name:?batchjob
spec:
??completions:?10
??template:
??省略多行...

并行的話我們可以這樣來(lái)寫 yaml:

設(shè)置并行的話,我們只需要在上面的 yaml 上加入 parallelism 配置即可,表示并行運(yùn)行多少個(gè) pod

apiVersion:?batch/v1
kind:?Job
metadata:
??name:?batchjob
spec:
??completions:?10
??parallelism:?4
??template:
??省略多行...

CronJob

上面的 Job 管理的 pod,都是啟動(dòng)一次,運(yùn)行一次,或者是控制運(yùn)行的次數(shù),那么,我們能不能控制周期性的運(yùn)行 一個(gè) pod 呢?

k8s 中當(dāng)然是可以的了,我們就可以使用 k8s 中的 CronJob 資源來(lái)完成我們的想法

我們只需要在 yaml 文件中寫好 CronJob 的配置即可,指定好 pod 運(yùn)行的周期時(shí)間即可

CronJob 的 demo

  • 資源類型是 CronJob

  • 運(yùn)行的周期是 "* * * * *" , 表示 每隔 1 分鐘運(yùn)行一次 pod

cronjob.yaml

apiVersion:?batch/v1beta1
kind:?CronJob
metadata:
??name:?mycronjob
spec:
??schedule:?"*?*?*?*?*"
??jobTemplate:
????spec:
??????template:
????????metadata:
??????????labels:
????????????app:?cronjob-xmt
????????spec:
??????????restartPolicy:?OnFailure
??????????containers:
??????????-?name:?cronjobxmt
????????????image:?luksa/batch-job

此處我們?cè)O(shè)置的是每一分鐘運(yùn)行一次 pod ,我們要是有別的需求也可以自行設(shè)定,上述 5 個(gè) * 含義如下:

  • 分鐘

  • 小時(shí)

  • 星期

例如,我需要設(shè)置每個(gè)星期一的,8 點(diǎn)起床,就可以這樣寫

“0 8 * * 1”

部署 CronJob

kubectl create -f cronjob.yaml

查看 CronJob

kubectl get cj

部署 cj 后,我們可以看到 cj 已經(jīng)起來(lái)了,但是好像還沒(méi)有對(duì)應(yīng)的 pod 被創(chuàng)建,cj 是 CronJob 簡(jiǎn)稱

當(dāng)然是不會(huì)有 pod 被創(chuàng)建的了,需要等 1 分鐘才會(huì)創(chuàng)建

再次查看我們的 cj ,我們可以看到 ACTIVE 已經(jīng)是 1 了,說(shuō)明已經(jīng)通過(guò) cj 創(chuàng)建了 1 個(gè) pod

我們來(lái)查看 pod ,果然是創(chuàng)建成功了一個(gè) pod,且已經(jīng)在運(yùn)行中了,沒(méi)毛病老鐵

我們?cè)谑褂?CronJob 資源的時(shí)候,會(huì)遇到這么一種情況:

啟動(dòng)的 Job 或者 pod 啟動(dòng)的時(shí)候相對(duì)比較晚的時(shí)候,我們可以這樣來(lái)設(shè)定一個(gè)邊界值

當(dāng)我們的 pod 開始啟動(dòng)的時(shí)間不能晚于我們預(yù)定時(shí)間的過(guò)多,我們可以設(shè)置成 20s,如果晚于這個(gè)值,那么該 job 就算是失敗

我們可以這樣來(lái)寫 yaml:

apiVersion:?batch/v1beta1
kind:?CronJob
metadata:
??name:?mycronjob
spec:
??schedule:?"*?*?*?*?*"
??startingDeadlineSeconds:?20
??jobTemplate:
??省略多行...

以上就是本次的全部?jī)?nèi)容了,分別分享了 ReplicaSet,DaemonSet,Job,CronJob,感興趣的朋友行動(dòng)起來(lái)吧

今天就到這里,學(xué)習(xí)所得,若有偏差,還請(qǐng)斧正

歡迎點(diǎn)贊,關(guān)注,收藏

朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力

好了,本次就到這里

技術(shù)是開放的,我們的心態(tài),更應(yīng)是開放的。擁抱變化,向陽(yáng)而生,努力向前行。

我是阿兵云原生,歡迎點(diǎn)贊關(guān)注收藏,下次見(jiàn)~


replicaSet,DaemonSet and Job的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
上思县| 清水河县| 高雄市| 青浦区| 松江区| 滨州市| 赣州市| 阳谷县| 乌拉特中旗| 沿河| 金门县| 睢宁县| 谷城县| 永嘉县| 敖汉旗| 招远市| 祁门县| 高台县| 通化市| 高要市| 中卫市| 澜沧| 泗水县| 西充县| 诸暨市| 蓬安县| 四子王旗| 饶阳县| 临沂市| 普定县| 揭东县| 平度市| 崇明县| 潞城市| 卢氏县| 剑阁县| 平湖市| 乌兰浩特市| 叙永县| 股票| 寻乌县|