Kubernetes Labels 和 Annotations 最佳实践

Best Practice for Kubernetes Labels and Annotations

Posted by Robin on March 31, 2019

Labels

Label 允许在 Kubernetes 资源上附加对于系统或者用户有意义的标示性属性,方便对 Kubernetes 资源进行分组管理。 这些属性对不会直接对 Kubernetes 核心组件产生语义,不过可能间接地被 Kubernetes 核心组件处理产生效果。例如:用户在 pod 或者 node 上加一些 label,然后配置一些调度策略,Kubernetes 的 scheduler 会基于这些 label 信息进行调度。

Label 通过记录标示性属性,方便选择查询。支持两种选择判断方式:

  • 相等判断
    • =:被选择的资源必须带 label key,并且 value 必须相等。
    • ==:被选择的资源必须带 label key,并且 value 必须相等。
    • !=:被选择的资源不带 label key,或者带 label key,但是 value 不相等。
  • 集合判断
    • in:被选择的资源必须带 label key,并且 value 在集合范围内。
    • notin:被选择的资源不带 label key,或者带 label key, 但是 value 不在集合范围内。
    • exists:被选择的资源必须带 label key,不检查 value。Label key 前加 ! 表示不存在,则被选择的资源必须不带 label key。

Label 选择支持多条件查询,多条件间通过 , 隔开。例如:partition,environment notin (qa) 表示查询带有 partition label, 且带有 environment label 但是 environment 不是 qa 的资源。

语法规则

Label key 由两部分组成:可选的 prefix 和 name,它们之间通过 / 连接。下面对它们的语法规则进行对比:

  Label prefix Label name
Existence Optional Required
Max length 253 63
Characters DNS subdomain Alphanumeric
Separator . -, _, .
Restriction End with / Begin and end with an alphanumeric character

kubernetes.io/k8s.io/ 是 Kubernetes 为自己的核心组件预留的两个前缀,不允许被用户使用。

Label value 跟 label name 的语法规则一样。

Annotations

Annotations 允许在 Kubernetes 资源上附加任意的非标识性元数据,用来记录资源的一些属性。这些元数据主要是给工具或者库来提取信息,一般不会直接开放给用户。绝大多数基于 Kubernetes 的开源项目都不依赖于 DB,完全可以利用 Kubernetes 的能力,满足对 DB 的需求。对于需要持久化的数据,除了定义 CRD,另一种通用的做法就是将数据存储在 annotation 中。

由于 annotation 的定位是 Kubernetes 资源上附加任意的非标识性元数据,除了在 key 上有跟 label key 完全一样的限制外,在 value 上没有任何限制:可长可短,可结构化可非结构化,可包含任意字符。

Comparison of Labels and Annotations

通过上面对 labels 和 annotations 的介绍,下面对它们进行一个全面的对比:

  Labels Annotation
Usage Identifying metadata for efficient queries and watches Attach arbitrary non-identifying metadata to Kubernetes resources
Selectable Yes No
Keys Label key syntax Label key syntax
Values Label value syntax Arbitrary

最佳实践

  • 平台必须使用带前缀的 label,前缀严格根据组织、产品、资源等信息定义。
  • 不带前缀的 label 是预留给用户使用的。
  • 给所有的资源加上合适的 label,最终这些 label 会提升资源管理的效率。

Reference