gpt4 book ai didi

amazon-web-services - 无法在Go代码中获取AWS EKS集群的kubeconfig

转载 作者:行者123 更新时间:2023-12-03 13:47:34 32 4
gpt4 key购买 nike

我已经创建了一个AWS EKS集群。为了获得其kubeconfig,我通常使用 shell 程序运行aws eks update-kubeconfig --name cluster-name --region us-west-2

但是,我现在希望在Go中获得kubeconfig,而不必在 shell 中运行任何程序(目标是在Go测试中创建然后操作EKS集群)。我可以使用以下代码描述EKS集群:

package main

import (
"fmt"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/eks"
)

func main() {
sess := session.Must(session.NewSession(&aws.Config{
Region: aws.String("us-west-2"),
}))
eksSvc := eks.New(sess, aws.NewConfig().WithRegion("us-west-2"))


clusterOutput, err := eksSvc.DescribeCluster(&eks.DescribeClusterInput{
Name: aws.String("cluster-name"),
})
if err != nil {
panic(err)
}
fmt.Printf("%#v\n", clusterOutput)
}

之后,我目前不知道如何获取该集群的kubeconfig,然后将其与Kubernetes的Go客户端一起使用,而不必分别使用 aws eks

到目前为止,我没有检查过AWS文档,AWS CLI代码库和 eksctl代码库。与EKS群集的连接仅在此网页中记录,并且使用 shell 程序: https://aws.amazon.com/premiumsupport/knowledge-center/eks-cluster-connection/

有任何想法吗?

最佳答案

一般流程如下所示:

  • DescribeCluster(已完成)并提取一些必要的数据
  • 使用必要的数据,使用aws-iam-authenticatorpackage token
  • 获取 token
  • 使用该 token ,在client-go的帮助下创建一个Kubernetes客户端集。

  • package main

    import (
    "encoding/base64"
    "log"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"

    "github.com/aws/aws-sdk-go/service/eks"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"

    "sigs.k8s.io/aws-iam-authenticator/pkg/token"
    )

    func newClientset(cluster *eks.Cluster) (*kubernetes.Clientset, error) {
    log.Printf("%+v", cluster)
    gen, err := token.NewGenerator(true, false)
    if err != nil {
    return nil, err
    }
    opts := &token.GetTokenOptions{
    ClusterID: aws.StringValue(cluster.Name),
    }
    tok, err := gen.GetWithOptions(opts)
    if err != nil {
    return nil, err
    }
    ca, err := base64.StdEncoding.DecodeString(aws.StringValue(cluster.CertificateAuthority.Data))
    if err != nil {
    return nil, err
    }
    clientset, err := kubernetes.NewForConfig(
    &rest.Config{
    Host: aws.StringValue(cluster.Endpoint),
    BearerToken: tok.Token,
    TLSClientConfig: rest.TLSClientConfig{
    CAData: ca,
    },
    },
    )
    if err != nil {
    return nil, err
    }
    return clientset, nil
    }

    func main() {
    name := "wonderful-outfit-1583362361"
    region := "us-east-2"
    sess := session.Must(session.NewSession(&aws.Config{
    Region: aws.String(region),
    }))
    eksSvc := eks.New(sess)

    input := &eks.DescribeClusterInput{
    Name: aws.String(name),
    }
    result, err := eksSvc.DescribeCluster(input)
    if err != nil {
    log.Fatalf("Error calling DescribeCluster: %v", err)
    }
    clientset, err := newClientset(result.Cluster)
    if err != nil {
    log.Fatalf("Error creating clientset: %v", err)
    }
    nodes, err := clientset.CoreV1().Nodes().List(metav1.ListOptions{})
    if err != nil {
    log.Fatalf("Error getting EKS nodes: %v", err)
    }
    log.Printf("There are %d nodes associated with cluster %s", len(nodes.Items), name)
    }

    这是我的go.mod版本:
    module github.com/swoldemi/sandbox

    go 1.14

    require (
    github.com/aws/aws-sdk-go v1.29.19
    k8s.io/apimachinery v0.0.0-20190612125636-6a5db36e93ad
    k8s.io/client-go v0.0.0-20190425172711-65184652c889
    sigs.k8s.io/aws-iam-authenticator v0.5.0
    )

    关于amazon-web-services - 无法在Go代码中获取AWS EKS集群的kubeconfig,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60547409/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com