在kubernetes里部署MetalLB

警告
本文最后更新于 2022-07-01,文中内容可能已过时。

Kubernetes 没有为裸机集群提供网络负载均衡器(LoadBalancer 类型的服务)的实现。 Kubernetes 附带的网络负载均衡器的实现都是调用各种 IaaS 平台(GCP、AWS、Azure…)的代码。 如果您没有在受支持的 IaaS 平台(GCP、AWS、Azure…)上运行,LoadBalancers 在创建时将无限期地保持在“pending”状态。

MetalLB 是一个负载均衡器,专门解决裸金属 Kubernetes 集群中无法使用 LoadBalancer 类型服务的痛点。MetalLB 使用标准化的路由协议,以便裸金属 Kubernetes 集群上的外部服务也尽可能地工作。即 MetalLB 能够帮助你在裸金属 Kubernetes 集群中创建 LoadBalancer 类型的 Kubernetes 服务。

MetalLB 需要以下功能才能运行:

  • 运行 Kubernetes 1.13.0 或更高版本的 Kubernetes 集群,尚未具有网络负载平衡功能。
  • 可以与 MetalLB 共存的集群网络配置。
  • MetalLB 分发的一些 IPv4 地址。
  • 使用 BGP 操作模式时,您将需要一台或多台能够 BGP 的路由器。
  • 根据成员列表的要求,节点之间必须允许端口 7946(TCP 和 UDP)上的流量。

如果您在 IPVS 模式下使用 kube-proxy,从 Kubernetes v1.14.2 开始,您必须启用严格的 ARP 模式。

请注意,如果您使用 kube-router 作为服务代理,则不需要它,因为它默认启用严格 ARP。

您可以通过编辑当前集群中的 kube-proxy 配置来实现此目的:

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

并设置:

1
2
3
4
5
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true

您也可以将此配置片段添加到您的 kubeadm-config 中,只需将其附加在主配置之后即可。---

如果您尝试自动执行此更改,这些 shell 代码段可能会对您有所帮助:

1
2
3
4
5
6
7
8
9
# see what changes would be made, returns nonzero returncode if different
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl diff -f - -n kube-system

# actually apply the changes, returns nonzero returncode on errors only
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system

如果是rancher创建的集群,编辑集群yaml

修改:

1
2
3
4
    kubeproxy: 
      extra_args:
        proxy-mode: ipvs
        ipvs-strict-arp: 1

image-20211021170348008

要安装 MetalLB,请应用清单:

1
2
3
4
5
6
kubectl apply -f https://cdn.jsdelivr.net/gh/metallb/metallb@v0.10/manifests/namespace.yaml
# kubectl apply -f https://cdn.jsdelivr.net/gh/metallb/metallb@v0.10/manifests/metallb.yaml
# quay.io拉取镜像很慢
curl https://cdn.jsdelivr.net/gh/metallb/metallb@v0.10/manifests/metallb.yaml | \
sed -e "s/quay.io\///" | \
kubectl apply -f -

安装清单不包括配置文件。 MetalLB 的组件仍将启动,但在您定义和部署配置映射之前将保持空闲状态。

helm安装我试了好几次最后都不能使用

通过 Helm 安装时,MetalLB 读取的 ConfigMap 名为 metallb-config 。

Metallb支持两种工作模式,一种是Layer2模式。

生成配置映射

LB地址段需要与k8s节点的管理网是同一个地址段。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.1.140-192.168.1.150 #Update this with your Nodes IP range
EOF

我这里没有支持的设备,没有进行尝试

检查组件状态为running

1
kubectl get pod -n metallb-system  -o wide

创建后端应用和服务测试

1
kubectl apply -f https://cdn.jsdelivr.net/gh/metallb/metallb@v0.10/manifests/tutorial-2.yaml

查看service分配的EXTERNAL-IP

1
kubectl get service

https://metallb.universe.tf/