Label/资源标签
在第一章博客中有简单的了解了标签的概念,以下介绍标签的使用格式及注意事项
-
一个对象可以拥有多个标签,而一个标签也可以被添加在多个资源之伤。
-
实践中,可以为资源附加多个不同纬度的标签以实现灵活的资源分组管理功能,例如版本标签、环境标签、分层架构标签等,拥有交叉标示同一个资源所属的不同版本、环境及架构层级等。
-
标签中的键名称由键前缀和键名称组成,其中键前缀可选,其格式如:"KEY_PREFEIX/KEY_NAME"。
- 键名称最多使用63个字符,可以使用字母、数字、连接号(-)、下划线(_)、点号(.)等字符,且只能以字母或数字开头。
- 键前缀必须为DNS子域名格式,且不能超过253个字符。省略键前缀时,键将被视为用户的私有数据,不过由Kubernetes系统组件或第三方组件自动为用户资源添加的键必须使用键前缀,而“kubernetes.io/”前缀是预留给kubernetes的核心组件使用。
- 标签中的键值必须不能多于63个字符,要么为空,要么是以字符或数字开头及结尾,且中间仅使用了字母、数字、连接号(-)、下划线(_)、点号(.)等字符的数据。
标签选择器
标签选择器(Selector),全称为 ”Label Selector“,标签选择器通过 Label来过滤符合条件的 Pod,例如附有标签 ”application:nginx“的所有 Pod 挑选出来归纳为一类,并为归纳出的这组标签的 Pod 创建为 Service的端点。
标签选择器用于表达标签的查询条件或选择标准,kubernetes API目前支持两种选择器:
- 基于等值关系(equality-based)
操作符有=、==、和!=三种,其中前两个意义相同,都表示“等值”关系,最后一个表示”不等“关系 - 基于集合关系(set-based)
KEY in (VALUE1,VALUE2…)
KEY not in (VALUE1,VALUE2…)
KEY:所有存在此键名标签的资源
!KEY:所有不存在此键名标签的资源
使用标签选择器时还将遵循以下逻辑:
- 同时指定的多个选择器之间的逻辑关系为“与”操作;
- 使用空值的标签选择器意味着每个资源对象都将被选中;
- 空的标签选择器将无法选出任何资源
定义标签选择器的方式:
- matchLabels:通过直接给定键值对指定标签选择器;
- matchExpressions:基于表达式指定的标签选择器列表,每个选择器如:"{key:KEY_NAME,operator:OPERATOR,values:[VALUE1,VALUE2,…]}",选择器列表间为“逻辑非”关系;
使用ln或NotIn操作符时,其values非必须为非空的字符串列表,而使用Exists或DostNotExist时,其values必须为空。
标签管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
1.显示默认名称空间下所有带标签的资源对象 kubectl get all -n default --show-labels 2.显示pods资源所带有的标签,默认使用控制器创建的pod会附加两个标签,第一个是 app= 对应控制器的标签,pod-template-hash为pod模版,hash值等于pod模版的hash指纹信息,默认我们通过yaml配置清单中创建的pod,没有使用labels参数的则没有标签 kubectl get pods -n default --show-labels ngx-dep-5d855b5b54-gglbl 1/1 Running 1 10d app=ngx-dep,pod-template-hash=5d855b5b54 ngx-dep-5d855b5b54-jkftx 1/1 Running 1 10d app=ngx-dep,pod-template-hash=5d855b5b54 ngx-dep-5d855b5b54-tbbrd 1/1 Running 1 13d app=ngx-dep,pod-template-hash=5d855b5b54 3.标签管理命令 kubectl label -h 查看标签命令用法 4.添加标签(为下面pod添加键为application,值为nginx_proxy的标签),添加多个标签空格即可,如第二条命令 kubectl label pods/nginx-deploy-7d5c9644b-xv44v -n default application=nginx_proxy kubectl label pods/nginx-deploy-7d5c9644b-xv44v -n default env=ngx version=1.17.2 5.修改标签(添加--overwrite参数)修改多个标签空格分割 kubectl label --overwrite pods/nginx-deploy-7d5c9644b-xv44v -n default application=ngx_proxy kubectl label --overwrite pods/nginx-deploy-7d5c9644b-xv44v -n default env=nginx version=1.17.1 6.覆盖标签 覆盖标签用法与修改标签一致,在原来的键上直接修改 7.删除标签(将键写为 key- ,即可删除相应标签) kubectl label pods/nginx-deploy-7d5c9644b-xv44v -n default application- version- 8.显示等于指定标签的pod(显示存在app=nginx-deploy标签的pod) kubectl get pods --show-labels -n default -l app=nginx-deploy 9.显示不等于指定标签的pod(加 ! 过滤掉 app=nginx-deploy 的 pod) kubectl get pods --show-labels -n default -l app!=nginx-deploy 10.显示标签键为app,值为 ngx-dep 或者nginx-deploy 的pod,如果匹配ngx-dep就显示ngx-dep,如果匹配nginx-deploy就显示nginx-deploy,如果两则都匹配,则两者都显示 kubectl get pods --show-labels -n default -l "app in (ngx-dep,nginx-deploy)" 11.在上面那条命令上使用 -L app ,会把 app(键) 作为列来展示值等于 ngx-dep 和 nginx-deploy 的 pod,-L 指定的值必须为键 kubectl get pods --show-labels -n default -l "app in (ngx-dep,nginx-deploy)" -L app NAME READY STATUS RESTARTS AGE APP LABELS nginx-deploy-7d5c9644b-cfg25 1/1 Running 0 2d23h nginx-deploy app=nginx-deploy,pod-template-hash=7d5c9644b nginx-deploy-7d5c9644b-xv44v 1/1 Running 0 2d23h nginx-deploy app=nginx-deploy,env=nginx,pod-template-hash=7d5c9644b ngx-dep-5d855b5b54-4vl54 1/1 Running 1 13d ngx-dep app=ngx-dep,pod-template-hash=5d855b5b54 ngx-dep-5d855b5b54-7md6k 1/1 Running 1 11d ngx-dep app=ngx-dep,pod-template-hash=5d855b5b54 12.显示键为 app ,值不是 ngx-dep 和 nginx-deploy 的 pod kubectl get pods --show-labels -l "app notin (ngx-dep,nginx-deploy)" 13.显示键为app的所有pod,只匹配键 kubectl get pods --show-labels -l app 14.显示键不为app的,感叹号 ! 要用单引号扩起来,表示文本意思,不然会被shell认为有特殊意义 kubectl get pods --show-labels -l '!app' |