Kubernetes 中的 Labels 和 Annotations 是什么?

在 Kubernetes 中,Labels 和 Annotations 都是用于添加元数据的机制,但是有以下主要区别:

  • Labels(标签):
  • 由键值对组成,用于标识识别和选择对象(如Pod)。
  • 可以在时刻用来选择集合的子集。
  • 典型的使用场景是用于选择器选择Pod。
  • 例如:app=nginx。
  • Annotations(注解):
  • 也由键值对组成,用于存储非标识性元数据。
  • 与 Labels 不同,Annotations 不能用来选择对象集合的子集。
  • 典型的使用场景是用于存储工具/库的额外数据,或实现机器人自动系统。
  • 例如:description=Nginx Pod。

所以总结来说,Labels 和 Annotations 的主要区别在于:

  • Labels 用于标识和选择对象,Annotations 用于存储附加信息。
  • Labels 可以在选择器中使用,Annotations 不能。
  • Labels 应该少数而精选,Annotations可以任意指定。
  • 相同的键和值既可以是Label也可以是Annotation。

Labels 的主要作用是标识和选择 Kubernetes 对象,主要应用于:

  • Pod 选择器:用于选择器选择一组 Pod,如 Deployment、Service等。
  • NodeSelector:用于选择指定节点运行 Pod。
  • 按标签选择对象:kubectl 可以通过标签选择某类对象。

Annotations 的主要作用是用来存储附加信息,主要应用于:

  • 工具/系统使用:某些工具或系统使用Annotation存储信息。
  • 编排使用:实现高级编排,复杂的调度逻辑。

例如:

Pod 标签:

yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: nginx
  name: nginx

Pod 注解:

yaml 
apiVersion: v1
kind: Pod   
metadata:
  annotations: 
    description: Nginx Pod   
  name: nginx
Deployment 选择器根据标签选择Pod: 
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  selector: 
    matchLabels:
      app: nginx  
  template:
    metadata:
      labels:
        app: nginx

所以总结来说,Labels和Annotations的主要作用和区别是:

Labels:

  • 用于标识和选择Kubernetes对象。
  • 可以在选择器和NodeSelector中使用。
  • 必须少而精选。

Annotations:

  • 用于存储附加信息。
  • 不能在选择器和NodeSelector中使用。
  • 相对灵活,可以设置任意键值对。