apiVersion: v1kind: Podmetadata: name: node-affinity namespace: devspec: containers: - name: nginx-pod image: nginx:latest affinity: # 节点亲和 nodeAffinity: # 硬策略,条件必须成立 requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: # 要调度到node的标签是kubernetes.io/hostname=node01的节点上 - matchExpressions: - key: kubernetes.io/hostname operator: NotIn values: - node01 # 软策略,条件尽量要成立 preferredDuringSchedulingIgnoredDuringExecution: # 多个软策略的权重,范围在1-100内,越大计算的得分越高 - weight: 1 preference: matchExpressions: # 要调度到node的标签是area=beijing的节点上 - key: area operator: NotIn values: - beijing复制代码
键值运算关系:apiVersion: v1kind: Podmetadata: name: pod-affinity namespace: devspec: containers: - name: nginx-pod image: nginx:latest affinity: # pod亲和 要求与指定的pod在同一个拓扑域 podAffinity: # 硬策略 requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - nginx01 # 拓扑域(node上的标签key) topologyKey: kubernetes.io/hostname # pod亲和 要求与指定的pod不在同一个拓扑域 podAntiAffinity: # 软策略 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - nginx02 # 拓扑域(node上的标签key) topologyKey: kubernetes.io/hostname复制代码
3. 污点和容忍度上面说的节点亲和性,可以理解为 pod 的一种偏好(或者是硬性的)属性,它使得 pod 被吸引到一类特定的节点。Taint(污点)则相反,它使得节点能排斥一类特定的 pod。Taint 和 Toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点都可以有一个或多个污点,而对于不能容忍这些污点的 pod,是不会被该节点接受的。如果将 Toleration 应用于 pod 上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上。污点(Taint)通过kubctl taint命令可以给某一个 node 节点设置污点,node 上设置了污点之后,pod 可以拒绝 node 的调度,甚至可以将 node 上已经存在的 pod 驱逐出去。污点可以用于集群节点迁移准备工作,通过打污点来使当前节点上的 pod 迁移出去。k8s 的 master节点自带污点。污点的组成为:key = value : effect复制代码
每个污点有一个 key 和 value 作为污点的标签,其中 value 可以为空,effect 描述污点的作用。当前 taint 的 effect 支持如下三个选项:NoSchedule:k8s 不会把 pod 调度到该节点上PreferNoSchedule:k8s 尽量不会把 pod 调度到该节点上NoExecute:k8s 不会把 pod 调度到该节点上,同时会把已有节点驱逐出去# 设置污点kubectl taint nodes node1 key1=value:NoSchedule# 去除污点Kubectl taint nodes node1 key1:NoSchedule-复制代码
容忍(Toleration)pod 可以设置容忍,即使 node 有污点,也可以分配。spec: tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule" tolerationSeconds: 3600 - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute" - key: "key2" operator: "Exists" effect: "NoSchedule"复制代码
其中 operator 的值为 Exists 将会忽略 value 值其中 key,vaule,effect 要与 Node 中设置的 taint 保持一致tolerationSeconds 用于描述当 Pod 需要被驱逐时可以在 Pod 上继续保留运行的时间k8s 的 namespace 可以提供资源的逻辑隔离,但是无法提供物理隔离。物理隔离可以通过污点与容忍来实现。如想隔离不同产品线的服务,可以提前给 node 打上不同的污点,不同的产品线的 pod 容忍对应的污点即可。4. 调度器的可扩展设计默认调度器的可扩展机制,在 Kubernetes 里面叫作 Scheduler Framework。这个设计的主要目的,就是在调度器生命周期的各个关键点上,为用户暴露出可以进行扩展和实现的接口,从而实现由用户自定义调度器的能力。每一个绿色的箭头都是一个可以插入自定义逻辑的接口。比如, 上面的 Queue 部分, 就意味着你可以在这一部分提供一个自己的调度队列的实现, 从而控制每个 Pod 开始被调度(出队)的时机。 Predicates 部分, 则意味着你可以提供自己的过滤算法实现, 根据自己的需求, 来决定选择哪些机器。(图片来源网络,侵删)
0 评论