使用Kubernetes对象4---标签和选择器(Labels and Selectors)

Labels是附到对象(如pods)上的键值对。Labels目的在于明确标识对象的属性,这些属性与用户相关并富有意义,但Labels对于核心系统来说并不具备语义。Labels可以用来组织和选择对象的子集。Labels可以在对象创建时附上,也可以在任意时间添加和修改。每个对象有一系列的键值对标签定义。给定一个对象,它的每个键(Key)都必须是唯一的。

"metadata": {
  "labels": {
    "key1" : "value1",
    "key2" : "value2"
  }
}

Labels允许高效的查询和观察,并且对用户有理想的UIs和CLIs。非识别的信息需要使用注解(annotations)记录

动机(Motivation)

Labels让用户用松散结合的方式映射他们的组织架构到系统对象上,而不需要使用者存储这些映射。

service(服务)的deployments(部署)和批处理管道经常是多维实体(如:多个分区或部署、多个发布轨道、多个层次、每个层次多个微服务)。管理经常需要跨领域操作,这会破坏严格封层表现形式的封装,特别是由基础设施而不是用户决定的严格层次结构。

labels的例子:

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

这只是常用标签的例子;你可以自由开发自己的协定。请牢记在一个给定对象里的标签的键(Key)必须是唯一的。

语法(Syntax)和字符集(character set)

Labels 是键值对。合法的建由两个部分组成:可选前缀和名称,由斜杠 (/) 分隔。名称部分是必须的,由少于63个字符组成,开头和结尾为数字或字母 ([a-z0-9A-Z]),中间包含横杠(-)、下划线(_)、点(.)和数字或字母。前缀是可选的。如果有规定,前缀必须是一个DNS的子域:一个系列的DNS labels由点(.)分隔,不长于253个字符,后跟一个斜杠(/)。

如果前缀被忽略,label的键被假定是用户私有的。向终端用户对象添加标签的自动化系统组件(components)(如kube-schedulerkube-controller-managerkube-apiserverkubectl或其他第三方自动化)必须指定一个标签。

kubernetes.io/ k8s.io/ 前缀为Kubernetes核心组件预留。

合法的label值必须由少于63个字符组成,且必须是空的或者开头和结尾为数字或字母 ([a-z0-9A-Z]),中间包含横杠(-)、下划线(_)、点(.)和数字或字母。

Label 选择器(selectors)

与名称和UID(names and UIDs)不同,label不需要是唯一的。通常,我们期望许多对象携带相同的label(s)。

通过label选择器,客户/用户可以指定一系列的对象。label选择器是Kubernetes核心分组原语。

API目前提供两种选择器:基于相等(equality-based) 和基于分组(set-based)。一个label选择器可以由多个由逗号分隔的要求组成。在多要求的情况下,所有要求都必须满足,逗号更像是逻辑与(&&)操作符。

空选择器或非指定选择器的语义取决于环境,使用选择器的API类型需要记录它们的有效性和含义。

注意:在一些API类型中,如ReplicaSets,两个实例的label选择器不能在一个名称空间中有重叠,否则控制器(controller)会将其视为冲突的指令并且不能确定应该运行多少副本。

基于相等要求

基于相等或不相等的要求允许通过label的键和值过滤。匹配的对象必须符合所有的指定标签限制,它们可以拥有额外的标签。支持三种操作符(=)、==)、!=)。前两个代表相等(且是同义的),后者代表不相等。例如:

environment = production
tier != frontend

上式选择了键为environment 且值为production的所有资源。下式选择了键为tier 且值不为frontend的所有资源,和没有键tier的所有资源。

相等标签要求的一种使用场景是为Pod指定node选择 标准。例如,下例Pod通过标签“accelerator=nvidia-tesla-p100”选择node。

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

基于集合要求

基于集合要求允许通过一个集合的值来过滤键。支持三种操作符(in)、(notin)、(exists)。例如:

environment in (production, qa)
tier notin (frontend, backend)
partition
!partition

第一个例子选择键为 environment 且值为 production 或 qa 的所有资源。第一个例子选择键为 tier 且值不为 frontend 和 backend 的所有资源,还有不包含键为 tier 的label的资源。第三个例子选择包含键为 partition 的label的所有资源,不做值检查。第四个例子选择不包含键为 partition 的label的所有资源,不做值检查。类似的,逗号作为与(&&)操作符。所以过滤包含键 partition (不做值检查)且 environment 值不为 qa 的资源可以使用 partition,environment notin (qa) 实现。基于集合的选择器和基于相等的选择器是通用的,就像 environment=productionenvironment in (production) 等同,!= 和 notin 类似。

基于集合的选择器和基于相等的选择器可以混用。如:partition in (customerA, customerB),environment!=qa

API

LIST  WATCH 过滤

LIST 和 WATCH 操作可以使用问号参数指定标签选择器过滤出一系列的对象返回。两种选择器都是支持的(表现在这里的语句会在URL中出现):

  • 基于相等要求:?labelSelector=environment%3Dproduction,tier%3Dfrontend
  • 基于集合要求:?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29

两种标签选择器都可以通过REST客户端用来列举和查看资源.例如目标 apiserver 包含 kubectl 且使用相等要求可以这么写:

kubectl get pods -l environment=production,tier=frontend

或使用基于集合要求:

kubectl get pods -l 'environment in (production),tier in (frontend)'

如上所述,基于集合要求更有表现力。例如,可以通过值来实现or操作符:

kubectl get pods -l 'environment in (production, qa)'

或通过exists 操作符实现否定匹配:

kubectl get pods -l 'environment,environment notin (frontend)'

在API对象中设置引用

一些Kubernetes对象,比如 services 和 replicationcontrollers, 也可以通过label选择器来指定一些其他资源,比如 pods.

Service ReplicationController

service指定的pods集合是通过一个label选择器来定义的。类似的,ReplicationController中管理的pods集合也是通过一个label选择器来定义的。这两种对象的label选择器在 json 或 yaml 文件中使用map定义,并且只支持相等要求。

"selector": {
    "component" : "redis",
}

selector:
    component: redis

这两个选择器(使用 jsonyaml 格式)和 component=redis 或 component in (redis) 含义相同

支持基于集合要求的资源

更新的资源,比如JobDeploymentReplica Set, Daemon Set也支持基于集合要求。

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

matchLabels是一个键值对({key,value})map。 在matchLabels map中的一个键值对和matchExpressions中的一个元素等价,该matchExpressionskey字段是键,operator是'In', values数组只包含值。matchExpressions是一份pod选择器要求。合法的操作符有 In, NotIn, Exists, 和 DoesNotExis。In 和 NotIn的值集合必须非空。matchLabelsmatchExpressions的所有要求是与条件----它们必须全部被满足以匹配。

选择nodes集合

存疑:使用label选择的一个用例,是限制一个pod可以被安排进入的node集合。查看node选择(node selection)来获取更多信息。 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值