Please enable Javascript to view the contents

Kubernetes 之 Labels、Selectors

 ·  ☕ 2 分钟

1. Labels

1.1 什么是 Labels

Labels 是一对关联到对象的键值对。可以在创建对象时,直接添加 Labels ,也可以在创建之后动态修改。

Labels 格式:

1
2
3
4
"labels": {
  "key1" : "value1",
  "key2" : "value2"
}

格式要求:

  • Key,不能重复
  • Value,须以字母或数字开头,可以使用字母、数字、连字符、点和下划线,最长63个字符

1.2 Labels 的用途

用户使用 Labels,对资源对象进行标识、组织和选择。

标签对于系统运行,没有直接意义,也不用于存储结构化或复杂数据。因为,标签将建立索引和反索引,用于查询和监控。

对于附加在资源对象上的复杂结构,应该使用 annotation。

annotation 可以将任意非标识元数据附加到对象上。使用工具和类库等客户端,我们可以检索这些数据。annotation 中的元数据可以是结构化的,也可以是非结构化的,同时对字符范围没有限制。

1.3 Labels 操作

  • 查看名字为 name 的 Pod 详情
1
kubectl describe pods name
  • 给名字为 name 的 Pod 添加 Label: tempLabel=True
1
2
kubectl label pods name tempLabel=True
pod/name labeled
  • 将名字为 name 的 Pod 修改为 Label: tempLabel=False
1
2
kubectl label --overwrite pods name tempLabel=False
pod/name labeled
  • 给所有 Pod 添加 Labels
1
2
3
kubectl label pods --all tempLabel2=True
pod/kube-nginx-7c765ffd95-2pxfk labeled
...
  • 删除名字为 name 的 Pod 中,Key 为 tempLabel 的 Labels

删除时,只需要在 Key 值后面拼上 - 即可。

1
2
kubectl label pods name tempLabel-
pod/name labeled

2. Labels Selectors

2.1 什么是 Labels Selectors

Labels Selectors,即标签选择器。

标签选择器是 Kubernetes 中的核心组成部分。在使用的过程当中,通常多个对象具有相同的标签。通过标签过滤出一组资源对象,批量进行操作。

2.2 Labels Selectors 的类型

Kubernetes 的 API 目前支持两种类型的选择器:

  1. equality-based,基于等式

基于等式的标签条件支持三种操作符:=、==、!=。其中,= 与 == 同义,多个条件可以使用逗号分隔连接。例如:

1
frontend:environment=production, tier!=frontend
  1. set-based,基于集合

基于集合的标签条件支持三种操作符: in , notin 和 exists。例如:

1
2
3
4
environment in (production, qa)
tier notin (frontend, backend)
partition
!partition

2.3 如何使用 Labels Selectors

  • 使用 API 进行查询过滤时,添加 GET 过滤参数即可

基于等式:

?labelSelector=environment%3Dproduction,tier%3Dfrontend

基于集合:

?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29

  • 使用 Kubectl 在 Console 中进行操作

基于等式:

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

基于集合:

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

3. Field Selectors

Field Selectors,字段选择器允许通过字段值过滤,来筛选资源对象。

不同的资源对象,支持的过滤字段不同。所有资源类型都支持 metadata.namemetadata.namespace 字段过滤。

下面是一个使用样例,选择 phase 字段为 Running 的所有 Pod :

1
2
3
4
5
kubectl get pods --field-selector status.phase=Running
NAME                                              READY   STATUS    RESTARTS   AGE
kube-nginx-7c765ffd95-2pxfk                       1/1     Running   3          17d
my-harbor-harbor-chartmuseum-567fb69cb6-q88ss     1/1     Running   0          3d20h
...

微信公众号
作者
微信公众号