第 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 地址功能的支持:

Expand
平台支持

裸机

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)
Copy to Clipboard Toggle word wrap

虽然 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 注解示例

cloud.network.openshift.io/egress-ipconfig: [
  {
    "interface":"eni-078d267045138e436",
    "ifaddr":{"ipv4":"10.0.128.0/18"},
    "capacity":{"ipv4":14,"ipv6":15}
  }
]
Copy to Clipboard Toggle word wrap

GCP 上的 cloud.network.openshift.io/egress-ipconfig 注解示例

cloud.network.openshift.io/egress-ipconfig: [
  {
    "interface":"nic0",
    "ifaddr":{"ipv4":"10.0.128.0/18"},
    "capacity":{"ip":14}
  }
]
Copy to Clipboard Toggle word wrap

以下小节描述了支持公共云环境的 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.10192.168.126.102。这两个节点之间流量大致平衡。

根据示意图,以下清单文件定义命名空间:

命名空间对象

apiVersion: v1
kind: Namespace
metadata:
  name: namespace1
  labels:
    env: prod
---
apiVersion: v1
kind: Namespace
metadata:
  name: namespace2
  labels:
    env: prod
Copy to Clipboard Toggle word wrap

根据示意图,以下 EgressIP 对象描述了一个配置,该配置选择将 env 标签设置为 prod 的任意命名空间中的所有 pod。所选 pod 的出口 IP 地址为 192.168.126.10192.168.126.102

EgressIP 对象

apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
  name: egressips-prod
spec:
  egressIPs:
  - 192.168.126.10
  - 192.168.126.102
  namespaceSelector:
    matchLabels:
      env: prod
status:
  items:
  - node: node1
    egressIP: 192.168.126.10
  - node: node3
    egressIP: 192.168.126.102
Copy to Clipboard Toggle word wrap

对于上例中的配置,OpenShift Container Platform 会为可用节点分配两个出口 IP 地址。status 字段显示是否以及在哪里分配了出口 IP 地址。

在 OpenShift Container Platform 中,出口 IP 地址为管理员提供控制网络流量的方法。出口 IP 地址可用于 br-ex Open vSwitch (OVS)网桥接口,以及启用了 IP 连接的任何物理接口。

您可以运行以下命令来检查网络接口类型:

$ ip -details link show
Copy to Clipboard Toggle word wrap

主网络接口被分配一个节点 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 转发。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat