Amazon EKS优化AMI在AL2023上运行Cilium的网络路由问题分析与解决方案
背景介绍
Amazon EKS优化AMI是AWS为Kubernetes集群节点提供的官方镜像。随着Amazon Linux 2023(AL2023)的发布,AWS推出了基于AL2023的EKS优化AMI。然而,在使用这个新镜像配合Cilium CNI插件时,用户遇到了一些网络路由方面的挑战。
问题现象
当在AL2023上部署Cilium时,主要出现了两类问题:
-
节点引导问题:使用Terraform EKS模块时,
nodeadm无法正确解析用户数据配置,导致节点无法加入集群。 -
网络路由冲突:系统出现两个默认路由,分别通过
ens5和ens6接口,导致Cilium代理启动失败,错误提示发现多个具有相同优先级的默认路由。
技术分析
节点引导问题
这个问题源于nodeadm工具对用户数据格式的严格要求。在AL2023上,nodeadm期望用户数据采用特定的YAML格式:
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
cluster:
name: ${cluster_name}
apiServerEndpoint: ${cluster_endpoint}
certificateAuthority: ${cluster_auth_base64}
cidr: ${cluster_service_ipv4_cidr}
如果格式不正确或缺少必要字段(特别是cidr),nodeadm-config.service将无法启动,导致节点无法加入集群。
网络路由问题
更复杂的是网络路由问题。AL2023使用systemd-networkd进行网络配置,其默认行为会为所有接口设置相同的路由优先级(metric=1024)。当Cilium创建并附加新的ENI(如ens6)时,系统会出现两个具有相同优先级的默认路由:
default via x.x.x.x dev ens5 proto dhcp src x.x.x.x metric 1024
default via y.y.y.y dev ens6 proto dhcp src y.y.y.y metric 1024
这种配置违反了Cilium对单一默认路由的假设,导致代理启动失败。
解决方案
节点引导问题解决
对于节点引导问题,有两种解决方案:
-
使用正确的YAML模板:通过
user_data_template_path参数提供符合要求的YAML配置。 -
更新Terraform EKS模块:v20.5.0及以上版本已添加对AL2023的支持,可以正确处理节点引导。
网络路由问题解决
针对网络路由冲突,最有效的解决方案是调整主接口的路由优先级:
- 创建自定义网络配置:在节点启动时,为
ens5接口创建专门的网络配置:
[Match]
Name=ens5
[Network]
DHCP=yes
[DHCP]
RouteMetric=1000
- 应用配置并重启网络服务:
cat > /etc/systemd/network/05-ens5.network << EOF
[Match]
Name=ens5
[Network]
DHCP=yes
[DHCP]
RouteMetric=1000
EOF
systemctl restart systemd-networkd.service
这样配置后,路由表将变为:
default via x.x.x.x dev ens5 proto dhcp src x.x.x.x metric 1000
default via y.y.y.y dev ens6 proto dhcp src y.y.y.y metric 1024
通过降低主接口的路由优先级,确保系统始终优先使用ens5作为默认路由,解决了Cilium的兼容性问题。
最佳实践建议
- 统一网络接口管理:对于Cilium管理的接口,建议配置
Unmanaged=yes以避免systemd-networkd干扰:
[Match]
Name=!ens5
[Link]
Unmanaged=yes
-
考虑不同实例类型的网络接口命名:AWS不同实例类型可能使用不同的网络接口命名方案(如
ens*、enp*等),配置时应考虑全面匹配。 -
监控网络连接:即使解决了路由问题,仍需监控跨ENI的通信,特别是对外部服务的访问。
结论
Amazon EKS优化AMI在AL2023上的部署虽然初期遇到了一些挑战,但通过正确的配置调整完全可以稳定运行Cilium等高级CNI插件。关键在于理解AL2023的网络管理机制与Kubernetes CNI插件的交互方式,并通过适当的优先级调整确保网络流量的正确路由。
随着AWS和Cilium社区的持续优化,未来这些配置可能会变得更加简单。但目前提供的解决方案已经过实际验证,可以作为生产环境部署的参考。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0153- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
LongCat-Video-Avatar-1.5最新开源LongCat-Video-Avatar 1.5 版本,这是一款经过升级的开源框架,专注于音频驱动人物视频生成的极致实证优化与生产级就绪能力。该版本在 LongCat-Video 基础模型之上构建,可生成高度稳定的商用级虚拟人视频,支持音频-文本转视频(AT2V)、音频-文本-图像转视频(ATI2V)以及视频续播等原生任务,并能无缝兼容单流与多流音频输入。00
auto-devAutoDev 是一个 AI 驱动的辅助编程插件。AutoDev 支持一键生成测试、代码、提交信息等,还能够与您的需求管理系统(例如Jira、Trello、Github Issue 等)直接对接。 在IDE 中,您只需简单点击,AutoDev 会根据您的需求自动为您生成代码。Kotlin03
Intern-S2-PreviewIntern-S2-Preview,这是一款高效的350亿参数科学多模态基础模型。除了常规的参数与数据规模扩展外,Intern-S2-Preview探索了任务扩展:通过提升科学任务的难度、多样性与覆盖范围,进一步释放模型能力。Python00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0112