Kubernetes使用NodeName、NodeSelector做Pod定向调度

警告
本文最后更新于 2023-05-17,文中内容可能已过时。

通常情况下,调度器会将我们的 Pod 合理地放置在某个节点上。但在某些情况下,我们需要强行控制 Pod 部署在某个节点上。

例如,确保 Pod 最终落在连接了 SSD 的机器上,或者确保来自两个不同的服务且有大量通信的 Pods 被放置在同一个可用区。

在 Kubernetes 中有两种定向调度方式:NodeName 和 NodeSelector。

NodeName 方式

我们可以通过设置 nodeName 将某个 Pod 调度到特定的节点,比如下面这个例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 使用此配置文件来创建一个 Pod,该 Pod 将只能被调度到 name=app 节点。
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  nodeName: app # 调度 Pod 到特定的节点
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

NodeSelector 方式

NodeName 方式利用的是「节点名字」,相应的,NodeSelector 方式利用的是「节点标签」:

查询我们集群中的节点(附带标签):kubectl get nodes --show-labels

输出类似如下:

1
2
3
4
NAME      STATUS    ROLES    AGE     VERSION        LABELS
worker0   Ready     <none>   1d      v1.13.0        ...,kubernetes.io/hostname=worker0
worker1   Ready     <none>   1d      v1.13.0        ...,kubernetes.io/hostname=worker1
worker2   Ready     <none>   1d      v1.13.0        ...,kubernetes.io/hostname=worker2

选择其中一个节点,为它添加标签:kubectl label nodes <your-node-name> disktype=ssd

老规矩,验证一下:kubectl get nodes --show-labels

输出如下:

1
2
3
4
NAME      STATUS    ROLES    AGE     VERSION        LABELS
worker0   Ready     <none>   1d      v1.13.0        ...,disktype=ssd,kubernetes.io/hostname=worker0
worker1   Ready     <none>   1d      v1.13.0        ...,kubernetes.io/hostname=worker1
worker2   Ready     <none>   1d      v1.13.0        ...,kubernetes.io/hostname=worker2

这时我们可以看到 worker0 节点有 disktype=ssd 标签。

现在我们创建一个 Pod,将其调度到拥有disktype=ssd标签的节点上:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd

此 Pod 配置文件描述了一个拥有节点选择器 disktype: ssd 的 Pod。这表明该 Pod 将被调度到有 disktype=ssd 标签的节点。

验证

执行命令:kubectl get pods --output=wide

输出类似如下:

1
2
NAME     READY     STATUS    RESTARTS   AGE    IP           NODE
nginx    1/1       Running   0          13s    10.200.0.4   worker0
Buy me a coffee~
室长 支付宝支付宝
室长 微信微信
0%