本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自定义网络
提示
通过亚马逊 EKS 研讨会探索
默认情况下,亚马逊 VPC CNI 会为 Pod 分配一个从主子网中选择的 IP 地址。主子网是主 ENI 所连接的子网 CIDR,通常是的 node/host子网。
如果子网 CIDR 太小,CNI 可能无法获取足够的辅助 IP 地址来分配给你的 Pod。这是 EKS IPv4 集群面临的常见挑战。
自定义网络是解决这个问题的一种方法。
自定义网络通过分配辅助 VPC 地址空间 (CIDR) 中的节点和 Pod IP 来解决 IP 耗尽问题。自定义网络支持支持 Eniconfig 自定义资源。EniConfig 包括备用子网 CIDR 范围(从辅助 VPC CIDR 中划分出来),以及 Pod 所属的安全组。启用自定义联网后,VPC CNI 会在 EniConfig 下定义的子网中创建辅助弹性网卡。CNI 根据 Eniconfig CRD 中定义的 CIDR 范围为 Pod 分配一个 IP 地址。
由于自定义网络不使用主 ENI,因此你可以在一个节点上运行的最大 Pod 数量较少。主机网络 Pod 继续使用分配给主 ENI 的 IP 地址。此外,主 ENI 用于处理源网络转换和将 Pod 流量路由到节点外。
示例配置
虽然自定义网络将接受二级 CIDR 范围的有效 VPC 范围,但我们建议您使用100.64.0.0/10共享地址空间 (RFC 6598) 中的 CIDR,因为与其他 RFC1918 范围相比,这些 CIDR 不太可能用于企业设置。例如,您可以用100.64.0.0/16作 VPC 的辅助 CIDR。有关您可以在 VPC 中使用的允许和受限 CIDR 区块关联的更多信息,请参阅 VPC 文档的 VPC 和子网大小部分中的 IPv4 CIDR 区块关联限制。
如下图所示,工作节点的主弹性网络接口 (ENI) 仍使用主 VPC CIDR 范围(在本例中为 10.0.0)。0/16)但辅助弹性网卡使用辅助 VPC CIDR 范围(在本例中为 100.64.0)。0/16)。现在,为了让 Pod 使用 100.64.0。0/16 CIDR 范围,必须配置 CNI 插件才能使用自定义网络。您可以按照此处记录的步骤进行操作。
如果您希望 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 将从中定义的子网中ENIConfig分配 Pod IP 地址。ENIConfig自定义资源用于定义调度 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,我们建议您考虑自定义网络。亚马逊 EKS 对 RFC6598
如果你有安全要求才能在具有不同安全组要求的不同网络上运行 Pod,你可以考虑自定义网络。启用自定义网络后,Pod 使用与 Eniconfig 中定义的子网或安全组不同的节点的主网络接口。
自定义网络确实是部署多个 EKS 集群和应用程序以连接本地数据中心服务的理想选择。您可以增加 VPC 中 EKS 可访问的私有地址 (RFC1918) 的数量,这些地址可用于亚马逊弹性负载平衡等服务 NAT-GW,同时为跨多个集群的 Pod 使用不可路由的 CG-NAT 空间。使用中转网关
在以下情况下避免使用自定义网络
准备实施 IPv6
自定义网络可以缓解 IP 耗尽问题,但需要额外的运营开销。如果您当前正在部署双栈 (IPv4/IPv6) VPC,或者如果您的计划包含 IPv6 支持,我们建议改为实施 IPv6 集群。您可以设置 IPv6 EKS 集群并迁移应用程序。在 IPv6 EKS 集群中,Kubernetes 和 Pod 都获得一个 IPv6 地址,并且可以与 IPv4 和 IPv6 终端节点进行进出通信。请查看运行 IPv6 EKS 集群的最佳实践。
CG-NAT 空间已耗尽
此外,如果您目前正在使用该 CG-NAT 空间中的 CIDR 或无法将辅助 CIDR 与您的集群 VPC 关联起来,则可能需要探索其他选项,例如使用备用 CNI。我们强烈建议您获得商业支持或拥有内部知识来调试和向开源 CNI 插件项目提交补丁。有关更多详细信息,请参阅备用 CNI 插件用户指南。
使用私有 NAT 网关
亚马逊 VPC 现在提供私有 NAT 网关功能。亚马逊的私有 NAT 网关使私有子网中的实例能够使用重叠 CIDR 连接到其他 VPC 和本地网络。考虑使用本博客文章中描述的方法
本博客文章实施中使用的网络架构遵循了 Amazon VPC 文档中启用重叠网络间通信下的建议。如本博客文章所示,您可以扩展私有 NAT 网关和 RFC6598 地址的使用,以管理客户的私有 IP 耗尽问题。EKS 集群、工作节点部署在不可路由的 100.64.0 中。0/16 VPC 二级 CIDR 范围,而私有 NAT 网关 NAT 网关部署到可路由的 RFC1918 CIDR 范围。该博客解释了如何使用传输网关连接 VPC,以促进具有重叠不可路由 CIDR 范围的 VPC 之间的通信。对于 VPC 不可路由地址范围中的 EKS 资源需要与地址范围不重叠的其他 VPC 进行通信的用例,客户可以选择使用 VPC 对等互连来互连这些 VPC。这种方法可以节省成本,因为现在通过 VPC 对等连接在可用区内传输的所有数据都是免费的。
节点和 Pod 的独特网络
如果您出于安全原因需要将节点和 Pod 隔离到特定的网络,我们建议您将节点和 Pod 从更大的辅助 CIDR 块(例如 100.64.0)部署到子网中。0/8)。在您的 VPC 中安装新 CIDR 后,您可以使用辅助 CIDR 部署另一个节点组,并耗尽原始节点,自动将容器重新部署到新的工作节点。有关如何实现此功能的更多信息,请参阅此博客
下图所示的设置中未使用自定义网络。相反,Kubernetes 工作节点部署在您的 VPC 二级 VPC CIDR 范围(例如 100.64.0)的子网上。0/10。你可以保持 EKS 集群运行(控制平面将保持在原始集群上 subnet/s),但节点和 Pod 将移至辅助集群 subnet/s。这是另一种减轻 VPC 中 IP 耗尽危险的技术,尽管非常规。我们建议在将容器重新部署到新的工作节点之前先耗尽旧节点。
使用可用区标签自动配置
您可以启用 Kubernetes 自动为工作节点可用区 (AZ) 应用相应的 EniConfig。
Kubernetes 会自动将标签topology.kubernetes.io/zonetopology.kubernetes.io/zone。请注意,该标签failure-domain.beta.kubernetes.io/zone已过时并替换为标签topology.kubernetes.io/zone。
-
将
name字段设置为您的 VPC 的可用区。 -
通过以下命令启用自动配置
-
通过以下命令设置配置标签
kubectl set env daemonset aws-node -n kube-system "AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true" kubectl set env daemonset aws-node -n kube-system "ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone"
如果每个可用区有多个辅助子网,则需要创建一个特定ENI_CONFIG_LABEL_DEF子网。您可以考虑使用自定义 Eniconfig 名称(ENI_CONFIG_LABEL_DEF例如k8s.amazonaws.com/eniConfigk8s.amazonaws.com/eniConfig=us-west-2a-subnet-1k8s.amazonaws.com/eniConfig=us-west-2a-subnet-2
配置辅助网络时更换 Pod
启用自定义网络不会修改现有节点。自定义联网是一种破坏性行动。与其在启用自定义联网后滚动替换集群中的所有工作节点,我们建议使用自定义资源更新 aws-node E KS 入门指南中的 AWS CloudFormation 模板,该资源调用 Lambda 函数,使用环境变量更新 Daemonset,从而在预置工作节点之前启用自定义联网。
如果在切换到自定义 CNI 网络功能之前,集群中有任何节点正在运行 Pod,则应封锁并排空节点
计算每个节点的最大 Pod 数
由于节点的主 ENI 不再用于分配 Pod IP 地址,因此您可以在给定 EC2 实例类型上运行的 Pod 数量有所减少。要解决此限制,可以在自定义网络中使用前缀分配。通过前缀分配,辅助 ENI 上的每个辅助 IP 都将被替换为 /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-pod 设置为 110 而不是 290,因为该实例的虚拟 CPU 数量相当少。对于较大的实例,EKS 建议最大容器值为 250。使用较小实例类型(例如 m5.large)的前缀附件时,您可能会在其 IP 地址之前耗尽实例的 CPU 和内存资源。
注意
当 CNI 前缀为 ENI 分配 /28 前缀时,它必须是一个连续的 IP 地址块。如果生成前缀的子网高度分散,则前缀连接可能会失败。您可以通过为集群创建新的专用 VPC 或为子网预留一组专门用于前缀附件的 CIDR 来缓解这种情况的发生。有关此主题的更多信息,请访问子网 CIDR 预留。
确定 CG-NAT 空间的现有使用情况
自定义网络允许您缓解 IP 耗尽问题,但它无法解决所有挑战。如果您已经为集群使用 CG-NAT 空间,或者根本无法将辅助 CIDR 与集群 VPC 关联起来,我们建议您探索其他选项,例如使用备用 CNI 或迁移到 IPv6 集群。