问题思考
- Kubernetes的网络模型是什么
- Docker 背后的网络基础是什么
- Docker自身的网络模型和局限
- Kubernetes 的网络组件之间是怎么通信的
- 外部如何访问Kubernetes的集群
- 开源组件
Kubernetes 网络模型
Kubernetes网络模型设计的一个基础原则是:每个Pod都用有一个独立的IP 地址。假设所有的Pod都在一个可以直接连通的,扁平的网络空间中,即无论Pod在哪个Node,它们都可以直接通过对方的IP进行访问。
IP-per-Pod
在Kubernetes中 IP以Pod为单位进行分配,一个Pod内部所有容器都共享一个网络栈(实际上就是一个网络命名空间,包括他们的IP地址,网络设备,配置等都是共享的)。一个Pod 一个IP的设计模型,IP-per-Pod。
基于这种网络抽象原则,Kubernetes 对集群网络有如下要求:
- 所有容器都可以在不用NAT的方式与别的容器通信
- 所有节点都可以在不用NAT的方式与所有容器通信,反之亦然
- 容器里的地址和别人看到的地址是同一个地址
Docker 网络基础
Kubernetes 网络实现
Kubernetes网络设计主要致力于解决如下场景:
- 容器之间的直接通信
- Pod到Pod之间的通信
- Pod 到Service之间的通信
- 集群外部与集群内部之间的通信
容器之间的通信
Kubernetes中Pod容器之间的直接通信是采用了Docker网络模型中Docker0网桥进行共享通信。
首先Pod内容器都共享Pause容器的网络,并与Node节点上的Docker0网桥连接,通信信息通过主机路表进行转发。
Pod之间的通信
同Node上Pod之间的通信
Pod1,Pod2都通过Veth连接到同一个Docker0网桥,IP1,IP2都是从Docker0的网段上获取的,与Docker0的IP3均在同一个网段,此外Pod1,Pod2的Linux协议栈上默认路由都是docker0的地址(即非所有本地(pod内)数据都会通过docker0网桥进行中转),由于两个Pod都关联在同一个docker0网桥,地址段相同,所以它们之间可以直接通信。
不同Node间Pod的通信
想要支持不同Node上Pod之间的通信必须满足如下两个条件:
- 在整个Kubernetes集群中对Pod的IP分配进行规划,不能有冲突;
- 将Pod的IP 与所在Node的IP关联起来,通过这个关联可以让Pod互相访问。
CNI 网络模型
Container Network Interface,CNI 提供了一种应用容器插件化网络解决方案,定义对容器网络进行操作和配置的规范,通过插件(plugin)的形式对CNI接口进行实现,CNI 仅仅关注在容器创建时分配网络资源及在销毁容器时删除网络资源。
CNI 模型中只涉及两个概念:
- 容器(Container) :容器是拥有独立Linux网络命名空间的环境,如使用Docker或rkt创建的容器。
- 网络(Network):网络表示可以互连的实体,这些实体拥有各自独立ÿ