Label

在k8s里面,有一些group & manage resources的方式,比如Label,Namespace。

本文我們重點(diǎn)講講Label。

想理解Label,我們可以類(lèi)比成tag(Instagram,微博都有這種用#開(kāi)始的tag),或者gmail里的label。

1. Label Intro

Label是管理pod和其他k8s resources的一種方式。它是“貼在” object上面的key/value pairs。Label可以在object創(chuàng)建的時(shí)候就指定,之后任何時(shí)間都可以修改或者添加。每個(gè)object可以有不止一個(gè)Label,但對(duì)每個(gè)object來(lái)說(shuō),它的Label不能有重復(fù)的key(如果說(shuō)對(duì)于Pod a,如果它已經(jīng)有個(gè)Label,key叫release,value叫canary,就不能還有個(gè)Label,key也叫release,value叫stable)。

Label的形式如下:

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

2. Label Selector

Label Selector能夠幫我們根據(jù)Label篩選resource object。它可以基于以下幾種篩選:

  • 包含或者不包含某種Label(只需要Label的key對(duì)應(yīng)上)
    • 比如:kubectl get po -l key
    • 比如:kubectl get po -l '!key'(表示不包含的時(shí)候,key需要用單引號(hào))
  • 包含一個(gè)Label的某個(gè)value值(Label的key和value都對(duì)應(yīng)上)。
    • 比如:kubectl get po -l key=value(指定某value)
    • 比如:kubectl get po -l key in (value1, value2)(指定某些value)
  • 包含一個(gè)Label,但是value不是的某個(gè)值(Label的key對(duì)應(yīng)上,但是value不同)。
    • 比如:kubectl get po -l key!=value(排除某value)
    • 比如:kubectl get po -l key notin (value1, value2)(排除某些value)

Label不能像Namespace那樣幫我們限制resource的分配,但是我們可以用來(lái):

  • 區(qū)分不同類(lèi)型的resource object。比如我們有個(gè)新的Node,它的hardware是特殊類(lèi)型,我們可以用Label進(jìn)行標(biāo)記。
  • 給特殊的Node schedule Pods。一般來(lái)說(shuō),創(chuàng)建新的Pod,schedule Pod的工作都是master里的scheduler負(fù)責(zé)。但我們可以在創(chuàng)建新的Pod的時(shí)候,指定它只能被deploy到某類(lèi)Node。比如用下面的yaml創(chuàng)建Pod:
apiVersion: v1
kind: Pod
metadata: 
  name: <pod-name>
spec:
  nodeSelector: # tell scheduler which type of node this pod should deploy to
    <label-key>: <label-value>
  containers:
  - image: <image-name>
    name: <image-name-in-pod>
  • 進(jìn)一步來(lái)說(shuō),我們不僅可以把新的Pod deploy到某類(lèi)Node上,也可以deploy到某個(gè)Node上,只要我們?cè)O(shè)置的label-value能定位到單獨(dú)的Node。
    實(shí)際上,每個(gè)Node都有個(gè)label,它的key是kubernetes.io/hostname,value是unique的,就是這個(gè)Node的實(shí)際的hostname。
    但是這樣做的缺點(diǎn)也很明顯,就是當(dāng)這個(gè)Node掛掉了之后(offline了),Pod沒(méi)辦法再recreate,redeploy。這是我們希望避免的方式。

3. Commands

我們平時(shí)用kubectl get pods的時(shí)候,并沒(méi)有Pod的Label信息。如果我們想顯示,需要指定:

kubectl get po --show-labels

還可以指定只列出來(lái)含有某個(gè)(些)Label的Pod:

kubectl get po -L creation_method, env

給Pod添加Lable:

kubectl label po <pod-name> <label_key>=<label_value>

修改Pod的Label:

kubectl label po <pod-name> <label_key>=<label_new_value> --overwrite

Reference:

  • Kubernetes in Action
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容