自动管理 Multus Workers 和 Pod 的 IP 地址

基于电信 5G 和 IMS 容器的工作负载利用 Multus CNI 来实现流量和路由分离以及数据包加速。Multus 容器网络接口插件允许 Kubernetes 容器连接到多个接口和网络。 Multus CNI 是一个 “元插件”,通过调用其他 CNI 来实现这一点,例如 VPC CNI 亚马逊弹性 Kubernetes 服务(亚马逊 EKS)中的默认 CNI ) IPVLAN CNI 等。VPC CNI 管理 Kubernetes 容器主接口,而 IPVLAN CNI 允许容器通过在工作节点弹性网络接口 (ENI) 上使用相同的 MAC 地址来使用工作节点的辅助接口)。 Multus CNI 还会调用 IPAM CNI,例如 主机本地、静态和下落。

这篇名为《 亚马逊 EKS》的文章现在支持 Multus CNI ,可以帮助你开始在亚马逊 EKS 上部署 Multus 工作负载。要在 Amazon EKS 上对基于 Multus 的工作负载进行生产级部署,您必须计划管理以下两个主题:

  • Multus 工作节点组:工作节点子网和工作节点的 IP 地址管理,因为每个工作节点 ENI 都需要子网中的 IP 地址。
  • Multus Pod 网络:来自工作节点子网的 Multus Pod IP 管理,以及 亚马逊虚拟私有云 (亚马逊 V PC) 中的容器通信。

在这篇文章中,我将介绍标准的 Multus 节点组部署方法,以及在 Amazon VPC 内将 ipvlan CNI 与 Multus 工作负载一起使用时面临的挑战和管理上述主题的方法。

标准 Multus 节点组部署方法

sample deployment of Multus workload with IPVLAN CNI

前面的图表代表了使用 IPVLAN CNI 部署 Multus 工作负载的示例,本文将对此进行介绍。在此示例中,我们有一个 Amazon EKS 集群和一个包含两个工作节点的节点组。两个工作节点都连接有两个子网,如下所示:

  • eth0 网络:10.10.12.0/24(用于 VPC CNI,即主容器接口)
  • eth1 网络:10.10.1.0/24(用于 Multus ipvlan cni,即 pod 辅助接口)

对于之前的示例部署方法,部署从 Amazon EKS 集群部署开始,然后是 Amazon EKS 节点组部署。部署节点组后,您可以部署 Multus CNI 和相关插件来支持您的工作负载。部署插件后,您可以部署工作负载。

在下一节中,我将讨论 Multus 工作节点组和 IP 管理的部署策略。

Multus 工作节点组部署和 IP 管理

多工作节点部署

自行管理的 Multus Node 组,使用自动扩展组,提供弹性(保持最少的工作人员数量)和可扩展性。自动扩缩组利用 启动模板 来配置 亚马逊弹性计算云 (Amazon EC2 ) 工作节点。Autoscaling Group 与 Launch Template 结合使用,可以创建具有属于同一子网的单个或多个接口的工作节点。定制部署策略通过使用定制 亚马逊云科技 Lambda 实现来自不同子网的多个网络接口附件,该定制 Aws Lambda 在 A mazon EC2 Autoscaling 生命周期挂钩上添加了 Multus 接口。

如下图所示,部署从自动扩展组使用启动模板创建具有单接口 (eth0) 的工作节点开始。工作线程启动后,自定义 Lambda 会终止单一接口节点。这种缩减会导致 “Autoscaling: ec2_instance_Terminating” 事件,该事件会触发自定义 Lambda,然后耗尽节点/或者不执行任何操作。

此事件完成后,自动扩缩组向外扩展以满足所需的容量,从而导致 “AutoScaling: ec2_instance_Launce_Launce_Launching” 事件。此事件触发自定义 Lambda 函数,该函数添加来自 Multus 子网的辅助接口,其标签为(密钥:node.k8s.amazonaws.com/no_manage” 值:true)。

EKS Multus node group Creation Flow

EKS 多节点组创建流程

工作节点 IP 管理挑战

自动扩展组为 Amazon EKS 工作节点组提供弹性和灵活性,并使用 DHCP IP 分配给所有接口来支持同样的配置。另一方面,对于 Multus Pod,非 VPC IPAM CNI( 主机本地 行踪 等)使用静态地址范围/池管理辅助接口上的 IP 分配。Pod 的出口/入口是通过相应的工作线 ENI 发生的,因此容器 IP 和工作网卡 IP 地址必须来自子网。应用程序规划者,通过 Multus 网络连接 定义配置和注释为 Multus 容器分配静态 IP 范围。

