IPPool 使用说明¶
集群默认地址池¶
如果创建 LoadBalancer Service 的时候没有通过 Annotations:metallb.universe.tf/address-pool
指定地址池或通过 Annotation:metallb.universe.tf/loadBalancerIPs
指定 IP,那么会从现存的地址池中设置 autoAssign=true
的池中分配地址。
Note
创建的地址池必须跟 MetalLb 组件在同一个 namespace,否则 MetalLb 无法识别。
指定地址池¶
创建 LoadBalancer Service 的时候可以通过 Annotations:metallb.universe.tf/address-pool
指定地址池:
apiVersion: v1
kind: Service
metadata:
name: metallb-ippool3
labels:
name: metallb-ippool3
annotations:
metallb.universe.tf/address-pool: default # default 必须和 metallb 组件在同一个 namespace 下
spec:
type: LoadBalancer
...
创建 LoadBalancer Service,详情请参考创建服务(Service)。
MetalLB IP 池:部署 MetalLB 时设置的 IP 池,其中的 IP 为真实可用的物理 IP 地址。 负载均衡 IP:负载均衡 IP 为 IP 池中随机分配或手动指定的地址,用于对外暴露服务。
指定 IP 地址¶
创建 LoadBalancer Service 的时候可以通过 Annotations:metallb.universe.tf/loadBalancerIPs
指定 IP:
apiVersion: v1
kind: Service
metadata:
name: metallb-ippool3
labels:
name: metallb-ippool3
annotations:
metallb.universe.tf/loadBalancerIPs: 172.16.13.210 # 该 IP 地址必须存在于现存的地址池中
spec:
type: LoadBalancer
...
共享 IP 地址¶
在 k8s v1.20 之前,LoadBalancer Service 不支持配置多种协议(v1.24 支持,已成为 Beta 功能),参考 #issue 23880。
MetalLb 通过创建不同的 Service 并共享 Service IP,间接的支持这个功能。
创建两个 Service:
apiVersion: v1
kind: Service
metadata:
name: dns-service-tcp
namespace: default
annotations:
metallb.universe.tf/allow-shared-ip: "key-to-share-1.2.3.4"
spec:
type: LoadBalancer
loadBalancerIP: 1.2.3.4
ports:
- name: dnstcp
protocol: TCP
port: 53
targetPort: 53
selector:
app: dns
---
apiVersion: v1
kind: Service
metadata:
name: dns-service-udp
namespace: default
annotations:
metallb.universe.tf/allow-shared-ip: "key-to-share-1.2.3.4"
spec:
type: LoadBalancer
loadBalancerIP: 1.2.3.4
ports:
- name: dnsudp
protocol: UDP
port: 53
targetPort: 53
selector:
app: dns
Note
只要 Annotations (metallb.universe.tf/allow-shared-ip
) 的 key 和 value 相同,那么不同的 LoadBalancer Service 就会具有相同的 IP 地址(ipv4/ipv6)。 当然也可以通过 Annotations (metallb.universe.tf/loadBalancerIPs
) 指定 ipv4/ipv6 地址,或者通过 .spec.loadBalancerIP
指定(只支持 ipv4)。 创建后编辑 Annotation 没有效果。
共享 IP 另一个作用是 LoadBalancer IP 地址不足,需要多个 Service 共享同一个 IP,但注意不同 Service 的协议和端口应该是不同的,否则无法区分连接。
共享 IP 池¶
开启共享 IP 池后,该 IP 池中所有的 IP 地址均为共享 IP 地址。
Default IPPool 开启共享 IP 池¶
-
通过 Helm 模板安装 MetalLB ,并开启 Shared Default IP Pool 开关
-
创建 service 时选择共享的 MetalLB IP池,并填写负载均衡 IP 地址。
非 Default IPPool 开启共享 IP 池¶
手动给 Helm 应用 MetalLB 打上 annotations
:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
annotations:
metallb.universe.tf/share-address-pool: true # 增加这一行
generation: 1
name: test-2048-pool
namespace: metallb-system
resourceVersion: "1306403711"
uid: e50c8f73-688a-47f9-ac45-0cbbd5cfe878
spec:
addresses:
- 10.6.202.90-10.6.202.100
autoAssign: false
avoidBuggyIPs: false
创建 service 时选择共享的 MetalLB IP 池,并填写负载均衡 IP 地址。