Kubernetes 无法在自动缩放 GKE 节点池中的节点上安排 Daemonset pods
Kubernetes is faling to schedule Daemonset pods on nodes in an auto scaling GKE node pool
我们发现 GKE kubernetes 调度程序无法或不愿意在自动缩放节点池中的节点上调度 Daemonset pods。
我们在集群中有三个节点池,但是 pool-x
池用于专门调度由 HPA 支持的单个 Deployment,其中的节点应用了污点 "node-use=pool-x:NoSchedule"这个游泳池。我们还部署了一个 filebeat Daemonset,我们在其上设置了非常宽松的 operator: Exists
容忍规范(希望这是正确的)设置,以确保在集群中的每个节点上安排 Daemonset。
我们的假设是,随着 pool-x
自动扩展,filebeat Daemonset 将在调度分配给该节点的任何 pods 之前先在该节点上调度。然而,我们注意到随着新节点被添加到池中,filebeat pods 无法放置在节点上并且处于永久 "Pending" 状态。这是一个 filebeat Daemonset 的描述输出(截断)示例:
Number of Nodes Scheduled with Up-to-date Pods: 108
Number of Nodes Scheduled with Available Pods: 103
Number of Nodes Misscheduled: 0
Pods Status: 103 Running / 5 Waiting / 0 Succeeded / 0 Failed
以及 "Pending" 文件节拍之一的事件 pods:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 18m (x96 over 68m) default-scheduler 0/106 nodes are available: 105 node(s) didn't match node selector, 5 Insufficient cpu.
Normal NotTriggerScaleUp 3m56s (x594 over 119m) cluster-autoscaler pod didn't trigger scale-up (it wouldn't fit if a new node is added): 6 node(s) didn't match node selector
Warning FailedScheduling 3m14s (x23 over 15m) default-scheduler 0/108 nodes are available: 107 node(s) didn't match node selector, 5 Insufficient cpu.
如您所见,节点没有足够的资源来安排 filebeat pod CPU 由于节点上的其他 pods 运行 请求已耗尽。但是,为什么 Daemonset pod 没有在调度任何其他节点之前放置在节点上 pods。似乎 Daemonset 的定义需要优先级调度。
另外值得注意的是,如果我删除了一个节点上的 pod,其中 filebeat 由于无法满足 CPU 请求而被 "Pending" 调度,filebeat 会立即在该节点上调度,这表明有一些调度优先级被观察到。
最终,我们只想确保 filebeat Daemonset 能够在集群中的每个节点上安排一个 pod,并让该优先级与我们的集群自动缩放和 HPA 很好地配合。关于我们如何实现这一点有什么想法吗?
我们希望避免使用 Pod Priority,因为它显然 GKE 中的 alpha 功能,我们目前无法使用它.
之前kubernetes 1.12 daemonset是自己controller调度的,那个版本以后,部署daemonset都是由默认调度器来管理,希望优先级,抢占,容忍覆盖所有情况。
如果你想要由 daemonset scheduler 管理的 daemonsets 的时间表,检查
ScheduleDaemonSetPods 功能。
https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/
您期望的 DaemonSet pods 首先在节点上调度的行为不再是现实 (since 1.12). Since 1.12, DaemonSet pods are handled by the default scheduler and relies on pod priority 来确定调度 pods 的顺序。您可能需要考虑为具有相对较高 value
的 DaemonSet 创建一个特定的 priorityCLass,以确保它们被安排在大多数其他 pods.
之前
我们发现 GKE kubernetes 调度程序无法或不愿意在自动缩放节点池中的节点上调度 Daemonset pods。
我们在集群中有三个节点池,但是 pool-x
池用于专门调度由 HPA 支持的单个 Deployment,其中的节点应用了污点 "node-use=pool-x:NoSchedule"这个游泳池。我们还部署了一个 filebeat Daemonset,我们在其上设置了非常宽松的 operator: Exists
容忍规范(希望这是正确的)设置,以确保在集群中的每个节点上安排 Daemonset。
我们的假设是,随着 pool-x
自动扩展,filebeat Daemonset 将在调度分配给该节点的任何 pods 之前先在该节点上调度。然而,我们注意到随着新节点被添加到池中,filebeat pods 无法放置在节点上并且处于永久 "Pending" 状态。这是一个 filebeat Daemonset 的描述输出(截断)示例:
Number of Nodes Scheduled with Up-to-date Pods: 108
Number of Nodes Scheduled with Available Pods: 103
Number of Nodes Misscheduled: 0
Pods Status: 103 Running / 5 Waiting / 0 Succeeded / 0 Failed
以及 "Pending" 文件节拍之一的事件 pods:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 18m (x96 over 68m) default-scheduler 0/106 nodes are available: 105 node(s) didn't match node selector, 5 Insufficient cpu.
Normal NotTriggerScaleUp 3m56s (x594 over 119m) cluster-autoscaler pod didn't trigger scale-up (it wouldn't fit if a new node is added): 6 node(s) didn't match node selector
Warning FailedScheduling 3m14s (x23 over 15m) default-scheduler 0/108 nodes are available: 107 node(s) didn't match node selector, 5 Insufficient cpu.
如您所见,节点没有足够的资源来安排 filebeat pod CPU 由于节点上的其他 pods 运行 请求已耗尽。但是,为什么 Daemonset pod 没有在调度任何其他节点之前放置在节点上 pods。似乎 Daemonset 的定义需要优先级调度。
另外值得注意的是,如果我删除了一个节点上的 pod,其中 filebeat 由于无法满足 CPU 请求而被 "Pending" 调度,filebeat 会立即在该节点上调度,这表明有一些调度优先级被观察到。
最终,我们只想确保 filebeat Daemonset 能够在集群中的每个节点上安排一个 pod,并让该优先级与我们的集群自动缩放和 HPA 很好地配合。关于我们如何实现这一点有什么想法吗?
我们希望避免使用 Pod Priority,因为它显然 GKE 中的 alpha 功能,我们目前无法使用它.
之前kubernetes 1.12 daemonset是自己controller调度的,那个版本以后,部署daemonset都是由默认调度器来管理,希望优先级,抢占,容忍覆盖所有情况。 如果你想要由 daemonset scheduler 管理的 daemonsets 的时间表,检查 ScheduleDaemonSetPods 功能。
https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/
您期望的 DaemonSet pods 首先在节点上调度的行为不再是现实 (since 1.12). Since 1.12, DaemonSet pods are handled by the default scheduler and relies on pod priority 来确定调度 pods 的顺序。您可能需要考虑为具有相对较高 value
的 DaemonSet 创建一个特定的 priorityCLass,以确保它们被安排在大多数其他 pods.