kubernetes里有三张不同的网络,每种IP地址,就代表一个不同的寻址空间
- Node IP:Node节点的IP地址
- Pod IP:Pod的IP地址
- Cluster IP:Service的IP地址
首先,Node IP是kubernetes集群中每个节点的物理网卡的IP地址(包括虚拟机的网卡),这是一个真实存在的物理网络,所有属于这个网络的服务器之间都能通过这个网络进行通信,不管他们中是否有部分节点不属于这个kebernetes集群。这也表明了Kubenetes集群之外的节点访问Kubernetes之内的某个节点或者TCP/IP服务时,必须要通过Node IP进行通信。
其次,Pod IP是每个Pod的IP地址,它是Docker Engine根据docker0网桥的IP地址段进行分配的,通常是一个虚拟的二层网络,前面我们说过,Kubernetes要求位于不同Node上的Pod能够彼此直接通信,所以Kuberntes里一个Pod里的容器访问另外一个Pod里的容器,就是通过Pod IP所在的虚拟二层网络进行通信的,而真实的TCP/IP流量则是通过Node IP所在的物理网卡流出的。
最后,我们说说Service的Cluster IP,它也是一个虚拟的IP,但更像一个“伪造”的IP网络,原因有一下几点。
- Cluster IP仅仅作用于kubernetes Service这个对象,并由Kubernetes管理和分配IP地址(来源于Cluster IP地址池)
- Cluster IP无法被ping,因为没有一个“实体网络对象”来响应
- Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备TCP/IP通信的基础,并且它们属于Kubernetes集群这样一个封闭的空间,集群之外的节点如果要访问这个通信端口,则需要做一些额外的工作。
- 在Kubernetes集群之内,Node IP网,Pod IP网与Cluster IP网之间的通信,采用的是Kubernetes自己设计的一种编程方式的特殊的路由规则,与我们所熟知的IP路由有很大的不同。
根据上面的分析和总结,我们基本明白了:Service的Cluster IP属于Kubernetes集群内部的地址,无法在集群外部直接使用这个地址。那么矛盾来了:实际上我们开发的业务系统中肯定多少有一部分要提供给Kubernetes集群外部的应用或者用户来使用的,NodePort是解决上述问题最直接、最有效、最常用的做法,这个主题以后再说。
来源:Kubernetes权威指南(纪念版)
网友评论