1.OpenELB介绍
1.1 为何选择OpenELB
OpenELB 是一个专为裸机 Kubernetes 集群设计的开源负载均衡器实现。
在云上的 Kubernetes 集群中,Service 通常使用云厂商提供的负载均衡器进行暴露,但云上的负载均衡器在裸机环境中不可用。OpenELB 允许用户在裸机、边缘和虚拟化环境中创建 LoadBalancer Service 供外部访问,并提供与云上的负载均衡器相同的用户体验。
1.2 核心功能
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 部署应用
2.3 修改 openelb-manager副本数量
进入工作负载 修改openelb-manager副本数为2个,保障高可用
2.4 kube-proxy 启用 strictARP
ARP 欺骗技术: 应用程序主动回复路由器 ARP 请求,让路由器以为该应用是合法终端,从而劫持网络流量包。
OpenELB 正是利用 ARP 欺骗技术,从而获取路由器流量,再由 kube-proxy 将流量转发到 Service 网络。
kubectl edit configmap kube-proxy -n kube-system
开启
......
ipvs:
strictARP: true
......
重启 kube-proxy
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相关镜像至harbor
百度云盘**[ 3 ]**
上传后解压openelb.tar.gz
[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中的配置
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
[root@master1 openelb]# ./install.sh
请先修改eip.yaml相关IP地址池和本脚本harbor地址,是否已修改(yes/no)y
Loaded image: kube-keepalived-vip:0.35
Loaded image: openelb:v0.5.1
Loaded image: kube-webhook-certgen:v1.1.1
The push refers to repository [dockerhub.kubekey.local/other/openelb]
2fa995770514: Layer already exists
1ec1660b13db: Layer already exists
c15c5a8aa981: Layer already exists
3699e9d02da9: Layer already exists
89ae5c4ee501: Layer already exists
v0.5.1: digest: sha256:5f22eac9ae9cf48e9e17bb5077b1e694819f90b6543654aef4cfd14f763c4393 size: 1374
The push refers to repository [dockerhub.kubekey.local/other/kube-webhook-certgen]
ce7a3c1169b6: Layer already exists
c0d270ab7e0d: Layer already exists
v1.1.1: digest: sha256:78351fc9d9b5f835e0809921c029208faeb7fbb6dc2d3b0d1db0a6584195cfed size: 739
The push refers to repository [dockerhub.kubekey.local/other/kube-keepalived-vip]
6d8c3fd4a96b: Layer already exists
26efa62e5ad2: Layer already exists
9fc70015b1b1: Layer already exists
cccd30f33efa: Layer already exists
9794d479ba50: Layer already exists
0.35: digest: sha256:7c8bc1a013369667625aa413c133fb0cbbe5694cfce11ef0f06216e235dee71d size: 1371
namespace/openelb-system unchanged
customresourcedefinition.apiextensions.k8s.io/bgpconfs.network.kubesphere.io configured
customresourcedefinition.apiextensions.k8s.io/bgppeers.network.kubesphere.io configured
customresourcedefinition.apiextensions.k8s.io/eips.network.kubesphere.io configured
serviceaccount/kube-keepalived-vip unchanged
serviceaccount/openelb-admission unchanged
role.rbac.authorization.k8s.io/leader-election-role unchanged
role.rbac.authorization.k8s.io/openelb-admission unchanged
clusterrole.rbac.authorization.k8s.io/kube-keepalived-vip unchanged
clusterrole.rbac.authorization.k8s.io/openelb-admission unchanged
clusterrole.rbac.authorization.k8s.io/openelb-manager-role configured
rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding unchanged
rolebinding.rbac.authorization.k8s.io/openelb-admission unchanged
clusterrolebinding.rbac.authorization.k8s.io/kube-keepalived-vip unchanged
clusterrolebinding.rbac.authorization.k8s.io/openelb-admission unchanged
clusterrolebinding.rbac.authorization.k8s.io/openelb-manager-rolebinding unchanged
service/openelb-admission unchanged
deployment.apps/openelb-manager unchanged
job.batch/openelb-admission-create unchanged
job.batch/openelb-admission-patch unchanged
mutatingwebhookconfiguration.admissionregistration.k8s.io/openelb-admission configured
validatingwebhookconfiguration.admissionregistration.k8s.io/openelb-admission configured
daemonset.apps/openelb-keepalive-vip unchanged
configmap/kube-proxy unchanged
eip.network.kubesphere.io/eip-pool configured
daemonset.apps/kube-proxy restarted
查看eip池
[root@master1 openelb]# kubectl get eip
NAME CIDR USAGE TOTAL
eip-pool 172.16.0.91 1 1
3.2 配置服务使用OpenELB负载均衡
修改服务对应的访问模式为:LoadBalancer 负载均衡器提供商:openelb
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/
评论区