一个 Pod,一个节点:AWS 无服务器 Kubernetes 背后的架构

一个 Pod,一个节点:AWS 无服务器 Kubernetes 背后的架构

💡 原文英文,约1800词,阅读约需7分钟。
📝

内容提要

本文介绍 EKS Fargate 实现无服务器 Kubernetes 的方式:通过准入 Webhook 将符合 Fargate 配置的 Pod 路由至专用调度器,按需创建独立计算环境,而非从节点池中选择。运行时提供 Kubelet 等节点组件,并利用网络命名空间隔离平台、节点与工作负载流量,每个 Pod 获得独立 ENI。EKS 还通过 PodAdmitHandler 限制单 Pod 单环境,并定期以 Eviction API 优雅替换 Pod 以完成打补丁。

🔎

延伸解读

准入控制如何决定 Pod 去向

EKS 通过准入 Webhook 在 Pod 对象持久化到 etcd 之前,根据 Fargate Profile 的命名空间和标签匹配结果,为 Pod 添加 Profile 标签并指定 Fargate 调度器。这一设计确保默认调度器不会抢占该 Pod,同时将网络配置(子网、安全组)与调度意图绑定,使放置决策在调度竞争开始前就已明确。

专用调度器与节点生命周期

Fargate 调度器不搜索现有节点池,而是根据 Pod 资源需求请求新容量,并先暂定关联节点以防止重复创建环境。运行时在环境就绪后注册 Node 对象,调度器完成最终绑定;Pod 终止时节点被移除、容量释放。若供应或绑定失败,协调机制会清理暂定分配并重试,保证一个 Pod 对应一个独立环境。

网络隔离与安全边界

每个 Fargate Pod 获得独立 ENI,并划分平台、节点、工作负载三个网络命名空间。平台流量与工作负载流量分离,工作负载无法访问平台元数据和管理进程。安全组和 VPC 路由作用于 Pod 的 ENI,而非共享节点,因此 VPC 流日志可识别接口,安全组规则可表达工作负载边界。但安全组需允许 Kubernetes 管理流量(如 logs、exec)。

运维影响与设计约束

EKS 定期通过 Eviction API 优雅替换 Pod 以打补丁,PodDisruptionBudget 控制中断预算,但若驱逐持续受阻,最终可能删除 Pod。用户需按每 Pod 一个 ENI 规划子网和 ENI 容量,并注意 Fargate Pod 无公网 IP,需依赖 NAT 网关或 VPC 端点。DaemonSet、主机网络、特权操作、GPU 及 EBS 挂载等节点级需求不适用 Fargate,持久共享存储应使用 EFS。

❓

Q&A

EKS Fargate 是如何让 Pod 被调度到 Fargate 而不是普通节点的?

EKS 通过一个准入 Webhook 在 Pod 持久化到 etcd 之前进行拦截。当 Pod 匹配 Fargate 配置(按命名空间和标签选择)时,Webhook 会为 Pod 添加对应配置的标签,并将 Pod 的调度器名称设置为 Fargate 专用调度器,从而阻止默认调度器抢占该 Pod。

Fargate 调度器和默认调度器的工作方式有什么不同?

默认调度器从已有的节点池中选择节点来放置 Pod;而 Fargate 调度器不搜索现有节点,而是根据 Pod 的资源需求和匹配的 Fargate 配置直接请求新的计算容量,然后等待 Fargate 运行时注册节点并报告就绪后完成最终绑定。

Fargate Pod 的网络是如何隔离平台流量和工作负载流量的?

Fargate 创建三个逻辑 Linux 网络命名空间:平台命名空间承载 Fargate 平台服务(遥测、凭证分发、配置),节点命名空间承载 Kubernetes 核心数据平面组件和客户 ENI,工作负载命名空间运行客户容器。客户 ENI 被移入节点命名空间,用于控制平面通信和 Pod 流量;工作负载命名空间无法访问平台元数据和管理进程,只能通过 ENI 出口流量。

Fargate 如何保证一个 Pod 独占一个节点环境?

EKS 在节点上运行自定义的 PodAdmitHandler,在 Pod 启动前进行验证,只允许意图走 Fargate 调度路径的 Pod 被准入。这保护了“一个 Pod 一个环境”的模型,防止在 kubelet 启动过程中有其他 Pod 被调度到同一环境。

EKS 如何对 Fargate Pod 进行安全补丁更新?

EKS 会定期识别需要打补丁的 Fargate 环境所影响的 Pod,通知客户后使用 Kubernetes Eviction API 优雅地驱逐 Pod,然后回收环境并创建带有最新补丁的新环境。对于控制器管理的工作负载,替换 Pod 有机会先就绪;PodDisruptionBudget 可控制中断预算,EKS 会尊重该预算并在违反时重试。

哪些工作负载不适合运行在 EKS Fargate 上?

需要节点级控制的工作负载不适合 Fargate,例如 DaemonSet、使用主机网络或主机端口、特权操作、需要 GPU 的工作负载。此外,依赖 HostPath 或主机附加块存储(如 Amazon EBS)的工作负载也无法在 Fargate 上运行;持久共享存储应使用 Amazon EFS。

使用 EKS Fargate 时,网络配置有哪些注意事项?

每个 Fargate Pod 都会获得一个独立的 ENI,因此需要规划 ENI 和子网容量。Fargate 配置使用私有子网,Pod 不会分配公有 IP,访问互联网或 AWS 服务通常需要通过 NAT 网关或 VPC 终端节点。由于客户 ENI 同时承载 Kubernetes 数据平面和 Pod 流量,其安全组必须允许 kubectl logs、kubectl exec 等操作所需的管理流量。

🏷️

标签

➡️

继续阅读