Label 和 Selector
作用:
- Label:对 k8s 中各种资源进行分类,分组,添加一个具有特别属性的标签;
- Selector: 通过一个过滤的语法进行查找对应标签的资源
当 kubernetes 对系统的任何 API 对象如 Pod 和节点进行 “分组” 时,会对其添加 Label
(key=value 形式的 “键-值对”)用以精确地选择对应的 API 对象。而 Selector
(标签选择器)则是针对匹配对象的查询方法。
例如,常用的标签 tier 可用于区分容器的属性,如 frontend,backend;或者一个 release_track 用于容器的环境,如 canary,production 等。
定义 Label
对 node 进行打标签
应用案例,公司与 xx 银行有一条专属的高速光纤通道,此通道只能与 192.168.7.0 网段进行通信,因此只能将与 xx 银行通信的应用部署到 192.168.7.0 网段所在的节点。此时可以对节点进行 Label(即加标签)
1 | # kubectl label node k8s-node-02 region=subnet7 |
然后,可以通过 Selector 对其进行筛选
1 | # kubectl get nodes -l region=subnet7 |
最后,在 Deployment 或者其他控制器中指定将 Pod 部署到该节点
1 | containers: |
对 service 打标签
也可以用同样的方式对 Service 进行 Label
1 | # kubectl label svc canary-v1 -n canary-production env=canary version=v1 |
查看 Labels
1 | # kubectl get svc -n canary-production --show-labels |
还可以查看所有 Version 为 v1 的 svc
1 | # kubectl get svc --all-namespaces -l version=v1 |
其他资源的 Label 方式相同
Selector 条件匹配
Selector 主要用于资源的匹配,只有符合条件的资源才会被调用,可以使用该方式对集群中的各类资源进行分配。
假如对 Selector 进行条件匹配,目前已有的 Label 如下
1
2
3
4
5
6
7
8
9# kubectl get svc --show-labels
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS
details ClusterIP 10.99.9.178 <none> 9080/TCP 45h app=details
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d19h component=apiserver,provider=kubernetes
nginx ClusterIP 10.106.194.137 <none> 80/TCP 2d21h app=productpage,version=v1
nginx-v2 ClusterIP 10.108.176.132 <none> 80/TCP 2d20h <none>
productpage ClusterIP 10.105.229.52 <none> 9080/TCP 45h app=productpage,tier=frontend
ratings ClusterIP 10.96.104.95 <none> 9080/TCP 45h app=ratings
reviews ClusterIP 10.102.188.143 <none> 9080/TCP 45h app=reviews选择 app 为 reviews 或者 productpage 的 svc
1
2
3
4
5# kubectl get svc -l 'app in (reviews, productpage)' --show-labels
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS
details ClusterIP 10.102.188.143 <none> 9080/TCP 45h app=reviews
nginx ClusterIP 10.106.194.137 <none> 80/TCP 2d21h app=productpage,version=v1
productpage ClusterIP 10.105.229.52 <none> 9080/TCP 45h app=productpage,tier=frontend选择 app 为 productpage 或者 details 但是不包括 version=v1 的 svc
1
2
3
4# kubectl get svc -l version!=v1,'app in (details, productpage)' --show-labels
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS
details ClusterIP 10.99.9.178 <none> 9080/TCP 45h app=details
productpage ClusterIP 10.105.229.52 <none> 9080/TCP 45h app=productpage,tier=frontend选择 label key 名为 app 的 svc
1
2
3
4
5
6
7# kubectl get svc -l app --show-labels
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS
details ClusterIP 10.99.9.178 <none> 9080/TCP 45h app=details
nginx ClusterIP 10.106.194.137 <none> 80/TCP 2d21h app=productpage,version=v1
productpage ClusterIP 10.105.229.52 <none> 9080/TCP 45h app=productpage,tier=frontend
ratings ClusterIP 10.96.104.95 <none> 9080/TCP 45h app=ratings
reviews ClusterIP 10.102.188.143 <none> 9080/TCP 45h app=reviews
修改标签
在实际使用中,label 的更改是经常发生的事情,可以使用 --overwrite
参数修改标签。
- 比如将 version=v1 改为 version=v2
1 | # kubectl get svc -n canary-production --show-labels |
删除标签
要删除一个标签,只需要在这个标签名后面跟一个 -
,比如删除 version 这个标签,则是 version-
1 | # kubectl label svc canary-v1 -n canary-production version- |