Polaris-Sidecar:更低成本的内网DNS实现


导语


PolarisMesh 是腾讯开源的百万级服务发现和治理中心,积累了腾讯从虚拟机到容器时代的分布式服务治理经验。作为分布式和微服务架构中的核心组件,PolarisMesh 提供服务寻址、流量调度、故障容错和访问控制等一系列能力,在K8s 和虚拟机环境中可以无差别使用,支持主流的开发模式,兼容grpc、spring cloud和servicemesh等开源生态,帮助用户快速构建扩展性强、可用性高的业务架构,实现从传统架构到云原生架构的转型。


内网寻址存在的问题


当某个服务下部署了多个应用程序副本时,一个请求如何发送给某一副本上进行处理呢?当应用部署于kubernetes时,请求流量先经过Service,再由Service将流量转发至某一个Pod进行处理;而应用部署在VM或者物理机时,会额外部署一个用于流量转发的组件,请求将先经过该组件,再由该组件将流量转发至某一台机器进行请求处理。



上述请求调用的方式,都是将所有的流量通过LVS等四层负载均衡组件进行转发,即某个服务下的所有服务实例都挂载到一个VIP(Virtual IP)下,所有的请求都先经过此VIP,再由VIP转发,但是这种方式使用起来会遇到以下几个明显的问题:
  • 负载问题 :所有的请求都必须经过这个VIP,VIP的请求转发压力会增大,容易引起四层负载组件出现高负载。
  • 性能问题 :请求链路中增加了负载均衡组件到业务进程的一跳,使得长尾时延变大;比如filebeat上报ES,ES集群暴露一个VIP,当filebeat上报数据时,由于每个请求都是大数据包并且均经过VIP,导致长尾时延很大。
  • 成本问题:需要维护VIP的可用性以及高性能,成本变大;直接在云上购买VIP产品,产品规格为50Mpbs的话,每月的成本都在¥3000~¥4000左右。

如果要解决VIP所带来的问题,那么通用的解决方式,就是去除负载均衡组件到业务进程这一跳的网络请求链路,直接将主调方的请求流量发送至对应业务进程进行处理。 这种思路存在两种解决 方案。
  1. 侵入式方案 :主动获取被调方地址。 主调方发起请求前先通过SDK的形式,发起请求前需调用SDK的获取服务地址的方法,在获取某服务下业务进程的的IP地址信息后向被调方发起请求。该方案需要将服务发现SDK与业务框架进行集成。
  2. 无侵入式方案 :被动获取被调方地址。 该方案最典型的就是DNS协议。主调方仅需要记录被调方的域名信息,通过DNS的形式,获取域名下的所有服务地址信息,随机选取一个向被调方发起请求。该方案无需将服务发现SDK与业务框架进行集成。

在上文提到的filebeat上报ES、组件Proxy统一接入地址、数据库主备节点统一接入地址等几个场景中,由于涉及到开源及第三方组件,这些组件无法通过改造的方式集成注册中心SDK,因此无法实施侵入式方案,只能通过无侵入式的方案来解决,下面我们看看如何实现无侵入的内网DNS方案。


如何实现无侵入的内网DNS


上述所提到的内网DNS方案,主要有集中式分布式两种实现方式,北极星对这两种方式均提供支持。下面向大家分享前期北极星对于这两种方案的设计思考


集中式DNS



集中式DNS模式,需要北极星服务端实现DNS协议,然后需要修改业务进程所在环境的/etc/resolv.conf 配置,将北极星服务端所在IP作为第一个 nameserver 地址即可,这样业务进程所有的DNS请求都将发往北极星服务端,北极星服务端会根据域名解析出对应的服务以及命名空间,将相关实例地址信息数据进行DNS回包。


可见,在时间驱动型场景中,相比执行内容而言,业务更关注的任务是定时执行还是周期执行、执行具体时间点准确性、周期频率的长短等时间因素。


分布式DNS



