Kubernetes通过整合规模庞大的容器实例形成集群,这些容器实例可能运行在异构的底层网络环境中,如何保证这些容器间的互通是实际生产环境中首要考虑的问题之一。

Kubernetes网络基本要求

Kubernetes对容器技术做了很多的抽象,其中最重要的一点是提出Pod的概念,Pod是Kubernetes资源调度的基本单元,我们可以简单的认为Pod是容器的一种延伸扩展,从网络的角度来看,Pod必须满足以下条件:

  • 每个Pod都有一个独特的IP地址,所有Pod都在一个可以直接连通的、扁平的网络空间中
  • 同一个Pod内的所有容器共享同一个Netns网络命名空间

网络.png
基于这样的基本要求可以知道:

  • 同一个Pod内的所有容器之间共享端口,可直接通过 localhost + 端口 来访问
  • 由于每个Pod有单独的IP,所以不需要考虑容器端口和主机端口的映射以及端口冲突问题

事实上,Kubernetes进一步确定了对一个合格集群网络的基本要求:

  • 任意两个Pod之间其实是可以直接通信的,无需使用NAT进行地址的转换
  • 任意集群节点Node与任意Pod之间是可以直接通信的,无需使用地址转换,反之亦然
  • 任意Pod看到自己的IP跟别人看见所有的IP是一样的,中间不能经过地址转换

也就是说,必须满足以上三点的网络模型才能适用于Kubernetes,事实上,在早期的Kubernetes中,并没有什么网络标准,只是提出了以上基本要求,只有满足这些要求的网络才可以部署Kubernetes,基于这样的底层网络架设,Kubernetes设计了pod-deployment-service的经典三层服务访问机制。直到1.1发布,Kubernetes才开始采用全新的CNI(Container Network Interface)网络标准。