标签与标签选择器

标签概述

标签是附加于资源对象上的一种键值型数据。可以为空,可以在创建之前或创建之后指定。标签和对象之间是多对多的关系,也就是说一个标签可以在多个对象之上,一个对象也有可以拥有多个标签。实际使用中,我们一般给予对象多个维度的标签,以便于管理。例如环境标签、版本标签、架构标签等。下面是一些比较常用的标签。

  • 版本标签:”release”: “canary”, “release”: “stable”, “release”: “beta”,
  • 环境标签:”environment”: “dev”, “environment”: “qa”, “environment”: “production”
  • 应用标签:”app”: “ui”, “app”: “as”, “app”: “pc”, “app”: “sc”
  • 架构层级标签:”tier”: “frontend”, “tier”: “backend”, “tier”: “cache”
  • 分区标签:”partition”: “customerA”, “partition”: “customerB”
  • 品控级别标签:”track”: “daily”, “track”: “weekly”

键名的组成包括键前缀和键名,格式为KEY_PREFIX/KEY_NAME键名最多可以使用63个字符,包括字母、数字、连接线、下划线、点号等字符,并且只能以数字或字母开头。键前缀必须为DNS子域名格式,且不能超过253个字符。省略键前缀时键将被视为用户的私有数据。由系统组件或第三方组件自动为用户资源添加的键必须使用键前缀。
标签中的键值不能多于63个字符,要么为空,要么是以字母或数字开头及结尾,且中间仅使用了字母数字,连接线,下划线或点号等字符的数据。实践中通常建议键名和键值都不要使用无意义的字符串。

管理资源标签

创建资源是可以在metadata字段中嵌套使用labels字段一定义标签。如下面的示例:

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-labels
  labels:
    env: qa
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1

使用kubectl get pods --show-labels可以获取到pod的标签信息。
使用kubectl get pods -L key1, key2...可以显示有特定标签的资源。
使用kubectl label命令如kubectl label pods/pod-demo env=production可以为已创建的对象添加或修改标签。对于已存在的标签,需要设定新的值的时候使用--overwrite选项进行覆盖。

标签选择器

基于等值关系的选择器

基于等值关系的标签选择器可用的操作符有=、==和!=三种,其中前两种的含义相同,且遵循以下逻辑:

  • 同时指定的多个选择器之间的关系为”与”操作
  • 使用控制的表情选择器意味着全选
  • 空的标签选择器无法选中任何资源
    如下面两条命令:
    kubectl get pods -l "env!=qa" -L env
    kubectl get pods -l "env!=qa, tier=frontend"
    第一条显示键名为env但值不为qa的所有pod
    第二条显示env不为qa且tier为frontend的所有pod

基于集合关系的选择器

基于集合关系的标签选择器支持in、notin和exists三种操作符,它们的使用格式及意义如下:

  • KEY in (VALUE1, VALUE2…):指定的键名的值存在于给定的列表中即满足条件
  • KEY notin (VALUE1, VALUE2…):指定的键名的值不存在于给定的列表中即满足条件
  • KEY:所有存在此键名的资源
  • !KEY:所有不存在此键名的资源
    如下面的示例:
    kubectl get pods -l "env in (production, dev)"
    kubectl get pods -l 'env in (production, dev), !tier' -L env, tier
    第一条命令显示标签键名为env值为production或dev的所有对象。
    第二条命令显示标签键名为env值为production或dev但标签中没有键名为tier的标签的所有对象。且为了避免叹号的影响,此类命令需要使用单引号。

使用标签选择器关联其他资源对象

通常用于Service、Deployment、ReplicaSet等,通过在spec中嵌套selector字段实现

  • matchLabels:通过直接给定键值对来指定标签选择器
  • matchExpressions:通过表达式指定标签选择器列表

使用matchExpressions时,其格式为"{key:KEY_NAME, operator:OPERATOR, values: [VALUE1, VALUE2...]}"选择器列表间的关系为逻辑与关系。使用In或NotIn操作符时,其value可以为空,使用Exists或DoseNotExist时,其value必须为空。下面是一个示例:

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

Pod的节点选择器nodeSelector

节点选择器即用来选择Pod对象运行于哪个节点之上的东西。我们可以手动指定pod对象运行于哪个节点,但在实践中我们通常给节点打标签,然后通过节点选择器关联相关标签。
例如使用kubectl label nodes node1 disktype=ssd给node1节点打一个disktype为ssd的标签,然后就可以在创建资源时使用nodeSelector关键,如下面的示例:

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-nodeSelector
  labels:
    env: test
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  nodeSelector:
    disktype: ssd

使用了节点选择器的资源会自动调度到具有相关标签的节点上。如果需要手动指定资源运行的节点可以使用spec.nodeName字段直接指定运行节点


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!