同一个子网上的两种不同且不连贯的 IP 分配方法(DHCP 和静态)给工作负载部署带来了有趣的挑战。DHCP 的工作节点 IP 分配是随机的,由于它不知道其他静态分配,因此它可以从容器计划的静态 IP 范围中获取任何 IP 地址。Multus IPAM CNI( 主机本地 下落 等)不知道这项任务。如果此 IP 被工作接口夺走,则应用程序 Pod 将出现 IP 冲突并且 IP 分配将失败,从而导致不可预测的应用程序部署。

解决方案

在以下部分中,我将向您介绍两种可能的方法,以非冲突的方式更好地管理工作节点和Multus工作负载的IP地址。

方法 1:使用自定义 Lambda 静态分配工作人员 IP

这种解决方案方法适用于工作节点和容器之间的逻辑子网共享模型。在这种方法中,工作节点从子网的开头获取未分配的 IP,而 Multus Pod 从子网末端获取未分配的 IP。使用这种分配策略,工作节点接口的 IP 地址分配不是随机的,IP 分配是从子网中第一个可用的 IP 静态开始的。

multus pod

有关详细描述、AW S CloudFormation 模板示例和支持 Lambda 函数的信息,请参阅 GitHub 存储库通过基于 lambda 的定制解决方案 静态 分配工作服务器 IP

方法 2:使用 VPC 子网 CIDR 预留(静态)作为 pod 的 IP 地址

这种方法使用 VPC 子网 CIDR 预留 策略来隔离工作节点和 Multus Pod IP 地址分配。使用这种方法,您可以明确地将 Multus Pod IP CIDR 范围保留为静态范围,确保 Amazon EC2 工作节点的 DHCP 不会将 IP 地址分配给该区块中的工作节点。

Use VPC subnet CIDR reservation (static) for the pods’ IP addresses 为此,您可以为 pod IP 地址区块创建一个或多个子网 CIDR 预留空间,仅用于显式(静态)分配。子网 CIDR 的未预留区块可用于自动扩缩组后面的工作节点的 DHCP(默认)分配。

有关详细描述、 CloudFormation 模板示例和支持的 Lambda 函数,请参阅 GitHub 存储库 为 pod IP 地址 使用 VPC 子网 cidr 预留(静态)

自动多舱联网

现在,亚马逊 EKS 集群和 Multus 节点组已使用上述任一方法进行部署,您可以使用 Multus 在 Amazon EKS 上部署工作负载。下一步,你将按照 git 存储库 中提到的方法部署 Multus CNI 并安装 下落 IPAM CNI。在这篇文章中,我正在使用 行踪 IPAM CNI 来管理集群唯一的 Multus IP 地址。

现在,让我们了解一下 IP 通信在 VPC 中的工作原理、启用路由的方法以及以自动方式为 Multus Pod 分配 IP。

Multus Pod IP 管理和路由挑战

在以下示例中,请注意,当你部署 Multus 容器时,即使安全组 Rules/Nacl 没有阻塞流量,不同工作人员上的 Pod 之间的通信也无法正常工作。但是,同一个工作节点上的 pod 之间的互通可以正常工作。

EKS control plane

在这里,我将详细解释这种行为。亚马逊 VPC 云为其工作负载提供第 3 层网络。ENI 是包含一个或多个 IP 地址和相应的 MAC 地址的逻辑网络实体。Amazon VPC 根据分配给 ENI 的 IP 地址将流量路由到正确的目的地。连接到 Amazon EC2 工作节点的每个 ENI 都必须为其分配所需的 IP 地址。

对于容器的主接口,亚马逊 VPC CNI 使用 DHCP 为容器 eth0(VPC CNI 托管接口)分配主容器 IP 地址(在前面的示例中为 10.10.12.x),并将这些 IP 分配为工作节点 ENI 上的辅助 IP。非 VPC IPAM CNI(行踪、主机本地、静态等)将 IP 地址分配给 Multus 容器。因此,亚马逊 VPC 不会知道这个 IP 地址的分配。此外,在相应的工作节点 ENI 上,这些 IP 地址未被指定为辅助 IP(在本示例中为 eth1)。

