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运行在哪个节点就运行在哪个节点,就具备了对当前集群调度结果的干预权利。
美女
鼓励的话语:不要等待机会,而是创造机会。只有拼搏才能成就辉煌,才能看到更广阔的天空。