☰
eksctl 0.17.0 发布解析:公网子网默认启用 MapPublicIpOnLaunch、Kubernetes 1.15 成为默认版本与 kubeReserved 默认值机制
2026/10/14 15:20:18 网站建设 项目流程
  • 云原生
  • 容器编排
  • DevOps

【免费下载链接】eksctl

The official CLI for Amazon EKS

项目地址:https://gitcode.com/gh_mirrors/ek/eksctl
点击查看免费下载

本文围绕 eksctl 0.17.0 版本的发布说明(docs/release_notes/0.17.0.md)展开,逐项解析该版本引入的 6 项改进与 1 项缺陷修复:公网子网默认启用MapPublicIpOnLaunch的 IP 映射行为变更、配套的eksctl utils update-legacy-subnet-settings存量集群修复命令、Kubernetes 1.15 成为默认集群版本、kubeletkubeReserved默认值按实例规格自适应,以及客户端 Kubernetes 依赖升级到 1.15.10 等。读完后你将理解这些变更背后的底层实现位置(VPC 构建器、子网校验逻辑、节点引导配置),并能正确处理"用旧版 eksctl 创建的老集群上新增节点组失败"这一典型问题。

0.17.0 版本变更总览

以下是 docs/release_notes/0.17.0.md 中记录的全部变更条目,本文后续各节逐一展开:

分类变更条目对应 PR主题
ImprovementsNew default IP mapping settings for public subnets#2002公网子网默认启用MapPublicIpOnLaunch
ImprovementsAdd documentation about alternative ways to delete clusters#1770补充集群删除的替代方式文档
ImprovementsImprove help of update cluster command#2009改善update cluster命令帮助文本
ImprovementsMake kubernetes 1.15 the default version#1997默认集群版本提升为 1.15
ImprovementsSet kubeReserved defaults according to instance type#1986kubelet 资源预留默认值按实例规格设置
ImprovementsUpgrade kubernetes dependencies to 1.15.10#1964客户端 Kubernetes 依赖升级
Bug FixesFix code generation path issues#2007修复代码生成路径问题

该版本由 Weaveworks 发布,发布说明中致谢了 @rndstr、@sayboras、@sean-abbott 三位贡献者。

