在kubernetes里部署MetalLB

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 配置来实现此目的:

bash

kubectl edit configmap -n kube-system kube-proxy

并设置:

yaml

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

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

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

bash

# 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

修改:

yaml

    kubeproxy: 
      extra_args:
        proxy-mode: ipvs
        ipvs-strict-arp: 1

image-20211021170348008

要安装 MetalLB,请应用清单:

bash

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节点的管理网是同一个地址段。

bash

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

bash

kubectl get pod -n metallb-system  -o wide

创建后端应用和服务测试

bash

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

查看service分配的EXTERNAL-IP

bash

kubectl get service

https://metallb.universe.tf/