• 安装部署
  • kubesphere3.4.0配置网关转发tcp和udp流量

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

流量都会经过负载均衡。

3 个月 后
2 个月 后
21 天 后

lld 3.4.1版本已经合并了tcp转发的代码了,不用执行这个命令了

  • lld 回复了此帖

    molingcfs 项目网关也支持转发tcp流量吗?因为我是在项目网关上配置的,并没有生效,所以有疑问。

      6 天 后

      什么时候界面上直接支持tcp 转发配置啊,这个方式有些场景不行

        4 个月 后

        lld 有一个用户也是用的项目网关,当时和他排查过,并不支持

        使用nginx ingress配置tcp或者udp转发,还不如直接NodePort。
        特别是生产环境中,需要修改nginx的全局设置,这个对运维来说很不友好,比如项目下面有多个服务,你修改了全局变量,对其他项目可能造成影响。
        还是用nodeport+LB暴露更简单

          2 个月 后
          2 个月 后

          klj890 是的,大部分情况下不会这样用,只是会有k8s集群内的容器需要通过tcp连接场景,这个方案刚好可以解决