Kubernetes 服务的 DNS 服务搭建和配置指南 -1

2020-06-18 0 By admin

作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,这就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析。

一、Kubernetes 集群中DNS服务的三个阶段

1.1、第一阶段 SkyDNS

在Kubernetes 1.2版本时,DNS服务是由SkyDNS提供的,它由4个容器组成:kube2sky、skydns、etcd和healthz。
kube2sky容器监控Kubernetes中Service资源的变化,根据Service的名称和IP地址信息生成DNS记录,并将其保存到etcd中;
skydns容器从etcd中读取DNS记录,并为客户端容器应用提供DNS查询服务;
healthz容器提供对skydns服务的健康检查功能。

1.2、第二阶段 KubeDNS

从Kubernetes 1.4版本开始,SkyDNS组件便被KubeDNS替换,主要考虑是SkyDNS组件之间通信较多,整体性能不高。
KubeDNS由3个容器组成:kubedns、dnsmasq和sidecar,去掉了SkyDNS中的etcd存储,将DNS记录直接保存在内存中,以提高查询性能。
kubedns容器监控Kubernetes中Service资源的变化,根据Service的名称和IP地址生成DNS记录,并将DNS记录保存在内存中;
dnsmasq容器从kubedns中获取DNS记录,提供DNS缓存,为客户端容器应用提供DNS查询服务;
sidecar提供对kubedns和dnsmasq服务的健康检查功能。

1.3、第三阶段 CoreDNS

从Kubernetes 1.11版本开始,Kubernetes集群的DNS服务由CoreDNS提供。
CoreDNS是CNCF基金会的一个项目,是用Go语言实现的高性能、插件式、易扩展的DNS服务端。
CoreDNS解决了KubeDNS的一些问题,例如dnsmasq的安全漏洞、externalName不能使用stubDomains设置,等等。
CoreDNS支持自定义DNS记录及配置upstream DNS Server,可以统一管理Kubernetes基于服务的内部DNS和数据中心的物理DNS
CoreDNS没有使用多个容器的架构,只用一个容器便实现了KubeDNS内3个容器的全部功能。

二、为Kubelet 设置DNS服务信息

在创建DNS服务之前修改每个Node上kubelet的启动参数;修改每个Node上kubelet的启动参数,加上以下两个参数。

  1. –cluster-dns=169.169.0.100:为DNS服务的ClusterIP地址。
  2. –cluster-domain=cluster.local:为在DNS服务中设置的域名。

然后重启kubelet服务。

三、创建 CoreDNS 应用

在部署CoreDNS应用前,至少需要创建一个ConfigMap、一个Deployment和一个Service共3个资源对象。
在启用了RBAC的集群中,还可以设置ServiceAccount、ClusterRole、ClusterRoleBinding对CoreDNS容器进行权限设置。

3.1、ConfigMap 配置文件

名为 coredns 的ConfigMap 资源对象是设置CoreDNS 服务的主配置文件Corefile的内容,其中可以定义各种域名的解析方式和使用的插件。其文件内容可以在网络上查找。

3.2、Deployment 容器应用配置文件

Deployment 的文本内容,可以在网络上自行查找。其中,replicas副本的数量通常应该根据集群的规模和服务数量确定,如果单个CoreDNS进程不足以支撑整个集群的DNS查询,则可以通过水平扩展提高查询能力。
由于DNS服务是Kubernetes集群的关键核心服务,所以建议为其Deployment设置自动扩缩容控制器,自动管理其副本数量。

3.3、Service 应用服务配置文件

对 CoreDNS 设置 Service 资源对象时,需要设置固定的ClusterIP,也需要将所有Node上的kubelet启动参数--cluster-dns设置为这个ClusterIP。