Kubernetes学习笔记-了解kubernetes机理-同节点/不同节点pod通信20220723

一、了解运行中的pod是什么

当创建一个pod是运行的是docker,可以创建一个pod容器,ssh到运行的pod工作节点,查看运行的docker容器

kubectl run nginx --image=nginx

docker ps

运行命令后,将会看到nginx容器,以及一个附加容器。附加容器没有做任何事情,附加容器名为“暂停容器”。暂停容器是一个基础容器,他唯一的目的是保存所有的命名空间。所有pod的其他用户定义容易使用pod的该基础容器的命名空间。

实际的应用容器可能会挂掉并重启,当容器重启,容器需要处于与之前相同的linux命名空间中。基础容器使这成为可能,因为它的生命周期和pod绑定,基础容器pod被调度指导被删除一直会运行。如果基础pod在这个期间被关闭,kubelet会重新创建它,以及pod的所有容器。

二、跨pod网络

每个pod有自己唯一的ip地址,可以通过一个扁平的、非nat网络和其他pod通信。

1、网络是什么样子的

pod用于通信的网络必须是:pod自己认为的ip地址一定和所有其他节点认为该pod拥有的ip地址一致。

如当pod A连接(发送网络包)到pod B时,pod B获取到的源IP地址必须和pod A自己认为的IP地址一致。期间没有网络地址转换(NAT)操作。pod A发送到pod B的包必须保持源和目的地址不变。这很重要,保证运行在pod内部的应用网络的间接性,就像运行在同一个网关机上一致。

2、深入了解网络工作原理

如之前讲到的,我们看到创建pod的ip地址以及网络命名空间,由基础设施容器--暂停容器来保存这些信息,然后pod容器就可以使用网络命名空间了。pod网络接口就是生成在基础设施容器的的一些东西。

1)同节点pod通信

基础设施启动之前,为容器创建一个虚拟Ethernet接口对(veth pair),其中一个对的接口保留在主机的命名空间中,而其他的对被移入容器网络命名空间,并重命名为eth0。两个虚拟接口就像管道的两侧,从一端进入,另一端出来。

Kubernetes学习笔记-了解kubernetes机理-同节点/不同节点pod通信20220723_第1张图片

主机网络命名空间的接口会绑定到容器运行时配置使用的网络桥接上,从网桥的地址段中取ip地址复制给容器内的eth0接口。应用的任何运行在容器内部的程序都会发送数据到eth0网络接口,数据从主机命名空间的另一个veth接口出来,然后发送给网桥。这意味着任何连接到网桥接口都可以接收该数据。

如果pod A发送网络包到pod B,报文首先会经过pod A的veth对到网桥然后经过pod B的veth对。所有节点上的容器都会连接到同一个网桥,意味着他们都能够互相通信。

2)不同节点上的pod通信

有多重连接不同节点航的网桥方式,可以通过overlay、underlay网络或常规的三层路由。

跨整个集群的pod的ip地址必须是唯一的,所以跨节点的网桥必须使用非重叠地址段,防止不同节点上的pod拿到同一个ip。

Kubernetes学习笔记-了解kubernetes机理-同节点/不同节点pod通信20220723_第2张图片

如上图为三层网络支持跨两个节点pod通信。节点的物理网络接口业务也要连接到网桥。节点A的路由表需要被配置如下图。这样所有目的地为10.1.2.0/24的豹纹会被路由到节点B,同时节点B的路由表也需要配置城如下,这样发送到10.1.1.0/24的包会被发送到节点A。

按照该配置,当报文从一个节点上的容器发送到其他节点上的容器,报文先通过veth pair,通过网桥到节点物理适配器,然后通过网线传到其他节点的物理适配器,再通过其他节点的网桥,最终经过veth pair到达目标容器。

3、引入容器网络接口

为了让连接容器到网络更加方便,启动一个项目容器网络接口(CNI),CNI允许kubernetes可配置使用任何CNI插件,这些插件包含:

  • Calico
  • Flannel 
  • Romana
  • Weave net
  • 其他

你可能感兴趣的:(学习笔记,kubernetes,学习,架构)