标签可以附加在kubernetes任何资源对象之上的键值型数据,常用于标签选择器的匹配度检查,从而完成资源筛选。

一、标签

  • 当Kubernetes对系统的任何API对象如Pod和节点进行“分组”时,会对其添加Label(key=value形式的“键-值对”)用以精准地选择对应的API对象。
    • 标签中的键名称通常由“键前缀”和“键名”组成,其格式形如“KEY_PREFIX/KEY_NAME”
    • 而键前缀必须为DNS子域名格式,且不能超过253个字符。例如Node对象上常用的kubernetes.io/os、kubernetes.io/arch和kubernetes.io/hostname等。键前缀为可选部分,省略键前缀时,键将被视为用户的私有数据。
    • 键名至多能使用63个字符,支持字母、数字、连接号(-)、下划线(_)、点号(.)等字符,且只能以字母或数字开头。
  • 标签的键值必须不能多于63个字符,它要么为空,要么是以字母或数字开头及结尾,且中间仅使用了字母、数字、连接号(-)、下划线(_)或点号(.)等字符的数据。

1、添加单个标签

为node2节点添加标签hello=world

[root@ln03 ~]# kubectl label node ln03 hello=world
node/ln03 labeled

在Deployment或其他控制器中指定将Pod部署到该节点,配置nodeSelector标签选择器中增加region: subnet1,如下:

containers:
  ......
dnsPolicy: ClusterFirst
nodeSelector:
  hello: world
restartPolicy: Always
......

2、添加多个标签

例如为ln02节点添加hello=world和tang=test两个标签:

[root@ln03 ~]# kubectl label node ln02 hello=world tang=test
node/ln02 labeled

3、查看标签

# 查看所有节点的所有标签
[root@ln03 ~]# kubectl get node --show-labels

# 查看具有制定标签的节点
[root@ln03 ~]# kubectl get node -l tang=test
NAME   STATUS   ROLES    AGE    VERSION
ln02   Ready    <none>   5d5h   v2.0.2-tos-final-build-20200728

# 查看配置了有tang标签的节点
[root@ln03 ~]# kubectl get node -l tang
NAME   STATUS   ROLES    AGE    VERSION
ln02   Ready    <none>   5d5h   v2.0.2-tos-final-build-20200728

# 查看配置了tang标签指定值test或world的节点
[root@ln03 ~]# kubectl get node -l 'tang in (test,world)'
NAME   STATUS   ROLES    AGE    VERSION
ln02   Ready    <none>   5d5h   v2.0.2-tos-final-build-20200728

二、标签选择器

标签选择器用于表达标签的查询条件或选择标准,Kubernetes API目前支持两个选择器:基于等值关系(equality-based)的标签选项器以及基于集合关系(set-based)的标签选择器。同时指定多个选择器时需要以逗号将其分隔,各选择器之间遵循“与”逻辑,即必须要满足所有条件,而且空值的选择器将不选择任何对象。

  • 基于等值关系的标签选项器:

基于等值关系的标签选择器的可用操作符有=、==和!=三种,其中前两个意义相同,都表示“等值”关系,最后一个表示“不等”。例如env=dev和env!=prod都是基于等值关系的选择器

  • 基于集合关系的标签选择器

基于集合关系的标签选择器则根据标签名的一组值进行筛选,它支持in、notin、和exists三种操作符,例如tier in (frontend,backend)表示所有包含tier标签且值为frontend或backend的资源对象:

KEY in (VALUE1,VALUE2,…) :指定的键名的值存在于给定的列表中即满足条件;
KEY notin (VALUE1,VALUE2,…) :指定的键名的值不存在于给定列表中即满足条件;
KEY:所有存在此键名标签的资源;
!KEY:所有不存在此键名标签的资源

1、选择标签

选择app为reviews或者productpage的svc:

[root@k8s-master01 ~]# kubectl get svc -l  '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
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

选择label key名为app的svc

[root@k8s-master01 ~]# 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

选择app为productpage或details但不包括version=v1的svc

[root@k8s-master01 ~]# 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

2、修改标签

在实际使用中,Label的更改是经常发生的事情,可以使用overwrite参数修改标签。比如将hello=test改为hello=test1

[root@ln03 ~]# kubectl get node -l hello=test
NAME   STATUS   ROLES    AGE    VERSION
ln03   Ready    <none>   5d5h   v2.0.2-tos-final-build-20200728
[root@ln03 ~]# kubectl label node ln03 hello=test1 --overwrite
node/ln03 labeled
[root@ln03 ~]# kubectl get node -l hello=test
No resources found in default namespace.
[root@ln03 ~]# kubectl get node -l hello=test1
NAME   STATUS   ROLES    AGE    VERSION
ln03   Ready    <none>   5d5h   v2.0.2-tos-final-build-20200728

3、删除标签

删除标签,比如删除hello

[root@ln03 ~]# kubectl label node ln03 hello-
node/ln03 labeled

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