K8s调度策略
元旦快乐
1
调度
kube-scheduler调度器
kube-scheduler调度流程
过滤 打分
调度策略:允许你配置过滤所用的 断言(Predicates) 和打分所用的 优先级(Priorities)。 调度配置:允许你配置实现不同调度阶段的插件, 包括:QueueSort、Filter、Score、Bind、Reserve、Permit 等等。 你也可以配置 kube-scheduler 运行不同的配置文件。
2
将Pod分配给指定节点
节点标签 亲和性与反亲和性 nodeName字段 Pod拓扑分布约束 污点和容忍度
节点标签
"metadata": { "labels": { "key1" : "value1", "key2" : "value2" }}给节点添加标签
”
#给指定的节点打标签kubectl label nodes k8s-node1 key1=value1#移除标签kubectl label nodes k8s-node1 key1-创建一个将被调度到你选择的节点的 Pod
”
apiVersion: v1kind: Podmetadata: name: nginx labels: env: testspec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent nodeSelector: key1: value1亲和性和反亲和性
亲和性、反亲和性语言的表达能力更强。nodeSelector 只能选择拥有所有指定标签的节点,而亲和性、反亲和性为你提供对选择逻辑的更强控制能力。 你可以标明某规则是“软需求”或者“偏好”,这样调度器在无法找到匹配节点时仍然调度该 Pod。 你可以使用节点上(或其他拓扑域中)运行的其他 Pod 的标签来实施调度约束, 而不是只能使用节点本身的标签。这个能力让你能够定义规则允许哪些 Pod 可以被放置在一起。
节点亲和性功能类似于 nodeSelector 字段,但它的表达能力更强,并且允许你指定软规则。 Pod 间亲和性、反亲和性允许你根据其他 Pod 的标签来约束 Pod。
节点亲和性
”
requiredDuringSchedulingIgnoredDuringExecution: 调度器只有在规则被满足的时候才能执行调度。此功能类似于 nodeSelector, 但其语法表达能力更强。 preferredDuringSchedulingIgnoredDuringExecution: 调度器会尝试寻找满足对应规则的节点。如果找不到匹配的节点,调度器仍然会调度该 Pod。
Pod 间亲和性与反亲和性
”
用节点亲和性把Pod分配到节点
”
#给指定的节点打标签kubectl label nodes k8s-node1 key1=value1apiVersion: v1kind: Podmetadata: name: nginx4spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: key1 operator: In values: - value1 containers: - name: nginx image: nginx imagePullPolicy: IfNotPresentapiVersion: v1kind: Podmetadata: name: nginx5spec: affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: key1 operator: In values: - value1 containers: - name: nginx image: nginx imagePullPolicy: IfNotPresentnodeName字段
apiVersion: v1kind: Podmetadata: name: nginx2spec: nodeName: k8s-node2 containers: - name: nginx image: nginx imagePullPolicy: IfNotPresentPod 拓扑分布约束
污点(Taint)和容忍度(Toleration)
给Node节点打污点
”
#查看节点信息kubectl describe node k8s-node1#添加污点kubectl taint nodes k8s-node1 key1=value1:NoSchedule#移除污点kubectl taint nodes k8s-node1 key1=value1:NoSchedule-在pod中定义容忍度
”
tolerations:- key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule"tolerations:- key: "key1" operator: "Exists" effect: "NoSchedule"apiVersion: v1kind: Podmetadata: name: myapp labels: env: testspec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent tolerations: - key: "key1" operator: "Exists" effect: "NoSchedule"如果 operator 是 Exists (此时容忍度不能指定 value) 如果 operator 是 Equal ,则它们的 value 应该相等。 如果 operator 不指定,则默认为Equal。
如果effect是NoSchedule,则新的不能容忍的pod不能再调度过来,但是之前运行在node节点中的Pod不受影响。 如果effect是NoExecute,则新的不能容忍的pod不能调度过来,老的pod也会被驱逐。 如果effect是PreferNoScheduler,则表示尽量不调度到污点节点中去。
多个污点的匹配规则
”
如果未被过滤的污点中存在至少一个effect值为NoSchedule的污点, 则 Kubernetes 不会将Pod分配到该节点。 如果未被过滤的污点中不存在 effect 值为NoSchedule的污点, 但是存在 effect 值为PreferNoSchedule的污点, 则 Kubernetes 会尝试不将 Pod 分配到该节点。 如果未被过滤的污点中存在至少一个 effect 值为NoExecute 的污点, 则 Kubernetes 不会将 Pod 分配到该节点(如果 Pod 还未在节点上运行), 或者将 Pod 从该节点驱逐(如果 Pod 已经在节点上运行)。
kubectl taint nodes node1 key1=value1:NoSchedulekubectl taint nodes node1 key1=value1:NoExecutekubectl taint nodes node1 key2=value2:NoScheduletolerations:- key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule"- key: "key1" operator: "Equal" value: "value1" effect: "NoExecute"tolerations:- key: "key1" operator: "Equal" value: "value1" effect: "NoExecute" tolerationSeconds: 3600默认情况下,只有master节点会有污点(role.kubernetes.io/master:NoSchedule),Node节点默认没有污点。这也是为什么默认情况下Pod不会被分配到master节点的原因。 当只有一个节点没污点,其他节点都有污点时,创建pod的yml文件的容忍度没匹配上所有的污点时,创建的pod节点在没有污点的节点上。 当只有一个节点没污点,其他节点都有污点时,创建pod的yml文件的容忍度匹配上污点时,创建的pod节点也在没有污点的节点上。 当所有node的节点都有污点,创建pod的yml文件的容忍度能匹配上污点时,创建的pod节点在匹配的污点的节点上。 当所有node节点都有污点,但是创建pod的yml文件的容忍度没匹配上所有的污点时,创建的pod节点的NODE这里为空。
3
给master节点分配pod
#查询k8s-master节点的Taintskubectl describe node k8s-master | grep Taints#取消污点kubectl taint nodes k8s-master role.kubernetes.io/master:NoSchedule-apiVersion: v1kind: Podmetadata: name: nginxspec: nodeName: k8s-master containers: - name: nginx image: nginx imagePullPolicy: IfNotPresentEND
参考:
将 Pod 指派给节点:https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity
污点和容忍度:https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity
k8s 的污点(Taint)和容忍度(Toleration):https://zhuanlan.zhihu.com/p/405348246