首先,我们先要搞清楚k8s中的三种IP:

  1. Node IP,Node节点的IP地址,这个ip很好理解,就是集群中每个节点的物理网卡的IP地址,这是真是存在的网络
  2. Pod IP, Pod的IP地址,它是docker engine根据docker0网桥的IP地段进行分配的,通常是一个虚拟的二层网络。pod之间的通信是通过PodIP所在的虚拟二层网络来进行通信的,而真是的TCP/IP流量则是通过Node IP所在物理网卡流出的
  3. Cluster IP: Service的IP地址,这是一个虚拟伪造的IP,它有以下这些特性:

a. Cluster IP仅仅作用于k8s service这个对象,并由k8s管理和分配IP地址(来源于Cluster IP地址池)
b. Cluster IP 无法被ping, 因为没有实体网络对象响应
c. Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备TCP/IP的通信基础
d. 集群内,Node IP,Pod IP,Cluster IP网之间的通信,采用的是k8s自己设计的一套独特的规则,和我们所熟悉的IP有很大不同

服务发现

正如我们所知,pod的EndPoint地址会随着Pod的销毁而变化,但是service不会,service一经过创建,k8s就会分配cluster ip。在service的整个生命周期内,cluster ip不会变。所以只是需要用servicce的name和service的cluster ip地址做一个DNS域名映射就可以解决问题。

最开始的时候,k8s用来一个很土鳖的制度,那就是通过Linux的环境变量来解决问题。即是在service生成的时候,生成一些Linux的环境变量(ENV), 在每个pod的容器在启动的时候,自动注入环境变量。

k8s现在通过Add-On增值包的方式引入了DNS系统,把服务名作为DNS域名,这样一来,程序之间就可以通过服务名来建立通信了。

但是我还是对服务发现这个概念有很大的疑问,服务发现就指的是服务间调用的方式?