PodSpec.NodeName的值为空需要调度,不为空不需要调度。过程是首先过滤掉不满足条件的节点,称为预选;然后是对通过的节点按照优先级排序,这个是优选;最后是选择优先级最高的节点。
预选有一系列的算法,常见如下:PodFitsResources,PodFitsHost,PodFitsHostPorts,PodSelectorMatches和NoDiskConflict。
优选由键值对组成,键是名称,值是权重。LeastRequestedPriority,BalancedResourceAllocation和ImageLocalityPriority。
自己编写调度器,通过 spec:schedulername 参数指定调度器的名字,可以为 pod 选择某个调度器进行调度。
节点亲和性是选择node,分为软策略preferredDuringSchedulingIgnoredDuringExecution和硬策略requiredDuringSchedulingIgnoredDuringExecution。
[root@zr-k8s-master01 affinity]# cat nodeAffinity.yaml
apiVersion: v1
kind: Pod
metadata:
name: affinity
labels:
app: node-affinity-pod
spec:
containers:
- name: with-node-affinity
image: ikubernetes/myapp:v1
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn #表示出了下面的value里面的主机,都可以
values:
- zr-k8s-node2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1 #权重越大越亲和
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- zr-k8s-node3
kubectl get node --show-labels
kubectl apply -f nodeAffinity.yaml
结果是pod运行在node1上,因为下面的软亲和决定了它可以运行在node3上,但是这里面没有node3那就运行在node1上去。
本文暂时没有评论,来添加一个吧(●'◡'●)