一、Kubernetes网络模型
kubernetes网络模型设计的一个基础原则是:每个pod都拥有一个独立的IP地址,并假定所有的Pod都在一个可以直接连通、扁平的网络空间。所以不管它们是否运行在同一个Node(宿主机)中,都要求它们可以直接通过对方的IP进行访问。设计这个原则是,用户不需要额外考虑如何建立Pod之间的联系,也不需要考虑如何将容器端口映射到主机端口问题。
实际,在Kubernetes的世界里,IP是以Pod为单位进行分配的。一个Pod内部的所有容器共享一个网络堆栈(相当于一个网络命名空间,它们的IP地址、网络设备、配置都是共享的)。按照这网络原则抽象出来的为每个Pod都设置一个IP地址的模型也称为IP-per-Pod模型。
由于Kubernetes的网络模型假设Pod之间访问时使用的是对方Pod的实际地址,所以一个Pod内部应用程序看到自己的IP地址和端口号和集群中其它Pod看到的是一样的。他们都是Pod实际分配的IP地址。将IP地址和端口号在Pod内部和外部都保持一致,这样就不用NAT进行地址转换。Kubernetes之所以这么设计是为了兼容过去的应用。这种IP-per-Pod的方案可以很好的利用现在有的各种域名解析和发现机制。
为每个Pod设置一个IP地址的模型,同一个Pod内的不同容器会共享同一个网络命名空间,也就是Linux网络协议栈。这就意味着同一个Pod内的容器可以通过localhost来连接对方端口。这种关系和同一个VM内进程之间的关系是一样的,看起来Pod内容器之间隔离性减小了,而且Pod内不同容器之间的端口号是共享的,就没有私有端口概念。如果应用必须使用特定的端口范围,可以用这个应用单独建立一个Pod。如果对那些没有特殊需求的应用,由于Pod内的容器是共享部分资源的,所以可以通过共享资源通信,这样显然更加容易和高效。针对这样的应用&#x