Kubernetes基本概念之Label


系列目錄

在為對象定義好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系統中最核心的應用模型,使得對象能夠精細分組,同時實現了集群的高可用性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM