如何避免AKS集群缩容时moon2部署的Pod被意外终止?
解决AKS自动缩容时避免特定Pod被终止的方案
方案一:锁定承载目标Pod的节点,阻止集群缩容销毁它们
这是最直接的解决方式,通过给节点添加注解阻止自动扩缩容组件删除它,同时用标签和污点确保只有目标Pod能运行在这些节点上:
- 先找到承载
moon2-pod1和moon2-pod2的节点名称,执行命令查看:kubectl get pods -o wide - 给这两个节点打上专属标签:
kubectl label nodes <节点名称1> dedicated=moon2-pods kubectl label nodes <节点名称2> dedicated=moon2-pods - 给节点添加污点,避免其他无关Pod调度到这些节点上:
kubectl taint nodes <节点名称1> dedicated=moon2-pods:NoSchedule kubectl taint nodes <节点名称2> dedicated=moon2-pods:NoSchedule - 修改
moon2的Deployment,让Pod能容忍上述污点,并且只调度到打了标签的节点:
执行命令编辑Deployment配置:kubectl edit deployment moon2,在spec.template.spec下添加以下内容:tolerations: - key: "dedicated" operator: "Equal" value: "moon2-pods" effect: "NoSchedule" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: dedicated operator: In values: - moon2-pods - 给节点添加禁用缩容的注解,让集群自动扩缩容组件跳过这些节点:
kubectl annotate nodes <节点名称1> cluster-autoscaler.kubernetes.io/scale-down-disabled=true kubectl annotate nodes <节点名称2> cluster-autoscaler.kubernetes.io/scale-down-disabled=true
方案二:用拓扑分布约束固定Pod节点分布+节点缩容保护
如果不想完全锁定节点,只想避免Pod因节点缩容被频繁调度,可以采用这个方案:
- 修改
moon2的Deployment,添加拓扑分布约束,确保两个Pod分别运行在不同节点:
执行命令编辑Deployment:kubectl edit deployment moon2,在spec下添加以下内容:topologySpreadConstraints: - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: moon2 # 替换成你的Deployment实际使用的标签 - 同样给承载Pod的节点添加缩容禁用注解,操作同方案一的第5步。
方案三:创建专用节点池,禁用自动缩容
直接给moon2的Pod单独分配一个不会触发缩容的节点池:
- 使用Azure CLI创建专用节点池,设置最小和最大节点数一致(比如2个),关闭自动扩缩容:
az aks nodepool add --resource-group <你的资源组名> --cluster-name <你的AKS集群名> --name moon2-pool --node-count 2 --min-count 2 --max-count 2 - 给这个节点池的节点打标签,然后配置
moon2的Deployment的节点亲和性,让Pod只调度到这个节点池的节点上,配置方式参考方案一的第4步。
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

