基于 CoreDNS 和 K8s 构建云原生场景下的企业级 DNS

容器作为近些年最火热的后端技术,加快了很多企业的数字化转型进程 。目前的企业,不是在使用云原生技术,就是在转向云原生技术的过程中 。在容器化进程中,如何保持业务的平稳迁移,如何将现有的一些服务设施一并进行容器化迁移,也是众多企业较为关注的点 。
以 DNS 为例,如何构建一个云原生的企业 DNS 系统?
CoreDNS 简介CoreDNS 是一个 Go 语言编写的灵活可扩展的 DNS 服务器,在 Kube.NETes 中,作为一个服务发现的配置中心,在 Kubernetes 中创建的 Service 和 Pod 都会在其中自动生成相应的 DNS 记录 。Kubernetes 服务发现的特性,使 CoreDNS 很适合作为企业云原生环境的 DNS 服务器,保障企业容器化和非容器化业务服务的稳定运行 。
构建企业 DNS 服务器时,一般会有以下需求:

  • 用户外网域名访问服务;
  • 混合云业务迁移、数据共享、容灾;
  • 开发代码 IP 写死导致架构可用性、弹性无法实现;
  • 统一 DNS 管理需求,含上下级平台对接;
  • DNS 劫持等网络安全风险;
  • 存量代码固定域名访问;
  • 集群外域名访问;
相比于 Bind 开源方案或 windows Server DNS 商业 DNS 服务器,CoreDNS 有以下优势:
  • 无商业许可要求,降低投资成本;
  • 轻量化,通过插件实现功能添加;
  • 支持 DNS,DNS over TLS,DNS over HTTP/2,DNS over gRPC 协议;
  • 提供 kubernetes 服务发现;
  • 支持对接 Route53/google Cloud DNS/AzureDNS;
  • 支持集成 Prometheus,OpenTracing,OPA,带来更全面的运维体验;
  • 支持整合容器管理平台,提供统一 DNS 系统运维 。
构建企业云原生 DNS 前,对 CoreDNS 做一个更深入的了解 。
CoreDNS 运行原理与插件介绍CoreDNS 基于 Caddy 框架实现模块化设计,每个插件承载相应的具体功能,对于 DNS 系统而言,CoreDNS 使用 File,ETCD 插件等加载 DNS 记录,使用 Kubernetes 插件实现集群服务发现,外部 DNS 请求到达 CoreDNS 后,根据插件调用链依次处理 DNS 请求 。
基于 CoreDNS 和 K8s 构建云原生场景下的企业级 DNS

文章插图
 
CoreDNS 社区官方提供了 50 多种插件,开发者亦可根据需求开发个性化的外部插件 。CoreDNS 常用插件如下图,根据使用场景,可分为运维、DNS 处理、后端数据存储等三个类别 。
CoreDNS 定义 Corefile 配置文件,服务器在加载 Corefile 后处理 DNS 请求,对于以下插件,只需在 Corefile 中引用即可,之后 CoreDNS 会使用插件链进行调用,插件链可参考以下链接: ?
https://github.com/coredns/coredns/blob/master/plugin.cfg? ?
基于 CoreDNS 和 K8s 构建云原生场景下的企业级 DNS

文章插图
 
设计一个基于 CoreDNS 的分层 DNS 架构在熟悉 CoreDNS 特性后,可设计企业的 DNS 架构:
基于 CoreDNS 和 K8s 构建云原生场景下的企业级 DNS

文章插图
 
DNS 架构以外网 DNS、内网 DNS、分区 DNS 组成:
外网 DNS:
  • 使用 DNSSEC、DOT、DOH 等保障 DNS 安全;
  • 缓存 DNS 记录;
  • 构建 DNS 实例自动伸缩,应对高 QPS 需求;
内网 DNS:
  • Kubernetes 服务发现;
  • 构建上游 DNS 区域;
分区 DNS:
  • 建立开发、测试、UAT、生产等区域 DNS;
  • NodeLocalDNS 提高性能;
  • 设置转发器处理递归 DNS 请求;
KubeSphere 部署 CoreDNS由于 CoreDNS 是一个 CNCF 毕业的云原生项目,是目前支持云原生最好的一个 DNS 服务器,用户可直接在 KubeSphere 应用商店一键安装 。KubeSphere 提供了基于 Helm 模板的应用商店,支持云原生应用的生命周期管理,提供开发人员应用上传、测试,版本提交,应用管理人员进行审核、发布等流程管理 。用户在应用商店选择 CoreDNS 应用后,可按需部署于不同集群的不同项目中,并自定义应用模板配置:
基于 CoreDNS 和 K8s 构建云原生场景下的企业级 DNS

文章插图
 

基于 CoreDNS 和 K8s 构建云原生场景下的企业级 DNS

文章插图
 
服务发现与 DNS 配置部署 CoreDNS 后,对于运维人员来说,CoreDNS 的配置大体分为两类:一类为 Kubernetes 配置,一类为 DNS 配置 。CoreDNS 提供了 Kubernetes 插件,支持在 kubernetes 集群中读取区域数据,并根据 Pod 和 Service 的域名记载相应的 A 记录和 PTR 记录 。


推荐阅读