服务发现机制
Kubernetes提供了两种发现Service的方法:
1.环境变量
当Pod运行的时候,Kubernetes会将之前存在的Service的信息通过环境变量写到Pod中。
这种方法要求Pod必须要在Service之后启动。
在Service之前启动的Pod就不会有该Service的环境变量。
采用DNS的方式就没有这个限制。
2.DNS
当有新的Service创建时,就会自动生成一条DNS记录。
使用这种方法,需要安装Cluster DNS。
Kubernetes1.2.7版本下Cluster DNS的安装
阅读github上官方源码发现:
Cluster DNS自Kubernetes1.3版本开始,结构发生了变化。这里先以1.2.7版本作为研究。
1.2.7版本中,Cluster DNS主要包含如下几项:
1)SkyDNS
提供DNS解析服务。
2)Etcd
用于DNS的存储。
3)Kube2sky
监听Kubernetes,当有新的Service创建时,将其注册到etcd上。
4)healthz
提供对skydns服务的健康检查功能。
安装过程参考官方github文档。
在Master服务器上下载Kubernetes发布包
Cluster DNS在Kubernetes发布包的cluster/addons/dns目录下
yum -y install wget
wget https://codeload.github.com/kubernetes/kubernetes/tar.gz/v1.2.7
tar zxvf v1.2.7
cd kubernetes-1.2.7/cluster/addons/dns
需要注意,skydns服务使用的clusterIP需要我们指定一个固定的IP地址,每个Node的kubelet进程都将使用这个IP地址,不能通过Kuberneters自动给skydns分配。
通过环境变量,配置参数
export DNS_SERVER_IP="10.254.10.2"
export DNS_DOMAIN="cluster.local"
export DNS_REPLICAS=1
设置 Cluster DNS Service的IP为 10.254.10.2(不能和已分配的IP重复),Cluster DNS的本地域为 cluster.local。
修改每台Node上的kubelet启动参数
vim /etc/kubernetes/kubelet
在KUBELET_ARGS里增加:
--cluster_dns=10.254.10.2
--cluster_domain=cluster.local
cluster_dns为DNS服务的ClusterIP地址
cluster_domain为DNS服务中设置的域名
重启kubelet服务
systemctl restart kubelet
生成dns-rc.yaml和dns-svc.yaml
kubernetes-1.2.7/cluster/addons/dns目录下。
skydns-rc.yaml.in和skydns-svc.yaml.in是两个模板文件,通过设置的环境变量修改其中的相应属性值,可以生成Replication Controller和Service的定义文件。
生成Replication Controller的定义文件dns-rc.yaml创建RC
sed -e "s/{
{ pillar\['dns_replicas'\] }}/${DNS_REPLICAS}/g;s/{
{ pillar\['