八 pod:pod的调度——将 Pod 指派给节点( 六 )


[root@k8scloude1 pod]# kubectl get pod -o wideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATESpod11/1Running021s10.244.112.158k8scloude2<none><none>删除pod,删除标签
[root@k8scloude1 pod]# kubectl get pod --show-labelsNAMEREADYSTATUSRESTARTSAGELABELSpod11/1Running032mrun=pod1[root@k8scloude1 pod]# kubectl delete pod pod1 --forcewarning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.pod "pod1" force deleted[root@k8scloude1 pod]# kubectl get pod --show-labelsNo resources found in pod namespace.[root@k8scloude1 pod]# kubectl label nodes k8scloude2 k8snodename-node/k8scloude2 labeled[root@k8scloude1 pod]# kubectl get nodes -l k8snodename=k8scloude2No resources found[root@k8scloude1 pod]# kubectl get nodes -l k8snodename=k8scloudeNo resources found注意:如果两台主机的标签是一致的,那么通过在这两台机器上进行打分,哪个机器分高,pod就运行在哪个pod上
给k8s集群的master节点打标签
[root@k8scloude1 pod]# kubectl label nodes k8scloude1 k8snodename=k8scloude1node/k8scloude1 labeled[root@k8scloude1 pod]# kubectl get nodes -l k8snodename=k8scloude1NAMESTATUSROLESAGEVERSIONk8scloude1Readycontrol-plane,master7d2hv1.21.0创建pod,nodeSelector:k8snodename: k8scloude1指定pod运行在标签为k8snodename=k8scloude1的节点上
[root@k8scloude1 pod]# vim schedulepod5.yaml [root@k8scloude1 pod]# cat schedulepod5.yamlapiVersion: v1kind: Podmetadata:creationTimestamp: nulllabels:run: pod1name: pod1namespace: podspec:nodeSelector:k8snodename: k8scloude1containers:- image: nginximagePullPolicy: IfNotPresentname: pod1resources: {}ports:- name: httpcontainerPort: 80protocol: TCPhostPort: 80dnsPolicy: ClusterFirstrestartPolicy: Alwaysstatus: {}[root@k8scloude1 pod]# kubectl apply -f schedulepod5.yamlpod/pod1 created因为k8scloude1上有污点,所以pod不能运行在k8scloude1上,pod状态为Pending
[root@k8scloude1 pod]# kubectl get podNAMEREADYSTATUSRESTARTSAGEpod10/1Pending09s删除pod,删除标签
[root@k8scloude1 pod]# kubectl delete pod pod1pod "pod1" deleted[root@k8scloude1 pod]# kubectl get podNo resources found in pod namespace.[root@k8scloude1 pod]# kubectl label nodes k8scloude1 k8snodename-node/k8scloude1 labeled[root@k8scloude1 pod]# kubectl get nodes -l k8snodename=k8scloude1No resources found3.5 使用亲和性与反亲和性调度podnodeSelector 提供了一种最简单的方法来将 Pod 约束到具有特定标签的节点上 。亲和性和反亲和性扩展了你可以定义的约束类型 。使用亲和性与反亲和性的一些好处有:

  • 亲和性、反亲和性语言的表达能力更强 。nodeSelector 只能选择拥有所有指定标签的节点 。亲和性、反亲和性为你提供对选择逻辑的更强控制能力 。
  • 你可以标明某规则是“软需求”或者“偏好”,这样调度器在无法找到匹配节点时仍然调度该 Pod 。
  • 你可以使用节点上(或其他拓扑域中)运行的其他 Pod 的标签来实施调度约束, 而不是只能使用节点本身的标签 。这个能力让你能够定义规则允许哪些 Pod 可以被放置在一起 。
亲和性功能由两种类型的亲和性组成:
  • 节点亲和性功能类似于 nodeSelector 字段,但它的表达能力更强,并且允许你指定软规则 。
  • Pod 间亲和性/反亲和性允许你根据其他 Pod 的标签来约束 Pod 。
节点亲和性概念上类似于 nodeSelector, 它使你可以根据节点上的标签来约束 Pod 可以调度到哪些节点上 。节点亲和性有两种: