基于k8s云容器平台的集群通信方法及装置

文档序号:195942 发布日期:2021-11-02 浏览:25次 >En<

阅读说明:本技术 基于k8s云容器平台的集群通信方法及装置 (Cluster communication method and device based on k8s cloud container platform ) 是由 石闪闪 陈飞 张学青 彭景强 于 2021-07-30 设计创作,主要内容包括:本发明提供了一种基于k8s云容器平台的集群通信方法及装置,该k8s云容器平台的集群外部主机和集群内部pod属于同一局域网,该方法包括以下步骤:在集群外部主机上添加需要访问的集群内部pod的IP段对应的静态路由;设置集群外部主机可以访问集群内部的端口范围;结合iptables和iptables-services软件配置端口规则;根据端口范围创建端口池并将端口放入端口池中;当集群外部主机作为服务端,集群内部pod作为客户端,进行TCP通信时,在集群内部pod建立socket之前,从端口池中获取未占用的端口,集群内部pod绑定该端口建立socket连接和集群外部主机进行socket通讯。本发明实现了k8s集群外的主机作为TCP服务端,集群内的pod作为TCP客户端的TCP正常通信。(The invention provides a cluster communication method and a device based on a k8s cloud container platform, wherein a cluster external host of the k8s cloud container platform and a cluster internal pod belong to the same local area network, and the method comprises the following steps: adding a static route corresponding to an IP section of a pod inside the cluster to be accessed on a host outside the cluster; setting a port range within which a host outside the cluster can access the cluster; configuring a port rule by combining iptables and iptables-services software; creating a port pool according to the port range and putting the port into the port pool; when a cluster external host serves as a server side and a cluster internal pod serves as a client side to perform TCP communication, before a socket is established by the cluster internal pod, an unoccupied port is obtained from a port pool, and the cluster internal pod binds the port to establish socket connection and performs socket communication with the cluster external host. The invention realizes that the host outside the k8s cluster is used as a TCP server side, and the pod in the cluster is used as the TCP normal communication of the TCP client side.)

基于k8s云容器平台的集群通信方法及装置

技术领域

本发明涉及通信领域,尤其涉及一种基于k8s云容器平台的集群通信方法及装置。

背景技术

Kubernetes是Goole开源的容器集群管理系统,它是一个开源的、用于管理云平台中多个主机上的容器化的应用。它是一种工业级的编排平台,主要提供服务的部署、弹性和管理,具有可以部署应用、扩展机制和维护等多种功能,使得跨机器运行的容器化的应用可以更加方便管理,Kubernetes的核心功能包括:服务发现和负载均衡,服务自动装箱,容器存储编排,容器故障恢复,自动发布和回滚,配置和密钥存储,服务水平伸缩,批量执行以及守护进程任务,探针。

在k8s集群部署完毕后,若外部主机和内部pod(容器)属于同一局域网,当容器云平台和外部网络需要通过Socket实现TCP通信时,就会面临一个问题,外部主机无法访问内部pod的地址,双方不能通信。当容器云平台和外部网络需要通过Socket实现TCP通信时,服务端响应数据给客户端时,客户端接收数据的端口是随机的。而若此时云平台的内部某个pod是客户端的话,pod能向服务端发送数据,但是服务端向pod发送数据时,由于端口随机,可能会遇到随机分配的端口受限,不能访问集群内部的客户端,导致不能正常通讯。

发明内容

本发明的目的在于提供一种基于k8s云容器平台的集群通信方法及装置,旨在用于保证k8s云容器平台和外部网络进行正常的TCP通信,并且保证其安全,不受外部攻击。

本发明是这样实现的:

第一方面,本发明提供一种基于k8s云容器平台的集群通信方法,该k8s云容器平台的集群外部主机和集群内部pod属于同一局域网,该方法包括以下步骤:

在集群外部主机上添加需要访问的集群内部pod的IP段对应的静态路由;

设置集群外部主机可以访问集群内部的端口范围;

结合iptables和iptables-services软件配置端口规则,对集群外部主机可以访问集群内部的端口范围以及集群内部pod访问集群外部主机的端口进行配置;

根据端口范围创建端口池并将对应的的端口放入端口池中;

当集群外部主机作为服务端,集群内部pod作为客户端,进行TCP通信时,在集群内部pod建立socket之前,从端口池中随机获取一个端口,检查是否已占用,若占用了,则重新获取端口,若没被占用,则集群内部pod绑定该端口建立socket连接,开始和集群外部主机进行socket通讯。

进一步地,所述在集群外部主机上添加需要访问的集群内部pod的IP段对应的静态路由具体包括:

