在公有云部署的kubernetes集群中,有公有云厂商提供LoadBalancer类型的Service。但是在基于本地环境部署的k8s集群是我们常用的测试环境和开发环境;需要通过NodePort和externalIPs方式将外部流量引入集群中,这就带来了很多的不便。
尤其是我们通过helm去部署一些服务时,尝尝会依赖于LoadBalancer的资源类型,导致创建的services中type: LoadBalancers会一直处于Pending状态;我们不得不进行仓库的fetch,然后手动进行values的修改。
Metallb 通过标准路由协议能解决该问题。MetalLB 也是 CNCF 的沙箱项目,最早发布在 https://github.com/google/metallb 开发,后来迁移到 https://github.com/metallb/metallb 中。
MetalLB 通过 MetalLB hooks 监听SVC的变化;然后通过Speaker组件采用对应的模式将外部流量引流到kubernetes集群node节点的可达路径。而具体到Pod中则是通过kuber-proxy依据转发模式(iptables或ipvs)将流量转发到Pod中。
MetaLB负责从主机维度实现负载均衡,而pod副本间的负载是通过kube-proxy实现。MetalLB负责IP地址分配、依据设定的广播模式进行广播、节点选举、节点失效切换等功能。而引流的过程则通过ARP、NDP和BGP标准路由协议实现。
主要的两大功能:
工作模式:
更多详情请参考官方文档:https://metallb.universe.tf/
二层部署的架构图,参考红帽openshift官方文档
上图显示了与 MetalLB 相关的以下概念:
环境要求
集群版本信息如下:
支持MetalLB的CNI如下:
Network addon | Compatible |
Antrea | Yes (Tested on version 1.4 and 1.5) |
Calico | Mostly (see known issues) |
Canal | Yes |
Cilium | Yes |
Flannel | Yes |
Kube-ovn | Yes |
Kube-router | Mostly (see known issues) |
Weave Net | Mostly (see known issues) |
注意事项:
apiVersion: kubeproxy.config.k8s.io/v1alpha1kind: KubeProxyConfigurationmode: "ipvs"ipvs: strictARP: true通过helm安装
MetalLBKubernetes manifests、Kustomize 和 Helm 三种安装方式;这里我们采用helm安装:
$ helm repo add metallb https://metallb.github.io/metallb $ helm search repo -l metallb $ helm fetch metallb/metallb --version=0.13.4 $ tar zxvf metallb-0.13.4.tgz #这里我们可以根据自己的需求进行values值的修改,例如原镜像地(quay.io)址无法拉取,我们可以先拉取然后上传到自己的镜像仓库,然后修改地址 $ kubectl create namespace metallb-system $ helm install metallb -n metallb-system ./metallb验证安装,如下图所示
在metallb-system的namespace下,会安装两个组件:
speaker pod 响应 IPv4 服务和 IPv6 的 NDP 请求。
通过manifest安装
要安装 MetalLB,使用yaml应用清单:
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.4/config/manifests/metallb-native.yaml由于我们的集群工作在测试环境中,我们采用的是L2工作模式下
第 2 层模式最容易上手,并且可以在任何环境中工作——不需要花哨的路由器
定义要分给负载均衡服务的IP地址池
新版本metallb使用了CR(Custom Resources),这里我们通过IPAddressPool的CR,进行地址池的定义。
如果实例中不设置IPAddressPool选择器L2Advertisement;那么L2Advertisement默认为该实例所有的IPAddressPool相关联。
创建metallb-config-ipaddresspool.yaml
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 192.168.74.100-192.168.74.110进行L2关联地址池的绑定。这里也可以使用标签选择器。
创建metallb-config-L2Advertisement.yaml
apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: example namespace: metallb-system spec: ipAddressPools: - first-pool创建类型为LoadBalancer的SVC进行测试,创建yaml文件tutorial-1.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: default spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1 ports: - name: http containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx namespace: default spec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer结果如下图所示:
通过浏览器进行访问:
参考网址:
| 留言与评论(共有 0 条评论) “” |