关于kubernetes与DNS,你必须知道的微服务架构的服务管理

Posted 苏研大云人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于kubernetes与DNS,你必须知道的微服务架构的服务管理相关的知识,希望对你有一定的参考价值。


应用场景


在kubernetes中每一个service都会被分配一个虚拟IP(kube-proxy生成访问规则,其虚拟IP可在创建service时直接指定),每一个Service在正常情况下都会长时间不会改变,所属该service的pod的IP因各种原因会有所变化,如pod实例因为业务流量过大,触发HPA规则,致使pod数量动态增长,但是对于该集群来说,使用该service进行通信是相对稳定的。但是如果其他应用需要与该Service进行通信,只有将service的信息注入到pod环境变量的方式,且严格规定了pod和service的启动顺序(当然可以使用init container方式来进行服务监测,这使得Kuberntees集群的使用不是太优雅。


基于上述一些原因,kubernetes以插件的方式引入了DNS 系统,利用DNS对Service进行一个映射,这样我们在应用中直接使用域名进行访问,避免了之前的变量配置问题,也解决了创建顺序的强依赖问题,cncf为产品化发展给出了如下的分层架构图。


关于kubernetes与DNS,你必须知道的微服务架构的服务管理



服务注册


服务注册中心是服务发现机制中的核心部分。它是一个包含服务实例弟子的数据库(如etcd)。服务注册中心需要实现高可用并实时更新。客户端可以缓存从服务注册中心获取的网络位置。但是,信息最终会过期,导致客户端不能发现服务实例。于是,服务注册中心可以使用K/V存储的一致性来解决服务器集群的一致性问题。

kubernetes中以插件的方式使用dnsmasq作为DNS服务器。并且引入了一个另外一个组件kube-dns用来创建和删除域名解析记录及提供自身的健康检查。它目前仅支持两种解析A记录、SRV记录,在集群中对于域名的创建遵循一个规则:

对于A记录:

每一个Service都会对应一个A记录,命名规则为:

SERVICENAME.NAMESPACENAME.svc.CLUSTERDOMAIN

SERVICENAME:每个Service的名字

NAMESPACENAME:Service所属的namespace的名字

svc:固定值

CLUSTERDOMAIN:集群内部的域名


对于SRV记录:

每一个服务端口和服务协议会对应一个SRV记录,命名规则为:

_PORTNAME._PORTPROTOCOL.SERVICENAME.NAMESPACENAME.svc.CLUSTERDOMAIN

_PORTNAME:服务端口名字

PORTPROTOCOL:服务端口的协议类型

SERVICENAME:每个Service的名字

NAMESPACENAME:Service所属的namespace的名字

svc:固定值

CLUSTERDOMAIN:集群内部的域名


其中,

SRV记录: 是服务器资源记录的缩写,SRV记录的作用是用于描述一个服务器能够提供什么样的服务。

基于云的微服务架构,因为自动(手动)伸缩、故障、升级等,服务实例(pods)动态生成IP集合,kub-proxy将它的IP添加进iptables,kube-proxy监听kubernetes事件,当该pod实例终止的时候,该IP将会从iptables删除。其他方式的服务访问,以后做深入介绍。


组件分析

kubernetes推荐使用的dns组件有以下两种:

1

coredns

2

kube-dns

其中,CoreDNS基于Caddy实现域名服务器,CoreDNS同样具备中间件序列功能,类似openstack中的middleware,CoreDNS被作为SkyDNS的下一代产品,其依靠etcd存储服务信息,提供域名访问服务。

CoreDNS支持多种查询请求方式:UDP/TCP,TLS以及gRPC。主要功能有:域名安全、缓存、健康检查、pprof、rewrite、支持kubernetes、whoami、日志管理、metrics(prometheus)、服务代理等。


关于kubernetes与DNS,你必须知道的微服务架构的服务管理



再来看看kube-dns,主要有三大组件sidecar、dnsmasq、kube-dns,其中sidecar负责对外暴露监控指标(prometheus类型)以及提供域名系统的健康检查功能,kube-dns负责监听apiserver事件,生成/删除域名记录,dnsmasq使用开业dnsmasq工具提供域名访问服务,原理如下图所示。



性能测试

首先准备查询域名目标,如下操作:

    [root@ys-2 ~]# for i in `kubectl get svc -n kube-system|awk '{ print $1}'`;do echo $i".kube-system.svc.cluster.local" >> ns.txt;done
    [root@ys-2 ~]# touch nq.txt
    [root@ys-2 ~]# for i in `seq 1 10000`;do cat ns.txt >> nq.txt;done

生产10w+查询目标,使用queryperf测试工具

社区结果如下:

启用缓存:

Kube-DNS (cache enabled): 15k qps

CoreDNS (cache enabled): 8k qps

未用缓存:

Kube-DNS (cache disabled): 7k qps

CoreDNS (cache disabled): 5k qps

实际结果:

未用缓存:

Kube-DNS (cache disabled): 3.8k qps

CoreDNS (cache disabled): 4.2k qps


结论


通过对dnsmasq的性能调优,如开启缓存功能等,Kube-DNS满足绝大多数应用场景,若需实现多集群的服务管理,使用Kubernetes(Federation多集群功能),社区推荐使用CoreDNS,当然,可以采用第三方技术实现多集群的服务管理,如hashicorp开源工具(consul)等。


1

END

1




请猛戳右边二维码





苏研大云人


以上是关于关于kubernetes与DNS,你必须知道的微服务架构的服务管理的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot与Kubernetes云原生微服务实战

.Net微服务实战之可观测性

个推基于Docker和Kubernetes的微服务实践

JHipster 微服务实体

Kubernetes运维之微服务生产环境采坑分享

做更好的单元测试:关于单测你必须知道的技巧与原则