26.6. 将服务配置为使用 MetalLB
作为集群管理员,当添加类型为 LoadBalancer
的服务时,您可以控制 MetalLB 如何分配 IP 地址。
26.6.1. 请求特定 IP 地址
与其他一些负载均衡器实施一样,MetalLB 接受服务规格中的 spec.loadBalancerIP
字段。
如果请求的 IP 地址位于任何地址池中,MetalLB 会分配请求的 IP 地址。如果请求的 IP 地址不在任何范围内,MetalLB 会报告警告。
特定 IP 地址的服务 YAML 示例
apiVersion: v1 kind: Service metadata: name: <service_name> annotations: metallb.universe.tf/address-pool: <address_pool_name> spec: selector: <label_key>: <label_value> ports: - port: 8080 targetPort: 8080 protocol: TCP type: LoadBalancer loadBalancerIP: <ip_address>
如果 MetalLB 无法分配请求的 IP 地址,服务报告的 EXTERNAL-IP
会报告 <pending>
,运行 oc describe service <service_name>
会包括一个类似以下示例的事件。
当 MetalLB 无法分配请求的 IP 地址时的示例
... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning AllocationFailed 3m16s metallb-controller Failed to allocate IP for "default/invalid-request": "4.3.2.1" is not allowed in config
26.6.2. 从特定池中请求 IP 地址
要从特定范围分配 IP 地址,但您不关注特定的 IP 地址,您可以使用 metallb.universe.tf/address-pool
注解从指定地址池中请求 IP 地址。
来自特定池的 IP 地址的服务 YAML 示例
apiVersion: v1 kind: Service metadata: name: <service_name> annotations: metallb.universe.tf/address-pool: <address_pool_name> spec: selector: <label_key>: <label_value> ports: - port: 8080 targetPort: 8080 protocol: TCP type: LoadBalancer
如果您为 <address_pool_name>
指定的地址池不存在,MetalLB 会尝试从允许自动分配的池中分配 IP 地址。
26.6.3. 接受任何 IP 地址
默认情况下,地址池配置为允许自动分配。MetalLB 从这些地址池中分配 IP 地址。
若要接受任何为自动分配配置的池的 IP 地址,不需要特殊注释或配置。
接受任何 IP 地址的服务 YAML 示例
apiVersion: v1 kind: Service metadata: name: <service_name> spec: selector: <label_key>: <label_value> ports: - port: 8080 targetPort: 8080 protocol: TCP type: LoadBalancer
26.6.5. 使用 MetalLB 配置服务
您可以将负载平衡服务配置为使用地址池中的外部 IP 地址。
先决条件
-
安装 OpenShift CLI (
oc
) 。 - 安装 MetalLB Operator 并启动 MetalLB。
- 至少配置一个地址池。
- 配置网络,将流量从客户端路由到集群的主机网络。
流程
创建一个
<service_name>.yaml
文件。在文件中,确保将spec.type
字段设置为LoadBalancer
。有关如何请求 MetalLB 分配给服务的外部 IP 地址的信息,请参考示例。
创建服务:
$ oc apply -f <service_name>.yaml
输出示例
service/<service_name> created
验证
描述该服务:
$ oc describe service <service_name>
输出示例
Name: <service_name> Namespace: default Labels: <none> Annotations: metallb.universe.tf/address-pool: doc-example <.> Selector: app=service_name Type: LoadBalancer <.> IP Family Policy: SingleStack IP Families: IPv4 IP: 10.105.237.254 IPs: 10.105.237.254 LoadBalancer Ingress: 192.168.100.5 <.> Port: <unset> 80/TCP TargetPort: 8080/TCP NodePort: <unset> 30550/TCP Endpoints: 10.244.0.50:8080 Session Affinity: None External Traffic Policy: Cluster Events: <.> Type Reason Age From Message ---- ------ ---- ---- ------- Normal nodeAssigned 32m (x2 over 32m) metallb-speaker announcing from node "<node_name>"
<.> 注解存在,如果您从特定池请求 IP 地址。<.> 服务类型必须指示
LoadBalancer
。<.> 如果服务被正确分配,则 load-balancer ingress 字段指示外部 IP 地址。<.> events 字段表示分配给声明外部 IP 地址的节点名称。如果出现错误,Event 字段会指示错误的原因。