4.2. 关于 IP 地址池的广告
您可以配置 MetalLB,以便使用第 2 层协议、BGP 协议或两者来广告 IP 地址。通过第 2 层,MetalLB 提供了容错的外部 IP 地址。使用 BGP,MetalLB 为外部 IP 地址和负载均衡提供容错功能。
MetalLB 支持将 L2 和 BGP 用于同一组 IP 地址。
MetalLB 提供了将地址池分配给特定 BGP 对等对象到网络上节点子集的灵活性。这可以实现更复杂的配置,例如促进节点隔离或网络分段。
4.2.1. 关于 BGPAdvertisement 自定义资源 复制链接链接已复制到粘贴板!
BGPAdvertise 对象的字段在下表中定义:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 指定 BGP 广告的名称。 |
|
|
| 指定 BGP 广告的命名空间。指定 MetalLB Operator 使用的同一命名空间。 |
|
|
|
可选:指定 32 位 CIDR 掩码中包含的位数。为了聚合发言人向 BGP 对等者公告的路由,掩码将应用于多个服务 IP 地址的路由,speaker 会公告聚合的路由。例如,聚合长度为 |
|
|
|
可选:指定 128 位 CIDR 掩码中包含的位数。例如,在聚合长度为 |
|
|
| 可选:指定一个或多个 BGP 社区。每个社区都被指定为两个 16 位值,用冒号字符分隔。知名的社区必须指定为 16 位值:
|
|
|
| 可选:指定这个广播的本地首选项。此 BGP 属性适用于 Autonomous System 中的 BGP 会话。 |
|
|
|
可选:用于使用这个广告进行广告的 |
|
|
|
可选:使用这个广告进行广告的 |
|
|
|
可选: |
|
|
|
可选:使用列表为每个 |
4.2.2. 使用 BGP 公告和基本用例配置 MetalLB 复制链接链接已复制到粘贴板!
按如下所示配置 MetalLB,使对等 BGP 路由器为每个 MetalLB 分配为服务的负载均衡器 IP 地址接收一个 203.0.113.200/32 路由和一个 fc00:f853:ccd:e799::1/128 路由。因为没有指定 localPref 和 community 字段,所以路由会公告,并将 localPref 设置为 0,且没有 BGP 社区。
4.2.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
4.2.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 公告,然后再与对等路由器通信。
4.2.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
4.2.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。
4.2.5. 关于 L2Advertisement 自定义资源 复制链接链接已复制到粘贴板!
l2Advertise 对象的字段在下表中定义:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 指定 L2 广告的名称。 |
|
|
| 指定 L2 广告的命名空间。指定 MetalLB Operator 使用的同一命名空间。 |
|
|
|
可选:用于使用这个广告进行广告的 |
|
|
|
可选:使用这个广告进行广告的 |
|
|
|
可选: 重要 限制节点,因为下一跃点只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。 有关红帽技术预览功能支持范围的更多信息,请参阅以下链接: |
|
|
|
可选:用于声明负载均衡器 IP 的 |
4.2.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
4.2.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
4.2.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 的节点。如果节点没有所选接口,则所选节点不会宣布该服务。
4.2.9. 使用二级网络配置 MetalLB 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 4.14 中,默认的网络行为是不允许在网络接口之间转发 IP 数据包。因此,当在二级接口上配置 MetalLB 时,您需要添加机器配置来只为所需的接口启用 IP 转发。
从 4.13 升级的 OpenShift Container Platform 集群不受影响,因为在升级过程中设置了全局参数来启用全局 IP 转发。
要为二级接口启用 IP 转发,有两个选项:
- 为特定接口启用 IP 转发。
为所有接口启用 IP 转发。
注意为特定接口启用 IP 转发提供了更精细的控制,同时为所有接口启用它应用全局设置。
4.2.9.1. 为特定接口启用 IP 转发 复制链接链接已复制到粘贴板!
流程
运行以下命令修补 Cluster Network Operator,将参数
routingViaHost设置为true:$ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig": {"routingViaHost": true} }}}}' --type=merge通过创建并应用
MachineConfigCR,为特定二级接口启用转发,如bridge-net:在本地机器中运行以下命令来配置网络内核参数的字符串(基于 Base64 编码):
$ echo -e "net.ipv4.conf.bridge-net.forwarding = 1" | base64 -w0输出示例
bmV0LmlwdjQuY29uZi5icmlkZ2UtbmV0LmZvcndhcmRpbmcgPSAxCg==-
创建
MachineConfigCR,为名为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,bmV0LmlwdjQuY29uZi5icmlkZ2UtbmV0LmZvcndhcmRpbmcgPSAxCg==2 verification: {} filesystem: root mode: 420 path: /etc/sysctl.d/enable-global-forwarding.conf osImageURL: ""运行以下命令来应用配置:
$ oc apply -f enable-ip-forward.yaml
验证
应用机器配置后,按照以下步骤验证更改:
运行以下命令,在目标节点上进入 debug 会话:
$ oc debug node/<node-name>此步骤实例化一个名为
<node-name>-debug的 debug pod。运行以下命令,将
/host设置为 debug shell 中的根目录:$ chroot /hostdebug pod 在 pod 中的
/host中挂载主机的 root 文件系统。通过将根目录改为/host,您可以运行主机可执行路径中包含的二进制文件。运行以下命令验证 IP 转发是否已启用:
$ cat /etc/sysctl.d/enable-global-forwarding.conf预期输出
net.ipv4.conf.bridge-net.forwarding = 1输出显示
bridge-net接口上启用了 IPv4 转发。
4.2.9.2. 全局启用 IP 转发 复制链接链接已复制到粘贴板!
运行以下命令来全局启用 IP 转发:
$ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}' --type=merge