Kubernetes Label 和 Annotation

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=productionapp=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

? 使用 Annotation 的情況

  • 需要存儲額外信息,但不會影響資源分組和調(diào)度,例如:
    • 記錄應(yīng)用構(gòu)建時間(buildTimestamp
    • 記錄監(jiān)控系統(tǒng)信息(monitoring=prometheus
    • 記錄 CI/CD 相關(guān)信息(ci-tool=Jenkins

5. 結(jié)論

  • Label 用于篩選和組織資源,影響 Kubernetes 的調(diào)度、負(fù)載均衡等。
  • Annotation 僅存儲額外信息,不影響 Kubernetes 機制。
  • Label 是結(jié)構(gòu)化的,Annotation 是非結(jié)構(gòu)化的,可以存儲更復(fù)雜的數(shù)據(jù)。
  • 合理使用 Label 和 Annotation 可以提高 Kubernetes 資源管理的靈活性和可維護(hù)性。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容