kubernetes_label&selector

Kubernetes Label & Label Selector


Label

概念

Label是Kubernetes的核心概念

Labels其实就一对 key/value ,被关联到对象上,标签的使用我们倾向于能够标示对象的特殊特点,并且对用户而言是有意义的,但是标签对内核系统是没有直接意义的。

Label可以附加到各种资源对象上,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。

我们可以通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便于灵活、方便地进行资源分配、调度、配置、部署等管理工作。

Label相当于标签,给某个资源对象定义一个Label,就相当于给它打上一个标签,随后可以通过Label Selector查询和筛选拥有某些Label的资源对象。Kubernetes通过这种方式实现了类似SQL的简单又通用的对象查询机制。

示例标签:

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

不要在label中使用大型、非标识的结构化数据,记录这样的数据应该用annotation。

语法与字符集

Label key的组成:

  • 不得超过63个字符
  • 可以使用前缀,使用/分隔,前缀必须是DNS子域,不得超过253个字符,系统中的自动化组件创建的label必须指定前缀,kubernetes.io/由kubernetes保留
  • 起始必须是字母(大小写都可以)或数字,中间可以有连字符、下划线和点

Label value的组成:

  • 不得超过63个字符
  • 起始必须是字母(大小写都可以)或数字,中间可以有连字符、下划线和点

Label Selector

概念

通过label selector,客户端/用户可以指定一个object集合,通过label selector对object的集合进行操作。

两种类型:

  • equality-based: 可以使用=、==、!=操作符,可以使用逗号分隔多个表达式
environment = production
tier != frontend

第一个选择所有key等于 environment 值为 production 的资源。后一种选择所有key为 tier 值不等于 frontend 的资源,和那些没有key为 tier 的label的资源。
  • set-based:可用in、notin、!操作符,另外还可以没有操作符,直接写出某个label的key,表示过滤有某个key的object而不管该key的value是何值,!表示没有该label的object。
environment in (production, qa)
tier notin (frontend, backend)

第一个例子,选择所有key等于 environment ,且value等于 production 或者 qa 的资源。 第二个例子,选择所有key等于 tier 且值是除了 frontend 和 backend 之外的资源,和那些没有标签的key是 tier 的资源。
$ kubectl get pods -l environment=production,tier=frontend
$ kubectl get pods -l 'environment in (production),tier in (frontend)'
$ kubectl get pods -l 'environment in (production, qa)'
$ kubectl get pods -l 'environment,environment notin (frontend)'
使用场景
  • kube-controller进程通过资源对象RC上定义的Label Selector来筛选要监控的Pod副本的数量,从而实现Pod副本的数量时钟符合预期设定的全自动控制流程
  • kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立起每个Service到对应Pod的请求转发路由表,从而实现Service的只能负载均衡机制。
  • 通过对某些Node定义特定的Label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,kube-scheduler进程可以实现Pod“定向调度”的特性。
例子

kubernetes_label&selector_第1张图片


总结

使用Label可以给对象创建多组标签,Label和Label Selector共同构成了Kubernetes系统中最核心的应用模型,使得被管理对象能够被精细地分组管理,同时实现了整个集群的高可用性。


资料来源:

  • 《Kubernetes 权威指南》纪念版
  • kubernetes handbook

你可能感兴趣的:(Kubernetes,kubernetes,docker)