本文原文出处: http://blog.csdn.net/bluishglc/article/details/52438917 严禁任何形式的转载,否则将委托CSDN官方维护权益!
架构
Kubernetes的DNS服务是基于SkyDNS实现的,同时又需要和API Server紧密沟通,它的基本工作方式是通过API Server监视服务创建,一旦有新的服务创建就通知SkyDNS创建一条域名解析记录。沟通API Server和SkyDNS的工作都是由Kube2Sky完成的,Kube2sky和Skydns都需要使用ETCD实现共享配置和服务发现。以下是ETCD的架构图,它清晰地阐明了
Kubernetes实现DNS的方式
关于Skydns和Kube2sky是在本地安装还是以Pod的方式安装到Kube集群里,笔者在网上看到两种方式都有,但是笔者对本地安装的方式持怀疑态度,主要是涉及到虚拟网络和物理网络的联通性问题,具体地说就是Skydns Server的IP应该kube集群虚拟网络中的某个IP地址,也就是说这个IP需要在kube-apiserver启动参数–service-cluster-ip-range指定的IP地址范围内。而Skydns如果是本地化安装,是无法绑定DNS Server的IP为一个虚拟网络的IP(就是参数-addr的值)。笔者看到网上有文章是这样做的,但是笔者没有尝试成功,不排除需要某种网络位置才能打通两个网络之间的通信。总的来说,还是倾向使用镜像方式安装。
安装
Kube安装和配置DNS官方文档位于:https://github.com/kubernetes/kubernetes/tree/master/build/kube-dns 首先我们需要到 https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns 去下载skydns的kube部署文件,也既skydns-rc.yaml和skydns-svc.yaml两个文件,修改其中的参数变量后通过命令:
sudo kubectl create -f skydns-rc.yamlsudo kubectl create -f skydns-svc.yaml
- 1
- 2
来启动skydns,etdc,kube2sky等相关服务。与此同时,kubernetes所有slave节点的上kubelet服务也需要做相应的配置,配置文件是/etc/kubernetes/kubelet,主要的改动就是在文件中指定一下KUBELET_ARGS参数,把集群的名称的DNS服务器的IP地址设定好:
KUBELET_ARGS="--cluster-dns=10.254.0.2 --cluster-domain=cluster.local"
- 1
关于skydns-rc.yaml和skydns-svc.yaml这两个文件,有几处需要根据集群的情况进行配置修改,让我们以一份现有配置为例:
1. skydns-rc.yaml
2. skydns-svc.yaml
常见问题
上述配置中2个文件中需要注意的地方已用红色标记了,主要需要留心的是三个地方:
1. 集群域名
在skydns和kube2sky两个服务的配置中都需要指定集群的名称,这个名称同时必须要和/etc/kubernetes/kubelet中--cluster-domain=cluster.local
设定的集群名称是一致的。本例中我们统一使用cluster.local
2. DNS服务器的IP地址
在skydns-svc.yaml中我们需要指定DNS服务器的IP地址,也就是clusterIP: 10.254.0.2
, 同样的,这个IP地址也要和/etc/kubernetes/kubelet中--cluster-dns
设定的是一样的。另外,这个IP地址也不是随意设定的,它的值必须要在kube-apiserver启动参数–service-cluster-ip-range指定的IP地址范围内。
3. 在kube2sky服务中设定Kubenetes Master节点(API Server)的地址
这一点非常常重要,然而不知道是什么原因,在官方下载的skydns-rc.yaml文件(V11版本)中却恰恰丢掉了这个关键配置,所以会导致你的dns服务不能正常的工作,而关于--kube-master-url
的值也很重要,它是API Server的地址,这很有趣。在我们的实例中,kube的相关服务服务都是直接安装在物理机的,比如api server, etcd等等,所以它们的IP地址都是物理机的IP,而我们在本文中安装skydns使用的是基于docker镜像的方式安装的,由于物理机网络和kube的虚拟网络不互通,所以,你看到了,我们在安装skydns的过程中没有复用kube集群上的etcd这个既有服务,而是重新在kube集群上单独安装一个etcd,只为skydns服务。那么同样的,有趣的地方在于当我们在设定--kube-master-url
这个参数的值时,它却是物理机网络的一个IP,这让我感到困惑,限于对kube/skynds网络认知比较有限,我尚不清楚这样可以work的原因,一个种可能的猜测是kube2sky在使用这个IP访问API Server时应该是通过物理主机上的某个端口或者说是以物理机的身份去访问的,这个问题可以留待以后研究。
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow