K8S的label和annotation区别

概述

label 和 annotation 都可以将元数据关联到 Kubernetes 的资源对象。与资源对象相关的事务与动作。label 主要用于来选择对象,可以指定满足特定条件的对象。但是 annotation 不能标识和选择对象。annotation 中的元数据可以是结构化或者非结构化的,也可以包含 label 中不允许出现的字符。

资源对象的名称 ( Name ) 、标签、注解这三个属性属于资源对象的元数据(metadata)

数据结构

两者都是 key-value 键值对的形式:

1
2
3
annotations:
key1: value1
key2: value2
1
2
3
labels:
key1: value1
key2: value2

label

label 是附着到资源对象上(例如 Pod )的键值对。可以在创建资源对象的时候指定,也可以在资源对象创建后随时指定。labels 的值对系统本身并没有什么含义,只是对用户才有意义。

1
2
3
labels:
key1: value1
key2: value2

Kubernetes 最终将对 labels 最终索引和反向索引用来优化查询和 watch,在 UI 和命令行中会对它们排序。不要在 label 中使用大型、非标识的结构化数据,记录这样的数据应该用 annotation。

一般配合 label selector 使用。

annotation

annotation 可以将 Kubernetes 资源对象关联到任意的非标识性元数据。使用客户端(如工具和库)可以检索到这些元数据。

1
2
3
annotations:
key1: value1
key2: value2

以下列出了一些可以记录在 annotation 中的对象信息:

  • 声明配置层管理的字段。使用 annotation 关联这类字段可以用于区分以下几种配置来源:客户端或服务器设置的默认值,自动生成的字段或自动生成的 auto-scaling 和 auto-sizing 系统配置的字段。
  • 创建信息、版本信息或镜像信息。例如时间戳、版本号、git 分支、PR 序号、镜像哈希值以及仓库地址。
  • 记录日志、监控、分析或审计存储仓库的指针
  • 可以用于 debug 的客户端(库或工具)信息,例如名称、版本和创建信息。
  • 用户信息,以及工具或系统来源信息、例如来自非 Kubernetes 生态的相关对象的 URL 信息。
  • 轻量级部署工具元数据,例如配置或检查点。
  • 负责人的电话或联系方式,或能找到相关信息的目录条目信息,例如团队网站。

如果不使用 annotation,也可以将以上类型的信息存放在外部数据库或目录中,但这样做不利于创建用于部署、管理、内部检查的共享工具和客户端库。

参考

作者

操先森

发布于

2021-10-14

更新于

2021-10-14

许可协议

评论