kubernetes 的管理之:Label 和 Label Selector

一、什么是Label?

    Label(标签)是k8s系统中的一个核心概念。一个Label是一个key=value的键值对,其中key与value由用户自己指定,可以附加到任何资源对象上,比如Node、Pod、Service、RC等。
    标签可以在创建一个对象的时候直接给与,也可以在后期随时修改,每一个对象可以拥有多个标签,但是,key值必须是唯一的,例如:

"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 Selector ?

     Label 相当于我们熟悉的"标签",给某个资源对象定义一个Label,就相当于给它打上一个标签,随后通过Label Selector 查询和筛选拥有某些Label的资源对象,K8s通过这种方式实现了类似SQL的简单又通用的对象查询机制。
     Label Selector 可以被类比为SQL语句中的WHERE查询条件,例如,name=redis-slave,这个Label Selector作用于Pod时,可以被类比为select * from pod where pod’s name = 'redis-slave’这样的语句。
    API目前支持两种选择器:equality-based(基于平等)和set-based(基于集合)的。标签选择器可以由逗号分隔的多个requirements 组成。在多重需求的情况下,必须满足所有要求,因此逗号分隔符作为AND逻辑运算符。

  • 一个为空的标签选择器(即有0个必须条件的选择器)会选择集合中的每一个对象。
  • 一个null型标签选择器(仅对于可选的选择器字段才可能)不会返回任何对象。

注意:两个控制器的标签选择器不能在命名空间中重叠。

Equality-based requirement 基于相等的要求

     基于相等的或者不相等的条件允许用标签的keys和values进行过滤。匹配的对象必须满足所有指定的标签约束,尽管他们可能也有额外的标签。有三种运算符是允许的,“=”,“==”和“!=”。前两种代表相等性(他们是同义运算符),后一种代表非相等性。例如:

 environment = production
tier != frontend
Set-based requirement

Set-based 的标签条件允许用一组value来过滤key。支持三种操作符: in , notin 和 exists(仅针对于key符号) 。例如:

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

第一个例子,选择所有key等于 environment ,且value等于 production 或者 qa 的资源。 第二个例子,选择所有key等于 tier 且值是除了 frontend 和 backend 之外的资源,和那些没有标签的key是 tier 的资源。 第三个例子,选择所有有一个标签的key为partition的资源;value是什么不会被检查。 第四个例子,选择所有的没有lable的key名为 partition 的资源;value是什么不会被检查。

三、怎么在client-go 中使用?

示例代码:

func GetDeploymentDetail(deployment *v1beta1.Deployment, cli *kubernetes.Clientset)  error {
	options := metav1.ListOptions{
		LabelSelector: k8Lables.Set(deployment.Spec.Selector.MatchLabels).String(),  //key=xxx
	}
	pods, err := cli.CoreV1().Pods(deployment.Namespace).List(options)
	if err != nil {
		return err
	}
	……
}

如上,在通过client-go 接口获取deployment关联下的pod,可以通过LabelSelector 选项进行过滤,LabelSelector 的过滤规则如上第二部分解释填写。

通过 kubectl 来针对 apiserver ,并且使用Equality-based的条件,可以用:

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

或使用Set-based 要求:

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

如已经提到的Set-based要求更具表现力。例如,它们可以对value执行OR运算:

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

或者通过exists操作符进行否定限制匹配:

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

以上是我在开发过程中,对Label 和 Label Selector 的理解和应用。

参考:
kubernetes 权威指南

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值