You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将现有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
    done
    

    Kubernetes会自动把旧节点上的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:46:06