7.1 Kubernetes网络模型
7.1 Kubernetes网络模型
Kubernetes 网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址,并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所有不管它们是否运行在同一个Node(宿主机)中,都要求它们可以直接通过对方的IP进行访问。设计这个原则的原因是,用户不需要额外考虑如何建立Pod之间的连接,也不需要考虑如何将容器端口映射到主机端口的等问题。
实际上,在Kubernetes的世界里,IP 是以Pod为单位进行分配的。一个Pod内部的所有容器共享一个网络堆栈(相当于一个网络命令空间,它们的IP地址、网络设备、配置等都是共享的)。按照这个网络原则抽象出来的每个Pod都设置一个IP地址的模型也被称作IP-per-Pod模型。IP-per-Pod的方案可以很好的利用现有的各种域名解析和发现机制。
为每个Pod都设置一个IP地址的模型还有另外一层含义,那就是同一个Pod内的不同容器会共享同一个网络命令空间,了就是同一个Linux网络协议栈。意味着同一个Pod内的容器可以通过Localhost 来连接对方的端口,这种关系和同一个VM内的进程之间的关系是一样的。
IP-per-Pod 模式和Docker原生的通过动态端口映射方式实现的多节点访问模式的主要区别是后者的动态端口映射会引入端口管理的复杂性,而且访问都看到的IP 地址和端口与服务提供都实际绑定的不同(因为NAT的缘故,它们都被映射成新的地址或端口了),这也会引起应用配置的复杂化。同时,标准的DNS 等名字解析服务也不适用了。甚至服务注册和发现机制都将迎来挑战,因为在端口映射情况下,服务自身很难知道自己对外暴露的真实的服务IP和端口,外部应用也无法通过服务所在容器的私有IP 地址和端口来访问服务。
总的来说,IP-per-Pod模型是一个简单的兼容性较好的模型。从该模型的网络的端口分配、域名解析、服务发现、负载均衡、应用配置和迁移等角度来看,Pod都能被看作一台独立的虚拟机或物理机。
Kubernetes对集群网络有如下要求。
(1). 所有容器都可以在不用NAT的方式下同别的容器通信
(2). 所有节点都可以在不用NAT的方式下同所有容器通信,反之亦然
(3). 容器的地址和别人看到的地址是同一个地址。
这些基本要求意味着并不是只要两台机器都运行Docker,Kubernetes就可以工作了。具体的集群网络实现必须满足上述基本要求,原生的Docker网络目前还不能很好的支持这些要求。