跳转至

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 池中随机分配或手动指定的地址,用于对外暴露服务。

MetalLb IPPool

指定 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
  ...

specify IP

共享 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 池

  1. 通过 Helm 模板安装 MetalLB ,并开启 Shared Default IP Pool 开关

    开启sharedippool

  2. 创建 service 时选择共享的 MetalLB IP池,并填写负载均衡 IP 地址。

    创建service

非 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 地址。

创建 service

评论