Kubernetes基本概念之Label

系列目錄html

在爲對象定義好Label後,其餘對象就能夠經過Label來對對象進行引用。Label的最多見的用法即是經過spec.selector來引用對象。nginx

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的用法重點在於這兩步:redis

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

  • 經過spec.selector字段來指定這個RC管理哪些Pod。在上面的例子中,新建的RC會管理全部擁有app:nginxLabel的Pod。這樣的spec.selector在Kubernetes中被稱做Label Selectorapp

1.1. Label的定義

咱們一般使用metadata.labels字段,來爲對象添加Label。Label能夠爲多個。一個簡單的例子以下:frontend

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在選擇的時候匹配便可code

1.1.1. 常見的Label

通常來講,咱們會給一個Pod(或其餘對象)定義多個Label,以便於配置,部署等管理工做。例如:部署不一樣版本的應用到不一樣的環境中;或者監控和分析應用(日誌記錄,監控,報警等)。經過多個Label的設置,咱們就能夠多維度的Pod或其餘對象進行精細化管理。一些經常使用的Label示例以下:htm

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系統中最核心的應用模型,使得對象可以精細分組,同時實現了集羣的高可用性。

相關文章
相關標籤/搜索