获取各需要访问的集群内部pod访问集群外部主机时的出口IP地址,根据获取的出口IP地址在集群外部主机上添加对应的静态路由。

进一步地,在集群外部主机上添加集群内所有pod的IP段对应的静态路由。

进一步地,所述结合iptables和iptables-services软件配置端口规则具体包括:

首先添加默认拒绝访问的规则;

然后添加放行访问对应端口请求报文和响应报文规则。

进一步地,所述通过设置iptables端口规则来配置集群外部主机可以访问的集群内部的端口范围具体如下:

首先添加默认拒绝访问的规则;

然后添加放行访问端口的请求报文规则以及放行所有响应报文的规则。

进一步地,对设置的端口规则执行保存命令。

第二方面,本发明提供一种基于k8s云容器平台的集群通信方法,该k8s云容器平台的集群外部主机和集群内部pod属于同一局域网,该方法包括以下步骤:

在集群外部主机上添加需要访问的集群内部pod的IP段对应的静态路由;

结合iptables和iptables-services软件配置端口规则,对集群内部pod访问集群外部主机的端口范围以及集群外部主机访问集群内部的端口进行配置;

根据端口范围创建端口池并将对应的的端口放入端口池中;

当集群外部主机作为客户端,集群内部pod作为服务端,进行TCP通信时,在集群外部主机建立socket之前,从端口池中随机获取一个端口,检查是否已占用,若占用了,则重新获取端口,若没被占用,则集群外部主机绑定该端口建立socket连接,开始和集群内部pod进行socket正常通讯。

第三方面,本发明提供一种基于k8s云容器平台的集群通信装置,该k8s云容器平台的集群外部主机和集群内部pod属于同一局域网,该装置包括:

静态路由添加模块,用于在集群外部主机上添加需要访问的集群内部pod的IP段对应的静态路由;

端口范围设置模块,用于设置集群外部主机可以访问集群内部的端口范围;

端口规则配置模块,用于结合iptables和iptables-services软件配置端口规则,对集群外部主机可以访问集群内部的端口范围以及集群内部pod访问集群外部主机的端口进行配置;

端口池创建模块,用于根据端口范围创建端口池并将对应的的端口放入端口池中;

socket通讯建立模块,用于当集群外部主机作为服务端,集群内部pod作为客户端,进行TCP通信时,在集群内部pod建立socket之前,从端口池中随机获取一个端口,检查是否已占用,若占用了,则重新获取端口,若没被占用,则集群内部pod绑定该端口建立socket连接,开始和集群外部主机进行socket通讯。

第四方面,本发明提供一种基于k8s云容器平台的集群通信装置,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上任一所述方法的步骤。

第五方面,本发明提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如上任一所述方法的步骤。

与现有技术相比,本发明具有以下有益效果:

本发明提供的这种基于k8s云容器平台的集群通信方法及装置,针对k8s集群外部主机和内部pod所属同一局域网时,双方无法进行TCP通信的问题,首先在集群外的主机上做调整,在集群外部主机上添加需要访问的集群内部pod的IP段对应的静态路由,实现了外部主机与集群内的多个pod的通信;其次,本发明利用iptables和iptables-services软件相结合的方式管理端口,配置端口规则,并根据端口范围创建端口池并将对应的的端口放入端口池中;最后,当集群外部主机作为客户端,集群内部pod作为服务端,进行TCP通信时,在集群外部主机建立socket之前,从端口池中随机获取一个端口,检查是否已占用,若占用了,则重新获取端口,若没被占用,则集群外部主机绑定该端口建立socket连接,开始和集群内部pod进行socket正常通讯。实现了k8s集群外的主机作为TCP服务端,集群内的pod作为TCP客户端的TCP正常通信,并且能保证其安全,不受外部攻击。

附图说明

图1为本发明实施例提供的一种基于k8s云容器平台的集群通信方法的流程图;

图2为本发明实施例提供的一种k8s云容器平台的架构图;

图3为本发明实施例提供的一种k8s云容器平台的网络结构简图;

图4为本发明实施例提供的基于k8s云容器平台的集群通信装置的结构框图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

如图1所示,本发明实施例提供一种基于k8s云容器平台的集群通信方法,图2为k8s云容器平台的架构图,本发明实施例的前提是k8s云容器平台的集群外部主机和集群内部pod属于同一局域网,即集群内部pod能访问集群外部主机,但是集群外部主机无法访问集群内部pod。

该方法包括以下步骤:

S101、在集群外部主机上添加需要访问的集群内部pod的IP段对应的静态路由;

