• 我有多个在 GKE 上运行的 kubernetes 集群(假设是 clusterA 和 clusterB)
  • 我想从在其中一个集群中运行的应用程序中的 client-go 访问这两个集群(例如,从在 clusterA 上运行的应用程序访问 clusterB)

  • 我一般从 client-go 使用 kubernetes 集群进行身份验证我看到我有两个选择:
  • 集群内配置
  • 或来自 kube 配置文件

  • 所以从clusterA访问clusterA很容易,但从clusterA访问clusterB却很容易。

    我在这里有哪些选择?似乎我只是无法通过 GOOGLE_APPLICATION_CREDENTIALS 并希望 client-go 能够照顾好自己。

    所以我的想法:
  • 创建专用 IAM 服务帐户
  • 通过执行 gcloud container clusters get-credentials clusterAgcloud container clusters get-credentials clusterB
  • 为两个集群创建带有 token 的 kube 配置
  • 通过 clusterA
  • 上的 BuildConfigFromFlags 在 client-go 中使用该 kube 配置文件

    这是正确的方法,还是有更简单的方法?我看到 token 有有效期?

    更新:

    看来我也可以使用 CLOUDSDK_CONTAINER_USE_CLIENT_CERTIFICATE=True gcloud beta container clusters get-credentials clusterB --zone 。这会将证书添加到我可以使用的 kube conf。但 AFAIK 这些证书不能被撤销

    最佳答案

    client-go 需要了解:

  • 集群 master 的 IP 地址
  • 集群的 CA 证书

  • (如果您使用 GKE,您可以在 $HOME/.kube/config 中看到这些信息,由 gcloud container clusters get-credentials 命令填充)。

    我建议您:
  • 有一个 kubeconfig 文件,其中包含集群 A 和 B 的这些信息
  • 使用 GKE API 检索集群 A 和 B ( example here ) 的这些信息(您需要一个服务帐户来执行此操作,如下所述。)

  • 一旦您可以在 client-go 中创建 *rest.Config 对象,client-go 将使用在 kubeconfig 文件(或您构造的内存中等效项)中指定的 auth 插件。在 gcp auth 插件中,它知道如何检索 token 。

    然后,Create a Cloud IAM Service Account 并赋予它“Container Developer”角色。下载它的 key 。

    现在,您有两个选择:

    选项 1:您的程序使用 gcloud
    gcloud auth activate-service-account --key-file=key.json
    KUBECONFIG=a.yaml gcloud container clusters get-credentials clusterA
    KUBECONFIG=b.yaml gcloud container clusters get-credentials clusterB
    

    然后在您的程序中创建 2 个不同的 *rest.Client 对象,一个从 a.yaml 创建,另一个从 b.yaml 创建。

    现在,您的程序将依赖 gcloud 二进制文件在每次 token 到期时(每 1 小时)检索 token 。

    选项 2:使用 GOOGLE_APPLICATION_CREDENTIALS
  • 不要将 gcloud 安装到您的程序环境中。
  • 将您的 key.json 设置为 GOOGLE_APPLICATION_CREDENTIALS 环境
    程序的变量。
  • 找出获取集群 IP/CA 的方法(如上所述),以便您可以
    为集群 A 和 B 构造两个不同的 *rest.Config 对象。
  • 现在你的程序将使用指定的 key 文件来获取 access_token
    每次过期(每 1 小时)到 Google API。

  • 希望这可以帮助。

    附言不要忘记在 Go 程序中使用 import _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"。这将加载 gcp auth 插件!

    关于kubernetes - 使用 client-go 访问 GKE 集群之外的 Kubernetes GKE 集群?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48400966/

    10-16 08:07