1.准备

如果您在 IPVS 模式下使用 kube-proxy,从 Kubernetes v1.14.2 开始,您必须启用严格的 ARP 模式。
请注意,如果您使用 kube-router 作为服务代理,则不需要它,因为它默认启用严格的 ARP。
您可以通过编辑当前集群中的 kube-proxy 配置来实现此目的:

  1. kubectl edit configmap -n kube-system kube-proxy

并设置:

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true

2.安装MetalLB

2.1.下载镜像

部署yaml文件下载地址:
下载好后在可以联网的机器中用docker下载里面的镜像,并打包上传到私有镜像仓库中

https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml

在可以联网的机器中下载镜像,并打包上传到私有镜像服务器中

docker pull quay.io/metallb/speaker:v0.11.0
docker pull quay.io/metallb/controller:v0.11.0

# 报错镜像为tar包,并上传到离线私有镜像服务器中
docker save -o speaker-0.11.0.tar quay.io/metallb/speaker:v0.11.0
docker save -o controller-0.11.0.tar quay.io/metallb/controller:v0.11.0

加载镜像到私有镜像仓库中

# 在私有镜像服务器中加载镜像
docker load -i speaker-0.11.0.tar
docker load -i controller-0.11.0.tar

# 创建tag
docker tag quay.io/metallb/speaker:v0.11.0 192.168.28.127:8001/kubesphere-install/quay.io/metallb/speaker:v0.11.0
docker tag quay.io/metallb/controller:v0.11.0 192.168.28.127:8001/kubesphere-install/quay.io/metallb/controller:v0.11.0

# push到私有镜像仓库中
docker push 192.168.28.127:8001/kubesphere-install/quay.io/metallb/speaker:v0.11.0
docker push 192.168.28.127:8001/kubesphere-install/quay.io/metallb/controller:v0.11.0

2.2.开始安装

kubectl apply -f namespace.yaml
kubectl apply -f metallb.yaml

3.配置

3.1.Layer 2 Configuration

第 2 层模式配置最简单:在许多情况下,您不需要任何特定于协议的配置,只需要 IP 地址。
第 2 层模式不需要将 IP 绑定到工作程序节点的网络接口。它的工作原理是直接响应本地网络上的 ARP 请求,将机器的 MAC 地址提供给客户端。
例如,以下配置使 MetalLB 可以控制从192.168.1.240 到 IP 192.168.1.250,并配置第 2 层模式:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.1.240-192.168.1.250

4.用法

安装和配置 MetalLB 后,要向外部公开服务,只需将 spec.type 设置为 LoadBalancerMetalLB 将完成剩下的工作。
MetalLB 将信息事件附加到它控制的服务。如果您的 LoadBalancer 行为异常,请运行kubectl describe service <service name>并检查事件日志。

4.1.请求特定的 IP

MetalLB 尊重 spec.loadBalancerIP 参数,因此如果您希望使用特定地址设置您的服务,您可以通过设置该参数来请求它。 如果 MetalLB 不拥有所请求的地址,或者该地址已被其他服务使用,则分配将失败并且 MetalLB 将记录在 kubectl describe service <service name> 中可见的警告事件。

MetalLB 还支持请求一个特定的地址池,如果你想要某种地址但不关心具体是哪一种。 要从特定池请求分配,请将 metallb.universe.tf/address-pool 注释添加到您的服务中,并将地址池的名称作为注释值。 例如:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  annotations:
    metallb.universe.tf/address-pool: production-public-ips
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer