警告
本文最后更新于 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
|

要安装 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
https://metallb.universe.tf/