如何配置EKS节点仅在DaemonSet就绪后调度Pod?
如何让EKS节点在DaemonSet就绪后才调度新Pod
一、针对特定DaemonSet的实现方案
方法1:利用节点就绪门(Node Readiness Gates)
节点就绪门允许你扩展节点的就绪状态判断逻辑——只有当自定义条件满足(比如目标DaemonSet的Pod在该节点上就绪),节点才会被标记为Ready,调度器只会向就绪节点分配新Pod。
步骤:
- 定义自定义节点条件类型,例如
acme.io/required-daemonset-ready - 编写自定义控制器(可用Kubebuilder快速生成,或用Python/Go脚本),实现以下逻辑:
- 监听目标DaemonSet的Pod状态,当节点上的目标Pod进入
Ready状态时,给该节点添加acme.io/required-daemonset-ready=True的条件 - 若Pod故障退出,将该条件标记为
False或移除
- 监听目标DaemonSet的Pod状态,当节点上的目标Pod进入
- 配置节点的就绪门:
可以通过EKS节点组的启动脚本自动给新节点添加该配置,或手动patch节点:apiVersion: v1 kind: Node metadata: name: target-node spec: readinessGates: - conditionType: "acme.io/required-daemonset-ready"
方法2:污点+容忍度配合自动清理污点
给新节点添加初始污点,阻止普通Pod调度;当目标DaemonSet的Pod就绪后,自动移除污点。
步骤:
- 在EKS节点组的用户数据中,配置kubelet添加初始污点:
# 启动脚本中添加kubelet参数 --register-with-taints=acme.io/wait-daemonset=true:NoSchedule - 给目标DaemonSet配置容忍度,确保它能被调度到带污点的节点:
apiVersion: apps/v1 kind: DaemonSet metadata: name: required-daemonset spec: template: spec: tolerations: - key: "acme.io/wait-daemonset" operator: "Equal" value: "true" effect: "NoSchedule" - 给DaemonSet的Pod添加
PostStart钩子,当Pod就绪后移除节点污点:
注意:需要给DaemonSet绑定的ServiceAccount授予containers: - name: main-container image: your-image:latest lifecycle: postStart: exec: command: ["kubectl", "taint", "nodes", "$(NODE_NAME)", "acme.io/wait-daemonset-"] env: - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeNamenodes/update权限,否则无法执行污点操作。
二、等待所有DaemonSet就绪的实现方案
方法1:扩展就绪门监控所有DaemonSet
修改自定义控制器的逻辑:检查节点上所有DaemonSet的Pod状态,只有当所有DaemonSet的Pod都处于Ready状态时,才将节点的自定义就绪条件标记为True。
方法2:优先级+调度约束结合
- 确保所有DaemonSet使用高优先级(默认DaemonSet的优先级已经高于普通Pod,可无需额外配置)
- 给普通Pod添加节点亲和规则,要求节点满足自定义的
acme.io/all-daemonsets-ready=True条件,该条件由控制器根据节点上所有DaemonSet的Pod状态动态更新。
EKS专属配置提示
在EKS中,可通过Node Group的启动脚本批量配置节点的污点或就绪门,无需手动操作单个节点。例如在用户数据中添加kubectl patch命令,自动给新节点添加就绪门配置。
内容的提问来源于stack exchange,提问作者jrz
相关产品推荐
相关产品推荐

