k8s之Labels,Daemonset,Job資源對象

Label(標籤)

咱們爲何要使用label呢?
當相同類型的資源對象愈來愈多,爲了更好的管理,才按照標籤分爲一個小組,爲的是提高資源的管理效率。前端

lable是附着到object上(例如pod)的鍵值對。能夠在建立object的時候指定,也能夠在object建立後隨時指定。Labels的值對系統自己並無什麼含義,只是對用戶纔有意義。node

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

語法和字符集linux

Label key的組成:
* 不得超過63個字符
* 可使用前綴,使用/分隔,前綴必須是DNS子域,不得超過253個字符,系統中的自動化組件建立的label必須指定前綴,kubernetes.io/ 由kubernetes保留。
* 起始必須是字母(大小寫均可以)或數字,中間能夠有連字符,下劃線和點。
Label value的組成:
不得超過63個字符
起始必須是字母(大小寫均可以)或數字,中間能夠有連字符,下劃線和點。

經常使用的,多維度標籤分類:nginx

版本標籤(release):      stable(穩定版),canary(金絲雀版本),beta(測試版)
環境類(environment):   dev(開發),qa(測試),production(生產),op(運維)
應用類(applaction):        ui(設計),as(應用軟件),pc(電腦端),sc(網絡方面)
架構層(tier):          frontend(前端),backend(後端),cache(緩存)
分區標籤(partition):        customerA(客戶),customerB
品控級別(track):        daily(天天),weekly(每週)

經過如下例子來實踐label:vim

[root@master yaml]# vim label-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: label-pod
  labels:       #使用labels字段來定義標籤,能夠一次定義多個標籤,這裏定義3個標籤
    release: stable   #版本:穩定版
    env: qa              #環境:測試
    tier: frontend   #架構類:前端
spec:
  containers:
  - name: testapp
    image: nginx    #部署的是nginx服務
---
kind: Service   #關聯一個service資源對象
apiVersion: v1
metadata:
  name: nginx-svc
spec:
  type: NodePort
  selector:   #使用標籤選擇器
    release: stable   #只需定義selector字段中的一個標籤,字段下的其餘標籤可所有實現關聯。
  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,而且顯示標籤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

//只顯示標籤的value:api

[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的其餘操做(命令行):添加,修改,刪除標籤
//經過命令行的方式添加標籤:緩存

[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

//修改標籤:網絡

[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

能夠看到想要修改標籤,必須加上--overwrite選項進行重寫。架構

//刪除標籤:

[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                     #能夠看到該標籤以被刪除

//咱們測試nginx服務是否可以正常運行:
k8s之Labels,Daemonset,Job資源對象

Label selector

標籤選擇器:標籤的查詢過濾條件。
Label不是惟一的,不少object可能有相同的label,經過label selector,客戶端/用戶能夠指定一個object集合,經過label selector對object的集合進行操做

目前kubernetes API支持兩種標籤選擇器:

1)基於等值的關係(matchLables): 「=」,「==」,「!=」
2)基於集合的(matchExpressions):in(在這個集合中),notin(不在這個集合中),exists(要麼存在,要麼不存在)

使用標籤選擇器的操做邏輯:
k8s之Labels,Daemonset,Job資源對象
1)同時指定的多個選擇器之間的邏輯關係爲「與」操做
2)使用空值的標籤選擇器,意味着每一個資源對象都將被選擇。
3)空的標籤選擇器將沒法選出任何資源。
4)在基於集合的選擇器中,使用「in」或者「Notin」操做時,其values不強制爲非空字符串列表,而使用exists或DostNoteExists,其values值必須爲空。

舉例:
selector的操做語法以下:

[root@master yaml]# vim selector.yaml
selector:
  matchLabels:      #基於等值關係的
    app: nginx
  matchExpressions:   #基於集合的
    - {key: name,operator:  In,values: [zhangsan,lisi]}   #key,operator,values這三個是固定參數
    - {key: age,operator: Exists,values:}     #若是指定了Exists,其values值必須爲空。

Daemonset

1)什麼是Daemonset?
Daemonset 確保集羣中的每一個node上運行一個pod,且只能運行一個pod。當有node加入集羣時,也會爲它們新增一個pod。當有node從集羣移除時,這些pod也會 被回收。當刪除Daemonset時將會刪除它建立的全部pod。

2)編寫Daemonset須要注意的點:
Daemonset不支持replicas字段,除此以外,與Deployment,RS等資源的寫法相同。

3)Daemonset通常的使用場景:

  • 經常使用於每一個節點的日誌收集工做。
  • 監控每一個節點的運行狀態。

實踐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-dh429   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個節點,能夠看到經過Daemonset實現了每一個node上都運行一個pod副本。

JOB資源對象

與以前的服務類容器不一樣,以前的資源對象是持續提供服務。job負責批量處理短暫的一次性任務,即僅執行一次的任務,它保證批量處理任務的一個或多個pod成功結束。

1,kubernetes支持如下幾種job:

* 非並行job:一般建立一個pod直至其成功結束。
* 固定結束次數的job:設置spec.completions,建立多個pod,直到.spec.completions個pod成功結束。
* 帶有工做隊列的並行job:設置.spec.Parallelism但不設置.spec.completions,當全部pod結束而且至少一個成功時,job就認爲是成功。

2,Job Controller
Job Controller負責根據Job Spec建立pod,並持續監控pod的狀態,直至其成功結束,若是失敗,則根據restartPolicy(只支持OnFailure和Never,不支持Always)決定是否建立新的pod再次重試任務。

經過如下例子來實踐Job:
//建立一個job資源對象:

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

若是在生產環境中忘記了字段用法,能夠經過kubectl explain 命令工具來提供幫助。

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

咱們能夠看到job與其餘資源對象不一樣,僅執行一次性任務,默認pod借宿運行後job即結束,狀態爲Completed。

//經過查看該pod的日誌來確保任務是否完成:

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

任務完成後,若是沒有其餘要求,咱們能夠刪除該job:

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

2,提升job執行效率的方法
經過在yaml文件中定義字段來實現:

kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:      #經過spec下的這兩個字段來優化
  parallelism: 2    #同時運行2個pod
  completions: 8    #運行pod的總數量8個
  template:
    metadata:
      labels:
        app: job
    spec:
      containers:
      - name: job
        image: busybox
        command: ["echo","hello job!"]
      restartPolicy: Never

job 字段解釋:

completions:標誌Job結束須要成功運行的Pod個數,默認爲1
parallelism:標誌並行運行的Pod的個數,默認爲1
activeDeadlineSeconds:標誌失敗Pod的重試最大時間,超過這個時間不會繼續重試.

//從新運行job後,查看pod狀態:

[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總數爲8個,且並行2個,時間會有些許差異,但不大。

3,定時運行job任務:
至關咱們在linux中crontab計劃任務。

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

//執行yaml文件後監控pod的狀態:

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

k8s之Labels,Daemonset,Job資源對象

能夠看到它會每一個一分鐘執行一次job任務,每執行一次就會生成一個pod。
查看日誌,驗證任務是否執行:

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

擴展: 添加apiVersion
1)查看當前kubernetes集羣中對應的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

查看發現並無開發版本,全是測試版本。
添加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資源對象
在該字段下,參照對應的格式進行添加對應的版本,以上添加的是batch開發版本。

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

//再次查看api版本時,就能夠查看到開發版本:
k8s之Labels,Daemonset,Job資源對象

相關文章
相關標籤/搜索