分布式DNS模式,则是通过在业务进程所在环境运行 polaris-sidecar 进程,然后需要修改业务进程所在环境的/etc/resolv.conf 配置,将 127.0.0.1 所在IP作为第一个 nameserver 地址,这样业务的DNS请求将全部由polaris-sidecar进程代为处理,polaris-sidecar在将自身缓存的服务地址列表进行DNS回包。polaris-sidecar 自身的服务地址信息缓存会定时和北极星服务端进行同步,从而拉取服务的最新实例地址列表。


北极星的选择:分布式DNS


这里再给出一个北极星对于集中式DNS与分布式DNS,在能力支持上的对比表格:


功能
集中DNS
分布式DNS
服务发现
支持
支持
服务注册
不支持
不支持
标签路由
不支持 支持
就近路由
不支持 支持
故障熔断
支持 支持
限流
不支持 部分支持
鉴权
不支持 支持


集中式DNS:DNS请求只能携带域名名称信息,提供的数据信息非常有限,北极星在此基础上只能做到服务发现,无法满足用户就近路由、分区路由等服务治理的需求。


分布式DNS:由于 polaris-sidecar 与业务进程在同一部署环境下,因此可以将一些静态信息注入为环境变量,polaris-sidecar 会将这些环境变量信息作为服务治理所需要的数据,每次处理DNS请求时可以通过这些静态标签执行相应的服务治理流程;因此相比集中式DNS服务发现,分布式DNS方案可以享受到更多的北极星服务治理能力。


选型依据:北极星服务端插件化的设计,要支持集中式DNS的方案十分便捷,仅需要在北极星服务端接入层中添加一个DNS协议的接入插件即可。但是北极星定位是一个服务治理中心,因此北极星在支持DNS协议的服务发现基础之上,同时还希望能将治理能力带入到DNS协议中,因此,最终北极星采用分布式DNS方案实现内网DNS寻址的能力。


后续规划


  • 协议扩展:支持SRV记录,解决后端多个实例端口号不一致的问题。

  • 能力补齐:支持限流及鉴权能力。



如何使用Polaris


参考文档



https://github.com/polarismesh/polaris-sidecar/blob/main/README.md

项目链接




  • polaris-sidecar
    https://github.com/polarismesh/polaris-sidecar

  • polaris-controller
    https://github.com/polarismesh/polaris-controller

学习视频链接



为了方便大家更好的学习北极星(PolarisMesh)开源项目,我们特别推出了《 北极星PolarisMesh训练营 系列学习课程,帮助大家更好地了解和使用北极星,您可以通过以下链接了解课程信息(视频课程每周更新1~2个),欢迎大家关注、点赞、转发:
  • bilibili

    https://www.bilibili.com/video/BV1A34y147tx/

  • 知乎

    https://www.zhihu.com/zvideo/1490462493013667841


往期

推荐


Linux 下一代架构基金会宣布:联合腾讯等企业和社区,发力微服务标准化建设

《腾讯云开源业界首个云原生标准的一站式微服务管理框架 Femas》

《分布式任务调度:你知道和不知道的事》

《云原生时代的Java应用优化实践》

《全面兼容Eureka:PolarisMesh(北极星)发布1.5.0版本》

《全面拥抱Go社区:PolarisMesh全功能对接gRPC-Go | PolarisMesh12月月报》

《SpringBoot应用优雅接入北极星PolarisMesh

《Serverless可观测性的价值》

《RoP重磅发布0.2.0版本:架构全新升级,消息准确性达100%》



扫描下方二维码关注本公众号,

了解更多微服务、消息队列的相关信息!

解锁超多鹅厂周边!


戳原文,查看更多PolarisMesh的信息!


点个在看你最好看


本文分享自微信公众号 - 腾讯云中间件(gh_6ea1bc2dd5fd)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

{{o.name}}
{{m.name}}

猜你喜欢

转载自my.oschina.net/u/4587289/blog/5506329