集群外.NET程序如何无需AWS CLI生成EKS令牌访问K8s API
在.NET中生成EKS API访问令牌(无需AWS CLI)
核心原理
aws eks get-token本质是通过STS生成GetCallerIdentity操作的预签名URL,再将其封装为Kubernetes认可的JWT格式令牌。我们可以直接在.NET中复现这一逻辑,无需调用AWS CLI。
实现步骤
1. 生成STS预签名URL
使用AWS SDK for .NET的AmazonSTSClient生成GetCallerIdentity的预签名URL,这是令牌的核心验证内容:
using Amazon; using Amazon.SecurityToken; using Amazon.SecurityToken.Model; // 替换为你的EKS集群所在区域 var stsClient = new AmazonSTSClient(RegionEndpoint.GetBySystemName("us-west-2")); var request = new GetCallerIdentityRequest(); // 默认有效期15分钟,和CLI行为一致,如需调整可添加Expires参数 var presignedUrl = stsClient.GetPreSignedURL(request);
2. 构造符合K8s规范的EKS令牌
将预签名URL、集群名称等信息封装为指定格式的JSON,Base64编码后拼接成最终令牌:
using System.Text; using System.Text.Json; var clusterName = "your-eks-cluster-name"; // 替换为你的集群名称 var expiration = DateTime.UtcNow.AddMinutes(15).ToString("yyyy-MM-ddTHH:mm:ssZ"); var tokenContent = JsonSerializer.Serialize(new { presignedUrl = presignedUrl, clusterName = clusterName, expiration = expiration }); var eksToken = $"k8s-aws-v1.{Convert.ToBase64String(Encoding.UTF8.GetBytes(tokenContent))}";
3. 配置Kubernetes .NET客户端
结合EKS集群的API端点、CA证书(通过AWS EKS SDK获取)和生成的令牌,初始化K8s客户端:
using Amazon.EKS; using Amazon.EKS.Model; using k8s; using System.Security.Cryptography.X509Certificates; // 获取集群基础信息 var eksClient = new AmazonEKSClient(RegionEndpoint.GetBySystemName("us-west-2")); var clusterResp = await eksClient.DescribeClusterAsync(new DescribeClusterRequest { Name = clusterName }); var clusterEndpoint = clusterResp.Cluster.Endpoint; var caCertBytes = Convert.FromBase64String(clusterResp.Cluster.CertificateAuthority.Data); var sslCaCert = new X509Certificate2(caCertBytes); // 初始化K8s客户端配置 var k8sConfig = new KubernetesClientConfiguration { Host = clusterEndpoint, AccessToken = eksToken, SslCaCert = sslCaCert }; var kubernetes = new Kubernetes(k8sConfig); // 测试调用示例:获取集群节点列表 var nodes = await kubernetes.ListNodeAsync();
关键注意事项
- 权限配置:运行程序的身份需具备
sts:GetCallerIdentity权限,同时EKS集群的aws-authConfigMap需将该AWS身份映射到对应的Kubernetes角色(如system:masters)。 - 凭证来源:程序会自动通过AWS默认凭证链获取凭证(环境变量、本地凭证文件、IAM角色等),无需硬编码。
- 令牌刷新:令牌有效期为15分钟,过期后需重新生成,建议在API调用前检查有效期或定时刷新。
内容的提问来源于stack exchange,提问作者Steve Rukuts
相关产品推荐
相关产品推荐

