我正在尝试使用谷歌的首选"工作负载标识";方法使我的GKE应用程序能够安全地访问来自谷歌秘密的秘密。
我已经完成了设置,甚至检查了故障排除部分中的所有步骤(https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity?hl=sr-ba#故障排除(,但我的日志中仍然出现以下错误:
未处理的异常。Grpc.Core.Rpc异常:状态(StatusCode=PermissionDenied,Detail="权限"资源的"secretmanager.secrets.list"被拒绝"项目/我的项目"(或者它可能不存在("(
我认为问题是由于节点池没有使用正确的服务帐户,所以我重新创建了它,这次指定了正确的服务账户。
服务帐户添加了以下角色:
- 云构建服务
- 帐户Kubernetes引擎开发人员
- 容器注册表服务代理
- Secret Manager Secret Accessor
- Secret Manager查看器
我用于验证的包的相关源代码如下:
var data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
var request = new ListSecretsRequest
{
ParentAsProjectName = ProjectName.FromProject(projectName),
};
var secrets = secretManagerServiceClient.ListSecrets(request);
foreach(var secret in secrets)
{
var value = secretManagerServiceClient.AccessSecretVersion($"{secret.Name}/versions/latest");
string secretVal = this.manager.Load(value.Payload);
string configKey = this.manager.GetKey(secret.SecretName);
data.Add(configKey, secretVal);
}
Data = data;
参考。https://github.com/jsukhabut/googledotnet
我是不是错过了这个过程中的一步?
知道谷歌为什么还在说";资源"projects/my project"的权限"secretmanager.secrets.list"被拒绝(或者它可能不存在(">
就像评论中提到的@sethvargo一样,您需要将服务帐户映射到您的pod,因为Workload Identity不使用底层节点标识,而是将Kubernetes服务帐户映射为GCP服务帐户。所有事情都发生在Workload标识中的每个pod级别。
为应用程序分配一个Kubernetes服务帐户,并将其配置为充当Google服务帐户。
1.创建一个具有所需权限的GCP服务帐户。
2.创建一个Kubernetes服务帐户。
3.分配Kubernetes服务帐户权限以模拟GCP服务帐户。
4.以Kubernetes服务帐户的身份运行您的工作负载。
希望你在项目或秘密中使用的是项目ID,而不是项目名称。
您无法更新已创建pod的服务帐户。
请参阅将服务帐户添加到pod的链接。