从 Amazon Linux 2 迁移到 Amazon Linux 2023 Amazon ECS 优化版 AMI
继 Amazon Linux
Amazon Linux 2023 提供了默认安全方法,包括预配置的安全策略、允许模式下的 SELinux、默认启用仅 IMDSv2 模式、优化的启动时间以及改进的程序包管理,增强了安全性和性能。
Amazon Linux 2 和 Amazon Linux 2023 Amazon ECS 优化版 AMI 之间高度兼容,大多数客户在使用这两个操作系统时所感受到的工作负载变化将微乎其微。
有关更多信息,请参阅《Amazon Linux 2023 用户指南》中的比较 Amazon Linux 2 与 Amazon Linux 2023 以及 AL2023 常见问题
兼容性注意事项
程序包管理和操作系统更新
与之前版本的 Amazon Linux 不同,Amazon ECS 优化版 Amazon Linux 2023 AMI 被锁定到特定版本的 Amazon Linux 存储库。这可以防止用户无意中更新可能引入不需要的更改或重大更改的程序包。有关更多信息,请参阅《Amazon Linux 2023 用户指南》中的 Managing repositories and OS updates in Amazon Linux 2023。
Linux 内核版本
Amazon Linux 2 AMI 基于 Linux 内核 4.14 和 5.10,而 Amazon Linux 2023 使用 Linux 内核 6.1 和 6.12。有关更多信息,请参阅《Amazon Linux 2023 用户指南》中的 Comparing Amazon Linux 2 and Amazon Linux 2023 kernels。
程序包可用性更改
以下是 Amazon Linux 2023 中值得注意的程序包更改:
-
Amazon Linux 2 不再包含 Amazon Linux 2023 中的某些源二进制包。有关更多信息,请参阅《Amazon Linux 2023 Release Notes》中的 Packages removed from Amazon Linux 2023。
-
Amazon Linux 支持不同版本程序包的方式的更改。Amazon Linux 2023 中不存在 Amazon Linux 2 中使用的
amazon-linux-extras系统。所有程序包都可在“核心”存储库中找到。 -
Amazon Linux 2023 不支持适用于 Enterprise Linux 的附加程序包(EPEL)。有关更多信息,请参阅《Amazon Linux 2023 用户指南》中的 EPEL compatibility in Amazon Linux 2023。
-
Amazon Linux 2023 不支持 32 位应用程序。有关更多信息,请参阅《Amazon Linux 2023 用户指南》中的 Deprecated features from Amazon Linux 2。
控制组(cgroup)更改
控制组(cgroup)是 Linux 内核的一项功能,用于分层组织进程并在进程之间分配系统资源。控制组被广泛用于通过 systemd 实现容器运行时系统。
Amazon Linux 2023 默认使用 cgroupv2,而 Amazon Linux 2 使用 cgroupv1。Amazon ECS 代理、Docker 和 containerd 均支持 cgroupv1 和 cgroupv2。有关 cgroupv2 的更多详细信息,请参阅《Amazon Linux 2023 用户指南》中的 Control groups v2 in Amazon Linux 2023。
内存使用情况报告
cgroupv2 改变了容器内存使用量的计算方式。在 cgroupv1(Amazon Linux 2)中,容器运行时报告的容器内存利用率通常不包括页面缓存。在 cgroupv2(Amazon Linux 2023)中,页面缓存包含在报告的内存用量中。与 Amazon Linux 2 相比,相同的工作负载在 Amazon Linux 2023 上可能报告更高的内存利用率,即使实际的应用程序内存消耗没有变更亦是如此。
我们建议在迁移生产工作负载之前对 Amazon Linux 2023 实例的内存用量进行基准测试,并在需要时调整任务和容器内存限制。可以使用 Container Insights 比较 Amazon Linux 2 和 Amazon Linux 2023 之间的内存利用率。
任务内存限制可见性
当您在任务级别设置内存而不设置容器级内存限制时,Amazon ECS 会将该限制应用于任务的 cgroup。这相当于属于该任务的所有容器的有效内存限制。在 cgroupv1 (Amazon Linux 2) 上,子 cgroup 可以在自己的级别上读取有效内存限制。它们不需要遍历 cgroup 层次结构。在 cgroupv2 (Amazon Linux 2023) 上,有效限制对容器不可见。此外,默认情况下,Docker 在私有 cgroup 命名空间中运行容器,这可以防止它们向上遍历 cgroup 层次结构来发现父级的限制。
容器内任何读取 cgroup 内存限制以确定可用内存的进程都将看到已满的主机内存,而不是任务级别的限制。例如,已知 Java 虚拟机 (JVM) 会受到此问题的影响。它使用 cgroup 限制来自动调整堆的大小。当它无法检测到真实限制时,它会过度分配内存,从而增加内存不足 (OOM) 终止的风险。其他读取 cgroup 限制以进行资源决策的运行时或框架也可能会受到类似的影响。
如果任务定义中设置了任务级内存,但未设置容器级memory,则会发生这种情况。
要解决此问题,请选择以下解决方法之一:
设置容器级内存限制(推荐)
在任务定义中显式设置容器级别的 memory 参数,该参数等于任务级内存值。这种方法安全、可靠,无需改变基础设施
启用代理级别的任务内存限制传播
在 Amazon ECS 代理中将 ECS_PROPAGATE_TASK_MEMORY_LIMIT_CGROUPV2 环境变量设置为 true。启用并在 cgroupv2 上时,如果容器还没有明确的容器级内存限制,代理会自动将每个容器的内存限制设置为任务级值。这使得任务内存限制在容器内可见,无需更改任务定义。
您可以在 Amazon EC2 实例上的 Amazon ECS 代理配置文件 (/etc/ecs/ecs.config) 中进行此设置:
ECS_PROPAGATE_TASK_MEMORY_LIMIT_CGROUPV2=true
此选项需要 Amazon ECS 代理版本 1.104.0 或更高版本。它仅适用于使用 cgroupv2 的 Linux 实例。Windows 中不支持此项。
实例元数据服务(IMDS)更改
默认情况下,Amazon Linux 2023 需要实例元数据服务版本 2(IMDSv2)。IMDSv2 可带来多项好处,有助于改善安全状况。它使用面向会话的身份验证方法,需要在简单的 HTTP PUT 请求中创建密钥令牌才能启动会话。会话令牌的有效时间可以介于 1 秒到 6 小时之间。
有关如何从 IMDSv1 过渡到 IMDSv2 的更多信息,请参阅《Amazon EC2 用户指南》中的过渡到使用实例元数据服务版本 2。
如果您想使用 IMDSv1,您仍然可以通过使用实例元数据选项启动属性,手动覆盖设置来做到这一点。
内存交换性更改
Amazon Linux 2023 和 cgroups v2 不支持按容器交换内存。有关更多信息,请参阅 管理 Amazon ECS 上的容器交换内存空间。
FIPS 验证更改
Amazon Linux 2 通过了 FIPS 140-2 认证,Amazon Linux 2023 通过了 FIPS 140-3 认证。
要在 Amazon Linux 2023 上启用 FIPS 模式,请在您的 Amazon EC2 实例上安装必要的程序包,然后按照《Amazon Linux 2023 用户指南》的 Enable FIPS Mode on Amazon Linux 2023 中的说明,完成配置步骤即可。
加速实例支持
Amazon ECS 优化版 Amazon Linux 2023 AMI 同时支持 Neuron 和 GPU 加速实例类型。有关更多信息,请参阅 经 Amazon ECS 优化的 Linux AMI。
构建自定义 AMI
虽然我们建议您迁移到官方支持和发布的 Amazon Linux 2023 Amazon ECS 优化版 AMI,但您可以继续使用用于构建 Amazon ECS 优化版 AMI 的 Linux 变体的开源构建脚本,来构建自定义 Amazon Linux 2 Amazon ECS 优化版 AMI。有关更多信息,请参阅 经 Amazon ECS 优化的 Linux AMI 构建脚本。
迁移策略
我们建议制定和实施包括全面应用程序测试在内的迁移计划。以下各节根据您管理 Amazon ECS 基础设施的方式概述了不同的迁移策略。
使用 Amazon ECS 容量提供程序进行迁移
-
使用新的启动模板创建一个新的容量提供程序。这应该引用一个自动扩缩组群组,其启动模板与您的现有模板类似,但它应该指定其中一个 Amazon Linux 2023 变体,而非 Amazon Linux 2 Amazon ECS 优化版 AMI。将这个新容量提供程序添加到现有的 Amazon ECS 集群。
-
更新集群的默认容量提供程序策略,将现有的 Amazon Linux 2 容量提供程序和新的 Amazon Linux 2023 容量提供程序纳入其中。首先,对 Amazon Linux 2 提供程序使用较高的权重,对 Amazon Linux 2023 提供程序使用较低的权重(例如,Amazon Linux 2:权重 80,Amazon Linux 2023:权重 20)。这会导致 Amazon ECS 在计划新任务时开始预置 Amazon Linux 2023 实例。确认实例是否注册正确,任务是否能够在新实例上成功运行。
-
逐步调整集群默认策略中的容量提供程序权重,增加 Amazon Linux 2023 提供程序的权重,同时随着时间的推移降低 Amazon Linux 2 提供程序的权重(例如,先是 60/40,然后是 40/60,接着是 20/80)。您还可以更新各个服务容量提供程序的策略,以优先考虑 Amazon Linux 2023 实例。监控任务放置,确保它们在 Amazon Linux 2023 实例上成功运行。
-
(可选)清空 Amazon Linux 2 容器实例以加速任务迁移。如果您有足够的 Amazon Linux 2023 替换容量,则可以通过 Amazon ECS 控制台或 AWS CLI 手动清空 Amazon Linux 2 容器实例,加速将任务从 Amazon Linux 2 过渡到 Amazon Linux 2023。迁移完成后,从您的集群中移除 Amazon Linux 2 容量提供程序,并删除关联的自动扩缩组。
使用 Amazon EC2 Auto Scaling 组进行迁移
-
使用新的启动模板创建一个新的 Amazon EC2 Auto Scaling 组。此模板应与现有的启动模板类似,但它应指定其中一个 Amazon Linux 2023 变体,而非 Amazon Linux 2 Amazon ECS 优化版 AMI。这个新的自动扩缩组可以向现有集群启动实例。
-
纵向扩展该自动扩缩组,即可开始将 Amazon Linux 2023 实例注册到您的集群中。确认实例是否注册正确,任务是否能够在新实例上成功运行。
-
验证确认您的任务可在 Amazon Linux 2023 上运行后,纵向扩展 Amazon Linux 2023 自动扩缩组,同时逐步缩减 Amazon Linux 2 自动扩缩组,直到完全替换所有 Amazon Linux 2 实例。
-
如果您有足够的 Amazon Linux 2023 替换容量,则可能需要显式清空容器实例,以加速将任务从 Amazon Linux 2 过渡到 Amazon Linux 2023。有关更多信息,请参阅 耗尽 Amazon ECS 容器实例。
使用手动托管的实例进行迁移
-
使用 Amazon ECS 优化版 Amazon Linux 2023 AMI(而不是 Amazon Linux 2)手动启动新的 Amazon EC2 实例(或调整启动该实例的脚本)。确保这些实例使用与现有 Amazon Linux 2 实例相同的安全组、子网、IAM 角色和集群配置。这些实例应在启动时自动注册到现有 Amazon ECS 集群中。
-
确认新的 Amazon Linux 2023 实例是否已成功注册到 Amazon ECS 集群并且处于
ACTIVE状态。通过等待自然任务放置或手动停止/启动某些任务以触发重新计划,测试是否可以在这些新实例上计划任务并正常运行任务。 -
根据需要启动其他 Amazon Linux 2023 实例,然后手动逐个清空和终止 Amazon Linux 2 实例,从而逐步替换 Amazon Linux 2 实例。将实例设置为
DRAINING状态,通过 Amazon ECS 控制台清空实例,这将停止在这些实例上放置新任务,并允许现有任务完成或在其他地方重新计划这些任务。