如何用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
相关产品推荐
相关产品推荐

