Google容器群集作为配置

问题描述 投票:1回答:2

我正在尝试将kubernetes go-client与cloud.google.com/go/container一起使用。我使用google cloud go容器包创建集群,然后我想使用go-client在该集群上部署。 go-client给出的out of cluster example使用kube配置文件来获取集群的凭据。但是因为我刚刚在我的应用程序中创建了这个集群,所以我没有那个配置文件。

如何使用“google.golang.org/genproto/googleapis/container/v1”群集设置“k8s.io/client-go/rest”配置?有哪些必填字段?下面的代码是我目前拥有的(没有显示实际的CA证书)。

func getConfig(cluster *containerproto.Cluster) *rest.Config {
    return &rest.Config{
        Host:     "https://" + cluster.GetEndpoint(),
        TLSClientConfig: rest.TLSClientConfig{
            Insecure: false,
            CAData: []byte(`-----BEGIN CERTIFICATE-----
                ...
                -----END CERTIFICATE-----`),
        },
    }

它导致此错误:x509:由未知权限签名的证书。所以显然缺少一些东西。任何其他方法都非常受欢迎!提前致谢

go kubernetes google-cloud-platform google-kubernetes-engine kubernetes-go-client
2个回答
2
投票

ClientCertificate,ClientKey和ClusterCaCertificate需要按照here的描述进行解码

func CreateK8sClientFromCluster(cluster *gkev1.Cluster) {
    decodedClientCertificate, err := base64.StdEncoding.DecodeString(cluster.MasterAuth.ClientCertificate)
    if err != nil {
        fmt.Println("decode client certificate error:", err)
        return
    }
    decodedClientKey, err := base64.StdEncoding.DecodeString(cluster.MasterAuth.ClientKey)
    if err != nil {
        fmt.Println("decode client key error:", err)
        return
    }
    decodedClusterCaCertificate, err := base64.StdEncoding.DecodeString(cluster.MasterAuth.ClusterCaCertificate)
    if err != nil {
        fmt.Println("decode cluster CA certificate error:", err)
        return
    }

    config := &rest.Config{
        Username: cluster.MasterAuth.Username,
        Password: cluster.MasterAuth.Password,
        Host:     "https://" + cluster.Endpoint,
        TLSClientConfig: rest.TLSClientConfig{
            Insecure: false,
            CertData: decodedClientCertificate,
            KeyData:  decodedClientKey,
            CAData:   decodedClusterCaCertificate,
        },
    }

    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        fmt.Printf("failed to get k8s client set from config: %s\n", err)
        return
    }
}

1
投票

我在这里回答了一个非常相似的问题:Access Kubernetes GKE cluster outside of GKE cluster with client-go?

基本上,简而言之,建议的方法是:

  1. 创建Google Cloud IAM服务帐户+下载其json密钥
  2. GOOGLE_APPLICATION_CREDENTIALS env var设置为该key.json
  3. gcloud container clusters describe查找集群的IP地址和CA证书(或者只是从.kube/config获取gcloud get-credentials文件)
  4. 将这些值传递给client-go并使用env var运行程序。
© www.soinside.com 2019 - 2024. All rights reserved.