https://github.com/kubesphere/kubesphere/pull/5445
在关注kubesphere3.3.2和3.4.0的更新时都看到了hongzhouzi 大佬提交的网关支持tcp和udp流量转发,之前就一个很想要这个功能,因为集群中部分业务应用是需要支持tcp连接的,以及部署的redis和mysql等中间件也想用网关接入。
https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/
ingress-nginx官方是支持tcp和udp流量转发的,只需要修改部分配置即可,但kubesphere的网关是经过魔改的,论坛精华帖KubeSphere 网关的设计与实现(解读)上详解了,下面评论有用户询问是否支持tcp流量转发,作者回复是目前还没有实现这个。需要调整 gateway CRD 结构和代码才可以。现在已经支持这个功能了,就根据我的实验和请教hongzhouzi 大佬,写一篇应用过程。
我测试的kubesphere版本是最新的3.4.0,理论上3.3.2应该也可以。
一,部署openelb
新建openelb项目,打开kubesphere应用商店,搜索openelb,我安装的是0.4.4版本,最新版好像是支持新的vip模式,我暂时没研究,用着layer2模式,但是这个模式我在使用过程也发现一个问题,需要在所有节点都部署ingress实例,不然他有时会无法转发请求。
配置文件方面,可以指定调度到基础设施节点,也可以默认
创建负载均衡的虚拟IP
openelb.yaml
apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
name: eip-pool
spec:
address: 192.168.0.209
protocol: layer2
interface: eth0
name,可以起一个名字,后续启用网关需要配置这个参数
address,是负载均衡的IP,选一个同网段没有使用的IP,后续ingress流量都会接入这个IP
interface,这里配置是你机器网卡的名称,用ifconfig命令查看下
kubectl apply -f openelb.yaml -n openelb
可以看到有这个eip了。
二,启用集群网关
平台管理,集群设置,集群网关,选择loadbalancer,负载均衡器提供商选择openelb,注解加上这三个参数,对应上个步骤设置好的openelb
lb.kubesphere.io/v1alpha1: openelb
protocol.openelb.kubesphere.io/v1alpha1: layer2
eip.openelb.kubesphere.io/v1alpha2: eip-pool
三,修改gateway配置
重点来了,之前3.3.2和3.4.0版本我都尝试过按hongzhouzi 大佬的配置,始终没有生效,在和hongzhouzi 大佬邮件交流的过程排查出来,原因是官方发行的这两个分支没有合并hongzhouzi 大佬提交的gateway CRD代码,配置没有生效。所以需要先更新gateway CRD。
可以在master节点直接执行这个命令
kubectl apply -f https://github.com/kubesphere/kubesphere/raw/master/config/ks-core/crds/gateway.kubesphere.io_gateways.yaml
倘若网络不好可以将https://github.com/kubesphere/kubesphere/raw/master/config/ks-core/crds/gateway.kubesphere.io_gateways.yaml的内容复制到本地yaml文件中,然后再应用
我就是复制内容到gateway.yaml文件然后应用。
更新完gateway后,就可以在kubesphere页面配置了,定制资源定义搜索gateway,编辑yaml
在controller部分添加tcp的配置,格式可以参考官方文档https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/
应用后可以在kubesphere-controls-system项目的service,kubesphere-router-kubesphere-system看到已经开启了tcp6379端口。
四,验证tcp连接
我也简单在应用商店部署了单节点的redis作为测试,在redis项目创建应用路由,指定redis的service。
可以在域名添加解析记录,将域名指向这个IP,也可以直接在本地修改hosts配置。
使用Another Redis Desktop Manager软件连接域名:端口
可以看到连接成功,新建两个键也是没有问题的。
最后说一个ingress的小应用吧
在集群的负载均衡中,需要配置不同的域名,例如你有ceshi.cn这个域名,那么就可以添加一条*.internal的解析记录,记录到负载均衡的IP上,后续项目中不同的应用只需要配置不同的ingress
例如admin.internal.ceshi.cn
web.internal.ceshi.cn
tcp的连接
redis.internal.ceshi.cn:6379
mysql.internal.ceshi.cn:3306
流量都会经过负载均衡。