1. Label(标签)
1.1 介绍
Label 是一组 键值对(Key-Value),用于标识、选择和组织 Kubernetes 资源对象。它们被广泛用于 查询、筛选、分组和调度 资源。
1.2 作用
- 资源分组:可以通过 Label 对 Pod、Service、Deployment 进行分组管理。
- 负载均衡:Service 通过 Label 选择器(Selector)匹配 Pod,并均衡流量。
- 调度决策:Node Selector、Affinity 规则可以基于 Label 进行 Pod 调度。
-
版本管理:可以使用 Label 标识应用的不同版本,如
app=v1.0
。
1.3 示例
(1) 给 Pod 添加 Label
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
app: my-app
env: production
spec:
containers:
- name: my-app-container
image: my-app:latest
(2) 使用 Label 选择器查询资源
- 获取所有
app=my-app
的 Pod:kubectl get pods -l app=my-app
- 获取所有
env=production
且app=my-app
的 Pod:kubectl get pods -l env=production,app=my-app
(3) Service 通过 Label 选择 Pod
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
2. Annotation(注解)
2.1 介绍
Annotation 也是一组 键值对(Key-Value),主要用于存储 Kubernetes 资源的 附加信息,不影响对象的标识或调度。
2.2 作用
- 存储额外的元数据(如作者、构建信息、外部工具信息)。
- 提供非结构化信息,如监控系统、日志系统或 CI/CD 工具使用的元数据。
-
Kubernetes 内部机制,如
kubectl.kubernetes.io/last-applied-configuration
记录kubectl apply
之前的状态。
2.3 示例
(1) 给 Pod 添加 Annotation
apiVersion: v1
kind: Pod
metadata:
name: my-app
annotations:
creator: "admin"
buildTimestamp: "2024-02-25T12:00:00Z"
monitoring: "prometheus"
spec:
containers:
- name: my-app-container
image: my-app:latest
(2) Kubernetes 内部 Annotation 示例
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Pod","metadata":{"name":"my-app"},"spec":{"containers":[{"name":"my-app-container","image":"my-app:latest"}]}}
3. Label 和 Annotation 的区别
特性 | Label | Annotation |
---|---|---|
用途 | 资源标识、选择和筛选 | 存储额外的元数据 |
是否可用于查询 | ✅ 支持 kubectl get -l
|
❌ 不支持 |
影响 Kubernetes 机制 | ✅ 可用于 Service、调度、自动伸缩等 | ❌ 仅用于信息存储 |
数据结构 | 简单的 Key-Value | 允许复杂的 Key-Value 及大数据量 |
4. 何时使用 Label vs Annotation
✅ 使用 Label 的情况:
- 需要筛选、分组或查询资源,例如:
- 按环境(
env=production
) - 按应用(
app=nginx
) - 按版本(
version=v2
)
- 按环境(
✅ 使用 Annotation 的情况:
- 需要存储额外信息,但不会影响资源分组和调度,例如:
- 记录应用构建时间(
buildTimestamp
) - 记录监控系统信息(
monitoring=prometheus
) - 记录 CI/CD 相关信息(
ci-tool=Jenkins
)
- 记录应用构建时间(
5. 结论
- Label 用于筛选和组织资源,影响 Kubernetes 的调度、负载均衡等。
- Annotation 仅存储额外信息,不影响 Kubernetes 机制。
- Label 是结构化的,Annotation 是非结构化的,可以存储更复杂的数据。
- 合理使用 Label 和 Annotation 可以提高 Kubernetes 资源管理的灵活性和可维护性。