1.OpenELB介绍
1.1 为何选择OpenELB
OpenELB 是一个专为裸机 Kubernetes 集群设计的开源负载均衡器实现。
在云服务环境中的 Kubernetes 集群里,通常可以用云服务提供商提供的负载均衡服务来暴露 Service,但是在本地没办法这样操作。而 OpenELB 可以让用户在裸金属服务器、边缘以及虚拟化环境中创建 LoadBalancer 类型的 Service 来暴露服务,并提供与云上的负载均衡器相同的用户体验。
1.2 核心功能
- BGP 模式和二层网络模式下的负载均衡
- ECMP 路由和负载均衡
- IP 池管理
- 基于 CRD 来管理 BGP 配置
- 支持 Helm Chart 方式安装
1.3 BGP 网络拓扑结构
建议使用 BGP 模式,因为它允许您创建一个没有故障转移中断和带宽瓶颈的高可用性系统。要使用 BGP 模式,您的路由器必须支持 BGP 和等价多路径 (ECMP) 路由。如果您的路由器不支持 BGP 或 ECMP,您可以使用第 2 层模式或 VIP 模式来实现类似的功能。
1.4 layer2 网络拓扑结构
- 通常,建议您使用 BGP 模式,因为它允许您创建一个没有故障转移中断和带宽瓶颈的高可用性系统。但是,BGP 模式要求您的路由器支持 BGP 和等价多路径 (ECMP) 路由,这在某些系统中可能不可用。在这种情况下,您可以使用第 2 层模式来实现类似的功能。
- 二层模式需要您的基础环境允许匿名 ARP/NDP 数据包,如果在云上的 Kubernetes 集群中安装了 OpenELB 进行测试,需要与云厂商确认是否允许匿名 ARP/NDP 数据包,如果不允许,则无法使用二层模式。
2.在线安装OpenELB
参考官方文档[1]:Install OpenELB on Kubernetes 本文主要介绍在kubesphere中使用layer2模式部署和使用,其他概念请参考官方文档。
2.1 添加应用
进入企业空间后,添加应用仓库 名称:kubesphere-test 地址:charts.kubesphere.io/test
2.2 部署应用
从添加的应用模板中创建openelb应用
2.3 修改 openelb-manager副本数量
进入工作负载 修改openelb-manager副本数为2个,保障高可用
2.4 kube-proxy 启用 strictARP
ARP 欺骗技术: 应用程序主动回复路由器 ARP 请求,让路由器以为该应用是合法终端,从而劫持网络流量包。 OpenELB 正是利用 ARP 欺骗技术,从而获取路由器流量,再由 kube-proxy 将流量转发到 Service 网络。
代码语言:javascript复制kubectl edit configmap kube-proxy -n kube-system
开启
代码语言:javascript复制......
ipvs:
strictARP: true
......
重启 kube-proxy
代码语言:javascript复制kubectl rollout restart daemonset kube-proxy -n kube-system
2.5 配置eip池
EIP 地址要与集群主机节点在同一网段内,且不可绑定任何网卡;
OpenELB Layer2 模式需要配置 EIP, 提供 IP 地址池。类似于keepalive IP 192.168.0.91
。
详细介绍参考官方文档[2]:Configure IP Address Pools Using Eip
apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
name: eip-sample-pool
annotations:
eip.openelb.kubesphere.io/is-default-eip: "true"
spec:
# Eip 对象的地址池
address: 192.168.0.91-192.168.0.100
priority: 100
namespaces:
- test
- default
namespaceSelector:
kubesphere.io/workspace: workspace
disable: false
# openELB的运行模式
protocol: layer2
# OpenELB 在其上侦听 ARP/NDP 请求的网卡。该字段仅在protocol设置为时有效layer2
# 如果 Kubernetes 集群节点的网卡名称不同,您可以将该值设置为can_reach:IP address(can_reach:192.168.200.1),IP address要求不是集群的地址,但集群节点可以访问该 IP 地址。
#interface: can_reach:192.168.0.1
interface: eth0
status:
occupied: false
usage: 1
poolSize: 10
used:
"192.168.0.91": "default/test-svc"
firstIP: 192.168.0.91
lastIP: 192.168.0.100
ready: true
v4: true
- 应用
kubectl apply -f eip.yaml
- 查看eip池
kubectl get eip
NAME CIDR USAGE TOTAL
eip-sample-pool 192.168.0.91 1 1
2.6 启用openelb负载均衡
2.7 设置服务对外访问LoadBalancer
配置服务对应的对外访问方式为负载均衡
- 使用服务端口进行访问
- 测试验证
3.离线安装OpenELB
离线安装部署主要是将OpenELB所使用的镜像导入到私有harbor,然后修改各服务对应的容器地址为harbor中的镜像地址。
3.1 安装OpenELB相关服务
百度云盘**[ 3 ]** 上传后解压openelb.tar.gz
代码语言:javascript复制[root@master1 openelb]# tar zxf openelb.tar.gz
[root@master1 openelb]# ls
eip.yaml install.sh kube-proxy.yaml openelb openelb-csmp.yaml openelb-images.tar.gz openelb-keepalive-vip.yaml openelb.tar.gz openelb.yaml
修改eip.yaml中的ip地址池,同2.5中的配置
代码语言:javascript复制apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
name: eip-sample-pool
annotations:
eip.openelb.kubesphere.io/is-default-eip: "true"
spec:
# Eip 对象的地址池
address: 192.168.0.91
priority: 100
namespaces:
- test
- default
namespaceSelector:
kubesphere.io/workspace: workspace
disable: false
# openELB的运行模式
protocol: layer2
# OpenELB 在其上侦听 ARP/NDP 请求的网卡。该字段仅在protocol设置为时有效layer2
# 如果 Kubernetes 集群节点的网卡名称不同,您可以将该值设置为can_reach:IP address(can_reach:192.168.200.1),IP address要求不是集群的地址,但集群节点可以访问该 IP 地址。
#interface: can_reach:192.168.0.1
interface: eth0
修改install.sh中关于harbor以及harbor中存放openelb相关镜像的项目位置,后执行install.sh
代码语言:javascript复制[root@master1 openelb]#catinstall.sh
#!/bin/bash
#
dockerload<openelb.tar.gz
dockerpushdockerhub.kubekey.local/other/openelb:v0.5.1
dockerpushdockerhub.kubekey.local/other/kube-webhook-certgen:v1.1.1
dockerpushdockerhub.kubekey.local/other/kube-keepalived-vip:0.35
kubectlapply-fopenelb.yaml
kubectlapply-fopenelb-keepalive-vip.yaml
kubectlapply-fkube-proxy.yaml
kubectlrolloutrestartdaemonsetkube-proxy-nkube-system
sleep 30
查看eip池
代码语言:javascript复制[root@master1 openelb]# kubectl get eip
NAME CIDR USAGE TOTAL
eip-pool 192.168.0.91 1 1
3.2 配置服务使用OpenELB负载均衡
修改服务对应的访问模式为:LoadBalancer 负载均衡器提供商:openelb
代码语言:javascript复制 eip.openelb.kubesphere.io/v1alpha2: eip-pool
lb.kubesphere.io/v1alpha1: openelb
protocol.openelb.kubesphere.io/v1alpha1: layer2
layer2.openelb.kubesphere.io/v1alpha1:master3为配置完成自动生成的所在节点
配置完成后可以看到该服务对应的外部访问为负载均衡器eip中对应的ip。
访问时使用eip地址 服务的端口,效果如2.6,此处不再截图
4.改善与建议
OpenELB Layer2 模式因其实现简单,而且对物理硬件和网络没有额外要求,所以实际生产中经常会用到。但目前仍存在单点故障风险,即如果 OpenELB 实例因资源不足故障,则整个对外流量将中断。 万幸的是 OpenELB 官方已有新的解决方案,即 Layer2 VIP 模式,该模式的使用方式可以参考官方文档:https://openelb.io/docs/getting-started/usage/use-openelb-in-vip-mode/。
引用链接
[1] 在k8s中安装OpenELB: https://openelb.io/docs/getting-started/installation/install-openelb-on-kubernetes [2] 配置eip: https://openelb.io/docs/getting-started/configuration/configure-ip-address-pools-using-eip/ [3] OpenELB离线包百度云: https://pan.baidu.com/s/1hIMMZqzD2wNPffc3h9Gc6w?pwd=v4q9 [4] Vip模式:https://openelb.io/docs/getting-started/usage/use-openelb-in-vip-mode/