调度亲和性给Pod调度到指定节点

调度模式:nodeSelector & nodeAffinity

比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。这时就可以使用标签来运行到指定的Node上;

nodeName

nodeName:指定节点名称,用于将Pod调度到指定的Node上;

注意:不经过调度器,前面设置的污点对这个参数无效,相当于走后门;

应用场景:

  • 当Scheduler组件Down掉了,无法进行Pod调度,就可以使用nodeName来调度Pod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@pool1 data]# vi nodeName-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
name: nodename-nginx
spec:
containers:
- name: nodename-nginx
image: nginx
nodeName: pool3

[root@pool1 data]# kubectl apply -f nodeName-nginx.yaml
pod/nodename-nginx created
[root@pool1 data]# kubectl get pods -o wide| grep nodename-nginx
nodename-nginx 1/1 Running 0 41s 10.244.206.46 pool3 <none> <none>

nodeSelector:

用于将Pod调度到匹配Label的Node上,如果没有匹配的标签会调度失败;

作用:

  • 完全匹配节点标签
  • 固定Pod到特定节点

给节点打标签

1
2
3
4
5
6
7
8
9
10
添加:
kubectl label node {node_name} key=value
例如:kubectl label node k8s-node2 disktype=ssd

查看:
kubectl get node --show-labels

删除:
kubectl label node {node_name} key-
例如:kubectl label node k8s-node2 disktype-

实例

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: pod01
spec:
containers:
- name: webpod01
image: lizhenliang/nginx-php
nodeSelector:
app: zx

nodeAddinity:

节点亲和性类似于nodeSelector,可以根据节点上的标签来约束Pod可以调度到哪些节点;

相比nodeSelector:

  • 匹配有更多的逻辑组合,不只是字符串的完全相等
  • 调度分为软策略和硬策略,而不是硬性要求
    • 硬(required):必须满足
    • 软(preferred):尝试满足,但不保证

操作符:In、NotIn、Exists、DoesNotExist、Gt、Lt

required实例:

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
[root@pool1 data]# vi pod-nginx-required-affinity.yaml
apiVersion: v1
kind: Pod
metadata:
name: req-nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype # Node节点的Key
operator: In
values:
- ssd # Node节点的Value
containers:
- name: req-nginx
image: nginx

[root@pool1 data]# kubectl apply -f pod-nginx-required-affinity.yaml
pod/req-nginx created
[root@pool1 data]# kubectl get pods | grep req-nginx
req-nginx 0/1 Pending 0 9s
# 以上出现Pending的原因是因为没有disktype的标签;如果重新定义标签该Pod就会处于Running状态了;
[root@pool1 data]# kubectl get node --show-labels | grep disktype

preferred实例:

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
[root@pool1 data]# vi pod-nginx-preferred-affinity.yaml
apiVersion: v1
kind: Pod
metadata:
name: pre-nginx
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: pre-nginx
image: nginx

[root@pool1 data]# kubectl apply -f pod-nginx-preferred-affinity.yaml
pod/pre-nginx created
[root@pool1 data]# kubectl get pods | grep pre-nginx
pre-nginx 1/1 Running 0 9s
# 此yaml文件中定义的disktype标签也是不存在的,当然pod也创建成功了,这就是preferred的特性;