Kubernetes 选择器及其使用详解(14)

作者 : 慕源网 本文共3473个字,预计阅读时间需要9分钟 发布时间: 2021-11-27 共536人阅读

本文是Kubernetes权威指南系列的一部分,你可以点击Kubernetes权威指南查看所有教程

Kubernetes 选择器简介

Kubernetes 选择器允许我们根据分配给一组 Pod 或节点的标签和资源字段的值来选择 Kubernetes 资源。当我们必须在一组 Kubernetes 资源上获取详细信息或执行任何操作时,或者当我们必须在特定的节点组上部署一个 Pod 或一组 Pod 时,它非常有用。当我们想要获取任何具有相似标签的 Kubernetes 对象的详细信息时,它可以用作过滤器。

选择器在 Kubernetes 中是如何工作的?

所有 Kubernetes 对象都有一些字段或元数据,如名称、命名空间、状态等与之关联,如果我们想获取具有相同命名空间的对象的详细信息,我们可以通过指定选项“–field-selector”来实现。如果我们想使用 labelSelector 或 nodeSelector,我们需要将实际上是键/值对的标签应用于对象或节点。我们使用键/值对指定“-l”选项以获取与键/值对匹配的对象列表。例如,如果我们想列出标签键等于 ‘environment’ 且值等于 ‘prod’ 的所有 pod,我们可以简单地使用 ‘-l’ 选项指定 ‘environment=prod’。

Kubernetes 选择器的类型

以下是 kubernetes 选择器的类型。

1. Label Selector(标签选择器)

我们将标签应用于 Kubernetes 对象以组织或选择一组对象。标签可以在创建时附加或随时添加和修改。标签区分大小写。我们可以使用选项“-l”来使用标签选择器。让我们创建三个标签为“env: prod”和“app: nginx-web”的 Pod 以及两个标签为“env: QA”和“app: nginx-web”的 Pod,如下所示:

apiVersion: v1
kind: Pod
metadata:
name: nginx-web-server1
labels:
env: prod
app: nginx-web
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
apiVersion: v1
kind: Pod
metadata:
name: nginx-web-server3
labels:
env: prod
app: nginx-web
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
apiVersion: v1
kind: Pod
metadata:
name: nginx-web-qa1
labels:
env: QA
app: nginx-web
………..
apiVersion: v1
kind: Pod
metadata:
name: nginx-web-qa
labels:
env: QA
app: nginx-web
………..
apiVersion: v1
kind: Pod
metadata:
name: nginx-web-server2
labels:
env: prod
app: nginx-web
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80

使用以下命令列出所有带有标签的 pod:

$kubectl get pods --show-labels

说明:在上面的快照中,我们总共有 5 个带有上述标签的 pod。现在我们可以使用标签选择器列出所有附加了“env=QA”标签的 pod,如下所示:

$kubectl get pods -l “env=QA” --show-labels

说明:在上面的快照中,只显示了 QA pod。“–show-option”是可选的,用于确认输出。

下面的命令将显示所有没有标签“env”等于“QA”的 pod,这里将显示 prod pod: –

$kubectl get pods –l “env!=QA” --show-labels

我们还可以使用多个标签来缩小结果范围,如下所示:

$kubectl get pods -l “env=QA, app=nginx-web” --show-labels
$kubectl get pods -l  “env=prod, app=nginx-web” --show-labels

Kubernetes API 支持两种类型的选择器——基于相等和基于集合。上面提到的例子是基于相等的选择器。让我们看一些基于集合的选择器的例子。这支持“in”、“notin”和“exists”运算符。

$kubectl get pods –l “app in (nginx-web)” --show-labels

说明:第一个命令显示所有标签为“env”、值为“prod”和“QA”的 pod,在第二个示例中,我们提到了“nginx-web”的“app”键作为基于相等的选择器,这意味着我们可以使用两种类型的选择器来缩小结果范围。

下面的命令演示了“notin”操作符的作用:

2. Field Selector(字段选择器

字段选择器用于根据我们在创建对象时需要定义的一个或多个资源字段的值来查询 Kubernetes 对象。我们使用“–field-selector”选项来获取Kubernetes对象的详细信息,如下所示:

$kubectl get pods --field-selector=metadata.name=nginx-web-server
$kubectl get pods --field-selector=metadata.namespace=default

说明:在上面的例子中,我们使用了上面创建的 pod。我们在没有定义命名空间的情况下创建了这些 Pod,因此 Kubernetes 已分配了“默认”命名空间。在第一个示例中,我们根据“名称”字段进行查询,但只有一个输出,因为有一个具有该名称的 pod,而在第二个示例中,基于“命名空间”进行查询,因此获得了所有 5 个 pod,因为它们在默认命名空间。

3. 节点选择器

当我们必须在通过配置文件中定义的条件的特定节点组上部署一个 Pod 或一组 Pod 时,将使用节点选择器。我们需要相应地标记节点。

在这里,我们要将标签“disk=ssd”附加到集群中的节点之一,如下所示:

$kubectl label <object_type> <object_name> key=value
$kubectl label node node01 disk=ssd

说明:在上面的例子中,重命名节点’node01’,键等于“disk”,该键的值为“ssd”。如果键已经分配了不同的值并想要更改它,则需要使用选项“-–overwrite”,如下所示:

$kubectl lable node node01 disk=ssd --overwrite

让我们使用以下配置文件创建两个 Pod,以了解“nodeSelector”的工作原理。在这里,我们有一个带有 nodeSelector ‘disk=ssd’ 的 pod 和另一个带有 ‘disk=ssd2’ 的 pod。

apiVersion: v1
kind: Pod
metadata:
name: nginx-web-ssd
labels:
env: prod
app: nginx-web
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
nodeSelector:
disk: ssd
apiVersion: v1
kind: Pod
metadata:
name: nginx-web-hdd
labels:
env: prod
app: nginx-web
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
nodeSelector:
disk: hdd

部署完上述两个pod后,我们查看pod的状态,如下图:

说明:在上面的快照中,具有 nodeSelector ‘disk=ssd’ 的 pod 已成功部署,但是具有 nodeSelector ‘disk=hdd’ 的 pod 显示为 ‘Pending’,因为没有具有标签的可用节点’disk=hdd’’。它将处于“Pending”状态,直到调度程序找到具有配置文件中提到的标签的任何节点。

结论

我们已经使用 Kubernetes 选择器来获取对象的详细信息,但是我们可以对其执行任务,例如删除附加有特定标签的一组 pod 等。 nodeSelector 是将 pod 限制为节点的一种非常基本的方法,但是如果我们需要更多地控制选择节点,然后我们可以使用节点亲和性和反亲和性功能。


慕源网 » Kubernetes 选择器及其使用详解(14)

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录