11.1、定向调度(NodeName)

5.4.1 定向调度

定向调度,指的是利用在pod上声明nodeName或者nodeSelector,以此将Pod调度到期望的node节点上。注意,这里的调度是强制的,这就意味着即使要调度的目标Node不存在,也会向上面进行调度,只不过pod运行失败而已。

一、定向调度

1、NodeName

NodeName用于强制约束将Pod调度到指定的Name的Node节点上。这种方式,其实是直接跳过Scheduler的调度逻辑,直接将Pod调度到指定名称的节点。

接下来,实验一下:创建一个pod-nodename.yaml文件

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: pod-nodename
namespace: dev
spec:
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:nginx-latest # nginx:1.17.1
nodeName: node1 # 指定调度到node1节点上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建Pod
kubectl create -f pod-nodename.yaml

# 查看Pod调度到NODE属性,确实是调度到了node1节点上
kubectl get pods pod-nodename -n dev -o wide

NAME READY STATUS RESTARTS AGE IP NODE ......
pod-nodename 1/1 Running 0 56s 10.244.1.87 node1 ......

# 接下来,删除pod,修改nodeName的值为node3(并没有node3节点)
kubectl delete -f pod-nodename.yaml
vim pod-nodename.yaml
// nodeName: node3

kubectl create -f pod-nodename.yaml

# 再次查看,发现已经向Node3节点调度,但是由于不存在node3节点,所以pod无法正常运行
kubectl get pods pod-nodename -n dev -o wide

NAME READY STATUS RESTARTS AGE IP NODE ......
pod-nodename 0/1 Pending 0 6s <none> node3 ......

2、NodeSelector

NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的label-selector机制实现的,也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。

接下来,实验一下:

1 首先分别为node节点添加标签

1
2
kubectl label nodes node1 nodeenv=pro
kubectl label nodes node2 nodeenv=test

2 创建一个pod-nodeselector.yaml文件,并使用它创建Pod

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Pod
metadata:
name: pod-nodeselector
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
nodeSelector:
nodeenv: pro # 指定调度到具有nodeenv=pro标签的节点上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 创建Pod
kubectl create -f pod-nodeselector.yaml


# 查看Pod调度到NODE属性,确实是调度到了node1节点上
kubectl get pods pod-nodeselector -n dev -o wide

NAME READY STATUS RESTARTS AGE IP NODE ......
pod-nodeselector 1/1 Running 0 47s 10.244.1.87 node1 ......

# 接下来,删除pod,修改nodeSelector的值为nodeenv: xxxx(不存在打有此标签的节点)
kubectl delete -f pod-nodeselector.yaml

vim pod-nodeselector.yaml
kubectl create -f pod-nodeselector.yaml

# 再次查看,发现pod无法正常运行,Node的值为none
kubectl get pods -n dev -o wide

NAME READY STATUS RESTARTS AGE IP NODE
pod-nodeselector 0/1 Pending 0 2m20s <none> <none>

# 查看详情,发现node selector匹配失败的提示
kubectl describe pods pod-nodeselector -n dev
.......
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling <unknown> default-scheduler 0/3 nodes are available: 3 node(s) didn't match node selector.

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/12/image_f9784e7b2d5ef85a96addb1f3daa1093.png