为了账号安全,请及时绑定邮箱和手机立即绑定

从 go 程序访问 AKS kubeconfig 文件

从 go 程序访问 AKS kubeconfig 文件

Go
ITMISS 2022-06-27 15:07:10
我正在尝试编写一个 Go 程序来从集群中获取 pod 日志。我正在使用 AKS kubernetes 集群。如何访问脚本中的 kubeconfig 文件?以下是我的代码:package mainimport (    "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())        }
查看完整描述

2 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

从这里的示例中,代码应如下所示。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/config


az aks get-credentials --resource-group myResourceGroup --name myAKSCluster


查看完整回答
反对 回复 2022-06-27
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

我注意到的第一件事是你没有提到你是如何开始你的程序的。

查看我看到的代码,您正在创建一个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 库的示例。

例如,看一下这个官方示例,并注意客户端是如何配置的。


查看完整回答
反对 回复 2022-06-27
  • 2 回答
  • 0 关注
  • 218 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号