核心变更一:公网子网默认 IP 映射行为(PR #2002)

变更内容

0.17.0 起,eksctl 新建集群时的默认 IP 映射行为发生了两处联动调整(官方文档 userdocs/src/usage/vpc-networking.md 中有明确标注,"Fromeksctlversion0.17.0and onwards"):

  1. 公网子网默认启用MapPublicIpOnLaunch:实例在该子网中启动时自动获得公网 IP,这是节点访问互联网(下载基础组件如 CNI 插件、kube-proxy 镜像等)的前提;
  2. 节点组 Auto Scaling Group 的AssociatePublicIpAddress属性默认禁用:不再在 ASG 层面为实例单独叠加公网 IP,改为统一由子网属性决定。

这个设计的意义在于把"节点能否拿到公网 IP"的控制权收敛到子网属性这一个地方:旧版本中 ASG 的AssociatePublicIpAddress=true可以掩盖子网缺少MapPublicIpOnLaunch的问题;新版本移除这层冗余后,在旧版本 eksctl 创建的存量集群上新建节点组时,其公网子网必须显式启用MapPublicIpOnLaunch,否则新节点无法联网、无法下载基础组件,也就无法加入集群。

源码印证

在当前仓库中,公网子网的这一默认行为由 VPC 的 CloudFormation 构建器实现。pkg/cfn/builder/vpc_ipv4.go 在构建 IPv4 子网资源时,按子网拓扑分别处理:

  • 私有子网(api.SubnetTopologyPrivate):关联私有路由表,打上kubernetes.io/role/internal-elb=1标签;
  • 公网子网(api.SubnetTopologyPublic):打上kubernetes.io/role/elb=1标签,并设置subnet.MapPublicIpOnLaunch = gfnt.True()(见 pkg/cfn/builder/vpc_ipv4.go)。

因此凡是由 0.17.0 及以后版本创建的集群,其公网子网在 CloudFormation 模板中天然带有该属性;只有更早版本创建的集群(其子网是裸的、不带该属性)才会踩到后文所述的校验失败问题。

存量集群修复:eksctl utils update-legacy-subnet-settings

问题场景

假设你的集群是用 0.17.0 之前的 eksctl 创建的,现在升级到新版本后要执行eksctl create nodegroup。新版本会在创建前校验目标公网子网的MapPublicIpOnLaunch,而旧集群子网没有该属性,命令会直接失败并提示修复方法。这段校验逻辑位于 pkg/vpc/vpc.go:

  • 校验发现公网子网未启用MapPublicIpOnLaunch时,如果集群启用了私有端点访问(HasPrivateEndpointAccess),节点仍可能通过 VPC 内端点连接控制平面,因此只输出警告、不阻断;
  • 否则输出 Critical 错误并中止,提示:"subnets for one or more new nodegroups don't meet requirements. To fix this, please runeksctl utils update-legacy-subnet-settings --cluster <name>"。

命令说明与实现

修复方式就是运行该版本新引入的工具命令:

eksctl utils update-legacy-subnet-settings --cluster <cluster-name>

命令的实现位于 pkg/ctl/utils/update_legacy_subnet_settings.go,其自述为:

"Update the configuration of the cluster's public subnets with MapPublicIpOnLaunch enabled. MapPublicIpOnLaunch is a new property for subnets that is required for creating new nodegroups in them"

即"更新集群公网子网的配置,启用MapPublicIpOnLaunch;该属性是这些子网中创建新节点组所必需的"。从源码结构看,其执行流程为:

  1. 通过cmdutils.NewMetadataLoader加载集群元数据(支持--config-file与位置参数/--cluster二选一传集群名,两者同时给出会报冲突错误);
  2. NewProviderForExistingCluster获取存量集群 Provider,stackManager.DescribeClusterStack读取集群 CloudFormation 栈;
  3. ctl.LoadClusterVPC载入 VPC 配置,确定子网清单;
  4. stackManager.EnsureMapPublicIPOnLaunchEnabled(ctx)对该集群全部公网子网批量开启MapPublicIpOnLaunch(EC2 侧的修改由 pkg/vpc/vpc.go 中定义的EnsureMapPublicIPOnLaunchEnabled完成);
  5. 成功后打印 "public subnets up to date"。

命令支持的常用 flag 包括--region、--wait-timeout、--config-file及通用 AWS 凭证 flag,见 pkg/ctl/utils/update_legacy_subnet_settings.go。

兼容性回归测试

该修复路径同样被纳入集成测试的回归清单:integration/tests/backwards_compat/backwards_compatibility_test.go 的兼容性命令列表中明确包含"update-legacy-subnet-settings",确保后续大版本演进不会破坏这条对存量用户的修复链路。官方用户文档 userdocs/src/usage/vpc-networking.md 也以 "important" 醒目标注了上述行为变更与修复命令,可视为这一迁移场景的权威说明。

默认集群版本提升为 Kubernetes 1.15(PR #1997)

0.17.0 将eksctl create cluster在未显式指定metadata.version时使用的默认版本提升为 Kubernetes 1.15。版本常量定义在 pkg/apis/eksctl.io/v1alpha5/types.go:

const ( Version1_10 = "1.10" ... Version1_15 = "1.15" ... )

需要说明适用前提:上述版本清单是配置 API 层面的版本常量;当前仓库 HEAD 处的DefaultVersion已随后续版本演进指向更新的大版本,因此"1.15 是默认版本"这一事实仅适用于 0.17.0 及其相邻时代的发行版,在现行版本上运行create cluster得到的默认版本会更高。如果你需要复现 0.17.0 的行为,最稳妥的方式是在配置文件中显式声明:

apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: us-west-2 version: "1.15"

kubeletkubeReserved默认值按实例规格设置(PR #1986)

背景与动机

Kubernetes 最佳实践建议在 kubelet 上预留系统资源(kubeReserved、systemReserved)并配置驱逐阈值:在资源耗尽时,如果 kubelet 自身被挤占,可能无法驱逐 Pod、最终导致节点NotReady。0.17.0 之前的 eksctl 写入节点的kubelet.yaml使用固定的一组预留值;从 0.17.0 起(PR #1986),kubeReserved的默认值会根据节点使用的 EC2 实例规格动态计算,避免"小规格机器预留过多、大规格机器预留不足"的偏差。官方用户文档 userdocs/src/usage/customizing-the-kubelet.md 描述了对应行为:

"values specified in the config file for the fields inkubeletExtraConfigwill completely overwrite the default values specified by eksctl. However, omitting one or morekubeReservedparameters will cause the missing parameters to be defaulted to sane values based on the aws instance type being used."

用户侧覆盖方式

要修改/覆盖这些默认值,在 ClusterConfig 的节点组中使用自由格式的kubeletExtraConfig字段,其内容会被嵌入节点上的kubelet.yaml:

apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: dev-cluster-1 region: eu-north-1 nodeGroups: - name: ng-1 instanceType: m5a.xlarge desiredCapacity: 1 kubeletExtraConfig: kubeReserved: cpu: "300m" memory: "300Mi" ephemeral-storage: "1Gi" kubeReservedCgroup: "/kube-reserved" systemReserved: cpu: "300m" memory: "300Mi" ephemeral-storage: "1Gi" evictionHard: memory.available: "200Mi" nodefs.available: "10%" featureGates: RotateKubeletServerCertificate: true # has to be enabled, otherwise it will be disabled

几个注意点(均来自 userdocs/src/usage/customizing-the-kubelet.md):

  • 配置文件中显式给出的kubeletExtraConfig字段整体覆盖eksctl 的默认值,而非逐项合并;
  • address、clusterDomain、authentication、authorization、serverTLSBootstrap等字段由 eksctl 固定设置,不可被覆盖;
  • 默认启用featureGates.RotateKubeletServerCertificate=true,但一旦你自定义了featureGates,该默认项会被取消,需要手动补回;
  • 对于混合实例规格的节点组,后续版本(0.24.0,见 docs/release_notes/0.24.0.md)进一步规定kubeReserved按InstanceDistribution.InstanceTypes中最小的实例规格计算,防止在小实例上预留过多资源。

从源码结构看,这些 kubelet 配置最终经由节点引导(node bootstrap)链路下发到节点:CloudFormation 模板把 kubelet 配置、kubeconfig、CA 证书等作为userData写入节点,相关设计说明见 docs/current-001-node_bootstrap.md(该设计文档标注自 0.47.0 起被 pkg/nodebootstrap/README.md 取代,仅作历史参考)。

客户端 Kubernetes 依赖升级到 1.15.10(PR #1964)

这一项升级的是 eksctl 仓库内部引用的 Kubernetes 客户端/库代码(如k8s.io/client-go等 Go 依赖)到 1.15.10 patch 版本,与集群控制平面的版本无关,主要带来 bug 修复与安全补丁收益。适用前提说明:该结论基于发布说明条目本身;仓库现阶段的go.mod中 Kubernetes 依赖已随后续版本大幅演进,无法直接印证当时的具体依赖版本。

其余改进与修复

  • 集群删除替代方式文档(PR #1770):新增文档说明除eksctl delete cluster之外删除/清理集群资源的替代途径。当前文档体系中对应的操作参考 userdocs/src/usage/creating-and-managing-clusters.md(eksctl delete cluster -f cluster.yaml、--wait、--disable-nodegroup-eviction等 flag 的说明)。
  • update cluster命令帮助文本改善(PR #2009):优化该命令的--help输出,帮助用户理解集群控制平面升级操作。注意在现行版本中update cluster已被标记为弃用并指向upgrade cluster(见 pkg/ctl/update/cluster.go:"DEPRECATED: use 'upgrade cluster' instead")。
  • 修复代码生成路径问题(PR #2007,Bug Fix):修正生成代码时的路径问题,属于工具链/构建层面的缺陷修复。

小结

0.17.0 是一个以"网络默认行为 + 版本基线 + 节点资源预留"三条主线演进的小版本:

  1. 公网子网默认启用MapPublicIpOnLaunch并简化 ASG 的公网 IP 叠加逻辑(pkg/cfn/builder/vpc_ipv4.go),同时提供eksctl utils update-legacy-subnet-settings修复存量集群(pkg/ctl/utils/update_legacy_subnet_settings.go),该修复路径至今仍被兼容性集成测试覆盖;
  2. 默认集群版本基线提升到 Kubernetes 1.15,客户端 Kubernetes 依赖同步升级到 1.15.10;
  3. kubelet 的kubeReserved默认值改为按实例规格自适应计算,并保留通过kubeletExtraConfig完整覆盖的能力。

对于使用 0.17.0 时代代码库的读者,建议在升级后重点验证两件事:存量集群新增节点组前运行一次update-legacy-subnet-settings;以及确认自己的kubeletExtraConfig配置在"显式字段整体覆盖默认值"语义下是否符合预期。

  • 云原生
  • 容器编排
  • DevOps

【免费下载链接】eksctl

The official CLI for Amazon EKS

项目地址:https://gitcode.com/gh_mirrors/ek/eksctl
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询