溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

k8s之Labels,Daemonset,Job資源對(duì)象

發(fā)布時(shí)間:2020-05-27 11:57:47 來(lái)源:網(wǎng)絡(luò) 閱讀:829 作者:wx5b9c94b17c62a 欄目:云計(jì)算

Label(標(biāo)簽)

我們?yōu)槭裁匆褂胠abel呢?
當(dāng)相同類型的資源對(duì)象越來(lái)越多,為了更好的管理,才按照標(biāo)簽分為一個(gè)小組,為的是提升資源的管理效率。

lable是附著到object上(例如pod)的鍵值對(duì)??梢栽趧?chuàng)建object的時(shí)候指定,也可以在object創(chuàng)建后隨時(shí)指定。Labels的值對(duì)系統(tǒng)本身并沒(méi)有什么含義,只是對(duì)用戶才有意義。

"labels": {
"key1" : "value1",
"key2" : "value2"
}

語(yǔ)法和字符集

Label key的組成:
* 不得超過(guò)63個(gè)字符
* 可以使用前綴,使用/分隔,前綴必須是DNS子域,不得超過(guò)253個(gè)字符,系統(tǒng)中的自動(dòng)化組件創(chuàng)建的label必須指定前綴,kubernetes.io/ 由kubernetes保留。
* 起始必須是字母(大小寫(xiě)都可以)或數(shù)字,中間可以有連字符,下劃線和點(diǎn)。
Label value的組成:
不得超過(guò)63個(gè)字符
起始必須是字母(大小寫(xiě)都可以)或數(shù)字,中間可以有連字符,下劃線和點(diǎn)。

常用的,多維度標(biāo)簽分類:

版本標(biāo)簽(release):      stable(穩(wěn)定版),canary(金絲雀版本),beta(測(cè)試版)
環(huán)境類(environment):   dev(開(kāi)發(fā)),qa(測(cè)試),production(生產(chǎn)),op(運(yùn)維)
應(yīng)用類(applaction):        ui(設(shè)計(jì)),as(應(yīng)用軟件),pc(電腦端),sc(網(wǎng)絡(luò)方面)
架構(gòu)層(tier):          frontend(前端),backend(后端),cache(緩存)
分區(qū)標(biāo)簽(partition):        customerA(客戶),customerB
品控級(jí)別(track):        daily(每天),weekly(每周)

通過(guò)以下例子來(lái)實(shí)踐label:

[root@master yaml]# vim label-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: label-pod
  labels:       #使用labels字段來(lái)定義標(biāo)簽,可以一次定義多個(gè)標(biāo)簽,這里定義3個(gè)標(biāo)簽
    release: stable   #版本:穩(wěn)定版
    env: qa              #環(huán)境:測(cè)試
    tier: frontend   #架構(gòu)類:前端
spec:
  containers:
  - name: testapp
    image: nginx    #部署的是nginx服務(wù)
---
kind: Service   #關(guān)聯(lián)一個(gè)service資源對(duì)象
apiVersion: v1
metadata:
  name: nginx-svc
spec:
  type: NodePort
  selector:   #使用標(biāo)簽選擇器
    release: stable   #只需定義selector字段中的一個(gè)標(biāo)簽,字段下的其他標(biāo)簽可全部實(shí)現(xiàn)關(guān)聯(lián)。
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 32134
[root@master yaml]# kubectl apply -f  label-pod.yaml 
pod/label-pod created
service/nginx-svc unchanged
//查看所有pod,并且顯示標(biāo)簽key:value:
[root@master yaml]# kubectl  get pod --show-labels 
NAME        READY   STATUS    RESTARTS   AGE   LABELS
label-pod   1/1     Running   0          30m   env=qa,release=stable,tier=frontend

//查看指定pod的key:value:

[root@master yaml]# kubectl  get pod label-pod  --show-labels 
NAME        READY   STATUS    RESTARTS   AGE   LABELS
label-pod   1/1     Running   0          40m   app=as,env=qa,release=stable,tier=frontend

//只顯示標(biāo)簽的value:

[root@master yaml]# kubectl  get pod label-pod -L env,release,tier
NAME        READY   STATUS    RESTARTS   AGE   ENV   RELEASE   TIER
label-pod   1/1     Running   0          41m   qa    stable    frontend

label的其他操作(命令行):添加,修改,刪除標(biāo)簽
//通過(guò)命令行的方式添加標(biāo)簽:

[root@master yaml]# kubectl  label  pod label-pod  app=sc
pod/label-pod labeled
[root@master yaml]# kubectl  get pod -L app
NAME        READY   STATUS    RESTARTS   AGE   APP
label-pod   1/1     Running   0          36m   sc

//修改標(biāo)簽:

[root@master yaml]# kubectl  label pod label-pod app=as
error: 'app' already has a value (sc), and --overwrite is false
[root@master yaml]# kubectl  label pod label-pod app=as --overwrite 
pod/label-pod labeled

可以看到想要修改標(biāo)簽,必須加上--overwrite選項(xiàng)進(jìn)行重寫(xiě)。

//刪除標(biāo)簽:

[root@master yaml]# kubectl  label pod label-pod app-
pod/label-pod labeled
[root@master yaml]# kubectl  get pod -L app
NAME        READY   STATUS    RESTARTS   AGE   APP
label-pod   1/1     Running   0          43m                     #可以看到該標(biāo)簽以被刪除

//我們測(cè)試nginx服務(wù)是否能夠正常運(yùn)行:
k8s之Labels,Daemonset,Job資源對(duì)象

Label selector

標(biāo)簽選擇器:標(biāo)簽的查詢過(guò)濾條件。
Label不是唯一的,很多object可能有相同的label,通過(guò)label selector,客戶端/用戶可以指定一個(gè)object集合,通過(guò)label selector對(duì)object的集合進(jìn)行操作

目前kubernetes API支持兩種標(biāo)簽選擇器:

1)基于等值的關(guān)系(matchLables): “=”,“==”,“!=”
2)基于集合的(matchExpressions):in(在這個(gè)集合中),notin(不在這個(gè)集合中),exists(要么存在,要么不存在)

使用標(biāo)簽選擇器的操作邏輯:
k8s之Labels,Daemonset,Job資源對(duì)象
1)同時(shí)指定的多個(gè)選擇器之間的邏輯關(guān)系為“與”操作
2)使用空值的標(biāo)簽選擇器,意味著每個(gè)資源對(duì)象都將被選擇。
3)空的標(biāo)簽選擇器將無(wú)法選出任何資源。
4)在基于集合的選擇器中,使用“in”或者“Notin”操作時(shí),其values不強(qiáng)制為非空字符串列表,而使用exists或DostNoteExists,其values值必須為空。

舉例:
selector的操作語(yǔ)法如下:

[root@master yaml]# vim selector.yaml
selector:
  matchLabels:      #基于等值關(guān)系的
    app: nginx
  matchExpressions:   #基于集合的
    - {key: name,operator:  In,values: [zhangsan,lisi]}   #key,operator,values這三個(gè)是固定參數(shù)
    - {key: age,operator: Exists,values:}     #如果指定了Exists,其values值必須為空。

Daemonset

1)什么是Daemonset?
Daemonset 確保集群中的每個(gè)node上運(yùn)行一個(gè)pod,且只能運(yùn)行一個(gè)pod。當(dāng)有node加入集群時(shí),也會(huì)為它們新增一個(gè)pod。當(dāng)有node從集群移除時(shí),這些pod也會(huì) 被回收。當(dāng)刪除Daemonset時(shí)將會(huì)刪除它創(chuàng)建的所有pod。

2)編寫(xiě)Daemonset需要注意的點(diǎn):
Daemonset不支持replicas字段,除此之外,與Deployment,RS等資源的寫(xiě)法相同。

3)Daemonset一般的使用場(chǎng)景:

  • 常用于每個(gè)節(jié)點(diǎn)的日志收集工作。
  • 監(jiān)控每個(gè)節(jié)點(diǎn)的運(yùn)行狀態(tài)。

實(shí)踐Daemonset:

[root@master yaml]# vim daemonset.yaml
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: nginx-ds
spec:
  template:
    metadata:
      labels:
        app: qa
        env: dev
    spec:
      containers:
      - name: nginx
        image: nginx
---
kind: Service
apiVersion: v1
metadata:
  name: nginx-dsvc
spec:
  type: NodePort
  selector:
    app: qa
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30003
[root@master yaml]# kubectl apply -f daemonset.yaml 
daemonset.extensions/nginx-ds created
service/nginx-dsvc created

//查看pod的分布情況:

[root@master yaml]# kubectl  get pod -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx-ds-dh529   1/1     Running   0          76s   10.244.2.2   node02   <none>           <none>
nginx-ds-xz4d8   1/1     Running   0          76s   10.244.1.3   node01   <none>           <none>

我集群中只有2個(gè)節(jié)點(diǎn),可以看到通過(guò)Daemonset實(shí)現(xiàn)了每個(gè)node上都運(yùn)行一個(gè)pod副本。

JOB資源對(duì)象

與之前的服務(wù)類容器不同,之前的資源對(duì)象是持續(xù)提供服務(wù)。job負(fù)責(zé)批量處理短暫的一次性任務(wù),即僅執(zhí)行一次的任務(wù),它保證批量處理任務(wù)的一個(gè)或多個(gè)pod成功結(jié)束。

1,kubernetes支持以下幾種job:

* 非并行job:通常創(chuàng)建一個(gè)pod直至其成功結(jié)束。
* 固定結(jié)束次數(shù)的job:設(shè)置spec.completions,創(chuàng)建多個(gè)pod,直到.spec.completions個(gè)pod成功結(jié)束。
* 帶有工作隊(duì)列的并行job:設(shè)置.spec.Parallelism但不設(shè)置.spec.completions,當(dāng)所有pod結(jié)束并且至少一個(gè)成功時(shí),job就認(rèn)為是成功。

2,Job Controller
Job Controller負(fù)責(zé)根據(jù)Job Spec創(chuàng)建pod,并持續(xù)監(jiān)控pod的狀態(tài),直至其成功結(jié)束,如果失敗,則根據(jù)restartPolicy(只支持OnFailure和Never,不支持Always)決定是否創(chuàng)建新的pod再次重試任務(wù)。

通過(guò)以下例子來(lái)實(shí)踐Job:
//創(chuàng)建一個(gè)job資源對(duì)象:

kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  template:
    metadata:
      labels:
        app: job
    spec:
      containers:
      - name: job
        image: busybox
        command: ["echo","hello job!"]
      restartPolicy: Never
[root@master yaml]# kubectl apply -f  job.yaml 
job.batch/test-job created

如果在生產(chǎn)環(huán)境中忘記了字段用法,可以通過(guò)kubectl explain 命令工具來(lái)提供幫助。

//查看該pod資源對(duì)象的狀態(tài):
[root@master yaml]# kubectl  get pod  test-job-dcv6g 
NAME             READY   STATUS      RESTARTS   AGE
test-job-dcv6g   0/1     Completed   0          2m8s

我們可以看到j(luò)ob與其他資源對(duì)象不同,僅執(zhí)行一次性任務(wù),默認(rèn)pod借宿運(yùn)行后job即結(jié)束,狀態(tài)為Completed。

//通過(guò)查看該pod的日志來(lái)確保任務(wù)是否完成:

[root@master yaml]# kubectl  logs  test-job-dcv6g 
hello job!

任務(wù)完成后,如果沒(méi)有其他要求,我們可以刪除該job:

[root@master yaml]# kubectl  delete  jobs.batch test-job 
job.batch "test-job" deleted

2,提高job執(zhí)行效率的方法
通過(guò)在yaml文件中定義字段來(lái)實(shí)現(xiàn):

kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:      #通過(guò)spec下的這兩個(gè)字段來(lái)優(yōu)化
  parallelism: 2    #同時(shí)運(yùn)行2個(gè)pod
  completions: 8    #運(yùn)行pod的總數(shù)量8個(gè)
  template:
    metadata:
      labels:
        app: job
    spec:
      containers:
      - name: job
        image: busybox
        command: ["echo","hello job!"]
      restartPolicy: Never

