跳到主要内容

第十七课

Label 专题

切换到 pr 138 ,我们这个版本的label 基于这个版本代码

Key Concept: Labels

标签(Label)是 Kubernetes 中用于标识和分类资源的键值对。它们主要用于:

  • 资源分组和筛选
  • 关联和管理资源(如 Pod、Service 等)
  • 应用策略和配置(如网络策略、资源配额等)
  • 简而言之,标签使得管理和操作 Kubernetes 集群更加便捷高效。

源码讲解

// Labels allows you to present labels independently from their storage.
type Labels interface {
Get(label string) (value string)
}

// Represents a label query.
type Query interface {
// Returns true if this query matches the given set of labels.
Matches(Labels) bool

// Prints a human readable version of this label query.
String() string
}

这段代码定义了一个用于处理 Kubernetes 标签(Label)查询的 Go 语言包。它实现了一个名为 Query 的接口,用于表示标签查询。该接口包含两个方法:Matches 和 String。然后,代码定义了几个实现了该接口的结构体,如 hasTerm、notHasTerm 和 andTerm。

hasTerm 结构体表示一个键值对,Matches 方法检查给定的标签集是否具有相同的键值对。
notHasTerm 结构体也表示一个键值对,但其 Matches 方法检查给定的标签集是否具有不同的键值对。
andTerm 结构体表示一组查询,其 Matches 方法检查给定的标签集是否与所有组成查询匹配。
这个包还提供了一些辅助函数,如:

Everything():返回一个匹配所有标签的查询。
QueryFromSet(Set):从给定的标签集创建一个查询对象。
ParseQuery(string):解析一个标签查询字符串,返回一个匹配该查询的对象,或者报告错误。
在这个包中,标签查询是一个逗号分隔的字符串,其中每个元素表示一个查询条件。这些条件可以是以下形式之一:

key=value:标签集必须具有与指定值相匹配的键。
key!=value:标签集必须具有与指定值不匹配的键。
key==value:这与 key=value 相同,也表示标签集必须具有与指定值相匹配的键。
ParseQuery 函数接受这样的字符串作为输入,并解析它以构造相应的查询对象。这个对象可以用于检查给定的标签集是否匹配查询条件。
提示

练习题:手动创建一个标签查询并进行匹配

要求:引用labels代码库,手动创建一个标签查询,并检查给定的标签集是否匹配该查询。

  • 创建一个 labels.Set,例如:{"app": "web", "tier": "frontend"}
  • 手动创建一个 labels.Query 对象,例如:&hasTerm{label: "app", value: "web"}
  • 使用 Query.Matches() 方法检查给定的标签集是否匹配该查询。
  • 根据匹配结果,输出 "Matched!" 或 "Not matched!"。