您好,登錄后才能下訂單哦!
我們為什么要使用label呢?
當相同類型的資源對象越來越多,為了更好的管理,才按照標簽分為一個小組,為的是提升資源的管理效率。
lable是附著到object上(例如pod)的鍵值對。可以在創建object的時候指定,也可以在object創建后隨時指定。Labels的值對系統本身并沒有什么含義,只是對用戶才有意義。
"labels": {
"key1" : "value1",
"key2" : "value2"
}
語法和字符集
Label key的組成:
* 不得超過63個字符
* 可以使用前綴,使用/分隔,前綴必須是DNS子域,不得超過253個字符,系統中的自動化組件創建的label必須指定前綴,kubernetes.io/ 由kubernetes保留。
* 起始必須是字母(大小寫都可以)或數字,中間可以有連字符,下劃線和點。
Label value的組成:
不得超過63個字符
起始必須是字母(大小寫都可以)或數字,中間可以有連字符,下劃線和點。
常用的,多維度標簽分類:
版本標簽(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:
[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:
[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-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個節點,可以看到通過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版本時,就可以查看到開發版本:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。