亚马逊 EKS 现在支持 Kubernetes 版本 1.26

作者:莉亚·塔克 | 2023 年 4 日

简介

亚马逊弹性 Kubernetes 服务( 亚马逊 EKS )团队很高兴地宣布支持亚马逊 EKS 和亚马逊 EKS 发行版的 Kubernetes 1.26 版。 亚马逊 EKS Anywher e (版本 0.15.1)也支持 Kubernetes 1.26。选择此版本的主题是为了表彰该项目所包含的不同组成部分以及为该项目做出贡献的个人。因此,恰当的版本名称是 “Electrifying”。Kubernetes 发布团队在 官方发布公告 中表示,此次发布 “专为所有将个人动作整合到发布流程中使所有这些成为可能的人而设。”要升级您的集群,请参阅 更新亚马逊 EKS 集群 Kubernetes 版本。

Kubernetes v1.26 亮点

这篇文章介绍了 Kubernetes 版本 1.26 中一些值得注意的移除、弃用和增强功能。首先,不容错过新闻以及重定向到2023年3月20日开始的 更快、更便宜、更公开(GA) 注册表的reg istry.k8s.io。请注意,Kubernetes 1.26 镜像已经在 k8s.gcr.io 中可用,它们将继续在那里可用。但是,展望未来,Kubernetes的所有新版本都将仅发布到registry.k8s.io,后者现在是 Kubernetes 图像的首选和唯一来源。请注意,之前位于 k8s.gcr.io 的注册表将不再发布 v1.26 的任何容器镜像标签,因此用户应开始使用 registry.k8s.io 来获取最新的 Kubernetes 镜像。如果你还没有更改到新的注册表,请观看我们的开发者倡导者之一贾斯汀·加里森在 YouTube上发布的这段简短视频 。

注意 Kubernetes 版本 1.26 中的所有弃用和删除内容。以下是最显著的变化列表。 有关完整列表,请参阅 Kubernetes 更改日志。

升级的先决条件

在亚马逊 EKS 中升级到 Kubernetes v1.26 之前,您需要完成一些重要任务。以下部分概述了升级前必须解决的两项关键更改。

  • 虚拟私有云 (VPC) 容器网络接口 (CNI) 插件 。您 必须 将 VPC CNI 插件 版本升级到 1.12 或更高版本。VPC CNI 的早期版本会导致 CNI 崩溃,因为它依赖于 CRI v1Alpha2API,该版本已从 Kubernetes v1.26 中删除。有关在集群中升级 VPC CNI 的分步说明,请参阅 使用适用于 Kubernetes 的亚马逊 VPC CNI 插件 Amazon EK S 插件。
  • 容器运行时。 您 必须 升级到 容器版本 1.6.0 或更高版本。Kubernetes v1.26 取消了对 CRI v1alpha2 的支持,这会导致 kubelet 在容器运行时不支持 CRI v1 时无法注册节点。这会影响 Kubernetes 1.26 不支持的容器次要版本 1.5 及以下版本。同样,其他仅支持 v1alpha2 的容器运行时也必须更新。如果您使用的是 Amazon E KS 优化的 AMI ,请检查它使用的是哪个版本的容器。请注意,自定义 AMI 中包含的容器版本可能会有所不同,某些旧版本可能与 Kubernetes v1.26 不兼容。为了确保兼容性,请升级到最新的 Amazon EKS 优化版 AMI,其中包括容器版本 1.6.19,以避免任何兼容性问题。

注意: 在 EKS 1.26 中,kubelet 中的 亚马逊云科技 特定逻辑已被禁用。如果您在 1.26 之前使用了 EKS 优化的 AMI,则 kubelet 被配置为使用树内云提供商。这是通过将 --cloudprovider=aws 标志传递给 kubelet 的额外参数来配置的 。这触发了 kubelet 调用 EC2 Desc ribeInstance API,后者返回了该实例 的 privatedNsName。 从 1.26 开始,kubelet 默认配置为使用 --cloud-provider=external 或--cloud-provider= “”。 如果您使用自定义 AMI 和/或使用包含自定义域后缀(例如 example.com)的 DHCP 选项集配置 VPC,这可能会导致问题。除非你将 --hostname-override=$private_dns_name 标志传递给 kubelet 的额外参数,否则 kubelet 将使用操作系统的主机名作为节点名称,例如 i-0c9e 5eff964fb6eea.example.com 或 ip-192-168-52.example.com。具有此类名称的节点将无法在集群中注册,因为 aws-iam-authenticator 希望节点的名称始终与节点的 privat edNsName 相匹配。有关此问题的更多信息,请参阅 替换主机名以匹配 EC2 的 privated Ns Name。 最新版本的 EKS 优化版 AMI v20230501 已更新,加入了--hostname-override 标志。 如果您的节点在升级到 1.26 后在加入集群时遇到问题,请验证您使用的是 v20230501 或更高版本。如 检索亚马逊 EKS 优化的亚马逊 Linux AMI ID 中所述,您可以通过查询 Parameter Store 来找到您所在地区最新的 EKS 优化版 AMI 。 基于 awslabs/amazon-eks-ami 上提供的 Packer 脚本构建的自定义 AMI 应使用最新版本 AMI Release v20230501 进行重建。

