cloud.network.openshift.io/egress-ipconfig: [
{
"interface":"eni-078d267045138e436",
"ifaddr":{"ipv4":"10.0.128.0/18"},
"capacity":{"ipv4":14,"ipv6":15}
}
]
作为集群管理员,您可以配置 OVN-Kubernetes 容器网络接口 (CNI) 网络插件,以将一个或多个出站 IP 地址分配给命名空间或命名空间中的特定 Pod。
AWS 上的 Red Hat OpenShift 服务出站 IP 地址功能允许您确保来自一个或多个命名空间中的一个或多个 Pod 的流量对于集群网络外部的服务具有一致的源 IP 地址。
例如,您可能有一个定期查询托管在集群外部服务器上的数据库的 Pod。为了执行服务器的访问要求,数据包过滤设备被配置为仅允许来自特定 IP 地址的流量。为了确保您可以可靠地仅允许来自该特定 Pod 的对服务器的访问,您可以为向服务器发出请求的 Pod 配置特定的出站 IP 地址。
分配给命名空间的出站 IP 地址与用于将流量发送到特定目标的出站路由器不同。
在使用 HCP 集群的 ROSA 中,应用程序 Pod 和入口路由器 Pod 运行在同一节点上。在这种情况下,如果您为此应用程序项目配置出站 IP 地址,则在您从应用程序项目向路由发送请求时不会使用该 IP 地址。
不支持使用 EgressIP 功能将出站 IP 地址分配给控制平面节点。 |
以下示例说明了来自多个公共云提供商节点上的注释。为提高可读性,注释已缩进。
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}
}
]
以下部分描述了受支持的公共云环境的 IP 地址容量,供您在容量计算中使用。
在 AWS 上,对 IP 地址分配的限制取决于配置的实例类型。有关更多信息,请参阅 每个实例类型的每个网络接口的 IP 地址数
要将一个或多个出站 IP 分配给命名空间或命名空间中的特定 Pod,必须满足以下条件:
您的集群中至少一个节点必须具有 k8s.ovn.org/egress-assignable: ""
标签。
存在一个 EgressIP
对象,该对象定义了一个或多个出站 IP 地址,用作从命名空间中的 Pod 离开集群的流量的源 IP 地址。
如果您在标记集群中任何用于出站 IP 分配的节点之前创建 为确保出站 IP 地址在集群中的节点之间广泛分布,请务必在创建任何 |
创建 EgressIP
对象时,以下条件适用于标有 k8s.ovn.org/egress-assignable: ""
标签的节点:
出站 IP 地址一次只能分配给一个节点。
出站 IP 地址在可以托管出站 IP 地址的可用节点之间平均分配。
如果 EgressIP
对象中的 spec.EgressIPs
数组指定多个 IP 地址,则适用以下条件:
任何节点都不会托管多个指定的 IP 地址。
流量在给定命名空间的指定 IP 地址之间大致平均分配。
如果节点不可用,则分配给它的任何出站 IP 地址都会自动重新分配,但要遵守前面描述的条件。
当 Pod 与多个 EgressIP
对象的选择器匹配时,无法保证 EgressIP
对象中指定的哪个出站 IP 地址将被分配为 Pod 的出站 IP 地址。
此外,如果 EgressIP
对象指定多个出站 IP 地址,则无法保证可能使用哪个出站 IP 地址。例如,如果 Pod 与具有两个出站 IP 地址(10.10.20.1
和 10.10.20.2
)的 EgressIP
对象的选择器匹配,则任何一个都可能用于每个 TCP 连接或 UDP 会话。
下图描述了出站 IP 地址配置。该图描述了集群中三个节点上运行的两个不同命名空间中的四个 Pod。这些节点从主机网络上的 192.168.126.0/18
CIDR 块分配 IP 地址。
节点 1 和节点 3 都标有 k8s.ovn.org/egress-assignable: ""
,因此可用于分配出站 IP 地址。
图中的虚线表示来自 pod1、pod2 和 pod3 的流量通过 pod 网络,从 Node 1 和 Node 3 离开集群。当外部服务接收来自示例EgressIP
对象选择的任何 pod 的流量时,源 IP 地址为192.168.126.10
或192.168.126.102
。流量在这两个节点之间大致平均分配。
下文将详细说明图中所示的以下资源:
Namespace
对象命名空间在以下清单中定义:
apiVersion: v1
kind: Namespace
metadata:
name: namespace1
labels:
env: prod
---
apiVersion: v1
kind: Namespace
metadata:
name: namespace2
labels:
env: prod
EgressIP
对象以下EgressIP
对象描述了一个配置,该配置选择任何命名空间中带有env
标签设置为prod
的所有 pod。所选 pod 的出口 IP 地址为192.168.126.10
和192.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
对于前面的示例配置,Red Hat OpenShift Service on AWS 会将这两个出口 IP 地址分配给可用的节点。status
字段反映了出口 IP 地址是否以及在何处分配。
以下 YAML 描述了EgressIP
对象的 API。该对象的范围是集群范围的;它不是在命名空间中创建的。
apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
name: <name> (1)
spec:
egressIPs: (2)
- <ip_address>
namespaceSelector: (3)
...
podSelector: (4)
...
1 | EgressIPs 对象的名称。 |
2 | 一个或多个 IP 地址的数组。 |
3 | 要将出口 IP 地址关联到的命名空间的一个或多个选择器。 |
4 | 可选:要将出口 IP 地址关联到的指定命名空间中 pod 的一个或多个选择器。应用这些选择器允许选择命名空间内 pod 的子集。 |
以下 YAML 描述了命名空间选择器的段落:
namespaceSelector: (1)
matchLabels:
<label_name>: <label_value>
1 | 命名空间的一个或多个匹配规则。如果提供了多个匹配规则,则选择所有匹配的命名空间。 |
以下 YAML 描述了 pod 选择器的可选段落:
podSelector: (1)
matchLabels:
<label_name>: <label_value>
1 | 可选:与指定的namespaceSelector 规则匹配的命名空间中 pod 的一个或多个匹配规则。如果指定,则仅选择匹配的 pod。命名空间中的其他 pod 不会被选择。 |
在以下示例中,EgressIP
对象将192.168.126.11
和192.168.126.102
出口 IP 地址与具有app
标签设置为web
且位于env
标签设置为prod
的命名空间中的 pod 关联。
EgressIP
对象apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
name: egress-group1
spec:
egressIPs:
- 192.168.126.11
- 192.168.126.102
podSelector:
matchLabels:
app: web
namespaceSelector:
matchLabels:
env: prod
在以下示例中,EgressIP
对象将192.168.127.30
和192.168.127.40
出口 IP 地址与任何不具有environment
标签设置为development
的 pod 关联。
EgressIP
对象apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
name: egress-group2
spec:
egressIPs:
- 192.168.127.30
- 192.168.127.40
namespaceSelector:
matchExpressions:
- key: environment
operator: NotIn
values:
- development
您可以将k8s.ovn.org/egress-assignable=""
标签应用于集群中的节点,以便 Red Hat OpenShift Service on AWS 可以将一个或多个出口 IP 地址分配给该节点。
安装 ROSA CLI (rosa
)。
以集群管理员身份登录集群。
要为节点添加标签以便它可以托管一个或多个出口 IP 地址,请输入以下命令:
$ rosa edit machinepool <machinepool_name> --cluster=<cluster_name> --labels "k8s.ovn.org/egress-assignable="
此命令将替换您机器池上任何现有的节点标签。您应该将任何所需的标签包含在 |