kubernetes之kubedns部署(kubedns,dnsmasq,exechealthz)以及dns-autoscaler部署

网易公开课,开课啦!

主讲内容:docker/kubernetes 云原生技术,大数据架构,分布式微服务,自动化测试、运维。

腾讯课堂:点击进入
网易课堂:点击进入

7月1号-7月29号 8折优惠!!!
7月1号-7月29号 8折优惠!!!
7月1号-7月29号 8折优惠!!!


全栈工程师开发手册 (作者:栾鹏)
架构系列文章

一,理解Kubedns原理

通俗理解,首先明白k8s dns是为服务的发现而生,即service的发现,为了能够让其它服务能够直接通过service 名字找到它们,于是就需要dns将service名转换为它的IP, 那么service的变化如何知道? 如何知道目前有哪些service 及知道他们的ip呢,service的增加减少又如何知道了,

所以要有一个组件(1.3中是Kube2sky,1.3后是kubedns)来时刻监控它的变化,监控到了什么就把它记录下来,记录的是service和ip之间的映射关系,称为DNS解析记录,但是记录在某个位置呢,监控的组件不同,记录的位置也不同, Kube2sky是记录到etcd中,kubedns是记录到哪了呢, 记录在内存当中,使用树形结构在内存中保存监控到的记录。

由于一切对集群的操作都是通过其API来的,所以它监控service资源变化也是借助于k8s API

这个组件仅仅是记录下来以后,并不提供查询。所以查询就是另外一个组件的作用了,1.3之前是由Skydns来查询的, 所有服务(pod)都找skydns查询,1.3以后都是由dnsmasq查询的,它们从前面记录的地方查询相关service的解析记录,之所以用dnsmasq来查询,因为它提供DNS查询缓存,在内存中完成查询,查询速度非常快!

两个组件一个负责监控并记录,另外一个负责帮其它服务做查询, 两个组件必须要同时运行,如果其中一个出问题了,那么dns系统将无法解析,于是需要有另一个组件专门来监控它们的健康状态,这个组件就是exechealthz,Exechealthz是两个版本中唯一保留的容器,依然提供健康检查。

在K8s中,这三个组件都是用容器运行的,而且是在同一个pod中,

官方理解,上图:

kubernetes之kubedns部署(kubedns,dnsmasq,exechealthz)以及dns-autoscaler部署_第1张图片

下面的语法中注意区分kube-dns和kubedns, kube-dns是k8s的dns业务,kubedns是其中的一个业务容器.

  • dnsmasq简介
    Dnsmasq是一款小巧的DNS配置工具
    在kube-dns插件中的作用:

    • 通过kubedns容器获取DNS规则,在集群中提供DNS查询服务,相当于dns的server端。
    • 提供DNS缓存,提高查询性能
    • 降低kubedns容器的压力、提高稳定性
    • Dockerfile在GitHub上Kubernetes组织的contrib仓库中,位于dnsmasq目录下
  • exechealthz简介

    • 在kube-dns插件中提供健康检查功能
    • 源码同样在contrib仓库中,位于exec-healthz目录下。
    • 新版中会对两个容器都进行健康检查,更加完善。

总结
kube-dns插件的三个容器的功能如下:

  • kubedns容器

    • 监视k8s Service资源并更新DNS记录
    • 替换etcd,使用TreeCache数据结构保存DNS记录并实现SkyDNS的Backend接口
    • 接入SkyDNS,对dnsmasq提供DNS查询服务
  • dnsmasq容器

    • 对集群提供DNS查询服务
    • 设置kubedns为upstream
    • 提供DNS缓存,降低kubedns负载,提高性能
  • exechealthz容器

    • 定期检查kubedns和dnsmasq的健康状态
    • 为k8s活性检测提供HTTP API

二、部署kubedns

1,上官方网址下载需要的yaml部署文件:https://github.com/kubernetes/kubernetes/tree/release-1.10/cluster/addons/dns

部署文件为kube-dns.yaml.base

其中ServiceAccount和configMap部分不需要修改

Deployment和service中需要将clusterIP设置为我们想要的值, 也不需要做什么修改

Deployment运行了 三个容器:kubedns dnsmasq sidecar,sidecar 是一个监控健康模块,同时向外暴露metrics 记录。

部署文件设置好后,一起来创建:

# kubectl create -f kube-dns.yaml.base

** 三,验证kubedns功能**

如果我们此前已经有了部署了许多pod和服务,并且在Kubelet 启动配置文件加入了 --cluster-dns=10.254.0.2 --cluster-domain=cluster.local 参数,则可以进入某个pod中的容器内查看其/etc/resolv.conf 文件

根据kubelet的启动参数,kubelet会在每个pod中设置DNS域名解析文件/etc/resolv.conf,加入了nameser和search搜索域。最后应用程序就能够像访问网站一样,仅仅通过服务的名字就能访问到服务了。

通常可以启动一个带有nslookup工具的pod,比如busybox,镜像从gcr.io/google_containers/busybox下载,来验证DNS服务是否能够正常工作。

四,kubedns自动水平扩展

在上面部署的Kubedns,它只有一个pod,如果这个pod没有了 又或一个pod因为解析量大无法撑起解析时,会导致dns无法工作,所以官方给了一个自动水平伸缩的方案,根据当前pod的负载来决定是否增加或减少pod数量,

称为,dns-horizontal-autoscaler ,部署文件位于kubernetes/cluster/addons/dns-horizontal-autoscale/dns-horizontal-autoscaler.yaml,下载下来可直接部署。

dns-horizontal-autoscaler-rbac.yaml文件解析:

实际它就创建了三个资源:ServiceAccount、ClusterRole、ClusterRoleBinding ,创建帐户,创建角色,赋予权限,将帐户绑定到角色上面。

kubernetes之kubedns部署(kubedns,dnsmasq,exechealthz)以及dns-autoscaler部署_第2张图片

kubernetes之kubedns部署(kubedns,dnsmasq,exechealthz)以及dns-autoscaler部署_第3张图片

** 至此,一个完整的kubedns部署完成了。**

你可能感兴趣的:(架构,微服务架构)