通过调度将数据库集群分配给节点

选择文档版本:

AlloyDB Omni Kubernetes operator 中,“调度”是一个将新数据库 Pod 与节点进行匹配的过程,以平衡集群中的节点分布,并帮助优化性能。Pod 和节点是根据多个条件和可用资源(例如 CPU 和内存)进行匹配的。

如需详细了解调度,请参阅 Kubernetes 文档中的调度、抢占和逐出

本页面介绍如何在 Kubernetes 清单中为主实例和读取池实例指定容忍、节点亲和性和拓扑分布限制条件等调度配置。

如需了解如何为节点定义污点,请参阅 Kubernetes 文档中的污点和容忍

指定容忍

如需将 AlloyDB Omni Pod 调度到没有其他应用 Pod 的节点,或匹配在这些节点上定义的特定“污染”,请向这些节点应用一个或多个容忍,如下所示:

  1. 修改 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。
  2. 重新应用清单。

定义节点亲和性

Kubernetes 调度器使用节点亲和性作为一组规则来确定 Pod 的放置位置。节点亲和性是一种灵活性更高且表达能力更出色的节点选择器版本。

如需指定必须调度哪些节点运行数据库,请按照以下步骤操作:

  1. 修改数据库集群清单,以将 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:表示指定节点的偏好权重。值越高,表示偏好程度越高。有效值为 1100
    • LABEL_KEY:节点的密钥标签,充当位置指示器,有助于在集群中均匀分布 Pod。例如 disktype=ssd
    • OPERATOR_VALUE:表示键与一组值之间的关系。将该参数设置为以下选项之一:
      • In:值数组不能为空。
      • NotIn:值数组不能为空。
      • Exists:值数组必须为空。
      • DoesNotExist:值数组必须为空。
      • Gt:值数组必须包含一个元素,该元素会被解读为一个整数。
      • Lt:值数组必须包含单个元素,该元素会被解释为整数。
    • LABEL_KEY_VALUE:标签键的值。将该参数设置为字符串值数组,如下所示:
      • 如果运算符为 InNotIn,则值数组不得为空。
      • 如果运算符为 ExistsDoesNotExist,则值数组必须为空。
      • 如果运算符为 GtLt,则值数组必须包含单个元素,该元素将被解释为整数。
  2. 重新应用清单。

定义拓扑分布限制条件

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 的均衡分布,从而提高弹性并改善资源利用率。

后续步骤