请注意,您可以通过检查 Amazon EC2 控制台上的工作节点 ENI 来进行验证:亚马逊 EC2 控制台 → 实例 → 选择实例(工作节点)→ 操作 → 联网 → 管理 IP 地址。

当将 Pod 假设的 IP 地址分配给相应的工作网卡时,这个问题就解决了。将这些 IP 分配给相应的 ENI(例如:eth1)后,亚马逊 VPC 会更新分配给 ENI 的 IP 的映射,以将流量路由到指定的 Multus IP 地址。

在以下示例中,Multus 容器 IP 地址 10.10.1.80 和 10.10.1.82 被分配为第一个工作节点的 eth1 ENI 上的辅助 IP 地址。同样,10.10.1.81 的辅助 IP 被分配给第二个工作节点 eth1 ENI。

eks control plane 2

自动化解决方案

Amazon EC2 分配 IP 地址/取消分配 IP 地址 API 调用可以在工作节点 ENI 上自动分配 IP。来自 git 存储 库的 Python 示例代码和脚本 可以帮助实现相同的结果。

下文讨论的自动化方法不需要对应用程序映像或源代码进行任何更改。您可以利用这些 Pod 上的自定义 “IP 管理” 容器在相应的工作节点 ENI 上执行 IP 分配的自动化,而不会对应用程序容器或其架构产生任何影响。您可以使用此附加容器增强工作负载容器/部署/状态集的规格。

请参阅 如何构建 以构建 docker 容器镜像,该镜像提供此功能,可用于以下任一解决方案选项。

方法 1:基于 InitContainer 的 IP 管理解决方案

此解决方案适用于大多数 ipvlan CNI pod,无需特殊/自定义处理,例如浮动 IP(将在下一个方法中解释)。这种方法不会对工作人员增加额外 CPU/内存要求的限制。

当 POD 处于初始状态时,此 “IP 管理” 容器作为第一个容器执行。此容器检查 Pod 的 IP 地址,并在容器处于初始状态时将 IP 地址分配给 ENI。成功将 Multus IP 地址分配给工作节点 ENI 后,此 InitContainer 将终止,Pod 将退出初始化状态。

要使用此解决方案,请参阅 InitContainer IP 管理 文档和部署程序。您可以通过在 Amazon EC2 控制台上检查工作节点 ENI 来进行验证:亚马逊 EC2 控制台 → 实例 → 选择实例(工作节点)→ 操作 → 联网 → 管理 IP 地址。

方法 2:Sidecar IP 管理解决方案

在这种方法中,“IP 管理” 容器作为边车容器运行。此外,与 InitContainer 不同,它会持续监控 Multus 接口上的 pod IP 地址,寻找新的或更改的 IP 地址。这对于对活动/备用容器进行自定义 “浮动 IP” 处理的 pod 很有用,并且根据内部逻辑,“浮动 IP” 会在不中断流量的情况下故障转移到备用 Pod。在这种情况下,sidecar 会持续监控 Pod 的 IP 地址变化,因此每个基于 Multus 的容器的 CPU/内存(最少)会额外使用。

要使用此解决方案,请参阅 Sidecar IP 管理解决方案 文档和程序。您可以在 Amazon EC2 控制台上对其进行验证:亚马逊 EC2 控制台 → 实例 → 选择实例(工作服务器)→ 操作 → 联网 → 管理 IP 地址。

正在清理

清理 本文 中部署的示例 Multus 工作负载,请参阅 GitHub 存储库中的清理。此外,为了避免将来产生费用,请从 CloudFormation 控制台中删除 Multus 工作节点组。亚马逊 EKS 集群可以从亚马逊 EKS 控制台中删除。

结论

这篇文章概述了客户在亚马逊 VPC 云中分配、管理和分离工作节点和 Multus Pod IP 地址时面临的挑战。此外,它还描述了 Multus Pod 如何在亚马逊 EKS 和亚马逊 VPC 范围内工作,以及如何在 VPC 中路由流量。

此外,这篇文章提供了Amazon EKS节点组的示例自动化方法和Multus Pod的IP管理自动化,软件/映像没有任何变化。

为简单起见,这篇文章仅演示了前面示例中的 IPv4 处理。但是, git 存储库 中的示例代码也支持 IPv6。您可以根据不同的应用程序架构和用例进一步调整 git 存储库中的示例源代码。