job 字段解釋:

completions:標(biāo)志Job結(jié)束需要成功運(yùn)行的Pod個(gè)數(shù),默認(rèn)為1
parallelism:標(biāo)志并行運(yùn)行的Pod的個(gè)數(shù),默認(rèn)為1
activeDeadlineSeconds:標(biāo)志失敗Pod的重試最大時(shí)間,超過(guò)這個(gè)時(shí)間不會(huì)繼續(xù)重試.

//重新運(yùn)行job后,查看pod狀態(tài):

[root@master yaml]# kubectl  get pod 
NAME             READY   STATUS      RESTARTS   AGE
test-job-28ww5   0/1     Completed   0          50s
test-job-5wt95   0/1     Completed   0          46s
test-job-6s4p6   0/1     Completed   0          44s
test-job-8s2v7   0/1     Completed   0          50s
test-job-bt4ch   0/1     Completed   0          45s
test-job-bzjz6   0/1     Completed   0          48s
test-job-fhnvc   0/1     Completed   0          44s
test-job-kfn9l   0/1     Completed   0          48s

[root@master yaml]# kubectl  logs test-job-28ww5 
hello job!

可以看到pod總數(shù)為8個(gè),且并行2個(gè),時(shí)間會(huì)有些許差別,但不大。

3,定時(shí)運(yùn)行job任務(wù):
相當(dāng)我們?cè)趌inux中crontab計(jì)劃任務(wù)。

[root@master yaml]# vim cronjob.yaml
kind: CronJob       #類型為CronJob
apiVersion: batch/v1beta1
metadata:    
  name: cronjob
spec:            #使用spec.schedule字段來(lái)定義計(jì)劃job任務(wù)
  schedule: "*/1 * * * *"      #指定每分鐘執(zhí)行一次任務(wù),格式同linux中的crontab(分,時(shí),日,月,周)
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cronjob
            image: busybox
            command: ["echo","hello job!"]
          restartPolicy: OnFailure    #僅在pod失敗時(shí)才重啟

//執(zhí)行yaml文件后監(jiān)控pod的狀態(tài):

[root@master yaml]# kubectl  apply -f  cronjob.yaml 
cronjob.batch/cronjob created

k8s之Labels,Daemonset,Job資源對(duì)象

可以看到它會(huì)每個(gè)一分鐘執(zhí)行一次job任務(wù),每執(zhí)行一次就會(huì)生成一個(gè)pod。
查看日志,驗(yàn)證任務(wù)是否執(zhí)行:

[root@master ~]# kubectl logs  cronjob-1577505180-4ss84 
hello job!
[root@master ~]# kubectl logs  cronjob-1577505240-d5gf8 
hello job!

擴(kuò)展: 添加apiVersion
1)查看當(dāng)前kubernetes集群中對(duì)應(yīng)的API版本:

[root@master ~]# kubectl  api-versions 
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
apps/v1beta1
apps/v1beta2
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

查看發(fā)現(xiàn)并沒(méi)有開(kāi)發(fā)版本,全是測(cè)試版本。
添加api版本:

[root@master ~]# cd /etc/kubernetes/manifests/
[root@master manifests]# ll
total 16
-rw------- 1 root root 1900 Nov  4 16:32 etcd.yaml
-rw------- 1 root root 2602 Nov  4 16:32 kube-apiserver.yaml
-rw------- 1 root root 2486 Nov  4 16:32 kube-controller-manager.yaml
-rw------- 1 root root  990 Nov  4 16:32 kube-scheduler.yaml
[root@master manifests]# vim kube-apiserver.yaml 

k8s之Labels,Daemonset,Job資源對(duì)象
在該字段下,參照對(duì)應(yīng)的格式進(jìn)行添加對(duì)應(yīng)的版本,以上添加的是batch開(kāi)發(fā)版本。

//重啟kubelet,重新加載:
[root@master manifests]# systemctl restart kubelet.service

//再次查看api版本時(shí),就可以查看到開(kāi)發(fā)版本:
k8s之Labels,Daemonset,Job資源對(duì)象

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI