Kubernetes提供了两种发现Service的方法:
当Pod运行的时候,Kubernetes会将之前存在的Service的信息通过环境变量写到Pod中。
这种方法要求Pod必须要在Service之后启动。
在Service之前启动的Pod就不会有该Service的环境变量。
采用DNS的方式就没有这个限制。
当有新的Service创建时,就会自动生成一条DNS记录。
使用这种方法,需要安装Cluster DNS。
在kubernetes中每一个service都会被分配一个虚拟IP,每一个Service在正常情况下都会长时间不会改变,这个相对于pod的不定IP,对于集群中APP的使用相对是稳定的。但是Service的信息注入到pod目前使用的是环境变量的方式,并且十分依赖于pod(rc)和service的创建顺序,这使得这个集群看起来又不那么完美,于是kubernetes以插件的方式引入了DNS系统,利用DNS对Service进行一个映射,这样我们在APP中直接使用域名进行引用,避免了之前的变量泛滥问题,也避免了创建顺序的尴尬局面。
阅读github上官方源码发现:
Cluster DNS自Kubernetes1.3版本开始,结构发生了变化。这里先以1.2.7版本作为研究。
Cluster DNS扩展插件用于支持Kubernetes的服务发现机制,1.2.7版本中,Cluster DNS主要包含如下几项:
1)SkyDNS
提供DNS解析服务。
2)Etcd
用于DNS的存储。
3)Kube2sky
监听Kubernetes,当有新的Service创建时,将其注册到etcd上。
4)healthz
提供对skydns服务的健康检查功能。
Cluster DNS在Kubernetes发布包的cluster/addons/dns目录下
[root@k8s-master home]# yum -y install wget [root@k8s-master home]# wget https://codeload.github.com/kubernetes/kubernetes/tar.gz/v1.2.7 [root@k8s-master home]# tar -xf kubernetes-1.2.7.tar.gz [root@k8s-master home]# ls kubernetes-1.2.7 kubernetes-1.2.7.tar.gz sheng [root@k8s-master home]# cd kubernetes-1.2.7/cluster/addons/dns [root@k8s-master dns]# ls kube2sky MAINTAINERS.md OWNERS README.md skydns skydns-rc.yaml.in skydns-svc.yaml.in #skydns-rc.yaml.in和skydns-svc.yaml.in是两个模板文件,通过设置的环境变量修改其中的相应属性值,可以生成Replication Controller和Service的定义文件。
需要注意,skydns服务使用的clusterIP需要我们指定一个固定的IP地址,每个Node的kubelet进程都将使用这个IP地址,不能通过Kuberneters自动给skydns分配。
创建DNS服务的RC配置文件,在这个RC配置中包含了3个Container的定义
Kubernetes实战[2]: 服务发现机制与Cluster DNS的安装(无CA认证版)
原文地址:http://blog.51cto.com/sf1314/2124462