k8s系列——标签那点事

272 阅读4分钟

什么是标签

标签,通常指的是用于描述或分类内容的关键词或短语。这个概念几乎存在于所有的应用系统中。

例如下面的掘金文章:

image.png 右下角的后端``前端这两个小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为prodqa的资源
  • tier notin (frontend, backend)匹配所有key为tier,value不为frontendbackend的资源,包括没有设置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中标签的定义、匹配、操作相关的内容,希望对您有帮助~