0

我有一个带有两个节点的 k8s 集群。一个节点让我们说 A,是一个 master+worker,另一个 B,只是一个 worker。现在,每当发生新部署时,它都会转到工作节点 (B)。我尝试了多个部署,每个部署都只部署在工作节点 (B) 上。

我认为调度程序的行为是在工作节点上安排部署并保持主节点的利用率尽可能低。

我想以循环方式分发部署,这样如果我有 6 个部署,每个节点将收到 3 个。我知道我可以通过在部署文件中定义节点约束来做到这一点,但我想知道是否有任何其他方式来实现这一目标?

注意 - 我尝试了具有两个副本的部署,并且两个节点都收到了一个 pod。但单副本的情况并非如此。它始终仅部署在工作节点 (B) 上。

节点 A (master + worker) 污点配置

CreationTimestamp:  Thu, 18 Apr 2019 11:38:54 +0200
Taints:             <none>
Unschedulable:      false

节点 B(仅限工作人员)污点配置

CreationTimestamp:  Tue, 10 Dec 2019 08:37:25 +0100
Taints:             <none>
Unschedulable:      false
4

3 回答 3

0

您可以在主节点和所有节点上运行以下命令删除污染

kubectl taint node --all node-role.kubernetes.io/master:NoSchedule-
于 2019-12-14T11:19:32.357 回答
0

我想以循环方式分发部署,这样如果我有 6 个部署,每个节点将收到 3 个。我知道我可以通过在部署文件中定义节点约束来做到这一点,但我想知道是否有任何其他方式来实现这一目标?

第一的; 您不应该关心有关调度的低级细节。让 Kubernetes 负责。

PodAffinity 或 PodAntiAffinity

关于 pod 调度,您应该关心的两件事是 pod 是否应该与其他东西位于同一位置,或者 pod 是否应该避免与某些东西位于同一位置。例如,您可能希望将应用程序副本安排在不同的节点上以实现容错/高可用性。

请参阅Pod Affinity 和 Pod Anti-Affinity

于 2019-12-14T17:48:39.737 回答
0

k8s 做 Pod 分发决策的组件称为“ Scheduler ”,它根据过滤和分发策略进行决策

过滤选项

  • 默认情况下,我们在 master 上拥有节点污染,Pod 必须容忍节点污染才能绕过限制
kubectl get node -l kubernetes.io/role=master -o json | jq '.items[].spec.taints'
  {
    "effect": "NoSchedule",
    "key": "node-role.kubernetes.io/master"
  }
  • 资源请求,因此 Pod CPU 和内存请求应该少于节点上的可用资源。

  • NodeAffinities/AntiAffinities , 根据节点标签提出调度条件

  • PodAffinities/AntiAffinities,与 NodeAff* 相同,但取决于其他 pod 标签

笔记

  • 所有过滤器选项都有软和硬级别的调度软关键字“首选”硬关键字“NoSchedule,required”
  • 您可以创建可以应用您自己的想法和优先级的自定义调度程序。
于 2022-01-31T20:42:46.977 回答