标签与标签选择器
标签概述
标签是附加于资源对象上的一种键值型数据。可以为空,可以在创建之前或创建之后指定。标签和对象之间是多对多的关系,也就是说一个标签可以在多个对象之上,一个对象也有可以拥有多个标签。实际使用中,我们一般给予对象多个维度的标签,以便于管理。例如环境标签、版本标签、架构标签等。下面是一些比较常用的标签。
- 版本标签:”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
选项进行覆盖。
标签选择器
基于等值关系的选择器
基于等值关系的标签选择器可用的操作符有=、==和!=三种,其中前两种的含义相同,且遵循以下逻辑:
- 同时指定的多个选择器之间的关系为”与”操作
- 使用控制的表情选择器意味着全选
- 空的标签选择器无法选中任何资源
如下面两条命令:第一条显示键名为env但值不为qa的所有podkubectl get pods -l "env!=qa" -L env kubectl get pods -l "env!=qa, tier=frontend"
第二条显示env不为qa且tier为frontend的所有pod
基于集合关系的选择器
基于集合关系的标签选择器支持in、notin和exists三种操作符,它们的使用格式及意义如下:
- KEY in (VALUE1, VALUE2…):指定的键名的值存在于给定的列表中即满足条件
- KEY notin (VALUE1, VALUE2…):指定的键名的值不存在于给定的列表中即满足条件
- KEY:所有存在此键名的资源
- !KEY:所有不存在此键名的资源
如下面的示例:第一条命令显示标签键名为env值为production或dev的所有对象。kubectl get pods -l "env in (production, dev)" kubectl get pods -l 'env in (production, dev), !tier' -L env, tier
第二条命令显示标签键名为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 协议 ,转载请注明出处!