该步骤具体包括:获取各需要访问的集群内部pod访问集群外部主机时的出口IP地址,根据获取的出口IP地址在集群外部主机上添加对应的静态路由。

具体的实施步骤如下:

①通过tcpdump获取pod访问集群外主机时的出口IP地址。

先在一个Pod中去telnet外部主机的地址,然后在外部主机上抓包:

#进入pod中

kubectl exec–it user-api-764d68b678-54kt2 bash

#telnet一个设置好的端口,并且没有被占用,目的是防止抓包时被其他信息干扰

telnet 192.168.31.6712345

外部主机上抓包

#外部主机上抓包,指定端口12345即可

tcpdump–nni any port 12345

Telnet结果

#telnet 192.168.31.6712345

Trying 192.168.31.67…

telnet:connect to address 192.168.31.67:Connection refused

tcpdump抓包结果

#tcpdump-nni any port 12345

tcpdump:verbose output suppressed,use-v or-vv for full protocoldecode

listening on any,link-type LINUX_SLL(Linux cooked),capture size262144bytes

12:52:28.644112IP 192.168.31.17.35066>192.168.31.67.12345:Flags[S],seq 3592146803,win 28000,options[mss 1400,sackOK,TS val 780676435ecr0,nop,wscale 7],length 0

12:52:28.644169IP 192.168.0.31.67>192.168.31.17.35066:Flags[R.],seq0,ack 3592146804,win 0,length 0

由此可以看出,在pod中进行telnet时,访问外部主机的源地址为node节点的IP地址,即192.168.31.17

②外部主机上添加静态路由

用如下命令查看pod的IP地址:

kubectl get pod–o wide|grep user-api

user-api-764d68b678-54kt21/1Running 03d17h 10.200.1.91alpha-node-01<none><none>

由此可看出pod的IP地址为:10.200.1.91

当获取到pod的IP地址后,即可利用如下命令去外部主机上添加路由了

route add–host 10.200.1.91gw 192.168.31.17

添加完毕后,可以验证如下所示:

#ping下是否能通

#ping 10.200.1.91

PING 10.200.1.91(10.200.1.91)56(84)bytes of data.

64bytes from 10.200.1.91:icmp_seq=1ttl=63time=0.296ms

64bytes from 10.200.1.91:icmp_seq=2ttl=63time=0.258ms

#再访问下服务是否可以通

#curl 10.200.1.91:8088/api/healthy/check

{"code":0,"message":"success"}

由上述验证完毕后,可以发现是可行的。因此,本发明实施例通过增加一条静态路由解决了同一局域网的外部主机和内部的pod的通信问题。但是,实际的k8s集群环境中,有上百个类似的pod,可以在集群外部主机上添加需要访问的集群内部pod的IP段对应的静态路由。优选地,在集群外部主机上添加集群内所有pod的IP段对应的静态路由。

针对多pod添加静态路由,本发明采用如下方法:

当集群使用的calico网络插件时,每一台节点分配的子网各不相同,比如node1分配的IP网段为10.200.1.0/24,node2的IP段为10.200.36.0/24,因此,本发明实施例添加整个IP段到外部主机的路由表中,如下所示:

route add–net 10.200.1.0/24gw 192.168.31.17

route add–net 10.200.36.0/24gw 192.168.31.45

S102、设置集群外部主机可以访问集群内部的端口范围;

当在同一局域网的集群外部主机和集群内部pod可以通信后,开始设计集群外部和内部的端口问题。本发明的设计前提是,容器云平台中对外可以访问的端口号是有一定的范围的,这个可以在配置文件/etc/kubernetes/manifests/kube-apiserver.yaml中进行修改。

S103、结合iptables和iptables-services软件配置端口规则,对集群外部主机可以访问集群内部的端口范围以及集群内部pod访问集群外部主机的端口进行配置;

iptables,在Linux下就是指Linux内置的防火墙。如果不指定端口范围,iptables很难对任意端口开放的,如果iptables允许任意端口访问,那和不设置防火墙就没有区别,所以需要指定数据传输端口的一个范围。本发明结合iptables和iptables-services软件管理端口规则,配置范围内的端口,

所述结合iptables和iptables-services软件配置端口规则具体包括:

首先添加默认拒绝访问的规则;

然后添加放行访问对应端口请求报文和响应报文规则。

具体的端口管理规则如下:

如图3所示,假设圆形表示的网络为集群内部网络,假设内部网络的网段为10.200.1.0/24,此内部网络中存在pod主机C,主机C的IP地址为10.200.1.1。

