1. Label(標(biāo)簽)
1.1 介紹
Label 是一組 鍵值對(Key-Value),用于標(biāo)識、選擇和組織 Kubernetes 資源對象。它們被廣泛用于 查詢、篩選、分組和調(diào)度 資源。
1.2 作用
- 資源分組:可以通過 Label 對 Pod、Service、Deployment 進(jìn)行分組管理。
- 負(fù)載均衡:Service 通過 Label 選擇器(Selector)匹配 Pod,并均衡流量。
- 調(diào)度決策:Node Selector、Affinity 規(guī)則可以基于 Label 進(jìn)行 Pod 調(diào)度。
-
版本管理:可以使用 Label 標(biāo)識應(yīng)用的不同版本,如
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 資源的 附加信息,不影響對象的標(biāo)識或調(diào)度。
2.2 作用
- 存儲額外的元數(shù)據(jù)(如作者、構(gòu)建信息、外部工具信息)。
- 提供非結(jié)構(gòu)化信息,如監(jiān)控系統(tǒng)、日志系統(tǒng)或 CI/CD 工具使用的元數(shù)據(jù)。
-
Kubernetes 內(nèi)部機制,如
kubectl.kubernetes.io/last-applied-configuration記錄kubectl apply之前的狀態(tài)。
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 內(nèi)部 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 的區(qū)別
| 特性 | Label | Annotation |
|---|---|---|
| 用途 | 資源標(biāo)識、選擇和篩選 | 存儲額外的元數(shù)據(jù) |
| 是否可用于查詢 | ? 支持 kubectl get -l
|
? 不支持 |
| 影響 Kubernetes 機制 | ? 可用于 Service、調(diào)度、自動伸縮等 | ? 僅用于信息存儲 |
| 數(shù)據(jù)結(jié)構(gòu) | 簡單的 Key-Value | 允許復(fù)雜的 Key-Value 及大數(shù)據(jù)量 |
4. 何時使用 Label vs Annotation
? 使用 Label 的情況:
- 需要篩選、分組或查詢資源,例如:
- 按環(huán)境(
env=production) - 按應(yīng)用(
app=nginx) - 按版本(
version=v2)
- 按環(huán)境(
? 使用 Annotation 的情況:
- 需要存儲額外信息,但不會影響資源分組和調(diào)度,例如:
- 記錄應(yīng)用構(gòu)建時間(
buildTimestamp) - 記錄監(jiān)控系統(tǒng)信息(
monitoring=prometheus) - 記錄 CI/CD 相關(guān)信息(
ci-tool=Jenkins)
- 記錄應(yīng)用構(gòu)建時間(
5. 結(jié)論
- Label 用于篩選和組織資源,影響 Kubernetes 的調(diào)度、負(fù)載均衡等。
- Annotation 僅存儲額外信息,不影響 Kubernetes 機制。
- Label 是結(jié)構(gòu)化的,Annotation 是非結(jié)構(gòu)化的,可以存儲更復(fù)雜的數(shù)據(jù)。
- 合理使用 Label 和 Annotation 可以提高 Kubernetes 資源管理的靈活性和可維護(hù)性。