什么是标签
标签,通常指的是用于描述或分类内容的关键词或短语。这个概念几乎存在于所有的应用系统中。
例如下面的掘金文章:
右下角的
后端``前端这两个小tip就是标签。
标签的作用,旨在描述对用户有意义、相关的对象标识属性,这种标识属性不作为核心系统的一种语义描述。
标签在大部分场景中都是用来辅助严格的对象分类,它不会抢了严格分类定义的风头,是一个“锦上添花”的系统,相对来说更灵活、松散,可以把定义的权利下放给使用端的用户。
在大部分应用场景下,严格的对象分类是必要的,松散的标签定义是非必要的。
k8s的标签
Kubernetes(k8s)中,标签是用来标识和组织Kubernetes资源的键值对。注意这里不仅仅有key,还有value,在有些系统中,标签定义只有key。
标签可以附加到各种Kubernetes资源上,如Pods、Services、Deployments等,以便于用户对资源进行分类和筛选。
标签的定义包括一个键和一个值,键和值都是由用户定义的字符串。
例如,你可能会在一个Pod上设置一个标签,键为"app",值为"myapp",以标识这个Pod是运行"myapp"应用的。
"metadata": {
"labels": {
"app" : "myapp"
}
}
维度
标签的维度可以完全根据应用实际情况来定义,例如:分区(境内、境外)、发布版本(dev、qa、pre、prod)、技术层(frontend、backend、cache、db)等。
标签选择运算符 selector
有分类就有选择器,选择器是使标签起作用的关键。在k8s中,是通过selector来识别一组对象的,它是k8s的核心分组原语。
selector有基于等值、基于集合两种类型。
基于等值
基于等值或基于不等值的需求允许按标签键和值进行过滤。匹配对象必须包含所有指定的标签规则。这里包含的运算符包括:= == !=。= ==表示相等,意思是一样的,!=表示不相等。
例如:
environment = prod
tier != frontend
前者选择所有key等于 environment,value等于 prod的资源。 后者选择所有key等于 tier,值不同于 frontend或没有带有 tier 键的标签的资源。
可以使用逗号运算符来过滤 prod 环境中的非 frontend 层资源:environment=prod,tier!=frontend。
这里需要注意的是,在多个匹配规则的情况下,必须满足所有的规则,相当于&&逻辑,逗号分割符充当了逻辑与&&运算符。不存在逻辑或||运算符。
节点选择运算符 nodeSelector
在等值匹配的场景中,有一种场景是匹配节点,使用的nodeSelector标签,如下:
apiVersion: v1
kind: Pod
metadata:
name: cuda-test
spec:
containers:
- name: cuda-test
image: "registry.k8s.io/cuda-vector-add:v0.1"
resources:
limits:
nvidia.com/gpu: 1
nodeSelector:
accelerator: nvidia-tesla-p100
当需要将Pod指派到指定的节点上运行时,就可以使用nodeSelector。
基于集合
基于集合的标签运算符为in``notin``exists,其中exists至应用在key上。
例如:
environment in (prod, qa)
tier notin (frontend, backend)
partition
!partition
environment in (prod, qa)匹配所有key为environment,value为prod或qa的资源tier notin (frontend, backend)匹配所有key为tier,value不为frontend或backend的资源,包括没有设置tier标签的资源partition匹配所有设置了partition标签的资源,不管value是什么值!partition匹配所有没有设置partition标签的资源
之所以没有逻辑或||的设计,是基于等值和基于集合的匹配规则,以及它们的混合可以涵盖所有的需求场景。
matchLabels、matchExpressions
使用matchLabels、matchExpressions设置基于等值、基于集合的匹配:
selector:
matchLabels:
component: redis
matchExpressions:
- { key: tier, operator: In, values: [cache] }
- { key: environment, operator: NotIn, values: [dev] }
标签的增删改查
活跃对象
对于已经创建的活跃对象,可以通过kubectl进行标签的操作。
- 增加
kubectl label pod <pod-name> <key>=<value>
- 删除
kubectl label pod <pod-name> <key>-
- 修改
kubectl label pod <pod-name> <key>=<new-value> --overwrite
- 查询
kubectl get pod <pod-name> --show-labels
非活跃对象
非活跃对象,则可以通过在定义资源的yaml文件中,指定label来实现标签绑定。
一般更推荐使用yaml定义的方式进行标签的运维,方便资源定义的版本维护。
如上就是k8s中标签的定义、匹配、操作相关的内容,希望对您有帮助~