指定 BGP 广告的名称。
您可以配置 MetalLB,以便使用第 2 层协议、BGP 协议或两者同时广告 IP 地址。使用第 2 层,MetalLB 提供容错的外部 IP 地址。使用 BGP,MetalLB 提供外部 IP 地址的容错性和负载均衡。
MetalLB 支持对同一组 IP 地址使用 L2 和 BGP 进行广告。
MetalLB 提供灵活性,可以有效地将地址池分配给特定的 BGP 对等体,从而分配到网络上的节点子集。这允许更复杂的配置,例如促进节点隔离或网络分割。
BGPAdvertisements
对象的字段定义在下面的表格中
字段 | 类型 | 描述 | ||
---|---|---|---|---|
|
|
指定 BGP 广告的名称。 |
||
|
|
指定 BGP 广告的命名空间。指定与 MetalLB 运算符使用的命名空间相同的命名空间。 |
||
|
|
可选:指定要在 32 位 CIDR 掩码中包含的位数。为了聚合发言者向 BGP 对等体通告的路由,将掩码应用于多个服务 IP 地址的路由,并且发言者通告聚合的路由。例如,如果聚合长度为 |
||
|
|
可选:指定要在 128 位 CIDR 掩码中包含的位数。例如,如果聚合长度为 |
||
|
|
可选:指定一个或多个 BGP 社区。每个社区都指定为两个 16 位值,用冒号字符分隔。众所周知的社区必须指定为 16 位值
|
||
|
|
可选:指定此广告的本地首选项。此 BGP 属性适用于自治系统内的 BGP 会话。 |
||
|
|
可选:使用此广告通告的 |
||
|
|
可选:用于使用此广告通告的 |
||
|
|
可选: |
||
|
|
可选:Peers 将通告所选池的 IP 的 BGP 对等体限制为此。为空时,负载均衡器 IP 将通告给配置的所有 BGP 对等体。 |
按如下方式配置 MetalLB,以便对等 BGP 路由器为 MetalLB 分配给服务的每个负载均衡器 IP 地址接收一个203.0.113.200/32
路由和一个fc00:f853:ccd:e799::1/128
路由。由于未指定localPref
和communities
字段,因此路由将使用设置为零的localPref
和无 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
按照以下步骤配置 MetalLB,使其在 203.0.113.200
到 203.0.113.203
以及 fc00:f853:ccd:e799::0
到 fc00:f853:ccd:e799::f
范围内为负载均衡服务分配 IP 地址。
为了解释这两个 BGP 通告,考虑 MetalLB 将 203.0.113.200
IP 地址分配给某个服务的情况。以该 IP 地址为例,speaker 会向 BGP 对等体通告两条路由。
203.0.113.200/32
,localPref
设置为 100
,社区属性设置为 NO_ADVERTISE
社区的数值。此规范指示对等路由器可以使用此路由,但不应将其传播给其他 BGP 对等体。
203.0.113.200/30
,将 MetalLB 分配的负载均衡器 IP 地址聚合到单条路由中。MetalLB 以社区属性设置为 8000:800
向 BGP 对等体通告此聚合路由。BGP 对等体将 203.0.113.200/30
路由传播到其他 BGP 对等体。当流量路由到具有 speaker 的节点时,将使用 203.0.113.200/32
路由将流量转发到集群和与服务关联的 Pod。
随着您添加更多服务以及 MetalLB 从池中分配更多负载均衡器 IP 地址,对等路由器将为每个服务接收一条本地路由 203.0.113.20x/32
,以及 203.0.113.200/30
聚合路由。您添加的每个服务都会生成 /30
路由,但 MetalLB 会在与对等路由器通信之前将路由去重为一个 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
要仅从特定节点集通告 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
通告。
l2Advertisements
对象的字段在以下表格中定义
字段 | 类型 | 描述 | ||
---|---|---|---|---|
|
|
指定 L2 通告的名称。 |
||
|
|
指定 L2 通告的命名空间。指定与 MetalLB 运算符使用的命名空间相同。 |
||
|
|
可选:使用此广告通告的 |
||
|
|
可选:用于使用此广告通告的 |
||
|
|
可选:
|
||
|
|
可选:用于通告负载均衡器 IP 的 |
按照以下步骤配置 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
BGPAdvertisement
和 L2Advertisement
自定义资源定义中的 ipAddressPoolSelectors
字段用于基于分配给 IPAddressPool
的标签而不是名称本身将 IPAddressPool
与通告关联。
此示例演示如何通过配置 ipAddressPoolSelectors
字段来配置 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-label
labels:
zone: east
spec:
addresses:
- 172.31.249.87/32
应用 IP 地址池的配置
$ oc apply -f ipaddresspool.yaml
创建一个使用 ipAddressPoolSelectors
通告 IP 的 L2 通告。
创建一个文件,例如 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
默认情况下,已分配给服务的 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
创建一个使用 interfaces
选择器通告 IP 的 L2 通告。
创建一个 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 的节点的方式。如果节点没有选择的接口,则选择的节点不会通告服务。 |
从 OpenShift Container Platform 4.14 开始,默认网络行为是不允许在网络接口之间转发 IP 数据包。因此,当在辅助接口上配置 MetalLB 时,您需要添加机器配置以仅为所需的接口启用 IP 转发。
从 4.13 升级的 OpenShift Container Platform 集群不受影响,因为在升级过程中会设置全局参数以启用全局 IP 转发。 |
要为辅助接口启用 IP 转发,您有两种选择
为特定接口启用 IP 转发。
为所有接口启用 IP 转发。
为特定接口启用 IP 转发可以提供更精细的控制,而为所有接口启用 IP 转发则应用全局设置。 |
通过运行以下命令修补集群网络操作符,将参数routingViaHost
设置为true
$ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig": {"routingViaHost": true} }}}}' --type=merge
通过创建和应用MachineConfig
CR,为特定辅助接口(例如bridge-net
)启用转发
在本地机器上运行以下命令,对用于配置网络内核参数的字符串进行 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
bmV0LmlwdjQuY29uZi5icmlkZ2UtbmV0LmZvcndhcmRpbmcgPSAxCm5ldC5pcHY2LmNvbmYuYnJpZGdlLW5ldC5mb3J3YXJkaW5nID0gMQpuZXQuaXB2NC5jb25mLmJyaWRnZS1uZXQucnBfZmlsdGVyID0gMApuZXQuaXB2Ni5jb25mLmJyaWRnZS1uZXQucnBfZmlsdGVyID0gMAo=
创建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,bmV0LmlwdjQuY29uZi5icmlkZ2UtbmV0LmZvcndhcmRpbmcgPSAxCm5ldC5pcHY2LmNvbmYuYnJpZGdlLW5ldC5mb3J3YXJkaW5nID0gMQpuZXQuaXB2NC5jb25mLmJyaWRnZS1uZXQucnBfZmlsdGVyID0gMApuZXQuaXB2Ni5jb25mLmJyaWRnZS1uZXQucnBfZmlsdGVyID0gMAo= (2)
verification: {}
filesystem: root
mode: 644
path: /etc/sysctl.d/enable-global-forwarding.conf
osImageURL: ""
1 | 您要启用 IP 转发的节点角色,例如worker |
2 | 使用生成的 Base64 字符串填充 |
运行以下命令应用配置
$ oc apply -f enable-ip-forward.yaml
应用机器配置后,请按照以下步骤验证更改
通过运行以下命令进入目标节点的调试会话
$ oc debug node/<node-name>
此步骤实例化一个名为<node-name>-debug
的调试 Pod。
在调试 shell 中将/host
设置为根目录,运行以下命令
$ chroot /host
调试 Pod 将宿主的根文件系统挂载到 Pod 内的/host
。通过将根目录更改为/host
,您可以运行包含在主机可执行路径中的二进制文件。
运行以下命令验证是否启用了 IP 转发
$ cat /etc/sysctl.d/enable-global-forwarding.conf
net.ipv4.conf.bridge-net.forwarding = 1
net.ipv6.conf.bridge-net.forwarding = 1
net.ipv4.conf.bridge-net.rp_filter = 0
net.ipv6.conf.bridge-net.rp_filter = 0
输出指示在bridge-net
接口上启用了 IPv4 和 IPv6 数据包转发。