如何禁用GKE节点池内节点的SSH访问?解决实例模板替换异常
解决方案:禁用GKE机密节点池的SSH访问
问题根源
手动创建的实例模板遗漏了GKE节点注册所需的核心配置(如kubelet参数、集群元数据、GKE专属标签等),导致新节点无法加入集群,触发自动修复循环。正确做法是基于原有节点池的配置修改,而非从零构建模板。
方案一:直接更新现有节点池(推荐)
无需替换实例模板,通过更新节点池元数据实现SSH禁用,操作简单且避免配置遗漏:
更新节点池元数据,禁用SSH访问
执行以下命令,添加阻止项目级SSH密钥、关闭OSLogin的元数据:gcloud container node-pools update card-decrpyt-confidential-pool-1 \ --cluster=svcs-dev-1 \ --region=us-central1 \ --metadata=block-project-ssh-keys=true,enable-oslogin=falseblock-project-ssh-keys=true:禁止使用项目级SSH密钥登录节点enable-oslogin=false:关闭OSLogin功能,进一步阻断SSH登录路径
触发滚动更新,让所有节点应用新配置
执行滚动更新,逐步替换旧节点为应用新配置的节点:gcloud container node-pools rolling-update start card-decrpyt-confidential-pool-1 \ --cluster=svcs-dev-1 \ --region=us-central1 \ --max-surge=1 \ --max-unavailable=1该命令会保持集群可用性,每次只替换1个节点,匹配你原有节点池的升级参数。
方案二:使用自定义实例模板(需基于原模板)
若必须使用自定义模板,需基于原有节点池的实例模板修改,确保保留GKE核心配置:
获取原节点池的实例模板URL
ORIGINAL_TEMPLATE=$(gcloud container node-pools describe card-decrpyt-confidential-pool-1 \ --cluster=svcs-dev-1 \ --region=us-central1 \ --format="value(instanceTemplate)")基于原模板创建带SSH禁用配置的新模板
gcloud compute instance-templates create card-decrypt-instance-template-custom \ --source-instance-template=$ORIGINAL_TEMPLATE \ --metadata=block-project-ssh-keys=true,enable-oslogin=false \ --project=corp-dev-project \ --region=us-central1更新节点池使用新模板
gcloud container node-pools update card-decrpyt-confidential-pool-1 \ --cluster=svcs-dev-1 \ --region=us-central1 \ --instance-template=card-decrypt-instance-template-custom触发滚动更新
同方案一的滚动更新命令,确保新节点替换旧节点并成功加入集群。
验证操作
完成后,可通过以下方式验证SSH已禁用:
- 尝试通过
gcloud compute ssh登录节点,应提示无有效密钥或权限被拒绝 - 查看节点元数据:
gcloud compute instances describe <节点名称> --project=corp-dev-project --zone=<节点区域> --format="value(metadata.items)",确认block-project-ssh-keys为true、enable-oslogin为false
内容的提问来源于stack exchange,提问作者TeeTee
相关产品推荐
相关产品推荐

