从GKE Pod通过gcloud SSH到GKE节点失败求助
解决方案:通过Workload Identity实现Pod到GKE节点的SSH访问(未启用OS Login)
问题背景
你已配置Workload Identity将K8s ServiceAccount绑定到GCP ServiceAccount(node-ssh-access@auto-x-244507.iam.gserviceaccount.com),该GCP SA拥有Owner权限,Pod可正常调用GCP API,但无法从Pod内部SSH到GKE节点;本地使用该SA可正常SSH,且未启用OS Login,希望避免使用K8s Secret存储SSH密钥。
核心原因
本地执行gcloud compute ssh时,会自动使用本地SSH密钥(或生成临时密钥并添加到实例/项目元数据);而Pod内部无默认SSH密钥,且gcloud不会自动为Workload Identity身份生成并注入SSH密钥到实例元数据,导致SSH验证失败。
解决步骤
1. 移除冗余的--impersonate-service-account参数
Pod已通过Workload Identity关联目标GCP SA,无需额外指定身份模拟参数,直接使用默认身份即可简化命令。
2. 在Pod内生成临时SSH密钥并添加到节点元数据
利用GCP SA的Owner权限,将临时生成的SSH公钥添加到目标节点的元数据中,完成SSH授权:
# 生成无密码SSH密钥对 ssh-keygen -t rsa -f ~/.ssh/id_rsa -N "" # 格式化公钥(格式:用户名:公钥内容,用户可自定义用户名,例如gke-pod-user) PUB_KEY=$(cat ~/.ssh/id_rsa.pub | awk '{print "gke-pod-user:"$0}') # 将公钥添加到目标节点的元数据 gcloud compute instances add-metadata gke-test-cluster-default-pool-0e59e91e-q5x6 --zone us-central1-c --metadata ssh-keys="$PUB_KEY"
3. 执行SSH访问
使用生成密钥对应的用户名发起SSH连接:
# 直接使用ssh命令 ssh gke-pod-user@gke-test-cluster-default-pool-0e59e91e-q5x6 # 或通过gcloud封装的命令 gcloud compute ssh gke-pod-user@gke-test-cluster-default-pool-0e59e91e-q5x6 --zone us-central1-c
4. 可选:清理临时SSH密钥(安全最佳实践)
SSH完成后,可移除添加到节点元数据的临时公钥:
# 获取当前节点的ssh-keys元数据 CURRENT_KEYS=$(gcloud compute instances describe gke-test-cluster-default-pool-0e59e91e-q5x6 --zone us-central1-c --format="value(metadata.items.ssh-keys)") # 过滤掉临时添加的密钥 UPDATED_KEYS=$(echo "$CURRENT_KEYS" | grep -v "gke-pod-user") # 更新节点元数据,移除临时密钥 gcloud compute instances add-metadata gke-test-cluster-default-pool-0e59e91e-q5x6 --zone us-central1-c --metadata ssh-keys="$UPDATED_KEYS"
替代方案:启用OS Login(推荐长期使用)
如果允许启用OS Login,可通过为GCP SA分配对应角色,直接通过Workload Identity身份完成SSH授权,无需手动管理SSH密钥:
# 为GCP SA分配OS Login角色 gcloud projects add-iam-policy-binding <Project-id> \ --member="serviceAccount:node-ssh-access@auto-x-244507.iam.gserviceaccount.com" \ --role="roles/compute.osLogin" # 启用集群节点的OS Login(需更新节点池) gcloud container node-pools update default-pool \ --cluster=test-cluster \ --zone=us-central1-c \ --enable-os-login # 之后在Pod内直接执行SSH命令即可 gcloud compute ssh gke-test-cluster-default-pool-0e59e91e-q5x6 --zone us-central1-c
内容的提问来源于stack exchange,提问作者Harsh Manvar
相关产品推荐
相关产品推荐

