介绍默认的的调度策略分为预选和优选资源限制属于预选是强制性的一旦满足不了就不再继续而优选仅仅是选择一个最好的而非强制前提是预选必须通过比如即使亲和性的标签能满足需求如果资源的需求不满足的话仍然不会去调度资源。范例#注意软亲和的权重配置是与硬亲和的区别所在。#应用资源定义文件复制代码[rootmaster1 scheduler]# cat scheduler-pod.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: node-resourcefits-affinityspec:replicas: 2selector:matchLabels:app: podtesttemplate:metadata:labels:app: podtestspec:containers:- name: podtestimage: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1imagePullPolicy: IfNotPresentresources:requests:cpu: 2memory: 2Giaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: envoperator: Exists复制代码#应用资源定义文件kubectl apply -f scheduler-pod.yaml#查看效果复制代码[rootmaster1 scheduler]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnode-resourcefits-affinity-7bd99c776f-2vfk8 0/1 Pending 0 12snode-resourcefits-affinity-7bd99c776f-qkpbd 0/1 Pending 0 12s[rootmaster1 scheduler]#复制代码#查看原因kubectl describe pod node-resourcefits-affinity-7bd99c776f-qkpbdEvents:Type Reason Age From MessageWarning FailedScheduling 59s default-scheduler 0/4 nodes are available: 1 node(s) had untolerated taint(s), 3 node(s) didn’t match Pod’s node affinity/selector. no new claims to deallocate, preemption: 0/4 nodes are available: 4 Preemption is not helpful for scheduling.#添加labelkubectl delete -f scheduler-pod.yamlkubectl label node node2.org envtestkubectl label node node1.org envdev#重新部署kubectl apply -f scheduler-pod.yaml#仍然不成功[rootmaster1 scheduler]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnode-resourcefits-affinity-7bd99c776f-2tldt 0/1 Pending 0 2snode-resourcefits-affinity-7bd99c776f-jrx47 0/1 Pending 0 2s#查看原因是资源不足kubectl describe pod node-resourcefits-affinity-7bd99c776f-jrx47Warning FailedScheduling 68s default-scheduler 0/4 nodes are available: 1 node(s) didn’t match Pod’s node affinity/selector, 1 node(s) had untolerated taint(s), 2 Insufficient cpu, 2 Insufficient memory. no new claims to deallocate, preemption: 0/4 nodes are available: 1 No preemption victims found for incoming pod, 3 Preemption is not helpful for scheduling.#结果显示节点资源不足所以无法正常的资源调度#查看主机资源kubectl describe node node2.org#调配资源限制复制代码[rootmaster1 scheduler]# cat scheduler-pod.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: node-resourcefits-affinityspec:replicas: 2selector:matchLabels:app: podtesttemplate:metadata:labels:app: podtestspec:containers:- name: podtestimage: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1imagePullPolicy: IfNotPresentresources:requests:cpu: 0.2memory: 200Miaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: envoperator: Exists[rootmaster1 scheduler]#复制代码#重新应用资源配置kubectl apply -f scheduler-pod.yaml#查看效果kubectl get pod -o wide[rootmaster1 scheduler]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnode-resourcefits-affinity-5c94bc867c-6q4cg 1/1 Running 0 8s 10.244.3.169 node2.orgnode-resourcefits-affinity-5c94bc867c-8r66l 1/1 Running 0 7s 10.244.3.168 node2.orgkubectl label node node2.org env-kubectl label node node1.org env-kubectl delete -f scheduler-pod.yamlPod 调度所谓的pod调度指 pod 彼此之间的亲和性和反亲和性也就是说哪些pod应该在一起或者不在同一个位置(拓扑域)。是否在同一个位置是通过拓扑域来定义拓扑域在Kubernetes中拓扑域是指按节点的标签定义和分组的节点集合例如区域、可用区、机架、主机名都可以作为将节点划分成不同拓扑域的依据Kubernetes使用TopologyKey(拓扑键)来定义将节点划分至不同拓扑域的标准topologyKey 的值决定是否是同一个位置imagePod 亲和性 podAffinityPod 亲和性说明Pod 亲和性就是将多个pod调度在同一个位置(拓扑域)上比如kubernetes 集群的节点分布在不同的区域或者不同的机房,当服务A和服务B需要高效的交流数据要求部署在同一个区域或者同一机房,甚至同一个节点Pod 亲和性允许跨 namespace 的Pod 间实现亲和Pod 亲和性分为: 硬亲和和软亲和属性解析#亲和:设定一个Pod是倾向与其它Pod运行同一个节点上kubectl explain deployment.spec.template.spec.affinity.podAffinitykubectl explain pod.spec.affinity.podAffinity#反亲和:设定一个Pod是倾向与其它Pod不要运行同一个节点上kubectl explain deployment.spec.template.spec.affinity.podAntiAffinitykubectl explain pod.spec.affinity.podAntiAffinity复制代码requiredDuringSchedulingIgnoredDuringExecution #硬亲和性labelSelector #选择跟哪组标签匹配的Pod亲和namespaces #选择哪个命名空间进行匹配,如果namespace值为空,表示所有namespace,如果没有namespace表示当前namespacetopologyKey #用于判断是否是同一个位置,指定节点上的哪个键这是一个必选项,不能为空#注意这三个条件是一个逻辑与的关系preferredDuringSchedulingIgnoredDuringExecution #软亲和性podAffinityTerm #与权重关联的亲和选项这是一个必选项labelSelectornamespaces #表示仅在指定的命名空间中查找topologyKey #在指定节点上的标签关键字这是一个必选项,不能为空weight #权重这是一个必选项复制代码Pod 亲和性案例范例: 硬亲和创建两个在不同主机上的pod然后创建一个第三个pod要求和有标签envtest的pod部署在一起#两个节点准备标签,确保Pod调度至不同的节点kubectl label node node1.org envdevkubectl label node node2.org envtest#创建资源配置实现两个有不同标签的Pod复制代码[rootmaster1 scheduler]# cat scheduler-pod-affinity-base.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: controller-deployment-demo-devspec:replicas: 1selector:matchLabels:env: devtemplate:metadata:labels:env: dev #注意此处labels和selector中label必须相同spec:nodeSelector: #确保Pod调度至不同的节点env: devcontainers:- name: deployment-2image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1apiVersion: apps/v1kind: Deploymentmetadata:name: controller-deployment-demo-testspec:replicas: 1selector:matchLabels:env: testtemplate:metadata:labels:env: test #注意此处labels和selector中label必须相同spec:nodeSelector:env: testcontainers:- name: deployment-2image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1复制代码#应用资源配置文件kubectl apply -f scheduler-pod-affinity-base.yaml#确认效果kubectl get pod -o wide[rootmaster1 scheduler]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScontroller-deployment-demo-dev-55947b644-dl5cr 1/1 Running 0 74s 10.244.1.62 node1.orgcontroller-deployment-demo-test-7685c5779d-mfxbx 1/1 Running 0 74s 10.244.3.172 node2.org#创建资源配置文件复制代码[rootmaster1 scheduler]# cat scheduler-pod-affinity-required.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: controller-deployment-demo-1spec:replicas: 1selector:matchLabels:app: myapp2template:metadata:labels:app: myapp2spec:containers:- name: deployment-2image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: envoperator: Invalues:- testnamespaces:- defaulttopologyKey: kubernetes.io/hostname复制代码#属性解析 topologyKey的来源kubectl get nodes -o yaml | grep kubernetes.io/hostname[rootmaster1 scheduler]# kubectl get nodes -o yaml | grep kubernetes.io/hostnamekubernetes.io/hostname: master1.orgkubernetes.io/hostname: node1.orgkubernetes.io/hostname: node2.orgkubernetes.io/hostname: node3.org#指定 kubernetes.io/hostname 和主机名效果是一样的只不过一个是自动获取一个是手工指定,此处表示使用主机名做为调度pod亲和性在同一位置的依据#应用资源配置文件kubectl apply -f scheduler-pod-affinity-required.yaml#查看效果kubectl get pod --show-labels -o wide复制代码[rootmaster1 scheduler]# kubectl get pod --show-labels -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELScontroller-deployment-demo-1-567fbcbc94-hrgfb 1/1 Running 0 5s 10.244.3.173 node2.org appmyapp2,pod-template-hash567fbcbc94controller-deployment-demo-dev-55947b644-dl5cr 1/1 Running 0 23m 10.244.1.62 node1.org envdev,pod-template-hash55947b644controller-deployment-demo-test-7685c5779d-mfxbx 1/1 Running 0 23m 10.244.3.172 node2.org envtest,pod-template-hash7685c5779d[rootmaster1 scheduler]#[rootmaster1 scheduler]#复制代码#结果显示由于是硬亲和状态所以直接调度到对应亲和Pod所在的节点#清理环境kubectl delete -f scheduler-pod-affinity-required.yaml范例: 软亲和, 多个满足条件的pod中选择最合适的Pod所在节点#创建资源配置文件复制代码[rootmaster1 scheduler]#[rootmaster1 scheduler]# cat scheduler-pod-affinity-preferred.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: controller-deployment-demo-1spec:replicas: 1selector:matchLabels:app: myapp2template:metadata:labels:app: myapp2spec:containers:- name: deployment-2image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1affinity:podAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 60podAffinityTerm:labelSelector:matchExpressions:- key: envoperator: Invalues:- devnamespaces:- defaulttopologyKey: kubernetes.io/hostname- weight: 30podAffinityTerm:labelSelector:matchExpressions:- key: envoperator: Invalues:- testnamespaces:- defaulttopologyKey: kubernetes.io/hostname复制代码