第 9 章 配置出口 IP 地址
作为集群管理员,您可以配置 OVN-Kubernetes Container Network Interface (CNI) 网络插件,为命名空间分配一个或多个出口 IP 地址,或分配给命名空间中的特定 pod。
9.1. 出口 IP 地址架构设计和实施 复制链接链接已复制到粘贴板!
通过使用 OpenShift Container Platform 出口 IP 地址功能,您可以确保来自一个或多个命名空间中的一个或多个 pod 的流量为集群网络外的服务具有一致的源 IP 地址。
例如,您可能有一个 pod 定期查询托管在集群外服务器上的数据库。要强制对服务器进行访问要求,将数据包过滤设备配置为只允许来自特定 IP 地址的流量。为确保您可以可靠地允许从该特定 pod 访问服务器,您可以为向服务器发出请求的 pod 配置特定的出口 IP 地址。
分配给命名空间的出口 IP 地址与用来向特定目的地发送流量的出口路由器不同。
在一些集群配置中,应用程序 Pod 和入口路由器 pod 在同一个节点上运行。如果您在这种情况下为应用程序项目配置出口 IP 地址,当您向应用程序项目发送请求时,不会使用 IP 地址。
不能在任何 Linux 网络配置文件中配置出口 IP 地址,比如 ifcfg-eth0
。
9.1.1. 平台支持 复制链接链接已复制到粘贴板!
下表概述了对不同平台中的出口 IP 地址功能的支持:
平台 | 支持 |
---|---|
裸机 | 是 |
VMware vSphere | 是 |
Red Hat OpenStack Platform(RHOSP) | 是 |
Amazon Web Services (AWS) | 是 |
Google Cloud Platform (GCP) | 是 |
Microsoft Azure | 是 |
IBM Z® 和 IBM® LinuxONE | 是 |
IBM Z® and IBM® LinuxONE for Red Hat Enterprise Linux (RHEL) KVM | 是 |
IBM Power® | 是 |
Nutanix | 是 |
在 Amazon Web Services(AWS)上置备的集群中不支持使用 EgressIP 功能将出口 IP 地址分配给 control plane 节点。(BZ#2039656)。
9.1.2. 公共云平台注意事项 复制链接链接已复制到粘贴板!
通常,公共云供应商对出口 IP 地址施加一个限制。这意味着,对于公共云基础架构上置备的集群,每个节点都有可分配 IP 地址的限制。如下公式描述了每个节点的可分配 IP 地址或 IP 容量 上限:
IP capacity = public cloud default capacity - sum(current IP assignments)
IP capacity = public cloud default capacity - sum(current IP assignments)
虽然 Egress IP 地址功能管理每个节点的 IP 地址容量,但在部署中计划这个约束非常重要。例如,如果公共云提供商将 IP 地址容量限制为每个节点 10 个 IP 地址,并且您有 8 个节点,则可分配的 IP 地址总数仅为 80。为了获得更高的 IP 地址容量,您需要分配额外的节点。例如,如果您需要 150 个可分配的 IP 地址,则需要分配 7 个节点。
要确认公共云环境中任何节点的 IP 容量和子网,您可以输入 oc get node <node_name> -o yaml
命令。cloud.network.openshift.io/egress-ipconfig
注解包括节点的容量和子网信息。
注解值是一个带有单个对象的数组,其中包含为主网络接口提供以下信息的字段:
-
interface
:指定 AWS 和 Azure 上的接口 ID,以及 GCP 上的接口名称。 -
ifaddr
:为一个或多个 IP 地址系列指定子网掩码。 -
capacity
:指定节点的 IP 地址容量。在 AWS 上,IP 地址容量为每个 IP 地址系列提供。在 Azure 和 GCP 上,IP 地址容量同时包括 IPv4 和 IPv6 地址。
为节点之间的流量自动附加和分离出口 IP 地址。这允许命名空间中许多 pod 的流量在集群外的位置上具有一致的源 IP 地址。这还支持 OpenShift SDN 和 OVN-Kubernetes,这是 OpenShift Container Platform 4.18 中 Red Hat OpenShift Networking 中的默认网络插件。
RHOSP 出口 IP 地址功能会创建一个名为 egressip-<IP address>
的 neutron 保留端口。使用与 OpenShift Container Platform 集群安装相同的 RHOSP 用户,您可以为此保留端口分配一个浮动 IP 地址,以便为出口流量具有可预测的 SNAT 地址。当 RHOSP 网络上的出口 IP 地址从一个节点移到另一个节点时,因为节点故障转移(例如,neutron 保留端口会被删除并重新创建)。这意味着浮动 IP 关联丢失,您需要手动将浮动 IP 地址重新分配给新的保留端口。
当 RHOSP 集群管理员为保留端口分配一个浮动 IP 时,OpenShift Container Platform 无法删除保留端口。CloudPrivateIPConfig
对象无法执行删除和移动操作,直到 RHOSP 集群管理员从保留端口取消分配浮动 IP。
以下示例演示了来自多个公共云提供商上节点的注解。注解被缩进以便于阅读。
AWS 上的 cloud.network.openshift.io/egress-ipconfig
注解示例
GCP 上的 cloud.network.openshift.io/egress-ipconfig
注解示例
以下小节描述了支持公共云环境的 IP 地址容量,用于容量计算。
9.1.2.1. Amazon Web Services(AWS)IP 地址容量限制 复制链接链接已复制到粘贴板!
在 AWS 上,IP 地址分配的限制取决于配置的实例类型。如需更多信息,请参阅 每个实例类型的每个网络接口的 IP 地址
9.1.2.2. Google Cloud Platform(GCP)IP 地址容量限制 复制链接链接已复制到粘贴板!
在 GCP 中,网络模型通过 IP 地址别名而不是 IP 地址分配来实施额外的节点 IP 地址。但是,IP 地址容量直接映射到 IP 别名容量。
IP 别名分配存在以下容量限制:
- 每个节点,IPv4 和 IPv6 的最大 IP 别名数为 100 个。
- 对于每个 VPC,IP 别名的最大数量没有被指定,但 OpenShift Container Platform 可扩展性测试显示最大为 15,000 个。
如需更多信息,请参阅 Per instance 配额和 Alias IP 范围概述。
9.1.2.3. Microsoft Azure IP 地址容量限制 复制链接链接已复制到粘贴板!
在 Azure 上,IP 地址分配有以下容量限制:
- 对于每个 NIC,对于 IPv4 和 IPv6,可分配 IP 地址的最大数量为 256。
- 对于每个虚拟网络,分配的 IP 地址的最大数量不能超过 65,536。
如需更多信息,请参阅网络限制。
9.1.3. 出口 IP 地址配置架构图 复制链接链接已复制到粘贴板!
下图显示了出口 IP 地址配置。图中描述了,在一个集群的三个节点上运行的两个不同命名空间中的四个 pod。节点从主机网络上的 192.168.126.0/18
CIDR 块中分配 IP 地址。
Node 1 和 Node 3 都标记为 k8s.ovn.org/egress-assignable: ""
,因此可用于分配出口 IP 地址。
图中的横线描述了 pod1、pod2 和 pod 3 的流量流,通过 pod 网络来从 Node 1 和 Node 3 出口集群。当外部服务从示例 EgressIP
对象选择的任何 pod 接收流量时,源 IP 地址为 192.168.126.10
或 192.168.126.102
。这两个节点之间流量大致平衡。
根据示意图,以下清单文件定义命名空间:
命名空间对象
根据示意图,以下 EgressIP
对象描述了一个配置,该配置选择将 env
标签设置为 prod
的任意命名空间中的所有 pod。所选 pod 的出口 IP 地址为 192.168.126.10
和 192.168.126.102
。
EgressIP
对象
对于上例中的配置,OpenShift Container Platform 会为可用节点分配两个出口 IP 地址。status
字段显示是否以及在哪里分配了出口 IP 地址。
9.1.4. 在额外网络接口中使用出口 IP 地址的注意事项 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 中,出口 IP 地址为管理员提供控制网络流量的方法。出口 IP 地址可用于 br-ex
Open vSwitch (OVS)网桥接口,以及启用了 IP 连接的任何物理接口。
您可以运行以下命令来检查网络接口类型:
ip -details link show
$ ip -details link show
主网络接口被分配一个节点 IP 地址,该地址还包含子网掩码。此节点 IP 地址的信息可以通过检查 k8s.ovn.org/node-primary-ifaddr
注解从集群中的每个节点检索。在 IPv4 集群中,此注解类似以下示例:"k8s.ovn.org/node-primary-ifaddr: {"ipv4":"192.168.111.23/24"}"
。
如果出口 IP 地址不在主网络接口子网的子网中,您可以在不属于主网络接口类型的另一个 Linux 网络接口中使用出口 IP 地址。这样一来,OpenShift Container Platform 管理员提供了对网络方面的更高级别控制,如路由、寻址、分段和安全策略。此功能允许用户选择通过特定网络接口路由工作负载流量,如流量分段或满足特殊要求。
如果出口 IP 地址不在主网络接口的子网中,则如果节点上存在,则出口流量的另一个网络接口可能会发生。
您可以通过检查 k8s.ovn.org/host-cidrs
Kubernetes 节点注解来确定哪些其他网络接口可能会支持出口 IP 地址。此注释包含为主网络接口找到的地址和子网掩码。它还包含其他网络接口地址和子网掩码信息。这些地址和子网掩码分配给使用 最长前缀匹配路由 机制的网络接口,以确定哪个网络接口支持出口 IP 地址。
OVN-Kubernetes 提供了一种机制来控制和直接从特定命名空间和 pod 出站网络流量。这样可确保它通过特定的网络接口和特定的出口 IP 地址退出集群。
对于希望出口 IP 地址和流量通过不是主网络接口的特定接口路由的用户,必须满足以下条件:
- OpenShift Container Platform 安装在裸机集群中。此功能在云或虚拟机监控程序环境中被禁用。
- OpenShift Container Platform pod 没有配置为 主机网络。
- 如果删除了网络接口,或者如果 IP 地址和子网掩码(允许在接口上托管出口 IP 地址)被删除,则会重新配置出口 IP 地址。因此,出口 IP 地址可以分配给另一个节点和接口。
- 如果您在辅助网络接口卡(NIC)上使用 Egress IP 地址,则必须使用 Node Tuning Operator 在二级 NIC 上启用 IP 转发。