Ben*_*man 5 google-cloud-platform kubernetes google-kubernetes-engine
我们有一个系统,旨在同时管理位于外部客户帐户中的大量 Kubernetes 集群。该系统目前的工作方式是将kubeconfig数据存储在运行时查询的数据库中,然后像这样传递给 golang kube-client 构造函数:
clientcmd.NewClientConfigFromBytes([]byte(kubeConfigFromDB))
Run Code Online (Sandbox Code Playgroud)
对于使用基本身份验证的集群,这“有效”。
对于 EKS 集群,只要aws-iam-authenticator在运行 golang 代码的机器上安装了 kube-client 以便 kube-client 可以调用它进行身份验证,并且更正API_AWS_ACCESS_KEY_ID并API_AWS_SECRET_ACCESS_KEY在kubeconfig's user.exec.envkey中设置,这就会起作用。
对于 GKE 集群,目前尚不清楚实现这一点的最佳实践方法是什么,尽管尝试了下面详述的一些不同操作,但我仍然无法使其工作。kubeconfig为 GKE 集群生成 a 的标准做法与 EKS 非常相似(详见https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl?authuser=1# generate_kubeconfig_entry )gcloud config config-helper用于生成身份验证凭据。
一个想法是使用GOOGLE_APPLICATION_CREDENTIALS环境变量,但问题在于它是全局的,因此我们不能让我们的系统同时与许多远程 GKE 集群通信,因为每个集群都需要一组唯一的 google 凭据来进行身份验证。
我的第二个想法是使用--impersonate-service-account提供给的标志gcloud config config-helper,但是当我运行它时它崩溃并出现以下错误:
$ gcloud config config-helper --format=json --impersonate-service-account=acct-with-gke-access@myorg.iam.gserviceaccount.com --project myproject
WARNING: This command is using service account impersonation. All API calls will be executed as [acct-with-gke-access@myorg.iam.gserviceaccount.com].
ERROR: gcloud crashed (AttributeError): 'unicode' object has no attribute 'utcnow'
Run Code Online (Sandbox Code Playgroud)
我最后的想法很复杂。我会得到 google-credentials-JSON 并将其放入如下kubeconfig所示:
user:
auth-provider:
config:
credentials: "<google-credentials-JSON>"
name: my-custom-forked-gcp
Run Code Online (Sandbox Code Playgroud)
我会创建自己的https://github.com/kubernetes/client-go/blob/master/plugin/pkg/client/auth/gcp/gcp.go#L156副本并替换第 156 行
ts, err := google.DefaultTokenSource(context.Background(), scopes...)
Run Code Online (Sandbox Code Playgroud)
和
ts, err := tokenSourceFromJSON(context.Background(), gcpConfig["credentials"], scopes...)
Run Code Online (Sandbox Code Playgroud)
tokenSourceFromJSON我添加的新方法在哪里,如下所示:
func tokenSourceFromJSON(ctx context.Context, jsonData string, scopes ...string) (oauth2.TokenSource, error) {
creds, err := google.CredentialsFromJSON(ctx, []byte(jsonData), scopes...)
if err != nil {
return nil, err
}
return creds.TokenSource, nil
}
Run Code Online (Sandbox Code Playgroud)
最后一个想法可能会奏效(希望如此!我现在正在研究它)但它似乎是一个非常复杂的简单问题的解决方案:google-credentials-JSON在运行时向 golang kubernetes 客户端提供使用这些凭据进行身份验证。有更容易的方法吗?
一个想法是使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量,但是,这样做的问题是它是全局的,因此我们无法让我们的系统同时与许多远程 GKE 集群通信,因为每个集群都需要一组唯一的 Google 凭据进行身份验证。
您可以使用以下命令覆盖运行 go 程序的特定 shell 的 env 变量:
os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", value)
Run Code Online (Sandbox Code Playgroud)
我的第二个想法是使用提供给 gcloud config config-helper 的 --impersonate-service-account 标志
看起来像是 gcloud 应用程序的 python 代码中的错误。这里 描述的utcnow仅适用于datetime.datetime对象。您可以检查该模块是否在您系统中的 python shell 中工作。
我的最终想法相当复杂。
似乎只要credentials: "<google-credentials-JSON>"GCP API 的不同会话之间的值不发生变化,这种方法就可以工作(凭证值可能会过期)
注:最终想法的公关。
| 归档时间: |
|
| 查看次数: |
619 次 |
| 最近记录: |