调度亲和性给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] apiVersion: v1 kind: Pod metadata: name: nodename-nginx spec: containers: - name: nodename-nginx image: nginx nodeName: pool3
[root@pool1 data] pod/nodename-nginx created [root@pool1 data] nodename-nginx 1/1 Running 0 41s 10.244.206.46 pool3 <none> <none>
|
nodeSelector:
用于将Pod调度到匹配Label的Node上,如果没有匹配的标签会调度失败;
作用:
给节点打标签
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] apiVersion: v1 kind: Pod metadata: name: req-nginx spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: disktype operator: In values: - ssd containers: - name: req-nginx image: nginx [root@pool1 data] pod/req-nginx created [root@pool1 data] req-nginx 0/1 Pending 0 9s
[root@pool1 data]
|
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] 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] pod/pre-nginx created [root@pool1 data] pre-nginx 1/1 Running 0 9s
|