作者:京东商城基础架构部
一、 引入
随着TIG阿基米德平台全面应用,组成京东容器生态技术栈的分布式域名解析服务ContainerDNS(go版https://github.com/tiglabs/containerdns )全量生产环境应用,承载着每天百亿的访问量,单实例峰值每秒请求达到15W QPS,已经接近ContainerDNS的性能极限(17W QPS)。为了更好的提高系统的并发服务,对ContainerDNS 的优化也势在必行。
本文对ContainerDNS性能优化思考和技术实践历程,希望对业内在容器领域和域名解析方向技术实践一些启迪。
ContainerDNS 的DNS Server 代码用Go 语言实现,我们在后期的优化中,通过各种尝试,并通过pprof 采集数据分析,发现性能损耗最大的是收发包的地方。同时我们对bind9 进行了压测、采集分析发现同样是收发包函数最为耗时。
数据平面开发套件DPDK(Data Plane Development Kit)可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。灵感来自TIG容器生态技术栈另外一个重要的服务高性能负载均衡服务Jupiter (https://github.com/tiglabs/jupiter )实现单实例200万QPS的高性能。因此TIG团队工程师想到用DPDK 来实现DNS数据报文的收发是一个有挑战和前景的尝试。
二、系统概述
让我们先来回顾下ContainerDNS设计之初的愿景和初心。ContainerDNS作为京东商城新一代软件定义数据中心的关键基础服务之一,具有以下特点:
- 分布式设计 多数据中心数据同步复制 避免维护多个域名解析元数据副本
- 支持自动发现服务域名 支持容器Service
- 支持后端探活
- 易于维护、易于动态扩展
ContainerDNS 包括四大组件 DNS server、service to DNS 、user API 、IP status check。这四个组件通过etcd 数据库集群结合在一起,彼此独立,降低了耦合性,每个模块可以单独部署。DNS server 用于提供DNS 查询服务的主体。service to DNS 组件是k8s 集群与DNS server的中间环节,会实时监控k8s集群的服务的创建,将服务转化为域名信息,存入etcd 数据库中。user API 组件提供restful api,用户可以创建自己的域名信息,数据同样保持到etcd数据库中。IP status check 模块用于对系统中域名所对应的ip做探活处理