说明:
这里说的是k8s内部服务的“域名”解析,不是外部访问集群服务所用的标准域名,而是指集群内各服务访问可使用的一个名称,通常为:服务名称.命名空间.svc.cluster.local 格式,集群内部服务之间可以通过这个名称访问各服务,而不必使用服务的VIP(ClusterIP)。
服务发现及访问
Service 发现是k8s中的一个重要机制,其基本功能为:在集群内通过服务名对服务进行访问,即需要完成从服务名到ClusterIP的解析。
我们可以通过 Service 生成的 ClusterIP(VIP) 来访问 Pod 提供的服务,但是在使用的时候还有一个问题:我们怎么知道某个应用的 VIP 呢?比如我们有两个应用,一个是 api 应用,一个是 db 应用,两个应用都是通过 Deployment 进行管理的,并且都通过 Service 暴露出了端口提供服务。api 需要连接到 db 这个应用,我们只知道 db 应用的名称和 db 对应的 Service 的名称,但是并不知道它的 VIP 地址,我们前面的 Service 课程中是不是学习到我们通过 ClusterIP 就可以访问到后面的 Pod 服务,如果我们知道了 VIP 的地址是不是就行了?
k8s主要有两种service发现机制:
①:基于环境变量的方式
②:基于内部域名的方式
没有DNS服务的时候,k8s会采用环境变量的形式,但一旦有多个service,环境变量会变复杂,基本上,使用环境变量的方式很少,为解决该问题,主要还是使用内部域名这种服务发现的方式。
其中,基于内部域名的方式,涉及到 Kubernetes 内部域名的解析,而 kubedns是 Kubernetes 官方的 DNS 解析组件。
DNS服务在kubernetes中经历了三个阶段(SkyDNS-》KubeDNS-》CoreDNS):
- 【第一阶段】在kubernetes 1.2版本时,dns服务使用的是由SkyDNS提供的,由4个容器组成:kube2sky、skydns、etcd和healthz。etcd存储dns记录;kube2sky监控service变化,生成dns记录;skydns读取服务,提供查询服务;healthz提供健康检查。
- 【第二阶段】在kubernetes 1.4版本开始使用KubeDNS,有3个容器组成:kubedns、dnsmasq和sidecar。kubedns监控service变化,并记录到内存(存到内存提高性能)中;dnsmasq获取dns记录,提供dns缓存,提供dns查询服务;sidecar提供健康检查。
- 【第三阶段】从kubernetes >=1.11版本开始,dns服务有CoreDNS提供,coredns支持自定义dns记录及配置upstream dns server,可以统一管理内部dns和物理dns。coredns只有一个coredns容器。下面是coredns的架构。
coreDNS的作用是在集群内提供Service和Pod的域名解析服务。coreDNS会监听集群中Service和Pod的创建销毁事件,当Service或Pod被创建时,记录对应的解析记录。当其他Pod需要通过域名访问集群中的Service或Pod时,会向coreDNS服务查询解析记录,然后访问解析到的IP地址。整个流程如下:
在k8s中,dns解析也是以服务(svc)形式存在,pod中/etc/resolv.conf,配置的nameserver值为该服务的ip地址。
CoreDNS的Service 地址一般情况下是固定的,类似于 kubernetes 这个 Service 地址一般就是第一个 IP 地址 10.96.0.1,CoreDNS 的 Service 地址就是 10.96.0.10,该 IP 被分配后,kubelet 会将使用 --cluster-dns=<dns-service-ip> 参数配置的 DNS 传递给每个容器。DNS 名称也需要域名,本地域可以使用参数--cluster-domain = <default-local-domain> 在 kubelet 中配置:
➜ ~ cat /var/lib/kubelet/config.yaml
......
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
查看k8s中dns服务—kubedns:
k8s的DNS服务位于kube-system命名空间
root@