Amazon ANS-C01: 容器与 Serverless 网络 — 学习指南

属于 AWS Advanced Networking Specialty ANS-C01 — 学习指南. 使用经过验证的答案练习: Amazon 考试中心, 或参加限时模拟考试: ExamRoll.io.

EKS 网络 (CNI, Pod 网络)

Amazon EKS 中的 Pod 网络主要由 Amazon VPC CNI 插件 (amazon-vpc-cni-k8s) 主导,该插件为每个 Pod 分配一个来自 VPC 的 IP 地址,并将 Pod 流量直接置于 VPC 网络上。这种设计提供了可预测的 VPC 级安全控制(安全组、NACL)和低延迟路由,但需要谨慎进行 IP 地址和 ENI 容量规划,因为每个 ENI 的辅助 IPv4 地址数量以及每个实例类型的 ENI 数量都受硬件限制。aws-node daemonset 负责驱动 IP 分配和附加/分离操作;其 ConfigMap 通过 kubectl 编辑以调整行为(例如,设置 WARM_IP_TARGET、WARM_ENI_TARGET 或 ENABLE_PREFIX_DELEGATION)。前缀委托 (Prefix delegation) 和 Pod ENI 模式通过允许节点将整个 /28 前缀分配给一个 ENI (ENABLE_PREFIX_DELEGATION=true),或为每个 Pod 分配一个专用的 ENI(这对于高安全隔离场景很有用),从而减少了单个节点的 IP 地址耗尽问题。

Amazon VPC CNI 的替代方案,如 Cilium (eBPF) 或 Calico,可以提供不同的权衡。Cilium 可以替代 kube-proxy 并使用 eBPF 实现高性能的 L3/L4 转发,启用节点间的透明加密(WireGuard 或 IPsec),并通过使用覆盖网络 (overlay) 或地址伪装 (masquerading) 的方法来减轻节点级的 IP 地址压力。使用 Cilium 时,您仍然需要与 VPC 路由集成以处理出口和入口流量,但可以避免频繁的 ENI 附加/分离操作;这在高 Pod 流失率(churn rates)下尤为重要。对于非常高的连接数和严格的 L7 行为要求,您还应考虑调整 kube-proxy 模式 (IPVS) 和节点内核设置:调整 conntrack_max、tcp_tw_recycle/tcp_tw_reuse 和 ip_local_port_range,并通过 kubelet 或 daemonset 初始化脚本来暴露这些设置,以避免在数千个并发的长时间 gRPC 连接下发生临时端口耗尽。

ECS 网络模式和 Lambda VPC 集成

ECS 任务网络有三种主要模式:bridge、host 和 awsvpc。awsvpc 模式与 Kubernetes Pod 网络最相似,因为它为每个任务(或任务组)附加一个 ENI,并直接为任务分配私有 IP 和安全组。通过在 RunTask 或 CreateService API 调用中指定包含 subnets 和 securityGroups 的 awsvpcConfiguration 来配置 awsvpc 模式。Fargate 强制使用 awsvpc 模式,从而提供任务级的网络隔离,并与 AWS Cloud Map 集成以实现服务发现。当您需要基于安全组对每个任务进行流量过滤,或需要暴露标准的 VPC 路由和指标时,应使用 awsvpc 模式。

需要访问 VPC 的 Lambda 函数通过在其配置的子网和安全组中创建的 ENI 附加到 VPC。这些 ENI 由 Lambda 控制平面创建和管理,但 ENI 的配置过程可能会增加冷启动延迟,并且在过去限制了快速扩展的能力,除非通过预置并发或使用 VPC 端点 (AWS PrivateLink) 以及精心设计的子网架构来缓解。在 VPC 中放置大量 Lambda 函数时,请确保子网有可用的 IP 地址,根据需要使用 NAT Gateway 或 NAT 实例进行出口访问,并优先使用 VPC 端点 (通过 AWS::EC2::VPCEndpoint 创建的 com.amazonaws.* 端点),以尽可能避免出口流量通过互联网路由。使用 CloudWatch Logs 和 VPC Flow Logs 监控 ENI 的附加/分离情况,以观察扩展行为并排查与并发相关的节流问题。

App Mesh 和服务发现

AWS App Mesh 使用 Envoy sidecar 作为其数据平面,提供 L3–L7 的可观察性、流量整形、重试以及 TLS 发起/终止控制。通过 App Mesh API (CreateMesh, CreateVirtualNode, CreateVirtualService) 或适用于 Kubernetes 的 App Mesh 控制器来定义网格 (mesh)、虚拟节点 (virtual node) 和虚拟服务 (virtual service)。App Mesh 通过配置 VirtualNode 侦听器的 TLS 块中的 clientPolicy 和证书颁发机构来支持 mTLS,并且您可以与 AWS Certificate Manager (ACM) 或 SDS 集成以进行证书分发。但请注意,根据设计,App Mesh sidecar 会终止并重新加密流量;如果要求应用程序流量在客户端和应用程序 Pod 之间保持端到端加密(即网络代理中不能解密),您必须确保 TLS 仅在 Pod 处终止,并避免在网格入口或负载均衡器处终止。

