
云原生容器编排DevOps【免费下载链接】eksctlThe official CLI for Amazon EKS项目地址https://gitcode.com/gh_mirrors/ek/eksctl点击查看免费下载eksctl v0.141.0 是一个聚焦稳定性的小版本发布主要包含两项改动一是强制 kubeconfig 中aws eks get-token认证插件的输出格式为 JSONPR #6554从源头消除因 AWS CLI 默认表格输出导致的 kubectl 认证失败问题二是修正 NAT Gateway 配置可选值文档中的拼写错误PR #6569。本文将结合仓库源码逐一解析这两个改动的技术背景、实现细节与对日常使用的影响帮助你理解 eksctl 生成的 kubeconfig 认证链路以及 VPC 网络配置的 NAT 选项语义。版本概览类别内容关联 PR Bug Fixes强制 kubeconfig get-token 输出格式为 json#6554 Documentation修正 NAT Gateway 配置值选项的拼写错误#6569改动集中在 kubeconfig 生成与 VPC 网络配置两块均与集群创建后的客户端认证、网络拓扑选择直接相关不涉及新的功能特性或破坏性变更。核心修复一kubeconfig 中 get-token 输出格式强制为 JSON问题背景exec 认证插件与输出格式kubectl 连接 EKS 集群时并不会直接使用明文 Token而是通过 kubeconfig 中的users[].user.exec配置exec credential plugin 机制在每次 API 请求前调用外部命令换取短期凭证。eksctl 支持两种认证器aws-iam-authenticator较早期的认证器命令形式为token -i cluster-nameaws即 AWS CLI 的aws eks get-token官方推荐的现代方案。从 kubeconfig 常量定义 可以看到两者的命令名与 API 版本阈值AWSIAMAuthenticator aws-iam-authenticator AWSEKSAuthenticator aws // aws-iam-authenticator 使用 v1beta1 的最低版本 AWSIAMAuthenticatorMinimumBetaVersion 0.5.3 // aws-cli v1 使用 v1beta1 的最低版本 AWSCLIv1MinimumBetaVersion 1.23.9 // aws-cli v2 使用 v1beta1 的最低版本 AWSCLIv2MinimumBetaVersion 2.6.3 alphaAPIVersion client.authentication.k8s.io/v1alpha1 betaAPIVersion client.authentication.k8s.io/v1beta1认证插件协议要求命令输出必须是结构化 JSON包含apiVersion、kind、status.token等字段。AWS CLI 的eks get-token虽然默认即输出 JSON但在某些场景下如用户 shell 配置了--output别名、AWS 配置文件设置了cli_output_format或 CLI 版本行为差异可能产生非 JSON 输出导致 kubectl 解析失败。v0.141.0 修复的核心就是让 eksctl 在生成 kubeconfig 时显式地在命令参数中追加--output json不再依赖默认行为。实现细节显式注入 --output json在 pkg/utils/kubeconfig/kubeconfig.go 的AppendAuthenticator函数中当探测到系统使用 AWS CLI 认证器时构造的命令参数为case AWSEKSAuthenticator: // 若 aws-cli v1 1.23.9 或 v2 2.6.3APIVersion 提升为 v1beta1 if awsCLIIsBetaVersion, err : awsCliIsAboveVersion(); err ! nil { logger.Warning(failed to determine authenticator version, leaving API version as default v1alpha1: %v, err) } else if awsCLIIsBetaVersion { execConfig.APIVersion betaAPIVersion } args []string{eks, get-token, --output, json, --cluster-name, cluster.ID()} roleARNFlag --role-arn if meta.Region ! { args append(args, --region, meta.Region) }关键点在于args中固定写入了--output json即实际下发的命令为aws eks get-token --output json --cluster-name cluster-name [--region region] [--role-arn roleARN]随后execConfig还会被补充AWS_STS_REGIONAL_ENDPOINTSregional环境变量强制 STS 使用区域端点降低跨区域调用延迟与失败率并在指定了--profile时追加AWS_PROFILE最终写入 kubeconfig 的AuthInfos[CurrentContext]pkg/utils/kubeconfig/kubeconfig.go。认证器选择与版本兼容逻辑eksctl 在 lookupAuthenticator 中通过exec.LookPath依次探测 PATH 中可用的认证器NewForKubectl会优先选用探测到的命令找不到时回退到aws-iam-authenticatorauthenticator, found : lookupAuthenticator() if !found { // fall back to aws-iam-authenticator authenticator AWSIAMAuthenticator }APIVersion 的选择同样精细默认使用v1alpha1但当 AWS CLI 版本达到 v1.23.9 / v2.6.3或 aws-iam-authenticator 达到 0.5.3时升级为v1beta1若仍为v1alpha1还会探测本机 kubectl 版本一旦发现 kubectl ≥ 1.24.0该版本已彻底移除 v1alpha1 支持则尽力切换到 v1beta1pkg/utils/kubeconfig/kubeconfig.go。这套版本探测逻辑意味着修复后的 kubeconfig 兼容不同版本的 AWS CLI 与 kubectl无需用户手动调整。测试验证client_test.go 中的单元测试直接断言了生成的 exec 参数case aws: expectedArgs eks get-token --output json --cluster-name auth-test-cluster --region eu-west-3 roleARNArg --role-arn ... Expect(strings.Join(k.AuthInfos[ctx].Exec.Args, )).To(Equal(expectedArgs))即生成的 kubeconfig 中 exec 参数必须精确等于eks get-token --output json --cluster-name name --region region--output json成为受测试保护的强制约定防止后续改动回退。对用户的实际影响升级到 v0.141.0 后重新执行eksctl utils write-kubeconfig --cluster name或创建/更新集群时自动写入的 kubeconfig生成的 exec 命令将显式携带--output json即使本地 AWS CLI 配置了非 JSON 的默认输出格式kubectl 的认证请求也能稳定拿到结构化 Token消除偶发的exec: json: cannot unmarshal ...类报错使用aws-iam-authenticator的用户不受影响其命令参数token -i cluster-name保持不变。核心修复二NAT Gateway 配置值文档拼写修正改动内容第二个修复是针对 VPC 网络配置文档中 NAT Gateway 可选值的拼写错误PR #6569。此前 vpc-configuration.md 中 NAT 相关文档对取值描述存在笔误本次修正后与源码常量保持一致。NAT 网关三种模式的真实定义NAT Gateway 的可选值定义在 pkg/apis/eksctl.io/v1alpha5/vpc.goconst ( // ClusterHighlyAvailableNAT 在 VPC 的每个可用区部署一个 NAT 网关 ClusterHighlyAvailableNAT HighlyAvailable // ClusterSingleNAT 部署单个 NAT 网关 ClusterSingleNAT Single // ClusterDisableNAT 禁用 NAT ClusterDisableNAT Disable // (默认值) ClusterNATDefault ClusterSingleNAT )对应 ClusterConfig 中的配置写法为vpc: nat: gateway: HighlyAvailable # 其他选项: Disable, Single (默认)完整可运行的示例见 examples/09-nat-gateways.yamlapiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: cluster-9 region: eu-west-1 vpc: nat: gateway: HighlyAvailable # other options: Disable, Single (default) nodeGroups: - name: ng-1 instanceType: m5.xlarge desiredCapacity: 2 privateNetworking: true # 如果只给定了 Private 子网此项必须开启三种模式的语义Single默认在整个 VPC 中只创建一个 NAT 网关部署在第一个可用区的公网子网所有私有子网的默认路由都指向它。成本最低但存在单点故障风险HighlyAvailable在每个可用区的公网子网中各部署一个 NAT 网关即使某个 AZ 宕机其他 AZ 中的节点仍可正常访问互联网Disable不创建任何 NAT 网关适合完全私有、通过 VPC 端点如 S3、ECR、API 端点出网的集群。底层实现三种模式如何映射为 CloudFormation 资源NAT 网关模式的分发逻辑在 pkg/cfn/builder/vpc_ipv4.go 的addNATGateways函数中func (v *IPv4VPCResourceSet) addNATGateways() error { switch *v.clusterConfig.VPC.NAT.Gateway { case api.ClusterHighlyAvailableNAT: v.haNAT() case api.ClusterSingleNAT: v.singleNAT() case api.ClusterDisableNAT: // Nothing to do default: return fmt.Errorf(%s is not a valid NAT gateway mode, *v.clusterConfig.VPC.NAT.Gateway) } return nil }haNAT()vpc_ipv4.go遍历所有公网子网为每个子网生成一对 EIPNATIPAZ NAT 网关NATGatewayAZ并为每个私有子网创建指向对应网关的路由表与0.0.0.0/0路由singleNAT()vpc_ipv4.go只创建一个 EIP 与一个 NAT 网关放在排序后第一个可用区的公网子网所有私有子网的路由统一指向该网关Disable分支不做任何资源生成。这些资源随后通过 goformation 构建为 CloudFormation 模板对应模板中的NATGateway、NATIP、NATPrivateSubnetRoute等逻辑资源并在创建集群时一并下发。使用限制务必注意仅创建时生效NAT 模式只在集群创建阶段被消费集群创建后的 update 流程不会触碰 NAT 网关配置见 vpc-configuration.md 的明确说明IPv6 集群不支持 NAT 配置校验逻辑 validation.go 中ipv6模式下设置vpc.nat会直接报错Local Zones 不支持HighlyAvailablevalidation.go 会拒绝HighlyAvailableNAT 与 localZones 的组合私有子网节点需配合 NAT节点若要访问公网如拉取镜像、连接 API Server必须依赖 NAT 网关或对应的 VPC 端点配置时需结合实际出网需求选择模式。小结v0.141.0 的两个改动虽小但都切中实际使用痛点--output json的强制化让 eksctl 生成的 kubeconfig 对 AWS CLI 输出配置更鲁棒属于面向认证稳定性的防御性修复并有单元测试长期守护NAT Gateway 文档取值修正让配置语义与源码常量Single/HighlyAvailable/Disable保持一致降低误配置风险。对升级用户的建议创建新集群后直接使用 eksctl 生成的 kubeconfig 即可自动获得修复对存量集群可重新执行eksctl utils write-kubeconfig刷新 kubeconfig 以立即生效。赞分享云原生容器编排DevOps【免费下载链接】eksctlThe official CLI for Amazon EKS项目地址https://gitcode.com/gh_mirrors/ek/eksctl点击查看免费下载相关推荐eksctl 0.1.38 新特性解析kubelet 自定义配置与配置文件模式输出增强eksctl 0.1.38 新特性解析kubelet 自定义配置与配置文件模式输出增强 版本背景 本文基于 eksctl 官方仓库 docs/release云原生容器编排DevOpsMediaCrawler 完全指南一条任务线跑通 7 平台自媒体数据采集MediaCrawler 完全指南一条任务线跑通 7 平台自媒体数据采集 你想长期盯住某款产品在小红书、抖音上的讨论或定期导出某个账号下的评论做分析手动操网页爬虫数据工程Proxmark3文档自动化Doxygen配置与输出定制Proxmark3文档自动化Doxygen配置与输出定制 还在手动维护Proxmark3的API文档面对庞大的C代码库和复杂的RFID协议实现文档维护已成渗透测试嵌入式物联网网络安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考