在k8s里面善涨,有一些group & manage resources的方式窒盐,比如Label,Namespace钢拧。
本文我們重點講講Label蟹漓。
想理解Label,我們可以類比成tag(Instagram源内,微博都有這種用#開始的tag)葡粒,或者gmail里的label。
1. Label Intro
Label是管理pod和其他k8s resources的一種方式膜钓。它是“貼在” object上面的key/value pairs嗽交。Label可以在object創(chuàng)建的時候就指定,之后任何時間都可以修改或者添加呻此。每個object可以有不止一個Label,但對每個object來說腔寡,它的Label不能有重復(fù)的key(如果說對于Pod a焚鲜,如果它已經(jīng)有個Label,key叫release放前,value叫canary忿磅,就不能還有個Label,key也叫release凭语,value叫stable)葱她。
Label的形式如下:
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
2. Label Selector
Label Selector能夠幫我們根據(jù)Label篩選resource object。它可以基于以下幾種篩選:
- 包含或者不包含某種Label(只需要Label的key對應(yīng)上)
- 比如:
kubectl get po -l key
- 比如:
kubectl get po -l '!key'
(表示不包含的時候似扔,key需要用單引號)
- 比如:
- 包含一個Label的某個value值(Label的key和value都對應(yīng)上)吨些。
- 比如:
kubectl get po -l key=value
(指定某value) - 比如:
kubectl get po -l key in (value1, value2)
(指定某些value)
- 比如:
- 包含一個Label,但是value不是的某個值(Label的key對應(yīng)上炒辉,但是value不同)豪墅。
- 比如:
kubectl get po -l key!=value
(排除某value) - 比如:
kubectl get po -l key notin (value1, value2)
(排除某些value)
- 比如:
Label不能像Namespace那樣幫我們限制resource的分配,但是我們可以用來:
- 區(qū)分不同類型的resource object黔寇。比如我們有個新的Node偶器,它的hardware是特殊類型,我們可以用Label進(jìn)行標(biāo)記缝裤。
- 給特殊的Node schedule Pods屏轰。一般來說,創(chuàng)建新的Pod憋飞,schedule Pod的工作都是master里的scheduler負(fù)責(zé)霎苗。但我們可以在創(chuàng)建新的Pod的時候,指定它只能被deploy到某類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)一步來說叨粘,我們不僅可以把新的Pod deploy到某類Node上猾编,也可以deploy到某個Node上,只要我們設(shè)置的label-value能定位到單獨的Node升敲。
實際上答倡,每個Node都有個label,它的key是kubernetes.io/hostname
驴党,value是unique的瘪撇,就是這個Node的實際的hostname。
但是這樣做的缺點也很明顯港庄,就是當(dāng)這個Node掛掉了之后(offline了)倔既,Pod沒辦法再recreate,redeploy鹏氧。這是我們希望避免的方式渤涌。
3. Commands
我們平時用kubectl get pods
的時候,并沒有Pod的Label信息把还。如果我們想顯示实蓬,需要指定:
kubectl get po --show-labels
還可以指定只列出來含有某個(些)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