概述
1、标签(Labels) 是附加到 Kubernetes 对象(比如 Pod)上的键值对
2、标签旨在用于指定对用户有意义且相关的对象的标识属性,但不直接对核心系统有语义含义
3、标签可以用于组织和选择对象的子集
4、标签可以在创建时附加到对象,随后可以随时添加和修改
(1)每个对象都可以定义一组键 / 值标签
(2)每个键对于给定对象必须是唯一的
5、标签能够支持高效的查询和监听操作,对于用户界面和命令行是很理想的。 应使用注解记录非识别信息
动机
1、标签使用户能够以松散耦合的方式将他们自己的组织结构映射到系统对象,而无需客户端存储这些映射
2、服务部署和批处理流水线通常是多维实体(例如,多个分区或部署、多个发行序列、多个层,每层多个微服务)。 管理通常需要交叉操作,这打破了严格的层次表示的封装,特别是由基础设施而不是用户确定的严格的层次结构
3、示例标签
(1)"release" : "stable", "release" : "canary"
(2)"environment" : "dev", "environment" : "qa", "environment" : "production"
(3)"tier" : "frontend", "tier" : "backend", "tier" : "cache"
(4)"partition" : "customerA", "partition" : "customerB"
(5)"track" : "daily", "track" : "weekly"
4、有一些常用标签的例子,可以任意自定义约定
(1)标签的 Key 对于给定对象必须是唯一的
(2)共享标签和注解都使用同一个前缀:app.kubernetes.io
(3)没有前缀的标签是用户私有的
(4)共享前缀可以确保共享标签不会干扰用户自定义的标签
键 | 描述 | 示例 | 类型 |
app.kubernetes.io/name | 应用程序的名称 | mysql | 字符串 |
app.kubernetes.io/instance | 用于唯一确定应用实例的名称 | mysql-abcxzy | 字符串 |
app.kubernetes.io/version | 应用程序的当前版本(例如语义版本 1.0、修订版哈希等) | 5.7.21 | 字符串 |
app.kubernetes.io/component | 架构中的组件 | database | 字符串 |
app.kubernetes.io/part-of | 此级别的更高级别应用程序的名称 | wordpress | 字符串 |
app.kubernetes.io/managed-by | 用于管理应用程序的工具 | helm | 字符串 |
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app.kubernetes.io/name: mysql
app.kubernetes.io/instance: mysql-abcxzy
app.kubernetes.io/version: "5.7.21"
app.kubernetes.io/component: database
app.kubernetes.io/part-of: wordpress
app.kubernetes.io/managed-by: helm
语法和字符集
1、标签是键值对
2、有效的标签键有两个段:可选的前缀和名称,用斜杠(/)分隔
(1)名称段是必需的,必须小于等于 63 个字符,以字母数字字符([a-z0-9A-Z])开头和结尾,带有破折号(-),下划线(_),点(.)和之间的字母数字
(2)前缀是可选的。如果指定,前缀必须是 DNS 子域:由点(.)分隔的一系列 DNS 标签,总共不超过 253 个字符, 后跟斜杠(/)
(3)如果省略前缀,则假定标签键对用户是私有的
(4)向最终用户对象添加标签的自动系统组件(例如 kube-scheduler、kube-controller-manager、 kube-apiserver、kubectl 或其他第三方自动化工具)必须指定前缀
(5)kubernetes.io/ 和 k8s.io/ 前缀是为 Kubernetes 核心组件保留的
3、有效标签值
(1)必须为 63 个字符或更少(可以为空)
(2)除非标签值为空,必须以字母数字字符([a-z0-9A-Z])开头和结尾
(3)包含破折号(-)、下划线(_)、点(.)和字母或数字
标签选择算符(Label selectors)
1、与名称和 UID 不同,标签不支持唯一性,通常,希望许多对象携带相同的标签
(1)通过标签选择算符,客户端/用户可以识别一组对象
(2)标签选择算符是 Kubernetes 中的核心分组原语
2、API 目前支持两种类型的选择算符:基于等值的和基于集合
(1)标签选择算符可以由逗号分隔的多个需求组成。在多个需求的情况下,必须满足所有要求,因此逗号分隔符充当逻辑与(&&)运算符
(2)注意:对于基于等值的和基于集合的条件而言,不存在逻辑或(||)操作符
3、空标签选择算符或者未指定的选择算符的语义取决于上下文, 支持使用选择算符的 API 类别应该将算符的合法性和含义用文档记录下来
4、说明:对于某些 API 类别(例如 ReplicaSet)而言,两个实例的标签选择算符不得在命名空间内重叠, 否则它们的控制器将互相冲突,无法确定应该存在的副本个数
5、基于等值的需求
(1)基于等值或基于不等值的需求允许按标签键和值进行过滤
(2)匹配对象必须满足所有指定的标签约束,尽管它们也可能具有其他标签
(3)可接受的运算符有 =、== 和 != 三种,前两个表示相等(并且是同义词),而后者表示不相等
#选择所有资源,其键名等于 environment,值等于 production
environment = production
#选择所有资源,其键名等于 tier,值不同于 frontend,所有资源都没有带有 tier 键的标签
tier != frontend
#可以使用逗号运算符来过滤 production 环境中的非 frontend 层资源
environment=production,tier!=frontend
6、基于集合的需求
(1)基于集合的标签需求允许通过一组值来过滤键
(2)支持三种操作符:in、notin 和 exists(只可以用在键标识符上)
#选择所有键等于 environment 并且值等于 production 或者 qa 的资源
environment in (production, qa)
#选择所有键等于 tier 并且值不等于 frontend 或者 backend 的资源,以及所有没有 tier 键标签的资源
tier notin (frontend, backend)
#选择所有包含了有 partition 标签的资源;没有校验它的值
partition
#选择所有没有 partition 标签的资源;没有校验它的值
!partition
(3)逗号分隔符充当与运算符
#使用 partition 键(无论为何值)和 environment 不同于 qa 来过滤资源
partition, environment notin (qa)
(4)基于集合的标签选择算符,是基于等值的标签选择算符的一般形式:environment=production 等同于 environment in (production);!= 和 notin 也是类似
(5)基于集合的要求可以与基于相等的要求混合使用
partition in (customerA, customerB),environment!=qa