自定义网络 - Amazon EKS

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

自定义网络

默认情况下,Amazon VPC CNI 会为 Pod 分配从主子网中选择的 IP 地址。主子网是主子网CIDR所连接的子网,通常ENI是节点/主机的子网。

如果子网太小,CIDR则CNI可能无法获取足够的辅助 IP 地址来分配给您的 Pod。这是EKSIPv4集群面临的常见挑战。

自定义网络是解决这个问题的一种方法。

自定义网络通过IPs从辅助VPC地址空间分配节点和 Pod 来解决 IP 耗尽问题(CIDR)。自定义网络支持支持ENIConfig自定义资源。ENIConfig包括备用子网CIDR范围(由辅助子网划分 VPCCIDR),以及 Pod 将属于的安全组。启用自定义联网后,将在下定义的子网ENIs中VPCCNI创建辅助网络ENIConfig。会为 Pod CNI 分配一个 IP 地址,该地址来自中定义的CIDRENIConfigCRD范围。

由于自定义网络ENI不使用主节点,因此可以在节点上运行的最大 Pod 数量较低。主机网络 Pod 继续使用分配给主网络 Pod 的 IP 地址ENI。此外,主节点ENI用于处理源网络转换和在节点之外路由 Pods 流量。

示例配置

虽然自定义网络将接受辅助范围的有效VPCCIDR范围,但我们建议您使用 CG NAT 空间中的 CIDRs (/16),即 100.64.0.0/10 或 198.19.0.0/16,因为与其他范围相比,这些范围不太可能在公司环境中使用。RFC1918有关可用于的允许和受限CIDR区块关联的更多信息VPC,请参阅VPC文档VPC和子网大小调整部分中的IPv4CIDR区块关联限制

如下图所示,工作节点的主弹性网络接口 (ENI) 仍使用主VPCCIDR范围(在本例中为 10.0.0.0/16),但辅助弹性网络接口(在本例中为 100.64.0.0/16)ENIs使用辅助VPCCIDR范围(在本例中为 100.64.0.0/16)。现在,为了让 Pod 使用 100.64.0.0/16 CIDR 范围,你必须将插件配置为使用自定义网络。CNI您可以按照此处记录的步骤进行操作。

辅助子网上 Pod 的插图

如果CNI要使用自定义网络,请将AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG环境变量设置为true

kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true

何时AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true,CNI将从中定义的子网中分配 Pod IP 地址ENIConfigENIConfig自定义资源用于定义调度 Pod 的子网。

apiVersion : crd.k8s.amazonaws.com/v1alpha1
kind : ENIConfig
metadata:
  name: us-west-2a
spec:
  securityGroups:
    - sg-0dff111a1d11c1c11
  subnet: subnet-011b111c1f11fdf11

创建ENIconfig自定义资源后,您将需要创建新的工作节点并耗尽现有节点。现有的工作节点和 Pod 将不受影响。

建议

在以下情况下使用自定义网络

如果您IPv4精疲力尽且IPv6还无法使用,我们建议您考虑使用自定义网络。Amazon 对RFC6598空间的EKS支持使您能够扩展 Pod 以RFC1918应对耗尽挑战。请考虑在自定义网络中使用前缀委派来增加节点上的 Pod 密度。

如果您需要在具有不同安全组要求的不同网络上运行 Pod,则可以考虑自定义联网。启用自定义联网后,Pod 使用与节点主网络接口不同的子网或安全组,ENIConfig如在节点的主网络接口中定义。

自定义网络确实是部署多个EKS集群和应用程序以连接本地数据中心服务的理想选择。您可以增加可用VPC于 Amazon Elastic Load Balancing 和 NAT-GW 等服务的私有地址 (RFC1918) 的数量,同时为跨多个集群的 Pod 使用不可路由的 CG NAT 空间。EKS通过公交网关和共享服务VPC(包括跨多个可用区域的NAT网关以实现高可用性)的自定义联网使您能够提供可扩展且可预测的流量。这篇博客文章描述了一种架构模式,这是使用自定义网络将 EKS Pod 连接到数据中心网络的最推荐方法之一。

在以下情况下避免使用自定义网络

准备实施 IPv6

自定义网络可以缓解 IP 耗尽问题,但需要额外的运营开销。如果您当前正在部署双堆栈 (IPv4/IPv6),VPC或者您的计划包括IPv6支持,我们建议改为实施IPv6集群。您可以设置IPv6EKS集群并迁移应用程序。在IPv6EKS集群中,Kubernetes 和 Pod 都会获得一个IPv6地址,并且可以与两者IPv4以及终端节点进行进出通信。IPv6请查看运行IPv6EKS集群的最佳实践。

精疲力尽的 CG-NAT 空间

此外,如果您目前正在使用 CIDRs CG NAT 空间或者无法将辅助集群CIDR与集群关联起来VPC,则可能需要探索其他选项,例如使用替代方案CNI。我们强烈建议您获得商业支持或拥有内部知识来调试和向开源CNI插件项目提交补丁。有关更多详细信息,请参阅备用CNI插件用户指南。

使用私有NAT网关

Amazon VPC 现在提供私有NAT网关功能。Amazon 的私有NAT网关允许私有子网中的实例通过重叠CIDRs连接到其他VPCs本地网络。考虑使用本博客文章中描述的方法使用私有NAT网关来克服重叠导致EKS的工作负载的通信问题CIDRs,这是我们的客户表达的重大抱怨。自定义网络无法单独解决重叠的CIDR困难,这增加了配置方面的挑战。