服务发现通常通过以下方式实现:对于 EKS,使用 Kubernetes Services 和 CoreDNS;对于跨平台场景,使用 Cloud Map (CreateService, RegisterInstance);对于基于 DNS 的查找,使用 Route 53 私有托管区。AWS Cloud Map 直接与 ECS 和 App Mesh 集成,支持 SRV 或 A 记录以及由 API 驱动的健康检查。对于实例快速扩展的动态环境,应结合使用较短的 DNS TTL 和 Cloud Map 健康检查,以避免解析到过期的记录;如果您需要即时一致性,应使用服务网格控制平面的 API 来获取端点,而不是依赖 DNS 缓存。

设计模式与权衡取舍

在设计大规模、基于 TLS 且使用 mTLS 的 gRPC 时,您必须决定 TLS 在何处终止。在负载均衡器 (ALB) 处终止 TLS,可以将证书卸载到 ACM 并简化证书轮换,但这会破坏端到端加密,并且除非后端使用转发的客户端证书信息重新建立 TLS,否则无法向后端 Pod 提供双向 TLS。要实现真正的端到端 mTLS(应用程序端点直接认证客户端),请使用 L4 直通网关(如 Network Load Balancer),并让 Pod/应用程序处理 TLS/mTLS。将 NLB 的 target-type ip 与 AWS Load Balancer Controller 注解 service.beta.kubernetes.io/aws-load-balancer-target-type: "ip" 结合使用,可以直接注册 Pod IP;这种模式具有良好的扩展性,因为 NLB 专为数百万连接而设计,并支持长连接的 TCP/gRPC 会话,且不会终止 TLS。

对于需要 HTTPS 终止的 Ingress 和基于路径的路由,Application Load Balancer 更为合适,因为它支持主机/路径规则、重定向以及与 WAF 的集成。当 ALB 终止 TLS 时,要保留客户端 IP,需依赖 X-Forwarded-For 标头;后端 Web 服务器必须使用并记录 X-Forwarded-For,并且您应启用 ALB 访问日志以进行验证。如果您需要在服务器层获取真实的客户端套接字地址(例如为了兼容旧版软件),请使用带有 proxy protocol v2 的 NLB,并确保后端服务支持代理协议。

跨多个 AWS 账户和 VPC 的服务连接性,其扩展方式因模式而异。VPC peering 简单但管理复杂度为 N^2;Transit Gateway 集中了路由,并通过路由表隔离为大量 VPC 提供了更好的扩展性;AWS PrivateLink (Interface VPC Endpoints) 提供了最精细的、基于身份的、按服务划分的访问模型,因为您可以通过 NLB 暴露端点服务,而使用者则在其 VPC 中创建接口端点。对于需要严格访问控制和可扩展接入流程的多账户共享服务,首选 PrivateLink,因为它隔离了路由(使用者 VPC 中的路由表无需更改),并使用安全组进行精细控制。

常见陷阱和决策标准

一个反复出现的误区是假设同一种网络模型适用于所有工作负载。有状态或长连接工作负载(gRPC、数据库)倾向于使用 L4 直通 (NLB),并在 Pod 级别进行 TLS 终止或采用 hostPort/hostNetwork 模式,以避免代理引入的延迟;而需要基于路径的路由、WAF 或 WebSocket 终止的 HTTP 微服务,则能从 ALB 和 App Mesh 的功能中受益。另一个错误是在 awsvpc 模式下扩展 EKS 节点或 ECS 任务时,没有考虑到 ENI/IP 的限制:务必查阅 EC2 实例类型的 ENI 和每 ENI IP 数量的表格,并在需要高 Pod 密度时使用前缀代理或 Cilium overlays。

监控和调试需要多个来源:使用 VPC Flow Logs 和 ENI 指标来查看流量的出口/入口,使用 CloudWatch 指标来监控 AWS Load Balancers(例如 ActiveFlowCount、ProcessedBytes),以及来自 Envoy/App Mesh 或 AWS X-Ray 代理的应用级别遥测数据。对于 Lambda 和 Fargate,请记住,与 ENI 操作相关的冷启动可以通过预置并发来缓解,或者通过重新设计访问模式以使用 VPC endpoints 和 PrivateLink,这样函数就不需要宽泛的出口权限。

实践问题:用例场景

