You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Go SDK创建支持自动令牌刷新的AWS EKS Kubernetes客户端

问题描述

我使用下方的newClientset函数创建clientset,向AWS EKS集群的api-server发送请求。参数clusterCAData和clusterEndpoint由调用方通过EKS APIDescribeCluster动态获取,无法从kubeconfig中获取,这是一个需要与api-server通信的集群外应用。该函数运行正常,但无法自动续订/刷新令牌,请问如何修改它以支持自动令牌续订?

原代码:

import (
    "encoding/base64"

    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
    "sigs.k8s.io/aws-iam-authenticator/pkg/token"
)

// newClientset creates kubernetes client.
// FIXME WRITEME TODO XXX Refresh/renew token automatically.
func newClientset(clusterName, clusterCAData, clusterEndpoint string) (*kubernetes.Clientset, error) {

    gen, err := token.NewGenerator(true, false)
    if err != nil {
        return nil, err
    }
    opts := &token.GetTokenOptions{
        ClusterID: clusterName,
    }
    tok, err := gen.GetWithOptions(opts)
    if err != nil {
        return nil, err
    }
    ca, err := base64.StdEncoding.DecodeString(clusterCAData)
    if err != nil {
        return nil, err
    }
    clientset, err := kubernetes.NewForConfig(
        &rest.Config{
            Host: clusterEndpoint,

            // FIXME WRITEME TODO XXX
            //
            // Refresh/renew token automatically.
            BearerToken: tok.Token,

            TLSClientConfig: rest.TLSClientConfig{
                CAData: ca,
            },
        },
    )
    if err != nil {
        return nil, err
    }
    return clientset, nil
}
解决方案

要实现自动令牌续订,无需手动管理令牌生命周期,只需利用rest.Config的BearerTokenProvider字段,将令牌生成逻辑封装为回调函数,客户端会在每次请求API Server前自动调用该函数获取最新令牌。

修改后的代码:

import (
    "encoding/base64"

    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
    "sigs.k8s.io/aws-iam-authenticator/pkg/token"
)

// newClientset creates kubernetes client with automatic token renewal.
func newClientset(clusterName, clusterCAData, clusterEndpoint string) (*kubernetes.Clientset, error) {
    gen, err := token.NewGenerator(true, false)
    if err != nil {
        return nil, err
    }

    ca, err := base64.StdEncoding.DecodeString(clusterCAData)
    if err != nil {
        return nil, err
    }

    config := &rest.Config{
        Host: clusterEndpoint,
        TLSClientConfig: rest.TLSClientConfig{
            CAData: ca,
        },
        // 回调函数会在每次请求前获取最新令牌,实现自动续订
        BearerTokenProvider: func() (string, error) {
            opts := &token.GetTokenOptions{
                ClusterID: clusterName,
            }
            tok, err := gen.GetWithOptions(opts)
            if err != nil {
                return "", err
            }
            return tok.Token, nil
        },
    }

    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        return nil, err
    }
    return clientset, nil
}

说明

  • 移除了一次性生成令牌的逻辑,将令牌获取逻辑移到BearerTokenProvider的回调函数中。
  • 每次客户端发起请求时,都会自动调用该函数获取新的有效令牌(AWS IAM Authenticator生成的令牌默认有效期15分钟),避免令牌过期导致请求失败。
  • 该方案完全适配集群外应用的场景,无需依赖kubeconfig的自动刷新机制。

内容的提问来源于stack exchange,提问作者Everton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:34:57