我们正在运行一个kubernetes集群,该集群具有一个由Google提供的容器(具体来说,prometheus-to-sd
,我们使用它来将自定义指标导入Google云端监控fka stackdriver)。
在我们在集群上启用Workload Identity之前,该pod运行良好。
该Pod当前使用应用程序默认凭据运行,该凭据以前是被设置为具有gcp角色monitoring.writer
的服务帐户。
当我们引入Workload Identity时,应用程序的默认凭据发生了变化,prometheus-to-sd
容器开始抱怨缺少权限monitoring.timeSeries.create
。
我尝试将GOOGLE_APPLICATION_CREDENTIALS
设置为从gke机密挂载的文件。
我确认文件在那里并且已设置环境var(kubectl exec -it $POD /bin/sh
)。
我正在尝试调试问题所在。
我想编写一些go代码来验证哪个gcp服务帐户正在运行,但是所有示例都显示了Client
,这是具有授权标头设置的http客户端。
参见https://github.com/googleapis/google-api-go-client
例如:
import (
"context"
"fmt"
"golang.org/x/oauth2/google"
)
func main() {
ctx := context.Background()
creds, err := google.FindDefaultCredentials(ctx)
fmt.Printf("%+v\n", *creds)
}
这将大致打印出一些内容:
{ProjectID:projectId TokenSource:0xc000120880 JSON:[/* big chunk of byte values, no idea what these mean */]}
现在我可以自己加载文件了,但这违背了测试是否选择默认凭据的机制的目的。
我也看过其他语言,例如nodejs,但基本上显示了相同的问题。该代码正在使用某些凭据运行,尚不清楚使用了哪些凭据。