公司名称:Acme Payments Inc. 挑战:Acme Payments 在 Amazon EKS 上运行一个 gRPC 服务,该服务必须支持在 TCP 端口 443 上的数千个并发 TLS 连接,使用双向 TLS (mTLS) 以便后端服务可以验证客户端证书,并允许 EKS 集群通过 Cluster Autoscaler 和 HPA 进行自动扩缩容,而不会中断连接或要求在负载均衡器中终止 TLS。

编号方法:

  1. 在 Pod 级别实现 TLS 和双向认证来部署服务,或者在不为外部客户端终止端到端 TLS 的 sidecar 中实现。将服务器/客户端证书存储在 AWS Secrets Manager 中,并通过 Kubernetes CSI secrets store 挂载,或使用与 Pod 生命周期兼容的证书分发机制。
  2. 使用 AWS Load Balancer Controller,通过为 Service 添加注解 (service.beta.kubernetes.io/aws-load-balancer-type: “nlb”) 来创建一个 Network Load Balancer,并将目标类型设置为 IP (service.beta.kubernetes.io/aws-load-balancer-target-type: “ip”),然后在端口 443 上创建一个 TCP 侦听器。这确保了 NLB 执行 L4 直通并且不终止 TLS。
  3. 将 NLB 目标组的协议配置为 TCP,并动态注册 Pod IP(Load Balancer Controller 将调用 CreateTargetGroup 和 RegisterTargets)。确保将健康检查设置为 TCP 或一个短间隔的自定义 TCP 健康探测,以便在自动扩缩容期间目标能被快速标记为健康 (aws elbv2 create-target-group –protocol TCP –port 443 –target-type ip; aws elbv2 create-listener –protocol TCP –port 443 …)。
  4. 调整 Amazon VPC CNI 以支持高 Pod 密度并减少 ENI 流失:如果支持,启用前缀代理(在 aws-node ConfigMap 中设置 ENABLE_PREFIX_DELEGATION=true),配置 WARM_IP_TARGET 以保留备用地址,并监控 aws-node 指标(kube-system daemonset 日志和 CloudWatch 自定义指标)。如果节点级别的 IP 限制是一个问题,可以考虑使用带有 eBPF 的 Cilium 以获得更高的 Pod 密度并减少 ENI 操作。
  5. 安全地扩展集群:确保 Cluster Autoscaler 拥有正确的节点组标签和 IAM 权限,设置 PodDisruptionBudgets,并验证目标组健康检查和 NLB 连接耗尽已配置妥当,以避免在缩容期间断开长连接的 gRPC 会话。
  6. 保障证书轮换和信任:使用 ACM Private CA 或 Secrets Manager 自动化证书轮换,并确保 Pod 能够获取更新的信任包而无需重新配置 NLB。使用能够反映 mTLS 握手就绪状态的 Kubernetes readiness/liveness 探针。

AWS 原理:在 IP 目标模式下的 Network Load Balancer 将 TLS 保持到 Pod(真正的端到端加密),并支持数百万个持久性 TCP 连接,使其非常适合处理数千个并发 gRPC 会话。直接注册 Pod IP 避免了每个节点的 hostPort 或实例目标注册的复杂性,并且能与 Cluster Autoscaler/HPA 干净地协同工作,因为 AWS Load Balancer Controller 会随着 Pod 的扩缩容自动注册和注销 Pod IP。调整 VPC CNI 或采用基于 eBPF 的数据平面可以防止 IP 耗尽并减少 ENI 附加/分离的延迟,这对于快速自动扩缩容和高连接数的工作负载至关重要。通过 Secrets Manager 或 CSI 提供程序存储和分发 mTLS 工件,使得证书生命周期管理变得可控,且无需触及负载均衡器。


自动化、IaC 与网络运维 · 所有领域

练习这些题目 → · 在 ExamRoll.io 上限时练习 →

Pass the whole exam — not just this question

You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.

通过考试 →

浏览 Amazon →

Related guides

一体化访问

一次订阅。所有考试。

所有计划均可无限制搜索答案、进行模拟测试、获取AI解释以及访问完整的资源库 — 支持20多种语言。

每月
24.87
Just €0.83/day
包含所有内容:
  • 无限答案搜索
  • 无限模拟测试
  • AI驱动的解释
  • 完整资源库
  • 20多种语言
  • 每周内容更新
  • 奖励与推荐
  • 优先支持
开始免费试用

无需信用卡*

最具价值
12个月
179.87
Just €0.49/daySave 40%
包含所有内容:
  • 无限答案搜索
  • 无限模拟测试
  • AI驱动的解释
  • 完整资源库
  • 20多种语言
  • 每周内容更新
  • 奖励与推荐
  • 优先支持
开始免费试用

无需信用卡*

✓ 包含免费计划 · ✓ 随时取消 · ✓ 所有计划均解锁完整产品