本页面介绍了调度器选项以及如何在 Google Distributed Cloud 软件(仅限裸机集群)中配置默认 Pod 调度限制条件。
Google Distributed Cloud 提供了许多标准 Kubernetes 功能,您可以使用这些功能来控制调度 Pod,例如:
如需了解 Kubernetes 中的 Pod 拓扑分布限制,请参阅 Kubernetes 文档中的 Kubernetes 调度器。
准备工作
在配置默认 Pod 分布之前,请确保集群中的每个节点都具有正确的拓扑标签。您可以使用 Nodepool.Spec.TaintsAndLabels API 应用标签。使用 kubectl label 手动为节点加标签可提供更大的灵活性,但在向集群添加新节点时需要手动加标签。
配置默认自定义调度器 {#:config-default}
为节点添加标签
将拓扑标签添加到集群和节点池 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应用更新后的集群配置。
bmctl update cluster -c CLUSTER_NAME将
CLUSTER_NAME替换为您的集群名称。等待
topology.k8s.io/rack标签传播到集群中的所有节点。
启用默认 Pod 分布限制条件
向集群 YAML 文件添加
preview.baremetal.cluster.gke.io/custom-scheduler-configuration:enable注解。在集群 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应用更新后的集群配置。
bmctl update cluster -c CLUSTER_NAME将
CLUSTER_NAME替换为您的集群名称。等待集群协调完成。监控
cluster.status.clusterState,直到其显示Running。在此过程中,系统会为每个控制平面节点运行一个control-plane-update作业。
验证 Pod 分布配置
创建一个包含五个副本的测试部署。
观察 Pod 分布。
nodepool-rack1和nodepool-rack2上的 Pod 数量之差应恰好为 1。验证每个控制平面节点上的
kube-scheduler-profile.config文件。 该文件位于/etc/kubernetes/kube-scheduler-profile.config,必须包含cluster.spec中的拓扑分布配置。
问题排查
如需诊断和解决默认 Pod 分布问题,请检查以下各项:
- 查看
BareMetalMachine.Status.ControlPlaneComponents,了解该功能的状态。 - 检查
cluster-operator和cap-controller-manager中的日志,查找相关事件。 - 如果
kube-scheduler静态 Pod 崩溃,请检查集群 YAML 文件中的调度器配置是否正确。
后续步骤
- 如需详细了解 Pod 拓扑分布限制,请参阅 Kubernetes 文档。
- 如果您遇到问题,请参阅排查 Kubernetes 调度器问题。