图3中主机B作为网络防火墙的角色,也属于集群内部网络,主机A充当了集群外部网络主机的角色,A主机的IP地址为192.168.31.67,我们在步骤S101中已经设置了静态路由,所以,此时,主机A能够访问集群内部的主机C服务了。接下来,我们通过iptables规则设置端口,保证集群外部和集群内部在设置的端口范围内才可以正常通信。

由于iptables作为"网络防火墙"角色,所以需要在filter表中的FORWARD链中设置规则。可以使用"白名单机制",先添加一条默认拒绝的规则,然后再为需要放行的报文设置规则。配置规则时需要考虑"方向问题",针对请求报文与回应报文,考虑报文的源地址与目标地址,源端口与目标端口等。

在主机B上,我们开始设置iptables端口规则。首先,添加默认拒绝的规则:

iptables-A FORWARD-j REJECT

其次,为放行的报文添加规则:

假如我们设置TCP客户端(集群外部)的端口为60001,则在主机B中,执行如下命令:

在主机B上放行集群内部主机访问60001端口的请求

iptables-I FORWARD-s 10.200.1.0/24-p tcp--dport 60001-j ACCEPT

在主机B上放行集群外部主机的回应报文

iptables-I FORWARD-d 10.200.1.0/24-p tcp--sport 60001-j ACCEPT

同理,设置TCP服务端(集群内部)的端口为40002,则在主机B上,执行如下命令:

在主机B上放行集群外部主机访问40002端口的请求

iptables-I FORWARD-s 192.168.31.67-p tcp--dport 40002-j ACCEPT

在主机B上放行集群内部主机的回应报文

iptables-I FORWARD-d 192.168.31.67-p tcp--sport 40002–j ACCEPT

为了优化上述规则,我们可以不管是由内而外还是由外而内,只要是“响应报文”,统统放行,即所述通过设置iptables端口规则来配置集群外部主机可以访问的集群内部的端口范围具体如下:

首先添加默认拒绝访问的规则;

然后添加放行访问对应端口请求报文和响应报文规则。

具体设置如下:

首先删除B主机上的配置的回应报文的两条规则,然后执行如下命令:

iptables-I FORWARD-m state-state ESTABLISGED,RELATED,-j ACCEPT

只需要在网络防火墙主机的FORWARD链中添加如上一条规则,就可以将绝大多数响应报文放行了,不管是外部响应内部,还是内部响应外部,一条规则就能搞定,当iptables作为网络防火墙时,每次配置规则时都要考虑“双向”的问题,但是配置完上述规则后,我们只要考虑请求报文的方向就行了,而回应报文,上述一条规则就能搞定,这样配置,即使以后有更多服务的响应报文需要放行,我们也不用再去针对响应报文设置规则了,这样简单方便。

若我们想放行的集群内部的端口是一个范围,比如集群外部的主机的端口范围为60001~80001,则可以利用如下命令:

iptables-I FORWARD-s 10.200.1.0/24-p tcp--dport 60001:80001-j ACCEPT

同理,可以配置集群外部的端口范围。

使用iptables命令配置的防火墙规则会在系统下一次重启时失效,如果想让配置的防火墙策略永久生效,需要对设置的端口规则执行保存命令;service iptables save。这样可以避免服务器重启,配置的端口规则丢失的现象发生。

S104、根据端口范围创建端口池并将对应的的端口放入端口池中;

在端口范围规定好且配置好规则之后,我们可以在socket建立之前,首先获取容器云平台服务通信所用端口范围,然后创建端口池,接着对端口池放入端口,放入完毕之后,端口池会保存设置范围内的一定数量的随机端口号。

S105、当集群外部主机作为服务端,集群内部pod作为客户端,进行TCP通信时,在集群内部pod建立socket之前,从端口池中随机获取一个端口,检查是否已占用,若占用了,则重新获取端口,若没被占用,则集群内部pod绑定该端口建立socket连接,开始和集群外部主机进行socket通讯。

本发明中k8s集群内部的pod作为tcp客户端,若要正常接收外部主机服务端的数据,需将外部TCP通信的客户端端口固定,而该端口即是从步骤S104中的端口池中取出的未被占用的端口。具体实现如下:当云容器平台的客户端在绑定固定端口时,将会从端口池中随机获取一个端口,然后先检查该端口是否已被占用,若被占用,继续从端口池中取出另外的端口,若没有被占用,则可以用该端口进行绑定,与外部服务端开始正常通信。

正常情况下,客户端流程为:

新建一个socket,然后连接服务器connect,接着开始read/write,最后close。

