在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