kubernetes 使用kubeconfig从DO集群连接GKE集群(不使用gcloud)

pftdvrlh  于 2023-04-05  发布在  Kubernetes
关注(0)|答案(2)|浏览(186)

我在Digital Ocean上有一个集群。我的项目的API在DO中。我的图像来自google/cloud-sdk:alpine,我还安装了gke-gcloud-auth-plugin,命令如下

gcloud components install gke-gcloud-auth-plugin

我在Google Kubernetes Engine上有另一个集群。我想通过DO中的api在gke集群上创建,列出,删除pods。我使用kubernetes go client。我给予gke集群的kubeconfig文件交给go client。但是当我尝试执行操作(例如列出pods)时,我得到以下错误:

cred.go:145] print credential failed with error: Failed to retrieve access token:: failure while executing gcloud, with args [config config-helper --format=json]: exit status 1
2023/04/04 07:28:21 code: get_pod_error, error: Get "https://..../api/v1/namespaces/default/pods/cloud-flow-80117068-9715-4374-b91b-799472d647be": getting credentials: exec: executable gke-gcloud-auth-plugin failed with exit code 1

我使用相同的方法在DO中的另一个集群上创建或删除Pod,并成功工作。
简单的说,我想通过使用GKE的kubeconfig文件从DO集群连接GKE集群,有没有人遇到同样的问题?谢谢。

mepcadol

mepcadol1#

最后我解决了如下问题:
1:使用令牌和服务帐户创建密钥。然后将它们关联。
2:创建一个clusterrole(给予必要的权限)和clusterrolebinding,并将其关联。
3:关联服务帐户和clusterrolebinding。
现在你可以使用token连接gke集群,而不需要使用gke-gcloud-auth-plugin。
如果我不使用token参数,则输出为:

但是,如果我使用令牌,它会成功运行

另外,使用token并打印pod的go代码如下所示:

package main

import (
    "context"
    "fmt"
    "os"

    v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    // Path to the kubeconfig file
    kubeconfigPath := "/home/latif/.kube/config"

    // Build the configuration from the kubeconfig file
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfigPath)
    if err != nil {
        fmt.Printf("Error building config from kubeconfig: %v", err)
        os.Exit(1)
    }

    // Set the authentication token
    config.BearerToken = "my_token"

    // Create a new Kubernetes client
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        fmt.Printf("Error creating Kubernetes client: %v", err)
        os.Exit(1)
    }

    // Get the list of pods in the default namespace
    pods, err := clientset.CoreV1().Pods("default").List(context.Background(), v1.ListOptions{})
    if err != nil {
        fmt.Printf("Error getting pods: %v", err)
        os.Exit(1)
    }

    // Print the name of each pod
    for _, pod := range pods.Items {
        fmt.Println(pod.Name)
    }
}
jv2fixgn

jv2fixgn2#

错误消息表明,使用gcloud命令行工具检索Kubernetes集群的访问令牌存在问题,该工具通常用于对Google Cloud Platform(GCP)服务进行身份验证。
GKE v1.26中对Kubectl身份验证进行了一些重要更改
请按照下面的Google文档操作,Hopley它可以帮助解决这个bug:https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke

相关问题