注释、标签和选择器用于管理附加到 Kubernetes 对象的元数据。注释和标签定义了数据,而选择器提供了一种查询方式。
以下是这三个概念之间的区别、它们的设计目的以及如何使用它们来管理资源。
注释该Kubernetes文档定义的注释为“任意非识别的元数据”,它添加到您的对象。它们的“不可识别”状态意味着它们不会被 Kubernetes 在内部用作其对象选择系统的一部分。
这意味着注释最适合用于独立于对象及其在集群中的角色的数据。您可以使用它们来添加有关创建对象的工具的信息,定义负责管理的人员,或添加要由外部工具选取的标签。
对您使用注释的目的没有限制。只要您的数据可以表示为键值对,您就可以创建一个注释来封装它。该模型使您可以将有用的数据直接与对象一起存储,而不必参考外部文档或数据库。
设置注释注释被定义为资源metadata字段的一部分。它们是简单的键值对。密钥必须不超过 63 个字符,并且可以包含字母数字字符、破折号、下划线和点。它必须以字母数字字符开头和结尾。
密钥还支持可选前缀,该前缀必须是有效的 DNS 子域。前缀用于命名注释键,避免常见注释之间的冲突,例如name和version。当使用前缀时,斜线字符将它与键分开。
apiVersion : v1 kind : Pod metadata :
name : pod-with-annotations
annotations :
unprefixed
-annotation : "value" cloudavvyit.com/prefixed-annotation : "another value" spec : #
此示例演示了带前缀和不带前缀的注释。
您可以使用 Kubectl检索已在对象上设置的注释。没有内置命令,因此您需要获取对象的 JSON 或 YAML 定义,然后提取该annotations字段的值。这是一个实例,显示与上面显示的 Pod 关联的注释:
kubectl get pod pod-with-annotations -o jsonpath='{.metadata.annotations}'
标签
标签是另一种形式的元数据,您可以将其附加到您的资源上。该文档将标签的作用描述为“识别对用户有意义且相关的对象属性”,但与核心系统的属性无关。
注释是故意没有目的的,能够表示任意数据,而标签则用于更正式的情况。它们通常用于表示流程和组织结构。您可以使用标签来表示资源的发布状态(例如beta或stable)或其映射到的开发阶段(build或qa)。
引用对象时,标签可用作选择器。与不支持作为选择器的注释相比,这是一个关键的区别。这是一个选择具有node-environment: production标签的节点的 Pod :
apiVersion : v1 kind : Pod metadata :
name : pod-with-node-selector spec :
containers : # <
omited > nodeSelector :
node-environment : production
设置标签
标签以与注释相同的方式附加到对象。labels向对象的 中添加一个字段metadata,然后用键值对填充它。标签对键名和前缀具有相同的约束。
apiVersion: v1kind: Podmetadata:
name: pod-with-labels
labels:
cloudsavvyit.com/environment: stablespec: #
您可以使用 Kubectl 使用与前面所示相同的技术来检索对象的标签。获取对象的 JSON 表示,然后提取labels字段:
kubectl get pod pod-with-labels -o jsonpath='{.metadata.labels}'
Kubectl 还支持–show-labels在人类可读的输出表中包含标签的标志:
kubectl get pods --show-labels选择器
选择器在 Kubernetes 对象定义中用于引用其他对象。不同类型的选择器可用于拉入具有某些特征的对象。
在上面的示例中,我们使用选择器来标识具有特定标签的节点。这是一个 Deployment 对象,它使用显式标签选择器来标识它应该管理的 Pod:
apiVersion: apps/v1kind: Deploymentmetadata:
name: deploymentspec:
selector:
matchLabels:
cloudsavvyit.com/app: selectors-demo
replicas: 3
template:
metadata:
labels:
cloudsavvyit.com/app: selectors-demo
spec: #
部署template将创建具有cloudsavvyit.com/app标签集的Pod 。这些将与 匹配,selector因此它们成为部署的一部分。
Kubectl 中的选择器您可以使用一种选择器的形式来过滤 Kubectl 返回的对象:
kubectl get pods -l cloudavvyit.com/app=selectors-demo
基于标签的查询支持多种比较运算符。这些包括基于等式和基于集合的比较:
= – 标签值等于给定值。
== – 标签值严格等于给定值。
!= – 标签值不等于给定值。
in – 标签值是一组给定值中的一个。
notin – 标签值不在一组给定值中。
exists – 标签存在于对象上。
以下是使用in运算符查询临时或生产环境中的对象的示例:
kubectl get pods -l "environment in (dev, production)"概括
注释和标签是将元数据添加到 Kubernetes 对象的两种方法。注释用于 Kubernetes 不会引用的非标识数据。标签用于标识对象,以便其他 Kubernetes 资源可以选择它们。
如果您不使用键值对查询对象,最好使用注释。如果您将在另一个资源中引用它或使用它来过滤终端中的 Kubectl 输出,请使用标签。
使用标签时,可以使用多种形式的选择器来帮助您访问所需的数据。注释访问起来有点棘手,因为它们不是用来查询的,但您仍然可以通过查看 Kubernetes 对象的 JSON 表示来列出它们。



