Kubernetes metallb LoadBalancer
一、metallb简介
基本介绍
MetalLB是使用标准路由协议的裸机Kubernetes集群的负载均衡器实现。
Kubernetes没有为裸机集群提供网络负载平衡器的实现(服务类型为LoadBalancer)。Kubernetes附带的Network LB的实现都是调用各种IaaS平台(GCP,AWS,Azure等)的粘合代码。如果您不在支持的IaaS平台(GCP,AWS,Azure等)上运行,则LoadBalancers在创建时将无限期保持“待处理”状态。
裸机集群运营商只剩下两个较小的工具,即“ NodePort”和“ externalIPs”服务,可将用户流量引入其集群。这两个选项在生产用途上都有很大的缺点,这使裸金属集群成为Kubernetes生态系统中的二等公民。
MetalLB旨在通过提供与标准网络设备集成的Network LB实现来解决这种不平衡问题,从而使裸机群集上的外部服务也尽可能“正常运行”。
条件
MetalLB需要以下功能才能运行:
1、一个Kubernetes集群,运行Kubernetes 1.13.0或更高版本,还没有网络负载平衡功能。
2、 群集的网络配置可以与MetalLB共存。
3、MetalLB目前只支持IPv4地址。
根据操作模式,您可能需要一个或多个能够说BGP的路由器 。
Metallb基本原理
Metallb 会在 Kubernetes 内运行,监控服务对象的变化,一旦察觉有新的LoadBalancer 服务运行,并且没有可申请的负载均衡器之后,
就会完成两部分的工作:
1.地址分配
用户需要在配置中提供一个地址池,Metallb 将会在其中选取地址分配给服务。
2.地址广播
根据不同配置,Metallb 会以二层(ARP/NDP)或者 BGP 的方式进行地址的广播。
基本原理图
二、metallb安装
项目文档、源代码地址
官方部署metallb文档:
https://metallb.universe.tf/installation/
官方项目开源地址:
https://github.com/google/metallb
本人项目:
https://gitee.com/sunney/kubernetes/tree/master/metallb
安装
Metallb 支持 Helm 和 YAML 两种安装方法,这里我们使用YAML更简单:
wget https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml
kubectl apply -f metallb.yaml
如果githubusercontent下载不了,直接到https://github.com/google/metallb找到对应的文件。
查看运行的pod
kubectl get pod -n metallb-system -o wide
metalLB包含两个部分: a cluster-wide controller, and a per-machine protocol speaker.
[centos@k8s-master ~]$ kubectl get pod -n metallb-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
controller-7cc9c87cfb-n25kc 1/1 Running 1 166m 10.244.1.39 k8s-node1 <none> <none>
speaker-cbhcg 1/1 Running 1 166m 192.168.92.56 k8s-master <none> <none>
speaker-l6vv2 1/1 Running 1 166m 192.168.92.58 k8s-node2 <none> <none>
speaker-pxscm 1/1 Running 1 166m 192.168.92.57 k8s-node1 <none> <none>
[centos@k8s-master ~]$
查看其它信息
包含了 “controller” deployment,和 the “speaker” DaemonSet.
[centos@k8s-master ~]$ kubectl get daemonset -n metallb-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
speaker 3 3 3 3 3 <none> 13h
[centos@k8s-master ~]$ kubectl get deployment -n metallb-system
NAME READY UP-TO-DATE AVAILABLE AGE
controller 1/1 1 1 13h
[centos@k8s-master ~]$
目前还没有宣布任何内容,因为我们没有提供ConfigMap,也没有提供负载均衡地址的服务。
接下来我们要生成一个 Configmap 文件,为 Metallb 设置网址范围以及协议相关的选择和配置,这里以一个简单的二层配置为例。
创建config.yaml提供IP池
wget https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/example-layer2-config.yaml
修改ip地址池和集群节点网段相同
[centos@k8s-master ~]$ vim example-layer2-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.92.200-192.168.92.210
注意:这里的 IP 地址范围需要跟集群实际情况相对应。
执行yaml文件
kubectl apply -f example-layer2-config.yaml
创建后端应用和服务测
$ wget https://raw.githubusercontent.com/google/metallb/master/manifests/tutorial-2.yaml
$ kubectl apply -f tutorial-2.yaml
查看yaml文件配置,包含了一个deployment和一个LoadBalancer类型的service,默认即可。
[centos@k8s-master ~]$ vim tutorial-2.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: nginx
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
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
查看service分配的EXTERNAL-IP
[centos@k8s-master ~]$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d15h
nginx LoadBalancer 10.101.112.1 192.168.92.201 80:31274/TCP 123m
[centos@k8s-master ~]$
集群内访问该IP地址
[centos@k8s-master ~]$ curl 192.168.92.201
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
......
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[centos@k8s-master ~]$
ping该ip地址,发现从pod所在节点192.168.92.57发起的请求:
[centos@k8s-master ~]$ ping 192.168.92.201
PING 192.168.92.201 (192.168.92.201) 56(84) bytes of data.
From 192.168.92.57: icmp_seq=2 Redirect Host(New nexthop: 192.168.92.201)
From 192.168.92.57: icmp_seq=3 Redirect Host(New nexthop: 192.168.92.201)
From 192.168.92.57: icmp_seq=4 Redirect Host(New nexthop: 192.168.92.201)
从集群外访问该IP地址:
此IP地址在集群外无法ping通,但可以访问80端口:
命令行终端执行telnet 192.168.92.201 80测试成功。
到这里metallb loadbalancer部署完成,你可以定义kubernetes dashboard,granafa dashboard等各种应用服务,以loadbalancer的方式直接访问,不是一般的方便。