在我们了解如何管理服务以及如何高效建立服务发现之前,我们必须了解服务发现所面临的首要挑战:IP分配问题。具体而言,Kubernetes将IP地址动态分配给Pod和服务的方式。
我们固然可以为单个Pod和服务定义IP地址,但这样做会限制Kubernetes环境的可伸缩性。在默认情况下,环境在每次重新启动集群、pod或服务时,任意资源都会获得新的IP地址,因此我们只能对服务使用唯一的名称。
为了克服这一问题,你可以使用两种方法。其一,查看服务的环境变量。与Docker允许容器相互通信的方式类似,Kubernetes允许你扫描注入到容器中的环境变量。
如果你有在多个端口上运行的服务,你可以运行kubectl exec memcached-rm58b env命令,然后对服务名称进行快速grep操作,之后将会显示分配给该服务的可用IP地址和端口。不过,这并不是管理服务发现的最有效方法。因为,这种方法中依赖的服务必须在 pod 启动之前就存在,不然是不会出现在环境变量中的。
Kube-DNS救场
长远来看,以下阐述的第二种方法通常被认为效率更高,这得益于Kubernetes的插件Kube-DNS。我们先来了解什么是Kube-DNS。顾名思义,Kube-DNS是充当内部DNS解析器的附加组件。它是一个数据库,其中包含用于查找的键值对。键是Kubernetes服务的名称,值是服务所运行的IP地址。
Kube-DNS仅依赖命名空间,无需以其他方式配置Pod和服务,甚至无需修改集群、Pod和服务的配置文件即可进行基于DNS的服务发现。
Kube-DNS同时也支持高级DNS查询以及DNS策略。例如,你可以对每个Pod进行配置,将其配置为遵循与其运行的节点不同的DNS属性。这意味着你可以使用私有DNS空间来自定义pod之间如何进行通信。
这一方法还能更进一步,在每个pod的基础上配置DNS策略。你需要做的就是将节点DNS策略设置为“None”,然后手动配置每个Pod以满足你的特定需求。