使用 kubectl 安装 OpenELB
# 当前使用的是最新版 openelb:v0.5.1 kubectl apply -f openelb.yaml执行完毕后,请再次执行下述命令检查openelb-manager的状态:
# kubectl get pod -n openelb-system -o wide NAME READY STATUS RESTARTS AGE NODE NOMINATED NODE READINESS GATES openelb-admission-create-k5ff9 0/1 Completed 0 112s k8s-node-1 <none> <none> openelb-admission-patch-h5zvh 0/1 Completed 0 112s k8s-node-0 <none> <none> openelb-keepalive-vip-4qvq5 1/1 Running 0 84s k8s-node-0 <none> <none> openelb-keepalive-vip-5hrcp 1/1 Running 0 84s k8s-node-2 <none> <none> openelb-keepalive-vip-r7qt2 1/1 Running 0 84s k8s-node-1 <none> <none> openelb-manager-85b6fc6c6b-9tz4w 1/1 Running 0 112s k8s-node-0 <none> <none>注意:在删除 OpenELB 之前,必须确保openelb-system命名空间下没有任何服务,特别是后面配置到eip时,必须先删除Eip,再删除 OpenELB ,否则你会遇到无法删除Eip的Bug,引用来源:https://kubesphere.com.cn/forum/d/2379-porter/8。
配置 OpenELB
基于Layer2模式进行配置,另外服务器都是使用的单网卡。
为 kube-proxy 启用 strictARP
在Layer2模式下,需要为kube-proxy启用strictARP,以便Kubernetes集群中的所有NIC停止响应来自其他NIC的ARP请求,让OpenELB处理ARP请求。
kubectl edit configmap kube-proxy -n kube-system # 将data.config.conf.ipvs.strictARP设置为True ipvs: strictARP: true # 滚动更新 kubectl rollout restart daemonset kube-proxy -n kube-system创建公网EIP对象(Eip)
这里的EIP对象充当OpenELB的IP地址池,如果你有多个IP,则填写起始IP-结束IP,如果你只有一个IP,则填写一个就好。
kubectl apply -f layer2-eip.yaml # 查看EIP信息 kubectl get Eip在KubeSphere启用集群网关,并指定OpenELB为负载均衡器提供商
登录KubeSphere控制台,在【集群】-> 【集群设置】-> 【网关设置】,添加一个集群网关,选择OpenELB为负载均衡器提供商,并在注解(即注释)中添加以下三项:
lb.kubesphere.io/v1alpha1: openelb protocol.openelb.kubesphere.io/v1alpha1: layer2 eip.openelb.kubesphere.io/v1alpha2: layer2-eip最后还需要在【平台管理】-> 【集群管理】,进入集群,在系统项目kubesphere-controls-system中找到集群网关对应的服务,本例中的是kubesphere-router-kubesphere-system。
编辑服务的配置文件,将 externalTrafficPolicy 改为 Local 模式即可。
至此,OpenELB的安装结束。后续就可以在项目部署中,直接使用这个集群网关,提供网站80和443端口的暴露了。
创建负载均衡测试服务
切到测试目录~/ceshi,部署对应的deployment和svc:
kubectl apply -f openelb-nginx.yaml kubectl apply -f openelb-nginx-svc.yaml # 查看服务 # kubectl get svc nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.233.2.218 192.168.16.211 80:31032/TCP 40h浏览器或命令行访问192.168.16.211:
查看Eip使用情况:
# kubectl get eip -o yaml usage: 2 used: 192.168.16.210: kubesphere-controls-system/kubesphere-router-kubesphere-system 192.168.16.211: default/nginx v4: true集群网关测试
我们将k8s集群中prometheus以域名形式浏览器访问,域名为wutf.test.com,因是临时测试,域名解析至本地hosts文件中即可。
配置应用路由:
保存后,稍等一会儿,直接界面点击访问服务测试即可。
OpenELB-manager高可用
默认情况下,openelb-manager只会部署一个副本,对于可用性要求较高的生产环境可能无法满足需求,官方也给出了部署多个副本的教程。
官方教程的方式是推荐通过给节点添加label的方式来控制副本的部署数量和位置,这里我们将其配置为每个节点都运行一个服务(类似于daemonset)。首先我们给需要部署的节点打上labels。
# 我们给集群内的三个节点都打上label kubectl label --overwrite nodes k8s-node-0 k8s-node-1 k8s-node-2 lb.kubesphere.io/v1alpha1=openelb # 查看标签 # kubectl get nodes -o wide --show-labels=true | grep openelb然后我们先把副本的数量缩容到0。
kubectl scale deployment openelb-manager --replicas=0 -n openelb-system接着修改配置,在部署节点的nodeSelector字段中增加我们前面新加的labels。
# kubectl get deployment openelb-manager -n openelb-system -o yaml ...略去一堆输出... nodeSelector: kubernetes.io/os: linux lb.kubesphere.io/v1alpha1: openelb ...略去一堆输出...扩容副本数量到3。
kubectl scale deployment openelb-manager --replicas=3 -n openelb-system检查deployment状态:
# kubectl get po -n openelb-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES openelb-admission-create-n4dfc 0/1 Completed 0 41h 10.233.111.12 k8s-node-0 <none> <none> openelb-admission-patch-67n8v 0/1 Completed 0 41h 10.233.113.11 k8s-node-2 <none> <none> openelb-keepalive-vip-5vxvb 1/1 Running 0 41h 192.168.16.160 k8s-node-2 <none> <none> openelb-keepalive-vip-srslh 1/1 Running 0 41h 192.168.16.157 k8s-node-0 <none> <none> openelb-keepalive-vip-w2tr5 1/1 Running 0 41h 192.168.16.159 k8s-node-1 <none> <none> openelb-manager-6c5db95cd8-7nkzt 1/1 Running 0 52s 192.168.16.159 k8s-node-1 <none> <none> openelb-manager-6c5db95cd8-d2qzk 1/1 Running 0 52s 192.168.16.157 k8s-node-0 <none> <none> openelb-manager-6c5db95cd8-wrmgm 1/1 Running 0 52s 192.168.16.160 k8s-node-2 <none> <none>参考文档
- 单节点部署Kubesphere+OpenELB
- 多节点负载均衡器之OpenELB
- 本地集群使用 OpenELB 实现 Load Balancer 负载均衡