如何将现有GKE集群节点更新为抢占式节点?
嗨,这个问题我刚好处理过好几次,给你捋清楚实操步骤:
把GKE现有非抢占式节点改为抢占式的操作流程
首先得明确一个关键点:GKE不支持直接将已存在的非抢占式节点池转换为抢占式,所以得通过「新建抢占式节点池 → 迁移工作负载 → 删除旧节点池」的路径来完成转换,具体步骤如下:
1. 创建抢占式节点池
用gcloud命令快速创建,记得替换命令里的集群名称、区域/可用区、机器类型等参数:
gcloud container node-pools create preemptible-pool \ --cluster=你的集群名称 \ --zone=你的集群可用区 \ # 区域性集群换成 --region=你的集群区域 --machine-type=n1-standard-2 \ # 替换成你实际需要的机器规格 --preemptible \ --num-nodes=3 \ # 初始节点数按需调整 --enable-autoscaling --min-nodes=1 --max-nodes=5 # 不需要自动扩缩容可以删掉这行
2. 验证新节点池状态
等节点池创建完成后,用下面的命令确认节点正常加入集群:
# 查看所有节点池列表 gcloud container node-pools list --cluster=你的集群名称 # 直接筛选抢占式节点 kubectl get nodes -l cloud.google.com/gke-preemptible=true
3. 迁移现有工作负载到新节点
这里提供两种常用的迁移方式,按需选择:
方式一:给旧节点打污点,自动驱逐Pod
这种方式适合大多数无状态应用,不需要修改工作负载配置:# 先获取旧节点池的所有节点名称 OLD_NODES=$(kubectl get nodes -l cloud.google.com/gke-nodepool=旧节点池名称 -o jsonpath='{.items[*].metadata.name}') # 给每个旧节点添加污点,让Pod无法继续调度在上面 for node in $OLD_NODES; do kubectl taint nodes $node dedicated=non-preemptible:NoSchedule doneKubernetes会自动把旧节点上的Pod驱逐到新的抢占式节点,等所有Pod都迁移完成后再进行下一步。
方式二:修改工作负载的节点选择器
如果你的工作负载原本就指定了节点选择器,直接更新选择器指向新节点池即可:kubectl edit deployment 你的Deployment名称在
spec.template.spec.nodeSelector中添加新节点池的标签:cloud.google.com/gke-nodepool: preemptible-pool保存后,Deployment会自动滚动更新Pod到新节点。
4. 删除旧的非抢占式节点池
确认所有工作负载都正常运行在新节点上(可以用kubectl get pods -o wide查看Pod所在节点),就可以安全删除旧节点池了:
gcloud container node-pools delete 旧节点池名称 --cluster=你的集群名称
执行命令时会需要你输入y确认删除。
额外注意事项
- 抢占式节点会在创建后24小时内被强制回收,建议开启节点自动修复和自动扩缩容,保障集群可用性;
- 对于有状态应用,迁移前务必确认数据已持久化到PersistentVolume,避免节点回收时丢失数据;
- 如果集群配置了PodDisruptionBudget,要确保驱逐过程不会违反PDB规则,防止应用服务中断。
内容的提问来源于stack exchange,提问作者pokeymond
相关产品推荐
相关产品推荐