本博客文章实施中使用的网络架构遵循了 Amazon VPC 文档中启用重叠网络间通信下的建议。如这篇博客文章所示,您可以将私有NAT网关的使用范围与RFC6598地址结合使用,以管理客户的私有 IP 耗尽问题。EKS集群、工作节点部署在不可路由的 100.64.0.0/16 VPC 辅助CIDR范围内,而私有NAT网关、NAT网关则部署在可路由的范围内。RFC1918 CIDR该博客解释了如何使用中转网关进行连接,以便VPCs在不可路由VPCsCIDR的重叠范围内促进通信。对于不可路由地址范围内的EKS资源需要与其他地址范围不重叠VPC的资源进行通信VPCs的用例,客户可以选择使用对VPC等互连进行互连。VPCs这种方法可以节省成本,因为通过对等连接在可用区内传输的所有数据现在都是免费的。VPC

使用私有网NAT关的网络流量的插图

节点和 Pod 的独特网络

如果您出于安全原因需要将节点和 Pod 隔离到特定网络,我们建议您将节点和 Pod 从更大的辅助CIDR块(例如 100.64.0.0/8)部署到子网中。CIDR在您的中安装新节点后VPC,您可以使用辅助节点部署另一个节点组CIDR并耗尽原始节点以自动将 Pod 重新部署到新的工作节点上。有关如何实现这一点的更多信息,请参阅此博客文章。

下图所示的设置中不使用自定义网络。相反,Kubernetes 工作节点部署在您的辅助VPCCIDR范围内的子网上,例如 100.6 VPC 4.0.0/10。您可以保持EKS集群运行(控制平面将保留在原始集群上subnet/s), but the nodes and Pods will be moved to a secondary subnet/s。这是另一种尽管非常规的技术,可以缓解知识产权耗尽的危险。VPC我们建议在将 pod 重新部署到新的工作节点之前,先耗尽旧节点。

辅助子网上工作节点的插图

使用可用区标签自动配置

您可以启用 Kubernetes 自动ENIConfig为工作节点可用区 (AZ) 应用相应的。

Kubernetes 会自动将标签topology.kubernetes.io/zone添加到你的工作节点中。当每个可用区只有一个辅助子网(备用CIDR)时,Amazon EKS 建议使用可用区作为ENI配置名称。请注意,标签已failure-domain.beta.kubernetes.io/zone被弃用并替换为标签topology.kubernetes.io/zone

  1. name字段设置为您的可用区VPC。

  2. 使用以下命令启用自动配置:

kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true

如果每个可用区有多个辅助子网,则需要创建一个特定的ENI_CONFIG_LABEL_DEF辅助子网。您可以考虑使用自定义 eniConfig 名称(ENI_CONFIG_LABEL_DEF例如k8s.amazonaws.com/eniConfig和)配置为k8s.amazonaws.com/eniConfig=us-west-2a-subnet-1和标签节点k8s.amazonaws.com/eniConfig=us-west-2a-subnet-2

配置辅助网络时替换 Pod

启用自定义联网不会修改现有节点。自定义联网是一种破坏性行为。我们建议不要在启用自定义联网后滚动替换集群中的所有工作节点,而是使用自定义资源更新《EKS入门指南》中的AWS CloudFormation 模板,该资源调用 Lambda 函数以使用环境变量更新 aws-node Daemonset,以便在配置工作节点之前启用自定义联网。

如果在切换到自定义CNI网络功能之前,你的集群中有任何正在运行 Pods 的节点,你应该封锁并排空节点,以优雅地关闭 Pod,然后终止节点。只有与ENIConfig标签或注释匹配的新节点才使用自定义网络,因此可以从辅助节点为调度在这些新节点上的 Pod 分配一个 IP CIDR。

计算每个节点的最大 Pod 数

由于不再使用节点的主ENI节点来分配 Pod IP 地址,因此在给定EC2实例类型上可以运行的 Pod 数量有所减少。要解决此限制,可以在自定义网络中使用前缀分配。通过前缀分配,每个辅助 IP 都将替换为辅助ENIs的 /28 前缀。

考虑使用自定义网络的 m5.large 实例的最大 Pod 数量。

在不分配前缀的情况下可以运行的最大 Pod 数为 29

  • 3 ENIs - 1) * (10 secondary IPs per ENI - 1 + 2 = 20

启用前缀附件会将 Pod 的数量增加到 290 个。

  • (3 ENIs - 1) * ((10 secondary IPs per ENI - 1) * 16 + 2 = 290

但是,我们建议将 max-pods 设置为 110 而不是 290,因为该实例的虚拟数量相当少。CPUs对于较大的实例,EKS建议 pod 的最大值为 250。使用具有较小实例类型(例如 m5.large)的前缀附件时,您可能会在实例的 IP 地址之前耗尽实例CPU和内存资源。

注意

当前CNI缀为分配一个 /28 前缀时ENI,它必须是一个连续的 IP 地址块。如果生成前缀的子网高度分散,则前缀连接可能会失败。您可以通过为集群创建一个新的专属子网或VPC为前缀附件保留一组CIDR专用的子网来缓解这种情况的发生。有关此主题的更多信息,请访问子网CIDR预留

确定 CG NAT 空间的现有用途

自定义网络允许您缓解 IP 耗尽问题,但它无法解决所有挑战。如果您已经在集群中使用 CG-sp NAT ace,或者根本无法将辅助集群CIDR与集群相关联VPC,我们建议您探索其他选项,例如使用备用集群CNI或移至IPv6集群。

📝 编辑此页面 GitHub