Kubernetes 标签和注解
1. 标签
标签(Labels) 是附加到 Kubernetes 对象(比如 Pod)上的键值对。
标签可以用于组织和选择对象的子集。标签可以在创建时附加到对象,随后可以随时添加和修改。 每个对象都可以定义一组键/值标签。每个键对于给定对象必须是唯一的。
有效标签值:
- 必须为 63 个字符或更少(可以为空)
- 除非标签值为空,必须以字母数字字符([a-z0-9A-Z])开头和结尾
- 包含破折号(-)、下划线(_)、点(.)和字母或数字
例如,下面定义了 environment: production 和 app: nginx 两个标签
apiVersion: v1
kind: Pod
metadata:name: label-demolabels:environment: productionapp: nginx
spec:...
1.1 标签选择符
所谓标签选择符
(Label selectors,官方文档翻译为“标签选择算符”)就是如何通过过滤标签来识别一组对象。标签选择符是 Kubernetes 中的核心分组原语。
API 目前支持两种类型的选择符:基于等值的和基于集合的。可以由逗号分隔的多个需求组成。
基于等值的需求
可对标签的键
通过=、== 和 != 三种
运算符进行筛选,前两个表示相等(并且是同义词),后者表示不相等。、
例如,environment=production,tier!=frontend
,很简单,不多说。
基于集合的需求
支持对标签的键
使用三种操作符:in、notin 和 exists,程序员都能看懂,不多说。
例如,environment in (production, qa)
,tier notin (frontend, backend)
。
1.2 kubectl 中使用
使用kubectl label --help
可查看查询帮助,-L
和 -l, --selector
是用于标签的可选项。
新增和更新标签
新增和更新一个对象的标签,都使用kubectl label
命令,如果原标签不存在则会新增。
例如,对名为 nginx-test 的 Pod 新增一个 tier=backend 标签:
kubectl label pods nginx-test tier=backend
如果原标签已存在,要更新则要加一个--overwrite
可选项才会更新,否则会报错。例如,要更新名为 nginx-test 的 Pod 的 env 标签值为 prd:
kubectl label pods nginx-test --overwrite env=prd
查看标签值
使用kubectl get --help
查看帮助。
要在查看资源的同时展示标签,可添加--show-labels
可选项。例如,查看名为 nginx-test 的 Pod(可以不指定查所有 Pod)包括标签的信息:
kubectl get pod nginx-test --show-labels
要单独查看某一资源的所有标签值,使用kubectl label
命令,加上--list=true
可选项。例如,要查看名为 nginx-test 的标签:
kubectl label pods nginx-test --list=true
其结果可能为:
app=nginx-test
env=uat
要查看某一类或某一个指定资源的指定标签值,可用-L
可选项。例如,要查看所有 pod 的 app、env 标签的值:
kubectl get pods -Lapp -Lenv
要查看名为 nginx-test 的 Pod 的 app、env 标签值:
kubectl get pods nginx-test -Lapp -Lenv
使用标签过滤查询
-l, --selector='':Selector (label query) to filter on, supports '=', '==', '!=', 'in', 'notin'.(e.g. -lkey1=value1,key2=value2,key3 in (value3)). Matching objects must satisfy all of the specified labelconstraints.
即,标签是使用-l
或--selector
可选项来接受标签选择符(注意,区分大小写),例如:
kubectl get pods -l app=nginx-test,env=uat
或
kubectl get pods -selector nginx-test,env=uat
删除标签
在标签的键
后加-
即表示删除。例如,要删除 nginx-test 的 tier 标签:
kubectl label pods nginx-test tier-
要删除所有 Pod 的标签,添加个--all
可选项:
kubectl label pods tier-
2. 注解
注解
可以为对象附加任意的非标识的元数据,客户端程序(例如工具和库)能够获取这些元数据信息。
注解和标签本质都是“键值对”,都可以将元数据附加到 Kubernetes 对象,但注解不用于标识和选择对象。 注解中的元数据,可以很小,也可以很大,可以是结构化的,也可以是非结构化的(例如可以是 json数据),能够包含标签不允许的字符。 可以在同一对象的元数据中同时使用标签和注解。
官方文档对注解的使用场景说明:
- 由声明性配置所管理的字段。 将这些字段附加为注解,能够将它们与客户端或服务端设置的默认值、 自动生成的字段以及通过自动调整大小或自动伸缩系统设置的字段区分开来。
- 构建、发布或镜像信息(如时间戳、发布 ID、Git 分支、PR 数量、镜像哈希、仓库地址)。
- 指向日志记录、监控、分析或审计仓库的指针。
- 可用于调试目的的客户端库或工具信息:例如,名称、版本和构建信息。
- 用户或者工具/系统的来源信息,例如来自其他生态系统组件的相关对象的 URL。
- 轻量级上线工具的元数据信息:例如,配置或检查点。
- 负责人员的电话或呼机号码,或指定在何处可以找到该信息的目录条目,如团队网站。
- 从用户到最终运行的指令,以修改行为或使用非标准功能。
可以看到,注解主要用来标识对象的非功能性信息,该信息可用来更全面地了解对象,而不会对对象的行为起作用
。
例如,给 Pod 对象添加镜像源地址注解 metadata.annotations.imageregistry:
apiVersion: v1
kind: Pod
metadata:name: annotations-demoannotations:imageregistry: "https://hub.docker.com/"
spec:...
新增和更新注解
使用kubectl annotate --help
查看文档帮助。
使用kubectl annotate
命令给对象添加注解。例如要给一个名为 nginx-deploy 的 deployment 添加注解 desc:
kubectl annotate deploy nginx-deploy desc=‘这是一个测试注解’
如果该注解原来不存在则新增,如果已经存在且最新的值与原来的值相同,则不更新,如果最新值与原来的值不同,则会报错;如果要覆盖更新原来的值,则要加--overwrite
可选项:
kubectl annotate deploy nginx-deploy --overwrite desc=‘这是一个新测试注解’
查询注解
查询一个对象的所有注解,需要加上--list
可选项。例如,查询 nginx-deploy 注解:
kubectl annotate deploy nginx-deploy --list
删除注解
同删除标签一样,只需要在要删除的注解键后面加-
即可。例如,要删掉 nginx-deploy 的 desc 注解:
kubectl annotate deploy nginx-deploy desc-
参考
[1] Kubernetes 文档:标签和选择算符
[2] Kubernetes 文档:注解