kubernetes labels 与 selector

大番茄 2020年03月03日 1,981次浏览

v1.16.7

https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/

label是添加标签的,selector是选择标签的。

Label

Label(标签)是 Kubernetes 系统中另外一个核心概念。一个 Label 是一个 key=value 的键值对,其中 key 与 value 由用户自己指定。Label 可以被附加到各种资源对象上,例如 Node、Pod、Service、RC 等,一个资源对象可以定义任意数量的 Label,同一个 Label 也可以被添加到任意数量的资源对象上。Label 通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。

常用的 label 示例:

  • "release" : "stable""release" : "canary"
  • "environment" : "dev""environment" : "qa""environment" : "production"
  • "tier" : "frontend""tier" : "backend""tier" : "cache"
  • "partition" : "customerA""partition" : "customerB"
  • "track" : "daily""track" : "weekly"

Label 由 key: values 对组成,key 由两部分组成,可选的前缀与名称,中间用 / 分开。如:

  labels:
    addonmanager.kubernetes.io/mode: Reconcile
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: CoreDNS

名称是必须的。前缀是可选的,如果存在,则必须是由 . 分割的 DNS 域名。
kubernetes.io/k8s.io/ 前缀保留给 Kubernetes 核心组件

Selector

Selector, 标签选择器, 通过查找标签确定资源对象。

LabelSelector可以被类比为SQL语句中的where查询条件,例如,name=redisslave这个LabelSelector作用于Pod时,可以被类比为select * from pod where pod's name='redisslave'这样的语句。

基础写法

基础的selector标签。

  selector:
    dev: pro
    app: se-test3

or

 selector:
    matchLabels:
      dev: pro
      app: se-test3

这些条件都是and关系。只有满足dev=proapp=se-test3的才会匹配。
matchLabels用于定义一组Label,与直接写在Selector中的作用相同。


基于集合

matchExpressions用于定义一组基于集合的筛选条件,可用的条件运算符包括InNotInExistsDoesNotExist

selector:
  matchLabels:
    component: redis
  matchExpressions:
    - {key: tier, operator: In, values: [cache]}
    - {key: environment, operator: NotIn, values: [dev]}

如果同时设置了matchLabels和matchExpressions,则两组条件为AND关系

当前有两种LabelSelector表达式:基于等式的(Equalitybased)和基于集合的(Setbased)。
警告:基于等式的和基于集合的,都没有逻辑OR(||)运算符。

service不能使用matchLabelsmatchExpressions,只有Deployment、ReplicaSet、DaemonSet和Job可以使用。

基于等式

官方网站没有明确说,只是说可以使用=,==,!=

environment = production
tier != frontend

但是yaml文件里是用不了的。
然后有一个例子:

apiVersion: v1
kind: Pod
metadata:
  name: cuda-test
spec:
  containers:
    - name: cuda-test
      image: "k8s.gcr.io/cuda-vector-add:v0.1"
      resources:
        limits:
          nvidia.com/gpu: 1
  nodeSelector:
    accelerator: nvidia-tesla-p100

看这意思,那种基础写法也叫做基于等式的。