本页面介绍了调度器选项,以及如何在 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}
为节点添加标签
向集群和节点池 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 散布配置
创建具有 5 个副本的测试部署。
观察 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 调度程序问题。