【问题标题】:Access Kubernetes GKE cluster outside of GKE cluster with client-go?使用 client-go 访问 GKE 集群之外的 Kubernetes GKE 集群?
【发布时间】:2018-07-02 05:28:54
【问题描述】:
  • 我在 GKE 上运行了多个 kubernetes 集群(比如说 clusterA 和 clusterB)
  • 我想在其中一个集群中运行的应用程序中从客户端访问这两个集群(例如,从在 clusterA 上运行的应用程序访问 clusterB)

我一般从 client-go 使用 kubernetes 集群进行身份验证,我发现我有两个选择:

  • InCluster 配置
  • 或来自 kube 配置文件

所以很容易从 clusterA 访问 clusterA 而不是从 clusterA 访问 clusterB。

我在这里有什么选择?看来我只是无法通过GOOGLE_APPLICATION_CREDENTIALS 并希望client-go 能照顾好自己。

所以我的想法:

  • 创建专用 IAM 服务帐号
  • 通过 gcloud container clusters get-credentials clusterAgcloud container clusters get-credentials clusterB 为两个集群创建带有令牌的 kube 配置
  • 通过 clusterA 上的 BuildConfigFromFlags 在 client-go 中使用该 kube 配置文件

这是正确的方法,还是有更简单的方法?我看到令牌有过期日期?

更新:

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

【问题讨论】:

    标签: kubernetes google-kubernetes-engine


    【解决方案1】:

    client-go 需要了解:

    1. 集群主控的 IP 地址
    2. 集群的 CA 证书

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

    我建议您:

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

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

    然后,Create a Cloud IAM Service Account 并赋予它“容器开发者”角色。下载它的密钥。

    现在,您有两个选择:

    选项 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 二进制文件在每次令牌过期时(每 1 小时)检索令牌。

    选项 2:使用 GOOGLE_APPLICATION_CREDENTIALS

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

    希望这会有所帮助。

    附:不要忘记在你的 Go 程序中import _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"。这会加载 gcp auth 插件!

    【讨论】:

    • 您确定选项 2 会起作用吗?由于查看 gcp.go 实现,它似乎确实需要外部二进制文件来刷新令牌?
    • 好吧,通过查看描述 cmd-path 和 cmd-args 的 gcp.go,我似乎对第二个选项感到困惑,所以我认为它与使用 gcloud 相同,但似乎如果你不提供这些,它只会使用 google.DefaultTokenSource 这似乎是我需要的
    • 很高兴听到。我最近更新了那个文件,这两个选项都是可能的。
    • @AhmetAlpBalkan-Google 第一种方法在生产中使用是否安全?
    • @AhmetB-Google 你知道如何将 IP/CA 传递给 client-go 吗?
    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 2020-02-03
    • 2019-10-13
    • 1970-01-01
    • 2018-04-12
    • 2018-12-25
    • 2019-06-06
    • 2021-11-15
    相关资源
    最近更新 更多