配置调度

本页面介绍了调度器选项,以及如何在 Google Distributed Cloud on Bare Metal 纯软件集群中配置默认 Pod 调度限制。

Google Distributed Cloud 提供了许多标准 Kubernetes 功能,您可以使用这些功能来控制 pod 调度,例如:

如需了解 Kubernetes 中的 Pod 拓扑分布限制,请参阅 Kubernetes 文档中的 Kubernetes 调度程序

准备工作

在配置默认 Pod 分布之前,请确保集群中的每个节点都具有正确的拓扑标签。您可以使用 Nodepool.Spec.TaintsAndLabels API 应用标签。使用 kubectl label 手动为节点加标签可提供更高的灵活性,但当您向集群添加新节点时,需要手动加标签。

配置默认自定义调度器 {#:config-default}

为节点添加标签

  1. 向集群和节点池 YAML 文件添加拓扑标签。以下示例假设两个工作器节点池位于不同的机架中,而控制平面节点位于 rack1 中。

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: abm-cluster
      namespace: cluster-abm-cluster
    spec:
      controlPlane:
        nodePoolSpec:
          labels:
            topology.k8s.io/rack: rack1
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: NodePool
    metadata:
      name: nodepool-rack1
      namespace: cluster-abm-cluster
    spec:
      labels:
        topology.k8s.io/rack: rack1
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: NodePool
    metadata:
      name: nodepool-rack2
      namespace: cluster-abm-cluster
    spec:
      labels:
        topology.k8s.io/rack: rack2
    
  2. 应用更新后的集群配置。

    bmctl update cluster -c CLUSTER_NAME
    

    CLUSTER_NAME 替换为您的集群名称。

  3. 等待 topology.k8s.io/rack 标签传播到集群中的所有节点。

启用默认 Pod 散布限制条件

  1. 向集群 YAML 文件添加 preview.baremetal.cluster.gke.io/custom-scheduler-configuration:enable 注解。

  2. 在集群 YAML 文件中的 cluster.spec.controlPlane 下添加 schedulerConfiguration 部分。

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: abm-cluster
      namespace: cluster-abm-cluster
      annotations:
        preview.baremetal.cluster.gke.io/custom-scheduler-configuration: enable
    spec:
      controlPlane:
        schedulerConfiguration:
          defaultTopologySpreadConstraint:
            defaultConstraints:
            - topologyKey: topology.k8s.io/rack
              whenUnsatisfiable: DoNotSchedule
              maxSkew: 1
            defaultingType: List
    
  3. 应用更新后的集群配置。

    bmctl update cluster -c CLUSTER_NAME
    

    CLUSTER_NAME 替换为您的集群名称。

  4. 等待集群协调完成。监控 cluster.status.clusterState,直到显示 Running。在此过程中,每个控制平面节点都会运行一个 control-plane-update 作业。

验证 pod 散布配置

  1. 创建具有 5 个副本的测试部署。

  2. 观察 pod 分布情况。nodepool-rack1nodepool-rack2 上的 pod 数量之差应正好为 1。

  3. 验证每个控制平面节点上的 kube-scheduler-profile.config 文件。 位于 /etc/kubernetes/kube-scheduler-profile.config 的文件必须包含来自 cluster.spec 的拓扑分布配置。

问题排查

如需诊断和解决默认 Pod 散布问题,请检查以下各项:

  1. 查看 BareMetalMachine.Status.ControlPlaneComponents 以了解功能的状态。
  2. 检查 cluster-operatorcap-controller-manager 中的日志,以查找相关事件。
  3. 如果 kube-scheduler 静态 pod 崩溃,请检查集群 YAML 文件中的调度程序配置是否正确。

后续步骤