加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

发布时间:2019-07-30 00:33:07 所属栏目:评测 来源:Andy_Lee
导读:副标题#e# 以我的经验来讲,理解Kubernetes集群服务的概念,是比较不容易的一件事情。尤其是当我们基于似是而非的理解,去排查服务相关问题的时候,会非常不顺利。 这体现在,对于新手来说,ping不通服务的IP地址这样基础的问题,都很难理解;而就算对经验很

理解这两件事情之后,我们可以来看下iptables,或者更准确的说法,netfilter的工作原理。netfilter实际上就是一个过滤器框架。netfilter在网络包收发及路由的管道上,一共切了5个口,分别是PREROUTING,FORWARD,POSTROUTING,INPUT以及OUTPUT;同时netfilter定义了包括nat、filter在内的若干个网络包处理方式。

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

需要注意的是,routing和forwarding很大程度上增加了以上netfilter的复杂程度,如果我们不考虑routing和forwarding,那么netfilter会变得更我们的水质过滤器框架一样简单。

节点网络大图

现在我们看一下Kubernetes集群节点的网络全貌。横向来看,节点上的网络环境,被分割成不同的网络命名空间,包括主机网络命名空间和Pod网络命名空间;纵向来看,每个网络命名空间包括完整的网络栈,从应用到协议栈,再到网络设备。

在网络设备这一层,我们通过cni0虚拟网桥,组建出系统内部的一个虚拟局域网。Pod网络通过veth对连接到这个虚拟局域网内。cni0虚拟局域网通过主机路由以及网口eth0与外部通信。

在网络协议栈这一层,我们可以通过编程netfilter过滤器框架,来实现集群节点的反向代理。

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

实现反向代理,归根结底,就是做DNAT,即把发送给集群服务IP和端口的数据包,修改成发给具体容器组的IP和端口。

参考netfilter过滤器框架的图,我们知道,在netfilter里,可以通过在PREROUTING,OUTPUT以及POSTROUGING三个位置加入NAT规则,来改变数据包的源地址或目的地址。

因为这里需要做的是DNAT,即改变目的地址,这样的修改,必须在路由(ROUTING)之前发生以保证数据包可以被路由正确处理,所以实现反向代理的规则,需要被加到PREROUTING和OUTPUT两个位置。

其中,PREOURTING的规则,用来处理从Pod访问服务的流量。数据包从Pod网络veth发送到cni0之后,进入主机协议栈,首先会经过netfilter PREROUTING来做处理,所以发给服务的数据包,会在这个位置做DNAT。经过DNAT处理之后,数据包的目的地址变成另外一个Pod的地址,从而经过主机路由,转发到eth0,发送给正确的集群节点。

而添加在OUTPUT这个位置的DNAT规则,则用来处理从主机网络发给服务的数据包,原理也是类似,即经过路由之前,修改目的地址,以方便路由转发。

升级过滤器框架

在过滤器框架一节,我们看到netfilter是一个过滤器框架。netfilter在数据“管到”上切了5个口,分别在这5个口上,做一些数据包处理工作。虽然固定切口位置以及网络包处理方式分类已经极大的优化了过滤器框架,但是有一个关键的问题,就是我们还是得在管道上做修改以满足新的功能。换句话说,这个框架没有做到管道和过滤功能两者的彻底解耦。

为了实现管道和过滤功能两者的解耦,netfilter用了表这个概念。表就是netfilter的过滤中心,其核心功能是过滤方式的分类(表),以及每种过滤方式中,过滤规则的组织(链)。

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

把过滤功能和管道解耦之后,所有对数据包的处理,都变成了对表的配置。而管道上的5个切口,仅仅变成了流量的出入口,负责把流量发送到过滤中心,并把处理之后的流量沿着管道继续传送下去。

如上图,在表中,netfilter把规则组织成为链。表中有针对每个管道切口的默认链,也有我们自己加入的自定义链。默认链是数据的入口,默认链可以通过跳转到自定义链来完成一些复杂的功能。这里允许增加自定义链的好处是显然的。为了完成一个复杂过滤功能,比如实现Kubernetes集群节点的反向代理,我们可以使用自定义链来模块化我们规则。

用自定义链实现服务的反向代理

集群服务的反向代理,实际上就是利用自定义链,模块化地实现了数据包的DNAT转换。KUBE-SERVICE是整个反向代理的入口链,其对应所有服务的总入口;KUBE-SVC-XXXX链是具体某一个服务的入口链,KUBE-SERVICE链会根据服务IP,跳转到具体服务的KUBE-SVC-XXXX链;而KUBE-SEP-XXXX链代表着某一个具体Pod的地址和端口,即endpoint,具体服务链KUBE-SVC-XXXX会以一定算法(一般是随机),跳转到endpoint链。

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

而如前文中提到的,因为这里需要做的是DNAT,即改变目的地址,这样的修改,必须在路由之前发生以保证数据包可以被路由正确处理。所以KUBE-SERVICE会被PREROUTING和OUTPUT两个默认链所调用。

总结

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读