kubernetes Lable(标签)

原创
半兽人 发表于: 2018-11-20   最后更新时间: 2022-09-15 14:27:13  
{{totalSubscript}} 订阅, 13,739 游览

Label是Kubernetes系统中另外一个核心概念。一个Label是一个key=value的键值对,其中key与vaue由用户自己指定。Label可以附加到各种资源对象上,例如Node、Pod、Service、RC等,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去,Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。

我们可以通过指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便于灵活、方便地进行资源分配、调度、配置、部署等管理工作。例如:部署不同版本的应用到不同的环境中;或者监控和分析应用(日志记录、监控、告警)等。一些常用等label示例如下。

  • 版本标签:"release" : "stable" , "release" : "canary"...
  • 环境标签:"environment" : "dev" , "environment" : "production"
  • 架构标签:"tier" : "frontend" , "tier" : "backend" , "tier" : "middleware"
  • 分区标签:"partition" : "customerA" , "partition" : "customerB"...
  • 质量管控标签:"track" : "daily" , "track" : "weekly"

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

Label Selector可以被类比为SQL语句中的where查询条件,例如,name=redis-slave这个label Selector作用于Pod时,可以被类比为select * from pod where pod's name = 'redis-slave'这样的语句。当前有两种Label Selector的表达式:基于等式的(Equality-based)和基于集合的(Set-based),前者采用“等式类”的表达式匹配标签,下面是一些具体的例子。

  • name=redis-slave:匹配所有具有标签name=redis-slave的资源对象。
  • env != production:匹配所有不具有标签env=production的资源对象,比如env=test就满足此条件的标签之一。
  • name in (redis-master, redis-slave):匹配所有具有标签name=redis-master或者name=redis-slave的资源对象。
  • name not in (php-frontend):匹配所有不具有标签name=php-frontend的资源对象。

可以通过多个Label Selector表达式的组合实现复杂的条件,多个表达式之间用“,”进行分隔即可,几个条件之间是“AND”的关系,即同时满足多个条件,比如下面的例子:

name=redis-slave,env!=production
name notin (php-fronted),env!=production

以myweb Pod为例,Label定义在其metadata中:

apiVersion: v1
kind: Pod
metadata:
  name: myweb
  labels:
      app: myweb

管理对象RC和Service在spec中定义Selector与Pod进行关联:

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 1
  selector:
    app: myweb
  template:
  ...略...

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  selector:
    app: myweb
  ports:
  - port: 8080

新出现的管理对象如Deploment、ReplicaSet、DaemonSet和Job则可以在Selector中使用基于集合的筛选条件定义,例如:

selector:
  matchLabels:
    app: myweb
  matchExpressions:
    - {key: tier, operator: In, values: [frontend]}
    - {key: environment, operator: NorIn, values: [dev]}

matchLabels用于定义一组Label,与直接写在Selector中作用相同:matchExpression用于定义一组基于集合的筛选条件,可用的条件运算符包括:In、NotIn、Exists和DoesNotExist。

如果同时设置了matchLabels和matchExpression,则两组条件为“AND”关系,即所有条件需要满足才能完成Selector的筛选。

Label Selector在Kubernetes中重要的使用场景有以下几处:

  • kube-controller进程通过资源对象RC上定义都Label Selector来筛选要监控的Pod副本的数量,从而实现Pod副本的数量始终符合预期设定。

  • kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立起每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。

  • 通过对某些Node定义特定的Label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,kube-scheduler进程可以实现Pod“定向调度”的特性。

在前面的例子中,我们只使用了一个name=XXXLabel Selector。让我们看一个更复杂的例子。假设为Pod定义了Label: releaseenvrole,不同的Pod定义了不同的Label值,如图所示,如果我们设置了 “role=frontend” 的 Label Selector,则会选取到 Node 1 和 Node 2 上到Pod。

Label Selector

而设置“release=beta”的Label Selector,则会选取到Node 2和Node 3上的Pod,如图所示。

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

Pod

更新于 2022-09-15
在线,1小时前登录

. 2年前

Label Selector在Kubernetes中多重要使用场景有以下几处。

kube-controller进程通过资源对象RC上定义都Label Selector来筛选要监控的Pod副本的数量,从而实现Pod副本的数量始终符合预期设定的全自动控制流程。

这两句话好像有错别字。

半兽人 -> . 2年前

不要怀疑自己,读的确实不顺。
感谢指正,已优化。

Demo 2年前

{key: environment, operator: NorIn, values: [dev]} 这里是NotIn还是NorIn呢,这个大小写是什么规律呢,写notin可以吗,到底是not in还是notin

半兽人 -> Demo 2年前

只是参数,notIn

陈健飞 2年前

name in (redis-master):匹配所有具有标签name=redis-master或者name=redis-slave的资源对象 这句有问题吧

吉祥如意 -> 陈健飞 2年前

我觉得也是有问题

半兽人 -> 吉祥如意 2年前

是有问题的,感谢指正,正确的应该是:name in (redis-master, redis-slave)

简洁明了。易懂,支持,看完一篇回复一下

macOS 3年前

支持,不错

宁静的风 4年前

标题label打错了

半兽人 -> 宁静的风 4年前

好羞愧,谢谢指正..

查看kubernetes更多相关的文章或提一个关于kubernetes的问题,也可以与我们一起分享文章