如何修改GKE节点所使用的服务账号(Service Account)
GKE集群无中断修改节点服务账号方案
GKE节点池的服务账号属性确实不支持直接编辑修改,你可以通过滚动替换节点池的方式在完全不干扰集群正常运行的前提下完成专属SA的配置,具体操作步骤如下:
前置操作:创建并配置专属服务账号
- 先在IAM中创建你需要的集群专属SA,按需配置最小权限,GKE节点默认需要的基础权限包括:
- 日志写入权限(roles/logging.logWriter)
- 监控指标上报权限(roles/monitoring.metricWriter)
- GCR镜像拉取权限(roles/storage.objectViewer)
- 节点运行基础权限(roles/container.node)
操作步骤
- 创建同配置的新节点池
新节点池的机器规格、磁盘配置、区域/可用区、标签、污点等配置和原有节点池保持完全一致,唯一区别是指定你刚创建的专属SA作为节点服务账号,参考gcloud命令:
等待新节点池所有节点状态变为Ready后再进行下一步。gcloud container node-pools create <新节点池名称> \ --cluster <你的集群名称> \ --service-account <专属SA邮箱>@<你的项目ID>.iam.gserviceaccount.com \ # 补充原有节点池的其他配置参数,比如--machine-type、--node-taints等- 创建同配置的新节点池
- 逐步驱逐旧节点上的工作负载
逐个对原有节点池的节点执行隔离+驱逐操作,确保每次驱逐的Pod都能在新节点上成功启动后再处理下一个节点,不会造成业务中断:
- 先隔离旧节点,禁止新Pod调度上去:
kubectl cordon <旧节点名称> - 驱逐旧节点上的所有业务Pod:
kubectl drain <旧节点名称> --ignore-daemonsets --delete-emptydir-data
参数说明:--ignore-daemonsets是忽略DaemonSet管理的Pod(这类Pod默认每个节点都需要运行,不需要迁移),--delete-emptydir-data如果你的业务没有在本地emptydir存储重要数据可直接使用,否则请先完成数据迁移后再执行驱逐
- 逐步驱逐旧节点上的工作负载
- 删除原有节点池
确认所有业务Pod都已经正常调度到新节点池的节点上运行后,删除旧节点池即可完成配置:gcloud container node-pools delete <旧节点池名称> --cluster <你的集群名称>
- 删除原有节点池
注意事项
- 操作前请确认核心业务都配置了≥2的副本数,以及合理的PodDisruptionBudget策略,进一步保障驱逐过程零中断
- 如果你的工作负载配置了节点选择器、节点亲和性规则,请提前确认新节点池的标签和旧节点完全一致,避免Pod调度失败
- 整个操作过程可以随时暂停回退,在未删除旧节点池之前如果遇到异常,只需要重新给旧节点解除cordon状态,再驱逐新节点上的Pod即可恢复原有配置
内容的提问来源于stack exchange,提问作者Shivangi Bhardwaj
相关产品推荐
相关产品推荐

