kubernetes基础知识之固定pod调度节点

发布时间:2025-08-08 17:33  浏览量:1

kubernetes污点和容忍可以保证有一些特殊的节点进行保护,也可以做pod驱离的动作,要根据effect的不同来决定。

污点的effect分成三种:

1.NoSchedule 不可调度

2.PreferNoSchedule 尽可能不调度

3.NoExecute 不可调度并且驱离已存在pod

固定节点调度pod.spec.nodeName将pod直接调度到指定的node节点上,会跳过scheduler调度器的调度策略,这个匹配规则是强制匹配。

如果在调度器中设置了污点和容忍,那么会跳过这些污点所干扰的,会跳过去调度器,因为会指定nodeName。唯一需要去匹配的两个内容是:第一:节点名称是否存在;第二:节点名称存在后是否可以达到pod运行的最基本要求。如果这俩条件没问题的话,就可以直接调度。而不是根据预选和优选策略,还有软性策略和硬性亲和性去调度。

还原kubernetes master节点污点的默认状态:

kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane=:preferNoSchedule-

kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane=:NoSchedule

touch pod-deploy.yaml

vim pod-deploy.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: nodename-test

namespace: default

spec:

replicas: 7

selector:

matchLabels:

app: nodename

template:

metadata:

labels:

app: nodename

spec:

nodeName: k8s-master

containers:

- name: myweb

image: nginx

imagePullPolicy: Always

ports:

- containerPort: 80

kubectl create -f pod-deploy.yaml

指定nodeName的节点,可以跳过调度器的策略。尽管kubernetes master节点存在NoSchedule的污点,可是仍然可以在kubernetes master节点上创建出来pod,因为指定nodeName会跳过调度策略。

nodeName可以直接指定pod的运行节点,跳过调度器的调度策略。

当指定节点完成之后,这样的节点是存在的,并且要满足pod运行的最低条件的话,pod就可以在对应节点上运行,哪怕当前节点上设置了对应的污点,因为跳过了调度器。

指定节点也可以通过节点标签进行调度:

pod.spec.nodeSelector:通过kubernetes 的label-selector机制选择节点,由调度器调度策略匹配label,而后调度pod到目标节点,这个规则属于强制约束。

资源清单文件:

touch pod-dep-nodesel.yaml

vim pod-dep-nodesel.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: nodeselect-test

namespace: default

spec:

replicas: 2

selector:

matchLabels:

app: nodeselect

template:

metadata:

labels:

app: nodeselect

spec:

nodeSelector:

type: nodeselect

containers:

- name: myweb

image: nginx

ports:

- containerPort: 80

kubectl create -f pod-dep-nodesel.yaml

这个规则属于强制约束,取决于worker node节点是否有标签,因为是强制约束。

kubectl label node k8s-master type=nodeselect

。创建出来的pod还是处于pending状态,因为nodeSelector并不能跳过调度器去匹配调度规则。

nodeName 关键字是可以跳过调度器的调度策略的,但是nodeSelector关键字是无法跳过调度器的调度策略的,比如节点设置了污点是NoSchedule不可调度。

nodeSelector无法跳过调度器的调度策略,比如设置的污点是NoSchedule不可调度的策略。

kubectl label node k8s-node1 type=nodeselect

查看pod的运行状态:

kubectl.get pod -n $namespace -o wide

可以查看到pod已经创建在k8s-node1 这个worker node节点上。

kubeadm部署的kubernetes集群,kubernetes master节点存在污点NoSchedule不可调度,k8s-node1 没有任何的污点去拒绝pod的运行,所以pod可以在worker node k8s-node1上运行成功。

固定节点的第二个设置选项是:spec.node.nodeSelector。

固定节点的第一个配置选项是:spec.node.nodeName。

调度、调度器、预选、优选、节点亲和性、pod亲和性、pod反亲和性、污点和容忍、固定调度(节点名称调度和节点标签调度)可以理解pod的调度过程,目标是想把pod运行在哪个节点就运行在哪个节点,就具备了对当前集群调度结果的干预权利。

美女

鼓励的话语:不要等待机会,而是创造机会。只有拼搏才能成就辉煌,才能看到更广阔的天空。