服务器流程为:

新建一个socket,然后绑定端口号bind,接着监听端口listen,然后接受客户端的连接accept,成功之后开始read/write,最后关闭close。

如果按照上述流程,就是随机生成一个客户端的端口,然后去连接服务器,会遇到随机端口没有开放的话,通讯无法正常进行的问题。

但在本发明中,客户端的端口不再是随机而是由iptables和iptablse-services共同管理的方式,设置的安全端口。为了指定客户端的端口号,需要对客户端的流程做改进,具体改进方法如下:

新建一个socket,然后去绑定端口号bind,接着连接服务器connect,再去read/write,最后close即可。

而具体到代码里,对比原来的随机端口代码,需在其基础上增加部分代码,如下所示:

升级了上述代码后,当客户端连接服务器时,服务器显示连接的客户端端口号就是我们设置的端口号,而不是随机的端口号了。

本发明实施例提供的这种基于k8s云容器平台的集群通信方法,针对k8s集群外部主机和内部pod所属同一局域网时,双方无法进行TCP通信的问题,首先在集群外的主机上做调整,在集群外部主机上添加需要访问的集群内部pod的IP段对应的静态路由,实现了外部主机与集群内的多个pod的通信;其次,本发明利用iptables和iptables-services软件相结合的方式管理端口,配置端口规则,并根据端口范围创建端口池并将对应的的端口放入端口池中;最后,当集群外部主机作为客户端,集群内部pod作为服务端,进行TCP通信时,在集群外部主机建立socket之前,从端口池中随机获取一个端口,检查是否已占用,若占用了,则重新获取端口,若没被占用,则集群外部主机绑定该端口建立socket连接,开始和集群内部pod进行socket正常通讯。实现了k8s集群外的主机作为TCP服务端,集群内的pod作为TCP客户端的TCP正常通信,并且能保证其安全,不受外部攻击。

基于同一发明构思,本发明实施例还提供了一种基于k8s云容器平台的集群通信装置,由于该装置所解决问题的原理与前述实施例的方法相似,因此该装置的实施可以参见前述方法的实施,重复之处不再赘述。

如图4所示,为本发明实施例提供的一种基于k8s云容器平台的集群通信装置,可以用于执行上述方法实施例,该装置包括:

静态路由添加模块401,用于在集群外部主机上添加需要访问的集群内部pod的IP段对应的静态路由;

端口范围设置模块402,用于设置集群外部主机可以访问集群内部的端口范围;

端口规则配置模块403,用于结合iptables和iptables-services软件配置端口规则,对集群外部主机可以访问集群内部的端口范围以及集群内部pod访问集群外部主机的端口进行配置;

端口池创建模块404,用于根据端口范围创建端口池并将对应的的端口放入端口池中;

socket通讯建立模块405,用于当集群外部主机作为服务端,集群内部pod作为客户端,进行TCP通信时,在集群内部pod建立socket之前,从端口池中随机获取一个端口,检查是否已占用,若占用了,则重新获取端口,若没被占用,则集群内部pod绑定该端口建立socket连接,开始和集群外部主机进行socket通讯。

本发明实施例还提供一种提高谐波检测精度的自适应VMD检测装置,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上任一所述方法的步骤。

本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如上任一所述方法的步骤。

针对集群外部主机作为客户端,集群内部pod作为服务端的情况,本发明实施例还提供一种基于k8s云容器平台的集群通信方法,该k8s云容器平台的集群外部主机和集群内部pod属于同一局域网,该方法包括以下步骤:

在集群外部主机上添加需要访问的集群内部pod的IP段对应的静态路由;

结合iptables和iptables-services软件配置端口规则,对集群内部pod访问集群外部主机的端口范围以及集群外部主机访问集群内部的端口进行配置;

根据端口范围创建端口池并将对应的的端口放入端口池中;

当集群外部主机作为客户端,集群内部pod作为服务端,进行TCP通信时,在集群外部主机建立socket之前,从端口池中随机获取一个端口,检查是否已占用,若占用了,则重新获取端口,若没被占用,则集群外部主机绑定该端口建立socket连接,开始和集群内部pod进行socket正常通讯。

该实施例由于集群外部主机不需要对端口范围进行设置,因此相对于上述集群外部主机作为服务端,集群内部pod作为客户端情况下的基于k8s云容器平台的集群通信方法实施例少了该步骤,其他步骤是类似的,具体可以参照上述方法实施例,在此不再赘述。

本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random AccessMemory)、磁盘或光盘等。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

14页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种基于迁移学习的无人机内容缓存决策方法

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类