无法在 Go 代码中获取 AWS EKS 集群的 kubeconfig

2024-03-18

我已经创建了一个 AWS EKS 集群。为了获取它的 kubeconfig,我通常运行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/ https://aws.amazon.com/premiumsupport/knowledge-center/eks-cluster-connection/

有任何想法吗?


一般流程是这样的:

  1. 描述集群(正如您所做的那样)并提取一些必要的数据
  2. 使用必要的数据,使用以下方法获取令牌AWS-iam-身份验证器 https://github.com/kubernetes-sigs/aws-iam-authenticator's package token
  3. 使用该令牌,在以下命令的帮助下创建 Kubernetes 客户端集客户去 https://github.com/kubernetes/client-go.
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
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 Go 代码中获取 AWS EKS 集群的 kubeconfig 的相关文章

随机推荐

  • Corda 企业节点上的 PostgreSQL 引发关系错误

    在 docker 容器中使用 PostgreSQL 运行 corda enterprise 我已按照文档中的说明进行操作并设置了数据库架构 在数据库启动时 我看到以下错误 任何人都可以帮助那里发生了什么事吗 2018 10 11 06 57
  • ASP.Net MVC5 和 StructureMap4 - 简化方法

    在整合的同时结构图 MVC5 https www nuget org packages StructureMap MVC5 到一个 ASP Net MVC5 Web 应用程序 意识到它使用 3 1 版本的 SM 而不是 4 然后尝试获取此
  • Swift:按下 UITabBarItem 时如何执行操作

    目前我有一个连接到表格视图控制器的选项卡栏控制器 当我按下标签栏项目时 我试图转到表格视图的顶部 我知道如何到达桌面视图的顶部 我只是不知道按下该项目时如何执行操作 你应该使用UITabBarDelegate用方法didSelectItem
  • 如何正确使用 codeigniter 发送电子邮件的方式

    嘿伙计 我正在尝试使用 codeigniter 邮件类函数发送电子邮件 但我发现 smtp 协议有问题 我使用gmail smtp协议 我在本地机器上运行这个 我正在使用 Xampp 1 7 4 包 并且我尝试过如下设置 function
  • .htaccess 将图像从旧文件夹重定向到新文件夹

    我刚刚从 Drupal Wordpress 迁移到完全用 WordPress 构建的网站 我有一组图像 其中文件不再存在 需要尝试将所有图像保留在一个文件夹中 如果可能 我需要发送对任何 gif png jpg 的请求http www do
  • Innosetup 添加多个 exe 文件并在主设置中执行

    我想知道如何添加额外的安装 exe 并使用 innosetup 与我的主 exe 一起执行额外的 exe 请帮助我 因为我在过去 3 天里一直在尝试这个 因为我是 innosetup 的新手 谢谢 最简单的方法是在 Run 部分调用附加的
  • CouchDB 文档更新处理程序(就地更新)

    http wiki apache org couchdb Document Update Handlers http wiki apache org couchdb Document Update Handlers CouchDB 0 10
  • 如何切换不同版本的gem安装?

    我在本地计算机上安装了三个版本的机架 rack 1 4 1 1 3 6 1 3 5 对于某些宝石 例如Cucumber 它需要较低版本rack被激活 我尝试过bundle但也没有什么好处 执行时 cucumber仍将使用激活的机架版本1 4
  • 反汇编Java字节码的Java程序[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我最近正在阅读有关字节码分析的内容 我需要以下查询的帮助 如果我想编写一个反汇编 Java 字节码 通过读取类文件 并打印操作码的 J
  • 如何在 MVC 4 中实现自定义 OpenID 依赖方

    我喜欢新的 MVC OpenID OAuth 登录功能 但我想知道如何添加新的登录按钮 例如我希望我的用户使用他们的 StackExchange 帐户或使用他们的 OpenID url 登录 就像在 stackoverflow 中一样htt
  • Fiddler 重新发行以及作曲家编辑和重新发行

    我在日常生活中使用 Fiddler 然而 对我来说最常用的功能 例如Reissue and Edit and Reissue from composer没有任何捷径 我不知道如何为此使用 fiddler 脚本 有人能指出这个问题的解决方案吗
  • 如何使用 Material ui Reactjs 禁用今天日期中的过去日期?

    我正在使用 React Material ui 创建日期范围选择器 我此功能背后的逻辑是选择所需日期 如果已选择所需日期 则禁用所选日期中的所有过去日期 如何实现这个react材质ui 这是我的代码 import React from re
  • struts 2将属性标签的值分配给隐藏字段

    我想将字段描述中的值分配给隐藏字段测试 但问题是 描述 包含单词序列 并且以下代码仅将第一个单词分配给 测试
  • 何时考虑 Solr

    我正在开发一个应用程序 需要通过搜索来做有趣的事情 包括全文搜索 命中突出显示 分面搜索等 该数据集可能有 3000 10000 条记录 每条记录有 20 30 个字段 并且全部存储在 MySQL 中 该网站的流量概况可能是中小型 所有这些
  • 如何将可绘制图像附加到 Gmail?

    我正在尝试将 gridview 中的图像附加到 gmail 或 facebook 但是每当我尝试附加应用程序时就会崩溃 并且我收到以下带有空指针异常的错误 以下是我使用 gridview 图像选择的代码 有人可以帮忙吗 public cla
  • VSCodium - Python 模块没有绿色语法

    最近 我正在尝试从 VSCode 迁移到 VSCodium 我发现一个问题是VSCodium中没有模块的绿色着色 如下图所示 左 VSCode 具有绿色语法 右 VSCodium 没有绿色语法 我在网上看到一些其他的截图 他们的 VSCod
  • java.time.ZonedDateTime.parse 和 iso8601?

    为什么 JDK8 DateTime 库似乎无法解析有效的 iso8601 日期时间字符串 它因表示为 01 而不是 01 00 的时区偏移而阻塞 这有效 java time ZonedDateTime parse 2015 08 18T00
  • 在 Thymeleaf 方言处理器中访问 HttpServletRequest 和 HttpServletResponse

    我正在尝试创建一个执行 ServletDispatcher include 的 Thymeleaf 方言处理器 我扩展了 AbstractElementTagProcessor 并重写了 doProcess 方法 相关代码片段是 Overr
  • 从中间件调用控制器的操作方法

    我的中间件类位于不同的类库项目中 控制器位于不同的项目中 我正在尝试做的事情是 如果不满足特定条件 则从中间件重定向到自定义控制器 操作方法 但是 我无法使用 Response Redirect 方法来做到这一点 我怎样才能在中间件类中做到
  • 无法在 Go 代码中获取 AWS EKS 集群的 kubeconfig

    我已经创建了一个 AWS EKS 集群 为了获取它的 kubeconfig 我通常运行aws eks update kubeconfig name cluster name region us west 2使用外壳 但是 我现在希望在 Go