咱們爲何要使用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服務是否可以正常運行:
標籤選擇器:標籤的查詢過濾條件。
Label不是惟一的,不少object可能有相同的label,經過label selector,客戶端/用戶能夠指定一個object集合,經過label selector對object的集合進行操做
目前kubernetes API支持兩種標籤選擇器:
1)基於等值的關係(matchLables): 「=」,「==」,「!=」 2)基於集合的(matchExpressions):in(在這個集合中),notin(不在這個集合中),exists(要麼存在,要麼不存在)
使用標籤選擇器的操做邏輯:
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值必須爲空。
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負責批量處理短暫的一次性任務,即僅執行一次的任務,它保證批量處理任務的一個或多個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
能夠看到它會每一個一分鐘執行一次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
在該字段下,參照對應的格式進行添加對應的版本,以上添加的是batch開發版本。
//重啓kubelet,從新加載: [root@master manifests]# systemctl restart kubelet.service
//再次查看api版本時,就能夠查看到開發版本: