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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:13:18