GKE中如何避免DaemonSet被集群自动扩缩容组件驱逐?
GKE环境下避免DaemonSet被集群自动扩缩容组件驱逐的可行方案
你使用的上游cluster-autoscaler注解在部分版本的GKE托管集群中不会生效,属于GKE侧的适配差异,可通过以下方法解决:
- 配置高优先级Pod优先级类
cluster-autoscaler默认不会驱逐优先级高于2000000000的Pod,你可以自定义高优先级类绑定到DaemonSet的Pod模板:- 先创建PriorityClass资源:
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: ds-no-evict-priority value: 2000001000 globalDefault: false description: "用于DaemonSet Pod,避免被集群自动扩缩容组件驱逐"- 在DaemonSet的
spec.template.spec字段下新增优先级配置:
如果你部署的DaemonSet处于priorityClassName: ds-no-evict-prioritykube-system命名空间,也可以直接使用GKE内置的system-cluster-critical或system-node-critical优先级类,无需自行创建。 - 为运行目标DaemonSet的节点添加缩容禁用注解
给节点添加注解cluster-autoscaler.kubernetes.io/scale-down-disabled: "true"后,cluster-autoscaler会直接跳过该节点的缩容逻辑,节点上所有Pod都不会被驱逐。你可以手动给节点打注解,也可以部署一个辅助DaemonSet自动检测节点上是否运行了目标DaemonSet Pod,匹配成功后自动给节点添加该注解。 - 给DaemonSet Pod配置本地临时存储
GKE的cluster-autoscaler默认开启了--skip-nodes-with-local-storage=true参数,不会缩容运行了带有本地存储Pod的节点。你可以在DaemonSet的Pod模板中新增emptyDir类型的临时存储挂载,即可触发该规则:- 在
spec.template.spec.volumes下新增卷配置:
volumes: - name: local-tmp emptyDir: {}- 在对应容器的
volumeMounts下新增挂载配置:
注意该方案下emptyDir内的数据会在Pod重建时清空,请勿在该路径下存储需要持久化的数据。volumeMounts: - name: local-tmp mountPath: /tmp - 在
内容的提问来源于stack exchange,提问作者Fulo Lin
相关产品推荐
相关产品推荐

