如需详细了解调度,请参阅 Kubernetes 文档中的调度、抢占和逐出。
本页面介绍如何在 Kubernetes 清单中为主实例和读取池实例指定容忍、节点亲和性和拓扑分布限制条件等调度配置。
如需了解如何为节点定义污点,请参阅 Kubernetes 文档中的污点和容忍。
指定容忍
如需将 AlloyDB Omni Pod 调度到没有其他应用 Pod 的节点,或匹配在这些节点上定义的特定“污染”,请向这些节点应用一个或多个容忍,如下所示:
- 修改 AlloyDB Omni Kubernetes operator 集群的清单,以将
tolerations
部分包含在以下任一部分的schedulingConfig
部分中:primarySpec
(适用于主实例)spec
(适用于读取池实例)
tolerations: - key: "TAINT_KEY" operator: "OPERATOR_VALUE" value: "VALUE" effect: "TAINT_EFFECT"
替换以下内容:
TAINT_KEY
:污点键的现有唯一名称,例如节点的主机名或容忍适用的其他本地推断值。污点键已在节点上定义。空字段和OPERATOR_VALUE
设置为exists
表示容忍必须与所有值和所有键匹配。OPERATOR_VALUE
:表示键与一组值之间的关系。将该参数设置为以下值之一:exists
:如果污点已定义,Kubernetes 会匹配任何值,而不管污点的值如何。equal
:如果值不同,Kubernetes 不会将 Pod 调度到节点。运算符需要污点true
值。
VALUE
:容忍匹配的污点值。如果运算符为“存在”,则值为空;否则,它是一个正则字符串。例如true
。TAINT_EFFECT
:指示要匹配的污点效果。空字段表示必须匹配所有污点效果。将该参数设置为以下选项之一:NoSchedule
:Kubernetes 不会在受污染节点上调度新的 Pod。PreferNoSchedule
:除非必要,否则 Kubernetes 会避免将新的 Pod 放置在受污染节点上。NoExecute
:Kubernetes 会逐出不能容忍污点的现有 Pod。
- 重新应用清单。
定义节点亲和性
Kubernetes 调度器使用节点亲和性作为一组规则来确定 Pod 的放置位置。节点亲和性是一种灵活性更高且表达能力更出色的节点选择器版本。
如需指定必须调度哪些节点运行数据库,请按照以下步骤操作:
- 修改数据库集群清单,以将
nodeaffinity
部分包含在primarySpec
(适用于主实例)或spec
(适用于读取池实例)的schedulingConfig
部分中tolerations
部分之后:nodeaffinity: NODE_AFFINITY_TYPE: - weight: WAIT_VALUE preference: matchExpressions: - key: LABEL_KEY operator: OPERATOR_VALUE values: - LABEL_KEY_VALUE
替换以下内容:
NODE_AFFINITY_TYPE
:将此参数设置为以下其中一项:requiredDuringSchedulingIgnoredDuringExecution
:Kubernetes 严格根据定义的规则来调度 Pod。preferredDuringSchedulingIgnoredDuringExecution
:Kubernetes 调度器会尝试查找符合定义的调度规则的节点。不过,如果没有此类节点,Kubernetes 会调度到集群中的其他节点。
WAIT_VALUE
:表示指定节点的偏好权重。值越高,表示偏好程度越高。有效值为1
到100
。LABEL_KEY
:节点的密钥标签,充当位置指示器,有助于在集群中均匀分布 Pod。例如disktype=ssd
。OPERATOR_VALUE
:表示键与一组值之间的关系。将该参数设置为以下选项之一:-
In
:值数组不能为空。 -
NotIn
:值数组不能为空。 -
Exists
:值数组必须为空。 -
DoesNotExist
:值数组必须为空。 -
Gt
:值数组必须包含一个元素,该元素会被解读为一个整数。 -
Lt
:值数组必须包含单个元素,该元素会被解释为整数。
-
LABEL_KEY_VALUE
:标签键的值。将该参数设置为字符串值数组,如下所示:- 如果运算符为
In
或NotIn
,则值数组不得为空。 - 如果运算符为
Exists
或DoesNotExist
,则值数组必须为空。 - 如果运算符为
Gt
或Lt
,则值数组必须包含单个元素,该元素将被解释为整数。
- 如果运算符为
- 重新应用清单。
定义拓扑分布限制条件
topologySpreadConstraints
字段可在 Kubernetes Pod API 的 spec
中进行设置,因此也可在 AlloyDB Omni 数据库集群清单的 schedulingConfig
中设置,该字段控制将如何在集群中的不同拓扑网域(例如可用区、节点或区域)之间分布 Pod。这样可防止过多的 AlloyDB Omni 数据库集群 Pod 落在单点故障上,有助于实现高可用性及资源均衡利用。
如需指定 AlloyDB Omni 数据库集群在集群拓扑中的分布方式,请在 primarySpec
(适用于主实例)或 spec
(适用于读取池实例)的 schedulingConfig
中添加 topologySpreadConstraints
部分:
schedulingconfig: # Other scheduling configs like tolerations, nodeaffinity topologySpreadConstraints: - maxSkew: MAXSKEW_VALUE topologyKey: "TOPOLOGY_KEY" whenUnsatisfiable: WHEN_UNSATISFIABLE_VALUE # labelSelector: <object> # optional # minDomains: <integer> # optional # matchLabelKeys: <list> # optional # nodeAffinityPolicy: [Honor|Ignore] # optional # nodeTaintsPolicy: [Honor|Ignore] # optional
替换以下内容:
-
MAXSKEW_VALUE
:定义任意两个拓扑网域的匹配 Pod 数量之间允许的最大差值。此参数必须大于0
。 TOPOLOGY_KEY
:用于定义拓扑网域的节点标签的键,例如,对于可用区,该键为topology.kubernetes.io/zone
。调度器会尝试在这些网域之间均衡分布 Pod。WHEN_UNSATISFIABLE_VALUE
:指示当 Pod 不满足分布限制条件时,调度器将如何处理该 Pod。将该参数设置为以下值之一:DoNotSchedule
:如果无法满足分布限制条件,调度器不会将相应 Pod 调度到节点。这是默认值。ScheduleAnyway
:调度器仍会调度相应 Pod,但会优先考虑可最大限度减少偏差的节点。
如需详细了解 Pod 拓扑分布限制条件,请参阅 Kubernetes 官方文档。
示例
以下示例说明了如何在 AlloyDB Omni Kubernetes 操作器主实例和读取池实例中调度 Pod。此类调度设置有助于确保在适当的节点上调度数据库集群的主实例,同时在节点选择方面提供一定的灵活性。此灵活性对于平衡负载、优化资源使用情况或遵循特定节点角色和特征非常有用。
schedulingconfig:
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
nodeaffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
topologySpreadConstraints:
- maxSkew: 1
topologyKey: "topology.kubernetes.io/zone"
whenUnsatisfiable: DoNotSchedule
示例容忍允许将 Pod 调度到标记为控制平面节点的节点上,原因如下:
node-role.kubernetes.io/control-plane
污点键表示节点具有控制平面节点。Exists
运算符表示容忍匹配具有指定污点键的任何污点,而不管值如何。NoSchedule
效果意味着,除非 Pod 具有匹配的容忍,否则不会在控制平面节点上调度 Pod。
preferredDuringSchedulingIgnoredDuringExecution
节点亲和性类型指定在调度期间,系统会优先考虑为节点亲和性定义的规则,但这些规则不是强制要求。如果首选节点不可用,Pod 可能仍会被调度在其他节点上。1
权重值表示偏好较弱。节点选择标准在 preference
部分中定义。matchExpressions
部分包含用于匹配节点的表达式数组。another-node-label-key
键表示要匹配的节点标签的键。In
运算符表示节点必须具有包含指定值之一的键。another-node-label-key
键必须具有 another-node-label-value
值。
示例节点亲和性规则表示偏好将 Pod 调度到具有 another-node-label-key
标签且值为 another-node-label-value
的节点上。此偏好较弱,因此不是强烈要求。
此示例中的 topologySpreadConstraints
会在不同的 Kubernetes 可用区中分布 Pod。如果 maxSkew
值为 1
,则表示与任何其他可用区中的最小 Pod 数量相比,任何给定可用区中的 Pod 数量最多只能多一个。如果 whenUnsatisfiable
设置的值为 DoNotSchedule
,则表示如果无法满足该限制条件,则不调度相应 Pod。
该示例结合了以下内容:
- 容忍,可通过容忍
NoSchedule
污点,让 Pod 在控制平面节点上进行调度。 - 节点亲和性,即偏好具有特定标签的节点,但并不严格要求;因此,在调度方面提供了灵活性。
- 拓扑分布限制条件,可在可用区之间强制实现 Pod 的均衡分布,从而提高弹性并改善资源利用率。