第 27 章 使用 MetalLB 进行负载平衡
27.1. 配置 MetalLB 地址池
作为集群管理员,您可以添加、修改和删除地址池。MetalLB Operator 使用地址池自定义资源来设置 MetalLB 可分配给服务的 IP 地址。示例中使用的命名空间假定命名空间是 metallb-system
。
有关如何安装 MetalLB Operator 的更多信息,请参阅关于 MetalLB 和 MetalLB Operator。
27.1.1. 关于 IPAddressPool 自定义资源
下表中描述了 IPAddressPool
自定义资源的字段。
字段 | 类型 | 描述 |
---|---|---|
|
|
指定地址池的名称。添加服务时,您可以在 |
|
| 指定地址池的命名空间。指定 MetalLB Operator 使用的同一命名空间。 |
|
|
可选:指定分配给 |
|
| 指定分配给服务的 MetalLB Operator 的 IP 地址列表。您可以在一个池中指定多个范围 ; 它们将共享相同的设置。以 CIDR 表示法指定每个范围,或者指定为以连字符隔开的起始和结束 IP 地址。 |
|
|
可选:指定 MetalLB 是否从这个池自动分配 IP 地址。如果要使用 |
|
|
可选:当启用时,IP 地址以 .0 和 .255 结尾时,不会从池中分配。默认值为 |
您可以通过配置 spec.serviceAllocation
规格,将 IP 地址从 IPAddressPool
分配给服务和命名空间。
字段 | 类型 | 描述 |
---|---|---|
|
| 可选:当多个 IP 地址池与服务或命名空间匹配时,定义 IP 地址池之间的优先级。较低数字表示优先级更高。 |
|
| 可选:指定您可以分配给 IP 地址池 IP 地址的命名空间列表。 |
|
| 可选:指定您可以使用列表格式的标签选择器从 IP 地址池分配给 IP 地址的命名空间标签。 |
|
| 可选:指定您可以使用列表格式的标签选择器从地址池中分配给 IP 地址的服务标签。 |
27.1.2. 配置地址池
作为集群管理员,您可以在集群中添加地址池来控制 MetalLB 可分配给负载均衡器服务的 IP 地址。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
创建一个文件,如
ipaddresspool.yaml
,其内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example labels: 1 zone: east spec: addresses: - 203.0.113.1-203.0.113.10 - 203.0.113.65-203.0.113.75
- 1
- 分配给
IPAddressPool
的该标签可通过BGPAdvertisement
CRD 中的ipAddressPoolSelectors
来引用,以将IPAddressPool
与广告关联。
应用 IP 地址池的配置:
$ oc apply -f ipaddresspool.yaml
验证
查看地址池:
$ oc describe -n metallb-system IPAddressPool doc-example
输出示例
Name: doc-example Namespace: metallb-system Labels: zone=east Annotations: <none> API Version: metallb.io/v1beta1 Kind: IPAddressPool Metadata: ... Spec: Addresses: 203.0.113.1-203.0.113.10 203.0.113.65-203.0.113.75 Auto Assign: true Events: <none>
确认输出中显示了地址池名称,如 doc-example
,并且 IP 地址范围显示在输出中。
27.1.3. 为 VLAN 配置 MetalLB 地址池
作为集群管理员,您可以在集群中添加地址池来控制 MetalLB 可分配给负载均衡器服务的创建的 VLAN 上的 IP 地址
先决条件
-
安装 OpenShift CLI(
oc
)。 - 配置单独的 VLAN。
-
以具有
cluster-admin
特权的用户身份登录。
流程
创建一个文件,如
ipaddresspool-vlan.yaml
,该文件类似以下示例:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-vlan labels: zone: east 1 spec: addresses: - 192.168.100.1-192.168.100.254 2
应用 IP 地址池的配置:
$ oc apply -f ipaddresspool-vlan.yaml
为确保此配置适用于您需要将
spec
gatewayConfig.ipForwarding
设置为Global
的 VLAN。运行以下命令来编辑网络配置自定义资源 (CR):
$ oc edit network.config.openshift/cluster
更新
spec.defaultNetwork.ovnKubernetesConfig
部分,将gatewayConfig.ipForwarding
设置为Global
。它应该类似如下:Example
... spec: clusterNetwork: - cidr: 10.128.0.0/14 hostPrefix: 23 defaultNetwork: type: OVNKubernetes ovnKubernetesConfig: gatewayConfig: ipForwarding: Global ...
27.1.4. 地址池配置示例
27.1.4.1. 示例:IPv4 和 CIDR 范围
您可以使用 CIDR 表示法指定 IP 地址范围。您可以将 CIDR 表示法与使用连字符分隔下限和上限的表示法合并。
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: doc-example-cidr namespace: metallb-system spec: addresses: - 192.168.100.0/24 - 192.168.200.0/24 - 192.168.255.1-192.168.255.5
27.1.4.2. 示例:保留 IP 地址
您可以将 autoAssign
字段设置为 false
,以防止 MetalLB 自动从池中分配 IP 地址。添加服务时,您可以从池中请求特定的 IP 地址,或者在注解中指定池名称从池中请求任何 IP 地址。
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: doc-example-reserved namespace: metallb-system spec: addresses: - 10.0.100.0/28 autoAssign: false
27.1.4.3. 示例:IPv4 和 IPv6 地址
您可以添加使用 IPv4 和 IPv6 的地址池。您可以像几个 IPv4 示例一样在 地址
列表中指定多个范围。
无论服务被分配一个 IPv4 地址、一个 IPv6 地址,还是由您添加该服务来确定。spec.ipFamilies
和 spec.ipFamilyPolicy
字段控制 IP 地址如何分配给该服务。
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: doc-example-combined namespace: metallb-system spec: addresses: - 10.0.100.0/28 - 2002:2:2::1-2002:2:2::100
27.1.4.4. 示例:将 IP 地址池分配给服务或命名空间
您可以将 IP 地址从 IPAddressPool
分配给您指定的服务和命名空间。
如果您将服务或命名空间分配给多个 IP 地址池,MetalLB 将使用较高优先级 IP 地址池中的可用 IP 地址。如果分配的 IP 地址池没有 IP 地址可用,MetalLB 将使用较低优先级或没有优先级的 IP 地址池的可用 IP 地址。
对于 namespaceSelectors
和 serviceSelectors
规格,您可以使用 matchLabels
标签选择器、matchExpressions
标签选择器或两者。本例展示了每个规格的一个标签选择器。
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: doc-example-service-allocation namespace: metallb-system spec: addresses: - 192.168.20.0/24 serviceAllocation: priority: 50 1 namespaces: 2 - namespace-a - namespace-b namespaceSelectors: 3 - matchLabels: zone: east serviceSelectors: 4 - matchExpressions: - key: security operator: In values: - S1