首页 > 编程知识 正文

k8s集群白名单,docker创建k8s集群

时间:2023-05-04 09:32:51 阅读:178325 作者:1978

上一篇文章以nginx-ingress-controller-service为例主要介绍了集群中node port类型的cluster ip的实现原理。 当然,这是基于iptable的nat的模型。 也就是说,利用操作系统的网络核心实现负载均衡。 这里主要介绍集群内的网络通信。 正如以前的文章中介绍的那样,容器之间的网络通信基本上有两种: underlay方式和overlay方式。 underlay方式在通信中没有多余的数据包,通常以集装箱的主机为路径实现数据包的传输。 overlay方式在通信中有追加的数据包。 当然这里只有学习。 在具体的生产环境中使用哪种方式,要根据自己的实际情况和需求。

以前的文章采用了基于flannel的underlay网络方式,所以这里主要介绍flannel underlay网络。 以以前的文章中安装的nginx-app为例。

nginx-app的服务名称为service-nginx-app

该服务有两个endpoints,分别支持两个pod

一个pod的ip是10.1.79.3,位于主机172.20.11.43上

一个pod的ip为10.1.27.4,位于主机172.20.11.42上

我们分析分组(例如curl http://10.1.27.4 from 10.1.79.3 )如何从pod 10.1.79.3到达pod 10.1.27.4

kubectldescribeserviceservice-nginx-app-ndefaultkubectlgetpods-o wide-n default|grep nginx-app

数据包从源pod到宿主

在pod10.1.79.3中将数据包发送到pod10.1.27.4时,根据以前的文章,pod10.1.79.3的网卡是veth的一个端点。 根据pod network namespace的路由规则,数据始终发送到10.1.79.1,即主机网络名称库的docke0 linux bridge设备。 pod10.1.79.3网卡veth的另一个端点attahe位于docker0 bridge设备上,因此数据将被docker0 bride接收。 这意味着数据将从pod的网络名称空间流向主机的网络名称空间。

数据包在源pod宿主中的路由

数据包的目标ip地址为10.1.27.4,在本例中,pod10.1.79.3的主机ip为172.20.11.43。 因为我们在主机上打开了转发功能(net.ipv4.ip_forward=1),所以当主机发现目标ip10.1.27.4不是自己的ip时,就会对包进行路由查看宿主172.20.11.43的路由表:

ip addr|grep 43route -n

在路由表中找到10.1.27.0/24网段数据的下一跳是172.20.11.42,即pod10.1.27.4的主机。 因此,进行arp目标mac地址数据包,将数据发送到172.20.11.42。 在这里请注意。 目标pod的下一跳地址是目标pod所在的主机。 这意味着数据将从原始pod所在的主机通过下一跳发送到目标pod所在的主机。 弦外之音必须与原始pod的host和目标pod的host位于同一双层网络中。 因为只有这样才能到达下一跳路线。 当然,这也是对flannel的underlay网络host gw方式的限制,并且要求所有的k8s worker node节点在同一个双层网络中(也可以假设它们在同一个ip子网中)。

数据包在目标pod宿主中的路由

当分组路由到目标pod10.1.27.4的主机172.20.11.42时,在目标pod主机上开启转发功能,因此主机发现目标ip10.1.27.4 .的宿主172.20.20

ip addr|grep 72.20.11.42route -n

已在路由表中发现10.1.27.0/24网段数据的下一跳是通过直接连接路由通过设备docker0传输的。 到此为止都很熟悉,根据以前的文章docker0(10.1.27.4.1 ),作为linux bridge,从主机网络名称通过veth pair输入目标pod的10.1.27

您可以使用以前文章中的kubectl-debug进入pod10.1.79.3,然后使用traceroute命令观察包从10.1.79.3到10.1.27.4的节点。

kube CTL-debug deployment-nginx-app-69b6bbfd 6d-4b 89 mipaddrtraceroute 10.1.27.4

因此,总结起来,对于Underlay(FlannelHostGW方式),分组:

从源pod的网络名称空间到主机网络名称空间的docker0 linux bridge。

在源pod所在的主机上进行三层路由,下一跳地址是目标pod所在的主机。

包从源pod所在的主机发送到目标pod所在的主机。

在目标pod所在的主机上进行三层路由,本地直接路由路由到目标pod。

必须为所有工作器节点打开路由转发功能。 (net.ipv4.ip_forward=1)。

所有工作器节点必须位于同一双层网络中,并且必须完成目标pod所在主机的下一跳路由。

至此,下一篇文章将继续介绍k8s集群网络中基于ipvs的服务的实现方法。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。