32.5. 关于 IP 地址池的广告
您可以配置 MetalLB,以便使用第 2 层协议、BGP 协议或两者来广告 IP 地址。通过第 2 层,MetalLB 提供了容错的外部 IP 地址。使用 BGP,MetalLB 为外部 IP 地址和负载均衡提供容错功能。
MetalLB 支持将 L2 和 BGP 用于同一组 IP 地址。
MetalLB 提供了将地址池分配给特定 BGP 对等对象到网络上节点子集的灵活性。这可以实现更复杂的配置,例如促进节点隔离或网络分段。
32.5.1. 关于 BGPAdvertisement 自定义资源
BGPAdvertise
对象的字段在下表中定义:
字段 | 类型 | 描述 |
---|---|---|
|
| 指定 BGP 广告的名称。 |
|
| 指定 BGP 广告的命名空间。指定 MetalLB Operator 使用的同一命名空间。 |
|
|
可选:指定 32 位 CIDR 掩码中包含的位数。为了聚合发言人向 BGP 对等者公告的路由,掩码将应用于多个服务 IP 地址的路由,speaker 会公告聚合的路由。例如,聚合长度为 |
|
|
可选:指定 128 位 CIDR 掩码中包含的位数。例如,在聚合长度为 |
|
| 可选:指定一个或多个 BGP 社区。每个社区都被指定为两个 16 位值,用冒号字符分隔。知名的社区必须指定为 16 位值:
|
|
| 可选:指定这个广播的本地首选项。此 BGP 属性适用于 Autonomous System 中的 BGP 会话。 |
|
|
可选:用于使用这个广告进行广告的 |
|
|
可选:使用这个广告进行广告的 |
|
|
可选: |
|
| 可选: Peers 限制 BGP 对等点来公告所选池的 IP。如果为空,负载均衡器 IP 会声明所有配置了 BGP 对等点。 |
32.5.2. 使用 BGP 公告和基本用例配置 MetalLB
按如下所示配置 MetalLB,使对等 BGP 路由器为每个 MetalLB 分配为服务的负载均衡器 IP 地址接收一个 203.0.113.200/32
路由和一个 fc00:f853:ccd:e799::1/128
路由。因为没有指定 localPref
和 community
字段,所以路由会公告,并将 localPref
设置为 0,且没有 BGP 社区。
32.5.2.1. 示例:使用 BGP 传输基本地址池配置
按如下所示配置 MetalLB,以便使用 BGP 协议公告 IPAddressPool
。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
创建 IP 地址池。
创建一个文件,如
ipaddresspool.yaml
,其内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-bgp-basic spec: addresses: - 203.0.113.200/30 - fc00:f853:ccd:e799::/124
应用 IP 地址池的配置:
$ oc apply -f ipaddresspool.yaml
创建 BGP 公告。
创建一个文件,如
bgpadvertisement.yaml
,内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: bgpadvertisement-basic namespace: metallb-system spec: ipAddressPools: - doc-example-bgp-basic
应用配置:
$ oc apply -f bgpadvertisement.yaml
32.5.3. 使用 BGP 广告和高级用例配置 MetalLB
按如下所示配置 MetalLB,使得 MetalLB 分配给负载均衡器的 IP 地址范围是 203.0.113.200
到 203.0.113.203
,以及 fc00:f853:ccd:e799::0
到 fc00:f853:ccd:e799::f
。
为了说明两个 BGP 公告,在 MetalLB 分配 IP 地址 203.0.113.200
时,请考虑实例。以该 IP 地址为例,发言人向 BGP 对等点公告两个路由:
-
203.0.113.200/32
,localPref
设置为100
,社区设置为NO_ADVERTISE
社区的数字值。此规范指示它们可以使用此路由的对等路由器,但它们不应将有关此路由的信息传播到 BGP 对等点。 -
203.0.113.200/30
将 MetalLB 分配的负载均衡器 IP 地址聚合到一个路由中。MetalLB 公告到 BGP 对等点的聚合路由,并将 community 属性设置为8000:800
。BGP 同行将203.0.113.200/30
个路由传播到其他 BGP 同级服务器。当流量通过发言人路由到节点时,使用203.0.113.200/32
路由将流量转发到集群以及与该服务关联的 pod。
当添加更多服务和 MetalLB 从池中分配更多负载均衡器 IP 地址时,对等路由器收到一个本地路由,203.0.113.20x/32
,以及 203.0.113.200/30
聚合路由。您添加的每个服务都会生成 /30
路由,但 MetalLB 会将路由重复数据删除到一个 BGP 公告,然后再与对等路由器通信。
32.5.3.1. 示例:使用 BGP 传输高级地址池配置
按如下所示配置 MetalLB,以便使用 BGP 协议公告 IPAddressPool
。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
创建 IP 地址池。
创建一个文件,如
ipaddresspool.yaml
,其内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-bgp-adv labels: zone: east spec: addresses: - 203.0.113.200/30 - fc00:f853:ccd:e799::/124 autoAssign: false
应用 IP 地址池的配置:
$ oc apply -f ipaddresspool.yaml
创建 BGP 公告。
创建一个文件,如
bgpadvertisement1.yaml
,内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: bgpadvertisement-adv-1 namespace: metallb-system spec: ipAddressPools: - doc-example-bgp-adv communities: - 65535:65282 aggregationLength: 32 localPref: 100
应用配置:
$ oc apply -f bgpadvertisement1.yaml
创建一个文件,如
bgpadvertisement2.yaml
,内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: bgpadvertisement-adv-2 namespace: metallb-system spec: ipAddressPools: - doc-example-bgp-adv communities: - 8000:800 aggregationLength: 30 aggregationLengthV6: 124
应用配置:
$ oc apply -f bgpadvertisement2.yaml
32.5.4. 从节点的子集公告 IP 地址池
要从 IP 地址池公告 IP 地址,请只使用特定的节点集合,使用 BGPAdvertisement 自定义资源中的 .spec.nodeSelector
规格。此规格将 IP 地址池与集群中的一组节点关联。如果您在集群中的不同子网上有节点,而您想要从特定子网的地址池中公告 IP 地址,例如仅面向公共的子网。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
使用自定义资源创建 IP 地址池:
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: pool1 spec: addresses: - 4.4.4.100-4.4.4.200 - 2001:100:4::200-2001:100:4::400
通过在 BGPAdvertisement 自定义资源中定义
.spec.nodeSelector
值,控制pool1
广告的 IP 地址来自集群中的哪些节点:apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: example spec: ipAddressPools: - pool1 nodeSelector: - matchLabels: kubernetes.io/hostname: NodeA - matchLabels: kubernetes.io/hostname: NodeB
在本例中,pool1
广告的 IP 地址仅来自 NodeA
和 NodeB
。
32.5.5. 关于 L2Advertisement 自定义资源
l2Advertise
对象的字段在下表中定义:
字段 | 类型 | 描述 |
---|---|---|
|
| 指定 L2 广告的名称。 |
|
| 指定 L2 广告的命名空间。指定 MetalLB Operator 使用的同一命名空间。 |
|
|
可选:用于使用这个广告进行广告的 |
|
|
可选:使用这个广告进行广告的 |
|
|
可选: 重要 限制节点,因为下一跃点只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。 有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。 |
|
|
可选:用于声明负载均衡器 IP 的 |
32.5.6. 使用 L2 广告配置 MetalLB
按如下所示配置 MetalLB,以便使用 L2 协议广告 IPAddressPool
。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
创建 IP 地址池。
创建一个文件,如
ipaddresspool.yaml
,其内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-l2 spec: addresses: - 4.4.4.0/24 autoAssign: false
应用 IP 地址池的配置:
$ oc apply -f ipaddresspool.yaml
创建 L2 广告。
创建一个文件,如
l2advertisement.yaml
,内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2advertisement namespace: metallb-system spec: ipAddressPools: - doc-example-l2
应用配置:
$ oc apply -f l2advertisement.yaml
32.5.7. 使用 L2 广告和标签配置 MetalLB
BGPAdvertisement
和 L2Advertisement
中的 ipAddress
Pools 字段用于根据分配给 IPAddressPool
的标签将 IPAddressPool
与广告相关联。
本例演示了如何配置 MetalLB,以便通过配置 ipAddressPoolSelectors
字段来广告使用 L2 协议的 IPAddressPools
。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
创建 IP 地址池。
创建一个文件,如
ipaddresspool.yaml
,其内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-l2-label labels: zone: east spec: addresses: - 172.31.249.87/32
应用 IP 地址池的配置:
$ oc apply -f ipaddresspool.yaml
使用
ipAddressPoolSelectors
创建 L2 广告广告 IP。创建一个文件,如
l2advertisement.yaml
,内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2advertisement-label namespace: metallb-system spec: ipAddressPoolSelectors: - matchExpressions: - key: zone operator: In values: - east
应用配置:
$ oc apply -f l2advertisement.yaml
32.5.8. 为所选接口配置带有 L2 广告的 MetalLB
默认情况下,分配给该服务的 IP 地址池的 IP 地址将从所有网络接口公告。L2Advertisement
自定义资源定义中的 interfaces
字段用于限制公告 IP 地址池的网络接口。
本例演示了如何配置 MetalLB,以便仅从所有节点的 interfaces
字段中列出的网络接口公告 IP 地址池。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您以具有
cluster-admin
权限的用户身份登录。
流程
创建 IP 地址池。
创建一个文件,如
ipaddresspool.yaml
,并输入类似以下示例的配置详情:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-l2 spec: addresses: - 4.4.4.0/24 autoAssign: false
为 IP 地址池应用配置,如下例所示:
$ oc apply -f ipaddresspool.yaml
使用
接口
选择器创建 L2 广告广告 IP。创建一个 YAML 文件,如
l2advertisement.yaml
,并输入类似以下示例的配置详情:apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2advertisement namespace: metallb-system spec: ipAddressPools: - doc-example-l2 interfaces: - interfaceA - interfaceB
为公告应用配置,如下例所示:
$ oc apply -f l2advertisement.yaml
接口选择器不会影响 MetalLB 如何使用 L2 选择给定 IP 的节点。如果节点没有所选接口,则所选节点不会宣布该服务。
32.5.9. 使用二级网络配置 MetalLB
在 OpenShift Container Platform 4.14 中,默认的网络行为是不允许在网络接口之间转发 IP 数据包。因此,当在二级接口上配置 MetalLB 时,您需要添加机器配置来只为所需的接口启用 IP 转发。
从 4.13 升级的 OpenShift Container Platform 集群不受影响,因为在升级过程中设置了全局参数来启用全局 IP 转发。
要为二级接口启用 IP 转发,有两个选项:
- 为所有接口启用 IP 转发。
为特定接口启用 IP 转发。
注意为特定接口启用 IP 转发提供了更精细的控制,同时为所有接口启用它应用全局设置。
流程
通过创建并应用
MachineConfig
CR,为特定二级接口启用转发,如bridge-net
。-
创建
MachineConfig
CR,为名为bridge-net
的指定的二级接口启用 IP 转发。 将以下 YAML 保存到
enable-ip-forward.yaml
文件中:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: <node_role> 1 name: 81-enable-global-forwarding spec: config: ignition: version: 3.2.0 storage: files: - contents: source: data:text/plain;charset=utf-8;base64,`echo -e "net.ipv4.conf.bridge-net.forwarding = 1\nnet.ipv6.conf.bridge-net.forwarding = 1\nnet.ipv4.conf.bridge-net.rp_filter = 0\nnet.ipv6.conf.bridge-net.rp_filter = 0" | base64 -w0` verification: {} filesystem: root mode: 644 path: /etc/sysctl.d/enable-global-forwarding.conf osImageURL: ""
- 1
- 要启用 IP 转发的节点角色,如
worker
运行以下命令来应用配置:
$ oc apply -f enable-ip-forward.yaml
-
创建
另外,您可以运行以下命令来全局启用 IP 转发:
$ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}