4.3.4 Pod 节点选择器 nodeSelector

Pod 节点选择器是标签及标签选择器的一种应用,它能够让 Pod 对象基于集群中工作节点的标签来挑选倾向运行的目标节点。

Kubernetes 的 kube-scheduler 守护进程负责在各工作节点中基于系统资源的可用性等标签挑选一个来运行创建的 Pod 对象,默认的调度器是 default-scheduler。Kubernetes 可将所有工作节点上的各系统资源抽象成资源池统一分配使用,因此用户无须关心Pod对象的具体运行位置也能良好工作。不过,事情总有例外,比如仅有部分节点拥有Pod对象依赖到的特殊硬件设备的情况,如GPU和SSD等。即便如此,用户也不应该静态指定Pod对象的运行位置,而是让 scheduler 基于标签和标签选择器为 Pod 用户挑选匹配的工作节点。

Pod 对象的 spec.nodeSelector 可用于定义节点标签选择器,用户事先为特定部分的 Node 资源对象设定好标签,而后配置 Pod 对象通过节点标签选择器进行匹配检测,从而完成节点亲和性调度。

为 Node 资源对象附加标签的方法同 Pod 资源,使用 “kubectl label nodes/NODE” 命令即可。例如,可为 kube-node-1.localdomain 和 kube-node-3.localdomain 节点设置 “disktype=ssd” 标签以标识其拥有SSD设备:

**[terminal]
**[delimiter $ ]**[command kubectl label nodes kube-node-1.localdomain disktype=ssd]
node/kube-node-1.localdomain labeled
**[delimiter $ ]**[command kubectl label nodes kube-node-3.localdomain disktype=ssd]
node/kube-node-3.localdomain labeled

查看具有键名 SSD 的标签的 Node 资源:

**[terminal]
**[delimiter $ ]**[command kubectl get nodes -l 'disktype=ssd' -L disktype]
NAME                      STATUS   ROLES    AGE   VERSION   DISKTYPE
kube-node-1.localdomain   Ready    <none>   11d   v1.14.3   ssd
kube-node-3.localdomain   Ready    <none>   11d   v1.14.2   ssd

如果某 Pod 资源需要调度至这些具有 SSD 设备的节点之上,那么只需要为其使用 spec.nodeSelector 标签选择器即可,例如下面的资源清单文件 pod-with-nodeselector.yaml 示例:

apiVersion: v1
kind: Pod
metadata:
    name: pod-with-nodeselector
    lables:
        env: testing
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
    nodeSelector:
        disktype: ssd

将如上资源清单中定义的 Pod 资源创建于集群中,通过检查其运行的节点即可判定调度效果

另外,手动测试和查看节点标签的读者或许已经注意到了,集群中的每个节点默认已经附带了多个标签,如 kubernetes.io/hostname、beta.kubernetes.io/os 和 beta.kubernetes.io/arch 等,这些标签也可以直接由 nodeSelector 使用,尤其是希望将 Pod 调度至某特定节点时,可以使用 kubernetes.io/hostname 直接绑定至相应的主机即可。不过,这种绑定至特定主机的需求还有一种更为简单的实现方式,即使用 spec.nodeName 字段直接指定目标节点。

results matching ""

    No results matching ""