猿问

从 go 程序访问 AKS kubeconfig 文件

我正在尝试编写一个 Go 程序来从集群中获取 pod 日志。我正在使用 AKS kubernetes 集群。如何访问脚本中的 kubeconfig 文件?以下是我的代码:


package main


import (

    "context"

    "flag"

    "fmt"

    "time"

    "os"

    "path/filepath"


    "k8s.io/apimachinery/pkg/api/errors"

    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

    "k8s.io/client-go/kubernetes"

    //"k8s.io/client-go/rest"

    "k8s.io/client-go/tools/clientcmd"

    //

    // Uncomment to load all auth plugins

    // _ "k8s.io/client-go/plugin/pkg/client/auth"

    //

    // Or uncomment to load specific auth plugins

    // _ "k8s.io/client-go/plugin/pkg/client/auth/azure"

    // _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"

    // _ "k8s.io/client-go/plugin/pkg/client/auth/oidc"

    // _ "k8s.io/client-go/plugin/pkg/client/auth/openstack"

)


func main() {

    /*// creates the in-cluster config

    config, err := rest.InClusterConfig()

    if err != nil {

        panic(err.Error())

    }*/

    

    fmt.Printf("Creating cluster config")

    

    kubePtr := flag.Bool("use-kubeconfig", false, "use kubeconfig on local system")

    flag.Parse()

    

    fmt.Printf("Updating the existing config")


    var kubeconfig string


    if *kubePtr == true {

        kubeconfig = filepath.Join(os.Getenv("HOME"), ".kube", "config")

    } else {

        kubeconfig = ""

    }

    

    fmt.Printf("Building config from flags")


    config, err := clientcmd.BuildConfigFromKubeconfigGetter("", kubeconfig)

    

    fmt.Printf("creating the clientset")

    

    

    // creates the clientset

    clientset, err := kubernetes.NewForConfig(config)

    if err != nil {

        panic(err.Error())

    }

    for {

        // get pods in all the namespaces by omitting namespace

        // Or specify namespace to get pods in particular namespace

        pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})

        if err != nil {

            panic(err.Error())

        }



ITMISS
浏览 219回答 2
2回答

慕村225694

从这里的示例中,代码应如下所示。BuildConfigFromFlags注意函数加载kubeconfig文件的用法。func main() {    var kubeconfig *string    if home := homedir.HomeDir(); home != "" {        kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")    } else {        kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")    }    flag.Parse()    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)    if err != nil {        panic(err)    }    clientset, err := kubernetes.NewForConfig(config)    if err != nil {        panic(err)    }    ...确保该位置存在有效的 kubeconfig 文件~/.kube/config 。在 AKS 上,您可以运行以下命令来获取 kubeconfig 文件,该文件将文件放在~/.kube/configaz aks get-credentials --resource-group myResourceGroup --name myAKSCluster

胡说叔叔

我注意到的第一件事是你没有提到你是如何开始你的程序的。查看我看到的代码,您正在创建一个kubePtr默认为false. 当 flag 设置为true它时,它将 kubeconfig 变量设置为 kubeconfig 路径,但是因为它是 false(默认情况下)它将它设置为 "",这就是它找不到配置的原因。将此标志设置为 true 后,您会看到以下错误:不能在 clientcmd.BuildConfigFromKubeconfigGetter 的参数中使用 kubeconfig(类型字符串)作为类型 clientcmd.KubeconfigGetter这意味着你有类型不匹配。让我们看一下BuildConfigFromKubeconfigGetter() 函数参数类型:func BuildConfigFromKubeconfigGetter(masterUrl string, kubeconfigGetter KubeconfigGetter) (*restclient.Config, error)请注意,您正在传递一个字符串作为预期类型为KubeconfigGetter的参数。最好使用不同的函数,如clientcmd.BuildConfigFromFlags(),作为参数期望kubeconfig 文件的路径(字符串)。在 github 上的官方 client-go 库存储库中,您可以找到几个可以帮助您开始使用 clien-go 库的示例。例如,看一下这个官方示例,并注意客户端是如何配置的。
随时随地看视频慕课网APP

相关分类

Go
我要回答