已停用的 API 版本和功能

如今,当发布新版本的 Kubernetes 时,应用程序编程接口 (API) 版本被删除的情况并不少见。发生这种情况时,在 升级到版本 1. 26 之前,必须将所有清单和控制器更新到本节中列出的较新版本 和功能。

  • apiserver.k8s.io/v1beta1 API 版本 。 在 1.26 中删除的 API 版本中有 flowcontrol.apiserver.k8s.io/v1beta1 API,它在 v1.23 中被标记为已过时。这个 API 版本与 Kubernetes 的 API 优先级和公平性功能有关。如果你使用的是 flowS chema 的 v1beta1 API 版本 和 PriorityLevelConfiguration 资源,请更新你的 Kubernetes 清单和 API 客户端,改用更新的 flow control.apiserver.k8s.io/v1beta2 API 版本。如果你没有修改 API 优先级和公平性的默认设置,那么你可能不会受到删除的影响,也不需要采取任何进一步的措施。如果您不确定是否正在使用已停用的版本,请运行以下命令:
kubectl get flowschema,prioritylevelconfiguration --all-namespaces | grep v1beta1
  • 自动扩展/v 2beta2 API 版本。 在 Kubernetes v1.26 中删除的 API 版本中包括自动扩展/v2beta2 API,它在 v1.23 中被标记为已过时。如果您当前使用的是 Hori zontalP odautoScaler 的自动缩放/v2beta2 API 版本,请更新您的应用程序以改用自动缩放/v2API 版本。如果您不确定是否正在使用已停用的版本,请运行以下命令:
kubectl get hpa --all-namespaces | grep v2beta2
  • 动态 kubelet 配置。 出于稳定性和安全考虑, 在 v1.26 中 删除了 动态 kubelet 配置。以前,此配置允许你通过 Kubernetes API 推出新的 kubelet 配置,方法是指定一个包含 kubelet 应为每个节点使用的配置数据的配置映射。我们建议使用像 Puppet、Chef 或 Ansible 这样的配置管理工具,或者使用 —config 将配置传递给 kubelet 来切换到静态 kubelet 配置。要了解更多信息,请参阅通过配置文件 设置 Kubelet 参数。
  • Bottlerocket cgroupsv1 向 cgroupsv2 迁移 。 Bottlerocket 将在版本 1.26 中从 cgroupsv1 迁移到 cgroupsv2。 此更改将影响在 亚马逊 EKS 集群中使用 Bottlerocket AMI 的用户 ,因为当前的 cgroupsv1 实现将不再是默认选项。取而代之的是,Bottlerocket将使用新的cgroupsv2 cgroupsv2,该版本旨在通过增强对内存、中央处理器 (CPU)、I/O 和网络的控制来解决以前在Linux资源管理方面的限制。这种改进可以更有效地实现资源分配的自动化,并可以更安全地限制 I/O 使用量和其他资源密集型活动。在此方面,Bottlerocket提供了自动更新Bottlerocket实例的工具,以及用于直接控制更新的API。要了解更多信息,请参阅 BottleRocket 文档中的 更新方法 。
  • klog 日志标志 。v1.26 中删除了许多 klog 日志库将 日志记录扩展到事件流上的 klog 标志,以简化日志配置和维护,包括删除 —logtostderr。我们建议更新您的配置文件和脚本以使用其他日志选项。有关已移除的标志的完整列表,请参阅 移除的 klog 标志 。

在 Kubernetes 项目的背景下,弃用某个功能或标志意味着它将被逐步淘汰,并最终在未来的版本中被删除,而且 Kubernetes 版本 1.26 中有很多弃用情况。有关完整列表,请参阅 Kubernetes v 1.26 中的所有弃用和删除内容。

毕业花絮

此版本中有许多很酷的功能即将进入稳定状态,这让我们的技术社区非常兴奋。用他们自己的话说,以下是最受欢迎的标题。

作业跟踪(没有滞留的豆荚)已成为 GA

贾斯汀·加里森 — 亚马逊云科技 高级开发者倡导者

  • #3207 这太棒了,因为当你运行大量作业时,从历史上看,在删除 pod 之后,你会丢失有关任务完成的信息。删除 Pod 很重要,因为它们会消耗节点上的资源(即使未运行),并且会给 API 服务器增加更多负载以进行秘密监视。
  • 此更新允许你删除 Pod,而不会丢失有关作业的数据。这对于使用 亚马逊云科技 Fargate 运行任务的客户来说尤其重要。如果他们在任务完成后不删除 Pod,那么 亚马逊云科技 Fargate 节点不会被移除。这意味着他们仍在为未使用的计算付费。建议使用 垃圾回收功能 , 但从历史上看,这意味着他们无法查询已删除的 Pod 的任务状态。
  • 要了解更多信息,请参阅 支持大规模并行批处理工作负载的 作业跟踪已正式上 线。

