eksctl 0.80.0 版本解析:utils 命令拥抱 ClusterConfig、端点访问控制迁入 CloudFormation 与 IPv6 配置修复 云原生容器编排DevOps【免费下载链接】eksctlThe official CLI for Amazon EKS项目地址https://gitcode.com/gh_mirrors/ek/eksctl点击查看免费下载导读本文围绕 eksctl 0.80.0 版本的发布说明docs/release_notes/0.80.0.md深入解析该版本的三类核心变更eksctl utils describe-stacks、update-legacy-subnet-settings、write-kubeconfig三个工具命令正式支持通过 ClusterConfig 文件驱动集群端点访问控制publicAccessCIDRs、私有/公开端点从创建后的二次 API 调用迁移到 CloudFormation 模板一次性配置以及围绕 IPv6 集群的多项配置修复。读完本文你将掌握这些命令在 0.80.0 之后的标准用法、ClusterConfig 相关字段的完整语义以及源码层面的实现原理。一、版本概览0.80.0 的核心主题0.80.0 是 eksctl 发布周期中的一个务实版本改动集中在配置一致性与模板化治理两条线上配置一致性三个常用的utils子命令此前只能通过--cluster、--region等命令行参数定位目标集群0.80.0 让它们支持--config-file使集群元数据名称、区域、版本等统一由 ClusterConfig 文件声明避免命令行拼错与脚本化调用中的重复参数维护模板化治理集群端点访问控制clusterEndpoints、publicAccessCIDRs此前由 eksctl 在 CloudFormation 栈创建后再调用 AWS API 二次更新0.80.0 改为在建栈模板中直接声明ResourcesVpcConfig让集群长什么样一步到位IPv6 收尾修复包括配置文件中的ipFamily大小写不敏感、移除 IPv6 集群中无意义的 NAT64/DNS64 配置、修正 IPv6 示例的前缀问题。二、utils 命令拥抱 ClusterConfig 文件2.1 三个命令的演进背景在 0.80.0 之前以下命令只能通过命令行标志指定集群命令功能新增能力eksctl utils describe-stacks描述指定集群的 CloudFormation 栈支持--config-filePR #4597eksctl utils update-legacy-subnet-settings为集群公共子网开启MapPublicIpOnLaunch支持--config-filePR #4598eksctl utils write-kubeconfig为指定集群写入 kubeconfig 文件支持--config-filePR #4599三个命令的实现都遵循同一模式在命令初始化时通过api.NewClusterConfig()创建默认配置然后注册AddConfigFileFlag(fs, cmd.ClusterConfigFile)见 pkg/ctl/utils/describe_stacks.go、pkg/ctl/utils/update_legacy_subnet_settings.go、pkg/ctl/utils/write_kubeconfig.go运行阶段统一调用cmdutils.NewMetadataLoader(cmd).Load()完成配置加载——该 Loader 专门服务于只需要元数据字段的简单操作命令见 pkg/ctl/cmdutils/configfile.go 中的注释。加载完成后代码会做一次显式的冲突检测如果配置文件里已经声明了metadata.name命令行又额外传入了位置参数集群名则直接返回ErrFlagAndArg错误防止两种来源的配置互相覆盖三个命令中均有此逻辑。2.2 典型用法以 write-kubeconfig 为例使用 ClusterConfig 文件后命令可以这样写# 配置文件cluster.yaml中声明 metadata.name / region eksctl utils write-kubeconfig --config-file cluster.yaml这与纯命令行方式等价eksctl utils write-kubeconfig --cluster name --region region从源码看pkg/ctl/utils/write_kubeconfig.go该命令还支持以下与 kubeconfig 输出相关的标志--kubeconfig path指定 kubeconfig 输出路径默认写入~/.kube/config--auto-kubeconfig自动生成形如cluster-name-region.yaml的独立文件路径通过kubeconfig.AutoPath且与--kubeconfig互斥同时指定会报--kubeconfig and --auto-kubeconfig are incompatible flags--set-kubeconfig-context写入后同时将上下文设为当前--authenticator-role-arn指定 AWS IAM Authenticator 使用的角色 ARN用于以特定身份生成凭证。2.3 describe-stacks从元数据到栈内幕describe-stacks在 0.80.0 后可用配置文件定位集群其完整标志集如下pkg/ctl/utils/describe_stacks.go标志说明--all包含已删除DELETE_COMPLETE的栈--events同时输出每个栈的 CloudFormation 事件--resource-status按资源状态过滤事件如CREATE_FAILED、UPDATE_FAILED必须与--eventstrue搭配使用--trail查询并输出该集群相关的 CloudTrail 事件-o, --output结构化输出仅支持json与yaml指定后不能再使用上述展示类标志实现上doDescribeStacksCmd见 pkg/ctl/utils/describe_stacks.go会通过ctl.NewStackManager(cfg).ListStacks(ctx)拉取全部栈并给出一个实用提示如果发现栈数量少于 2会警告就绪集群至少应有 2 个栈cluster 栈 nodegroup 栈。事件过滤逻辑会对resourceStatus与事件状态做大小写归一化后逐一比对方便快速定位失败资源。# 查看某集群所有栈的事件中失败的资源 eksctl utils describe-stacks --config-file cluster.yaml --events --resource-status CREATE_FAILED,UPDATE_FAILED2.4 update-legacy-subnet-settings让旧公共子网具备 IP 自动分配能力该命令解决的是一个具体的历史遗留问题较早期创建的公共子网没有开启MapPublicIpOnLaunch新启动实例自动获得公网 IP导致无法在其中新建节点组。其实现pkg/ctl/utils/update_legacy_subnet_settings.go流程为通过MetadataLoader加载配置或标志确定集群名与区域stackManager.DescribeClusterStack(ctx)定位集群 CloudFormation 栈ctl.LoadClusterVPC(ctx, cfg, stack, true)反查集群 VPC 配置得到公共子网列表调用stackManager.EnsureMapPublicIPOnLaunchEnabled(ctx)为这些公共子网开启MapPublicIpOnLaunch完成后输出public subnets up to date。eksctl utils update-legacy-subnet-settings --config-file cluster.yaml该命令与 VPC 导入逻辑共用同一套子网处理函数见 pkg/vpc/vpc.go从源码结构可以推断它处理的是子网属于 eksctl 创建但属性过时的兼容场景。三、端点访问控制迁入 CloudFormationPR #45263.1 变更本质从事后更新到一次成型0.80.0 之前clusterEndpoints与publicAccessCIDRs是在集群栈创建完成后由 eksctl 再调用一次UpdateClusterConfig类型的 AWS API 来生效的。0.80.0 将其直接固化进 CloudFormation 模板的 EKS Cluster 资源中一次部署即完成全部配置。模板中的对应实现位于 pkg/cfn/builder/cluster.go 的addResourcesForControlPlaneclusterVPC : gfneks.Cluster_ResourcesVpcConfig{ EndpointPublicAccess: gfnt.NewBoolean(*c.spec.VPC.ClusterEndpoints.PublicAccess), EndpointPrivateAccess: gfnt.NewBoolean(*c.spec.VPC.ClusterEndpoints.PrivateAccess), SecurityGroupIds: c.securityGroups, PublicAccessCidrs: gfnt.NewStringSlice(c.spec.VPC.PublicAccessCIDRs...), }也就是说ResourcesVpcConfig中的四个关键属性公开端点、私有端点、控制平面安全组、公网访问 CIDR在模板生成阶段就从spec.VPC提取并写入。这样可以确保集群创建时端点访问配置即生效无需额外的等待与二次 API 调用创建流程中新增的WaitForControlPlane冗余调用被移除PR #4615对应 pkg/eks/api.go 中定义、pkg/eks/client.go 实现的WaitForControlPlane接口其内部通过对ServerVersion的连续成功探测来判断控制平面就绪。3.2 ClusterConfig 中对应的配置字段相关字段定义在 pkg/apis/eksctl.io/v1alpha5/vpc.go 与同文件中的ClusterEndpoints结构体第 237-241 行vpc: clusterEndpoints: privateAccess: true # 是否允许 VPC 内私有访问 publicAccess: false # 是否允许公网访问 publicAccessCIDRs: - 1.2.3.4/32 # 允许访问公网 K8s API 端点的 CIDR 列表字段说明字段类型语义vpc.clusterEndpoints.privateAccessbool私有端点访问仅 VPC 内可达vpc.clusterEndpoints.publicAccessbool公开端点访问vpc.publicAccessCIDRs[]string白名单 CIDREKS 用它为公开端点创建安全组规则校验层面pkg/apis/eksctl.io/v1alpha5/validation.go会通过validateCIDRs对publicAccessCIDRs逐一做 CIDR 合法性校验非法输入直接报错对应测试见 pkg/apis/eksctl.io/v1alpha5/validation_test.go。3.3 与之配套的运行时命令尽管创建时已模板化运行中对既有集群的端点调整仍然保留了两个工具命令注意源码中均标注为 deprecated统一指向update-cluster-vpc-configeksctl utils update-cluster-vpc-config统一入口支持--public-access、--private-access、--public-access-cidrs、--control-plane-subnet-ids、--control-plane-security-group-ids等标志见 pkg/ctl/utils/update_cluster_vpc_config.goeksctl utils update-cluster-endpoints仅调整端点开关已被前者取代见 pkg/ctl/utils/update_cluster_endpoint_access.goeksctl utils set-public-access-cidrs仅调整 CIDR同样被取代见 pkg/ctl/utils/set_public_access_cidrs.go。此外当创建完全私有集群时创建逻辑会自动把publicAccess置为 false 并调用端点更新见 pkg/ctl/create/cluster.go。3.4 对 publicAccessCIDRs 的访问警告发布说明同时提到 Add warning to cluster access about publicAccessCIDRsPR #4576。从代码结构看这一警告的语境是当用户通过publicAccessCIDRs收紧或扩展公网 API 端点的访问范围时eksctl 会在创建/更新流程中提示该配置对集群可访问性的直接影响——尤其是当配置的白名单过窄时kubectl等客户端可能因此无法连接集群。实践中建议将 CI 或办公网出口 IP 明确加入白名单并在变更后立即验证连通性。四、IPv6 集群修复集0.80.0 对 IPv6 配置做了三处收尾均与配置文件的易用性、正确性直接相关4.1ipFamily大小写不敏感PR #4619此前配置文件中的ipFamily是大小写敏感的ipv6、IPv6、IPV6等写法可能导致校验失败。0.80.0 起该字段在配置加载与校验阶段统一按大小写不敏感处理。源码中的双重佐证类型定义与默认值pkg/apis/eksctl.io/v1alpha5/types.goIPV4Family IPv4、IPV6Family IPv6默认DefaultIPFamily IPV4Family校验逻辑pkg/apis/eksctl.io/v1alpha5/validation.gostrings.ToLower(c.KubernetesNetworkConfig.IPFamily)后与ipv4/ipv6比对非法值报invalid value %q for ipFamily; allowed are IPv4 and IPv6辅助方法func (k *KubernetesNetworkConfig) IPv6Enabled() bool同样使用strings.EqualFold见 pkg/apis/eksctl.io/v1alpha5/types.go。对应测试覆盖了iPv6这类混合大小写写法也能通过校验见 pkg/apis/eksctl.io/v1alpha5/validation_test.go。4.2 移除 IPv6 集群的 NAT64/DNS64PR #4618IPv6 集群的子网不需要 NAT64/DNS64 这类为纯 IPv6 访问 IPv4 资源设计的转换机制。0.80.0 移除了 IPv6 子网模板中的相关设置。从模板代码看CloudFormation 的AWS::EC2::Subnet属性集中仍保留EnableDns64等字段的定义见 pkg/goformation/cloudformation/ec2/aws-ec2-subnet.go 与 pkg/goformation/schema/cloudformation.go 的 schema 声明但 IPv6 集群构建路径不再写入这些属性避免生成无意义甚至引发配置冲突的子网属性。4.3 修正 IPv6 示例前缀PR #4605示例文件 examples/30-vpc-with-ip-family.yaml 中ipFamily的值此前存在大小写/写法不一致的问题0.80.0 将其统一为合法的IPv6。该示例本身是一个可复制的完整 IPv6 集群配置要点包括apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: cluster-2 region: us-west-2 version: 1.21 kubernetesNetworkConfig: ipFamily: IPv6 # 开启 IPv6 集群 addons: - name: vpc-cni version: latest attachPolicy: # IPv6 模式需要额外的 IAM 权限 Statement: - Effect: Allow Action: - ec2:AssignIpv6Addresses ... - name: coredns - name: kube-proxy iam: withOIDC: true managedNodeGroups: - name: mng-1示例中特别注释了IPv6 集群的vpc-cni需要ec2:AssignIpv6Addresses等权限来为 Pod 分配 IPv6 地址因此通过attachPolicy显式声明。配套的 VPC 级 IPv6 能力autoAllocateIPv6: true可见于 examples/02-custom-vpc-cidr-no-nodes.yaml。从模板构建看pkg/cfn/builder/vpc.goIPv6 子网 CIDR 由Fn::Cidr在 CloudFormation 运行时从 VPC 自动分配的/56IPv6 块中切出若干/64子网getSubnetIPv6CIDRBlock路由相关常量如InternetIPv6CIDR ::/0、PubSubIPv6RouteKey也一并预置说明 eksctl 对 IPv6 网络是一等公民式支持。五、升级建议与验证路径对于使用 0.80.0 及之后版本的用户建议按以下顺序对齐用法脚本迁移若脚本中使用了utils describe-stacks、update-legacy-subnet-settings、write-kubeconfig并手工维护--cluster/--region可将集群元数据收敛到 ClusterConfig 文件用--config-file替换端点配置声明化新建集群时直接在vpc.clusterEndpoints与vpc.publicAccessCIDRs中声明端点策略享受模板一次成型存量集群的调整继续使用utils update-cluster-vpc-configIPv6 配置规范化检查既有配置中的ipFamily写法大小写均可但建议统一为IPv6并参考 examples/30-vpc-with-ip-family.yaml 补齐 vpc-cni 的 IPv6 权限。需要说明的是以上内容以 0.80.0 发布说明为核心骨架实现细节均来自当前仓库源码pkg/ctl/utils、pkg/cfn/builder、pkg/apis/eksctl.io/v1alpha5等若你在更新的 eksctl 版本中观察到行为差异应以对应版本的发布说明与源码为准。参考路径速查发布说明docs/release_notes/0.80.0.mddescribe-stacks 实现pkg/ctl/utils/describe_stacks.goupdate-legacy-subnet-settings 实现pkg/ctl/utils/update_legacy_subnet_settings.gowrite-kubeconfig 实现pkg/ctl/utils/write_kubeconfig.go配置文件加载器pkg/ctl/cmdutils/configfile.go端点访问控制模板生成pkg/cfn/builder/cluster.goVPC 配置字段定义pkg/apis/eksctl.io/v1alpha5/vpc.goIPFamily 类型与默认值pkg/apis/eksctl.io/v1alpha5/types.go配置校验pkg/apis/eksctl.io/v1alpha5/validation.goIPv6 集群示例examples/30-vpc-with-ip-family.yamlIPv6 子网 CIDR 切分pkg/cfn/builder/vpc.go赞分享云原生容器编排DevOps【免费下载链接】eksctlThe official CLI for Amazon EKS项目地址https://gitcode.com/gh_mirrors/ek/eksctl点击查看免费下载相关推荐eksctl 0.8.0 版本解析SSM 参数仓库 AMI 解析与集群 API 端点访问控制实战指南eksctl 0.8.0 版本解析SSM 参数仓库 AMI 解析与集群 API 端点访问控制实战指南 eksctl 0.8.0 是 Amazon EKS 官方云原生容器编排DevOpseksctl 0.79.0 版本解析IPv6 集群支持、GitOps 前置校验与多项可靠性修复eksctl 0.79.0 版本解析IPv6 集群支持、GitOps 前置校验与多项可靠性修复 导读本文以 eksctl 0.79.0 版本发布说明 do云原生容器编排DevOpsHyperf数据迁移革命告别手动SQL拥抱版本控制新范式Hyperf数据迁移革命告别手动SQL拥抱版本控制新范式 还在为数据库结构变更而头疼吗每次上线都要手动执行SQL脚本担心遗漏或冲突Hyperf的数据库后端Web框架微服务RPC框架异步编程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考