4.3.3 标签选择器

标签选择器用于表达标签的查询条件或选择标准,Kubernetes API 目前支持两个选择器:基于等值关系(equality-based)以及基于集合关系(set-based)。例如,env=production 和 env!=qa 是基于等值关系的选择器,而 tier in (frontend, backend)则是基于集合关系的选择器。另外,使用标签选择器时还将遵循以下逻辑。

1) 同时指定的多个选择器之间的逻辑关系为“与”操作。 2)使用空值的标签选择器意味着每个资源对象都将被选中。 3)空的标签选择器将无法选出任何资源。

基于等值关系的标签选择器的可用操作符有“=”“==”和“!=”三种,其中前两个意义相同,都表示“等值”关系,最后一个表示“不等”关系。“kubectl get”命令的“-l”选项能够指定使用标签选择器,例如,显示键名 env 的值不为qa的所有Pod对象:

**[terminal]
**[delimiter $ ]**[command kubectl get pods -l "env!=qa" -L env]
NAME                       READY   STATUS    RESTARTS   AGE     ENV
pod-example                1/1     Running   1          2d19h   production
pod-with-labels            1/1     Running   0          15h     testing

再例如,显示标签键名 env 的值不为 qa,且标签键名 tier 的职为 frontend 的所有 Pod 对象:

**[terminal]
**[delimiter $ ]**[command kubectl get pods -l "env!=qa,tier=frontend" -L env,tier]
NAME              READY   STATUS    RESTARTS   AGE   ENV       TIER
pod-with-labels   1/1     Running   0          15h   testing   frontend

基于集合关系的标签选择器支持 in、notin 和 exists 三种操作符,它们的使用格式及意义具体如下。

  • KEY in (VALUE1, VALUE2, ...):指定的键名的值存在于给定的列表中即满足条件。
  • KEY notin (VALUE1, VALUE2, ...):指定的键名的值不存在与给定的列表中即满足条件。
  • KEY:所有存在此键名标签的资源。
  • !KEY:所有不存在此键名标签的资源。

例如,显示标签键名 env 的值为 production 或 env 的所有 Pod 对象:

**[terminal]
**[delimiter $ ]**[command kubectl get pods -l "env in (production,dev)" -L env]
NAME          READY   STATUS    RESTARTS   AGE     ENV
pod-example   1/1     Running   1          2d19h   production

再如,列出标签键名 env 的值为 production 或 dev,且不存在键名为 tier 的标签的所有 Pod 对象:

**[terminal]
**[delimiter $ ]**[command kubectl get pods -l 'env in (production,dev),!tier' -L env,tier]
NAME          READY   STATUS    RESTARTS   AGE     ENV          TIER
pod-example   1/1     Running   1          2d19h   production

为了避免shell解释器解析惊叹号(!),必须要为此类表达式使用单引号。

此外,Kubernetes 的诸多资源对象必须以标签选择器的方式关联到Pod资源对象,例如 Service、Deployment 和 ReplicaSet 类型的资源等,它们在 spec 字段中嵌套使用嵌套的 “selector” 字段,通过“matchLabels”来指定标签选择器,有的甚至还支持使用“matchExperssions”构造复杂的标签选择机制。

  • matchLabels:通过直接给定键值对来指定标签选择器。
  • matchExpressions:基于表达式指定的标签选择器列表,每个选择器都形如 “{key:KEY_NAME, operator: OPERATOR, values: [VALUE1, VALUE2, ...]}”,选择器列表间为“逻辑与”关系;使用 In 或 NotIn 操作符时,其 values 不强制要求为非空的字符串列表,而使用 Exists 或 DostNotExist 时,其 values 必须为空。

下面所示的资源清单片段是一个示例,它同时定义了两类标签选择器:

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

标签赋予了 Kubernetes 灵活操作资源对象的能力,它也是 Service 和 Deployment 等核心资源类型得以实现的基本前提。

results matching ""

    No results matching ""