Kubernetes基本概念之Label

周國通發表於2019-06-14

系列目錄

在為物件定義好Label後,其他物件就可以通過Label來對物件進行引用。Label的最常見的用法便是通過spec.selector來引用物件。

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

關於Label的用法重點在於這兩步:

  • 通過template.metadata.labels欄位為即將新建的Pod附加Label。在上面的例子中,新建了一個名稱為nginx的Pod,它擁有一個鍵值對為app:nginx的Label。

  • 通過spec.selector欄位來指定這個RC管理哪些Pod。在上面的例子中,新建的RC會管理所有擁有app:nginxLabel的Pod。這樣的spec.selector在Kubernetes中被稱作Label Selector

1.1. Label的定義

我們通常使用metadata.labels欄位,來為物件新增Label。Label可以為多個。一個簡單的例子如下:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
    release: stable
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

上面的描述檔案為名為nginx的Pod新增了兩個Label,分別為app: nginx和release: stable。

注: label為任意鍵值對,只要selector在選擇的時候匹配即可

1.1.1. 常見的Label

一般來說,我們會給一個Pod(或其他物件)定義多個Label,以便於配置,部署等管理工作。例如:部署不同版本的應用到不同的環境中;或者監控和分析應用(日誌記錄,監控,報警等)。通過多個Label的設定,我們就可以多維度的Pod或其他物件進行精細化管理。一些常用的Label示例如下:

relase: stable
release: canary
environment: dev
environemnt: qa
environment: production
tier: frontend
tier: backend
tier: middleware
......

上面說過,Label是自定義的一些key/value對,你可以隨心所欲的設定,但是強烈建議按照一定的慣例或者組織內部規則,以便維護管理

1.2. Label Selector

帶有Label的物件建立好之後,我們就可以通過Label Selector來引用這些物件。
通常我們通過描述檔案中的spec.selector欄位來指定Label,從而Kubernetes尋找到所有包含你指定Label的物件,進行管理。
Kubernetes目前支援兩種型別的Label Selector:

  • 基於等式的Selector(Equality-based)
  • 基於集合的Selector(Set-based)

RC只支援基於等式的Selector,而RS兩種Selector都支援。而RC是很早版本就建議棄用的特徵,因此實際專案中強烈建議使用Deployment來代替Repliation Controller (RC)

1.2.1. 基於等式的Selector

上文中建立RC的例子中的使用的就是基於等式的Selector。基於等式的Selector通過等式類的表示式來進行篩選。例如:

  • app=nginx 選擇所有Label中key為app,value為nginx的物件。
  • env!=dev 選擇所有Label中key為env,value不等於dev的物件。

1.2.2. 基於集合的Selector

基於集合的Selector通過集合操作的表示式來進行篩選。例如

  • name in (redis-master, redis-slave) 選擇所有Label中key為name,並且value為redis-master或redis-slave的物件。

  • env not in (dev) 選擇所有Label中key為env,並且value不為dev的物件。

使用Label可以給物件建立一組或多組標籤,Service,ReplicationController ReplicaSet,Deployment等元件則通過Label Selector來定位需要管理的物件,Label和Label Selector共同構成了Kubernetes系統中最核心的應用模型,使得物件能夠精細分組,同時實現了叢集的高可用性。

相關文章