容器的访问及Kubernetes网络原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QMW19910301/article/details/87617959

首先来看我在Rancher上搭建的MongoDB容器集群和Cassandra容器集群的配置,每个容器都有一个虚拟IP,一个容器要想被访问,不能通过虚拟IP访问,需要将容器的端口映射到其所在主机的端口,访问主机的IP便能访问容器

                     

                     

---------------------------------------------------------------------------------------------------------------------------------------

目录

Kubernetes网络模型

Kubernetes的网络实现

容器之间的通信(同一个Pod内的容器间的通信)

Pod之间的通信(同一Node内的Pod之间的通信)

Pod之间的通信(不同Node上的Pod之间的通信)

开源的网络组件Flannel


Kubernetes网络模型

Kubernetes网络模型设计的基础原则:每个Pod都有一个独立的IP地址,这样Pod之间可以直接进行通信,无论它们是否在同一个Node上。而且用户就不需要考虑将容器的端口映射到节点的物理端口上了。

一个Pod分配一个独立的IP,一个Pod内部的所有容器共享一个Linux网络堆栈,包括它们的IP地址、网络设备、配置等都是共享的。所以容器之间是可以通过localhost来连接对方端口的。从这个层面来看,Pod内部容器之间的隔离性相比于不同Pod的容器有所降低,但也只是它们不用相同的端口而已。

Kubernetes的网络实现

Kubernetes网络设计主要解决以下场景:
1.容器之间的通信
2.Pod之间的通信
3.Pod到Service之间的通信
4.集群外部与内部组件之间的通信

容器之间的通信(同一个Pod内的容器间的通信)

  • 同一个Pod下的容器共享同一个网络命名空间,共享同一个Linux协议栈。所以它们就像在同一台机器上一样。可以相互之间直接通信。可以用localhost访问彼此的端口。
  • 如果容器2运行的是mysql容器,那么容器1通过localhost:3306就直接能够访问运行在容器2上的Mysql了。当然,既然像是在同一台机器上的不同进程,那么它们之间也就是可以通过IPC(进程间通信)进行通信(如消息队列或管道)。 

                                             

Pod之间的通信(同一Node内的Pod之间的通信)

                               

同一个Node内的不同Pod都是通过Veth连接在同一个Docker0网桥上的。所以它们之间是可以直接进行通信的。而且,非本地数据的网络数据都是默认发送到Docker0网桥然后由它进行中转的。 
Docker0网桥会路由到节点上的所有Pod的,这个可以通过看Kubernetes任一节点上的路由表了解 


这个就表示docker0的IP地址为10.0.82.1,而该节点上的Pod都是10.0.82网段的。

Pod之间的通信(不同Node上的Pod之间的通信)

                             

不同Node上的Pod与Pod之间进行通信,肯定是要通过节点的物理网卡的。而且不同的Pod肯定是不能有相同的私有IP的。另外,我们还必须要有Node IP找到该Pod的IP才成。
对于这些要求,Flannel就可以做得到。

开源的网络组件Flannel

Kubernetes是谷歌的开源项目,它假定了所有的Pod都是在一个可以直接连通的扁平的网络空间中,因为它建立在GCE上,而GCE已经实现了这些要求。

但是对于一个私有云来说,要想用Kubernetes就必须自己来实现这个网络假设。有些开源软件可以做到这些。

Flannel

Flannel实现了两点来保证Kubernetes的底层网络: 
1,保证集群中每个Pod的IP不冲突 
2,建立了一个覆盖网络,保证数据可以在不同节点之间的Pod传递(通过Pod节点路由表可以找到Pod与Node节点的对应关系) 
            

猜你喜欢

转载自blog.csdn.net/QMW19910301/article/details/87617959