在kubernetes里部署MetalLB
Kubernetes 没有为裸机集群提供网络负载均衡器(LoadBalancer 类型的服务)的实现。 Kubernetes 附带的网络负载均衡器的实现都是调用各种 IaaS 平台(GCP、AWS、Azure…)的代码。 如果您没有在受支持的 IaaS 平台(GCP、AWS、Azure…)上运行,LoadBalancers 在创建时将无限期地保持在“pending”状态。
MetalLB 是一个负载均衡器,专门解决裸金属 Kubernetes 集群中无法使用 LoadBalancer 类型服务的痛点。MetalLB 使用标准化的路由协议,以便裸金属 Kubernetes 集群上的外部服务也尽可能地工作。即 MetalLB 能够帮助你在裸金属 Kubernetes 集群中创建 LoadBalancer 类型的 Kubernetes 服务。
1 要求
MetalLB 需要以下功能才能运行:
- 运行 Kubernetes 1.13.0 或更高版本的 Kubernetes 集群,尚未具有网络负载平衡功能。
- 可以与 MetalLB 共存的集群网络配置。
- MetalLB 分发的一些 IPv4 地址。
- 使用 BGP 操作模式时,您将需要一台或多台能够 BGP 的路由器。
- 根据成员列表的要求,节点之间必须允许端口 7946(TCP 和 UDP)上的流量。
2 准备
如果您在 IPVS 模式下使用 kube-proxy,从 Kubernetes v1.14.2 开始,您必须启用严格的 ARP 模式。
请注意,如果您使用 kube-router 作为服务代理,则不需要它,因为它默认启用严格 ARP。
您可以通过编辑当前集群中的 kube-proxy 配置来实现此目的:
kubectl edit configmap -n kube-system kube-proxy
并设置:
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
您也可以将此配置片段添加到您的 kubeadm-config 中,只需将其附加在主配置之后即可。---
如果您尝试自动执行此更改,这些 shell 代码段可能会对您有所帮助:
# 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
修改:
kubeproxy:
extra_args:
proxy-mode: ipvs
ipvs-strict-arp: 1
3 安装
3.1 通过清单安装
要安装 MetalLB,请应用清单:
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 的组件仍将启动,但在您定义和部署配置映射之前将保持空闲状态。
3.2 通过helm安装
helm安装我试了好几次最后都不能使用
通过 Helm 安装时,MetalLB 读取的 ConfigMap 名为 metallb-config 。
4 工作模式
Metallb支持两种工作模式,一种是Layer2模式。
4.1 Layer2配置
生成配置映射
LB地址段需要与k8s节点的管理网是同一个地址段。
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
4.2 BGP配置
我这里没有支持的设备,没有进行尝试
5 测试
检查组件状态为running
kubectl get pod -n metallb-system -o wide
创建后端应用和服务测试
kubectl apply -f https://cdn.jsdelivr.net/gh/metallb/metallb@v0.10/manifests/tutorial-2.yaml
查看service分配的EXTERNAL-IP
kubectl get service