GA 对 Kubelet 凭证提供商的支持

贾斯汀·加里森 — 亚马逊云科技 高级开发者倡导者

  • #2133 这有助于简化对各种容器注册表的身份验证,并避免将机密存储为 Kubernetes 资源。这为向注册表进行身份验证时提供了更大的灵活性,并允许在 Kubernetes 资源管理和节点/注册表/安全管理之间进行所有权分离。
  • 要了解更多信息,请参阅 GA 对 Kubelet 凭据提供者的支持 。

CPUManager 上线了

贾斯汀·加里森 — 亚马逊云科技 高级开发者倡导者

  • CPU 管理器让工作负载可以更好地控制其 CPU 和性能要求。这对于可以根据可用性在 CPU 之间调度或移动工作负载的多插槽服务器非常重要。某些工作负载需要严格控制其 CPU 调度,以避免缓存丢失,或者使用主内存获得更高的带宽,并与 NUMA 调度在同一条总线上。
  • 如果在执行期间不将图像渲染等高性能计算 (HPC) 工作负载重新调度到不同的 CPU,则可以更快地运行。
  • 要了解更多信息,请参阅 CPUManager 上线。

在 type=LoadBalancer 的服务中支持混合协议

杰里米·考恩 — 亚马逊云科技 开发者宣传高级经理

  • #1435 此功能允许创建具有不同端口定义和不同协议的负载平衡器服务。 使用 亚马逊云科技 负载均衡器控制器 , 您可以创建暴露传输控制协议 (TCP) 和 用户数据报协议 (UDP) 的服务,前提是这两个端口不同。创建暴露相同端口和协议的服务,例如通过 TCP 和 UDP 打开端口 53 的域名系统 (DNS),目前不起作用。
  • 要了解更多信息,请参阅 混合协议实验室 。

服务内部流量政策

杰里米·考恩 — 亚马逊云科技 开发者宣传高级经理

  • #2086 允许对服务流量进行节点本地和拓扑感知路由。过去,路由到服务的内部流量是随机分配到所有端点的。使用服务内部流量策略,您可以创建始终将流量定向到在同一节点上运行的服务实例的服务。通过将流量保留在节点/可用区 (AZ) 的本地,您可以在提高性能的同时降低跨可用区的网络成本。
  • 要了解更多信息,请参阅 服务内部流量政策 。

这绝不是在 Kubernetes v1.26 中升级为稳定版的最酷功能的详尽列表。有关完整列表,请参阅 “升级 到稳定 版”。

Kubernetes 提示和技巧

我们的技术社区还有其他一些提示和技巧,可以帮助更轻松地升级到 Kubernetes v1.26。

提取所有 kubelet 设置

杰里米·考恩 — 亚马逊云科技 开发者宣传高级经理

  • kubelet 配置可以分布在多个文件中。这是一次提取所有 kubelet 设置的便捷方法。
  • 代理命令启动代理服务器并在后台运行它。后续命令将 shell 变量设置为正在重新配置的节点的名称,然后使用 curl 使用在端口 8001 上运行的代理服务器从 Kubernetes API 服务器获取该节点的 kubelet 配置。然后,输出通过管道传送到 jq,jq 通过设置种类和 APiVersion 来修改配置。然后,更新后的配置可用于更新指定节点的 kubelet 配置。
kubectl proxy --port=8001 &

$ NODE_NAME="the-name-of-the-node-you-are-reconfiguring"; curl -sSL "http://localhost:8001/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig|.kind="KubeletConfiguration"|.apiVersion="kubelet.config.k8s.io/v1beta1"'

支持终止

如果你仍在运行旧版本的 Kubernetes,比如 1.22 和 1.23,那么请考虑升级到支持的新版本之一。 对1.22集群的支持将于2023年6月4日结束,对1.23集群的支持将于2023年10月结束。如果您对亚马逊 EKS 版本支持还有其他疑问,请参阅我们的 常见问题解答 。

结论

在这篇文章中,我介绍了 Kubernetes 版本 1.26 中的主要变化,亚马逊云科技 社区重点介绍了一些令人兴奋的可用功能。请务必查看 Kubernetes v 1.26 发行说明中记录的其他改进。 请注意,如果您当前正在运行 VPC CNI 插件、容器或任何已停用的 API 版本,强烈建议您开始规划迁移。如果您在将集群升级到最新的 Amazon EKS 版本时需要帮助,请参阅 此处 的文档 。

Leah Tucker

Leah Tucker

Leah 是 亚马逊云科技 的资深开源软件作家。她在网络开发、软件集成、产品管理和技术写作方面拥有多年的经验。在对解决复杂难题的无限好奇心驱使下,她找到了解开 Kubernetes 错综复杂之处的最新挑战。在目前的职位上,Leah 将大部分时间用于弥合 亚马逊云科技 和开源 Kubernetes 集成之间的鸿沟。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。