您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

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

时间:2022-09-21 13:08:40  来源:今日头条  作者:JAVA数据库

容器作为近些年最火热的后端技术,加快了很多企业的数字化转型进程。目前的企业,不是在使用云原生技术,就是在转向云原生技术的过程中。在容器化进程中,如何保持业务的平稳迁移,如何将现有的一些服务设施一并进行容器化迁移,也是众多企业较为关注的点。

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 社区官方提供了 50 多种插件,开发者亦可根据需求开发个性化的外部插件。CoreDNS 常用插件如下图,根据使用场景,可分为运维、DNS 处理、后端数据存储等三个类别。

CoreDNS 定义 Corefile 配置文件,服务器在加载 Corefile 后处理 DNS 请求,对于以下插件,只需在 Corefile 中引用即可,之后 CoreDNS 会使用插件链进行调用,插件链可参考以下链接: ​
https://github.com/coredns/coredns/blob/master/plugin.cfg​ ​

 

设计一个基于 CoreDNS 的分层 DNS 架构

在熟悉 CoreDNS 特性后,可设计企业的 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 应用后,可按需部署于不同集群的不同项目中,并自定义应用模板配置:

 


 

服务发现与 DNS 配置

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

这是一个 Kubernetes 集群中的 CoreDNS corefile 默认配置,CoreDNS 会在 53 端口读取 cluster.local 后缀的 Kubernetes 集群 A 记录和 PTR 记录。并将 CoreDNS 收集到的监控指标通过 9153 端口输出到集群内的 Prometheus。而 Kubernetes 不同类型 Service 的 DNS 记录格式,CoreDNS 也有相应标准进行记录。

 

设置完 Kubernetes 后,可以设置其他业务需求的 DNS 配置,如:

  • 设置不同的存根域;
  • 设置存根域静态 DNS 条目;
  • 面对存量代码,设置域名重写;
  • 面对集群外服务,设置 DNS 转发;
  • 设置日志和监控集成;
  • 设置缓存、健康、就绪检查及链路追踪;

根据以上配置,就构建了一个基础的企业云原生 DNS 系统:

 

DNS 服务暴露

对于集群外的服务而言,存量业务可能还是一些虚拟化和裸机的应用,若和集群网络无法互联,如何在业务迁移时访问新的 DNS 服务?

KubeSphere 提供了一个开源项目——OpenELB 来解决云原生环境下的服务暴露问题,这是一个 CNCF 的沙箱项目。OpenELB 通过物理环境的交换机使用 BGP 协议将 LoadBalancer 类型服务的 ExternalIP 宣告出去,在 IP 可达的环境下集群外部业务即可通过 EIP 访问 Kubernetes 服务资源。

 

对于集群外需要设置 DNS 服务器的服务资源,可通过 OpenELB 使用 EIP 暴露 CoreDNS ,即可访问 DNS 服务 。

在 KubeSphere 3.3 版本,用户可在开启集群网关 / 项目网关时,在网关访问 LoadBalancer 模式下,选择“OpenELB”负载均衡提供商,之后创建的 LoadBalancer 服务都会从 OpenELB 建立的 EIP Pool 中分配 EIP,供集群外部访问。

 


 

DNS 监控运维

为保障 CoreDNS 稳定运行,运维人员还需在基础设施侧完善 DNS 系统的日志、监控、告警、通知功能,KubeSphere 提供了简单易用的监控面板、日志管理与落盘,多维度的告警策略和消息,以及对接多个企业应用(邮件,钉钉, 企业微信)的通知系统,时刻关注业务运行状态。

此处以一个系统管理员视角,展示了在 KubeSphere 日志系统搜寻 NXDOMAIN 类型 DNS 回复的结果。

 

通过 KubeSphere 自定义监控面板,设置一个基于 CoreDNS 指标的监控面板,KubeSphere 内置了众多监控面板,用户可直接使用模板构建亦可使用 PromQL 创建面板:

 


 


 

通过 KubeSphere 告警和通知组件,用户可基于预置规则模板(CPU、内存、磁盘、网络、异常率)或使用 PromQL 语句自定义告警规则,此处定义当 CoreDNS CPU 用量大于等于 0.1Core 系统触发告警:

 

KubeSphere 针对租户设计了通知模板,包含多种通知系统集成,此处使用邮件将“重要告警”,“危险告警”条件的告警消息发送给邮件接收人。

 

当告警触发后,即可在告警消息和通知历史处查看到相应的条目,此时用户也会收到一封告警邮件了:

 


 


 

在高并发 DNS 请求场景中,还需对 CoreDNS 进行自动伸缩设计,通常考虑到服务高可用性和性能考量,可参考以下计算规格和调度策略设计:

  • 副本打散,跨可用区 / 节点。
  • 避免所在节点 CPU、内存过高。
  • 通常设计副本数为 2。QPS 与 CPU 消耗正相关,单 CPU——1w+QPS
  • Kubernetes 集群下,CoreDNS 副本数与集群节点配置 1:8。
  • 业务峰值 CPU 占用 >1Core,水平扩容。

通过 KubeSphere 自动伸缩机制,可设置基于 CPU 用量的自动伸缩策略,保障 CoreDNS 在瞬时高并发场景稳定运行。

 


 

总结

以上就是建设一个云原生的 DNS 系统的全部内容了,可以看出,在云原生时代,新的技术层出不穷,IT 系统的部门和人员也越发趋于协同作战,以往构建一个 DNS 系统可能只需要安装一套稳定能进行 DNS 解析的系统,并实现主备切换即可。在应用驱动基础架构转型的云原生时代,基础服务应用还更需要考虑异构系统的连接,灵活简便的安装升级管理,更强大的可靠性和自愈能力,日志监控通知系统的完善,还有更适合实际业务需求的弹性设计,来加速应用现代化,推动业务应用持续转型。



Tags:CoreDNS   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
容器作为近些年最火热的后端技术,加快了很多企业的数字化转型进程。目前的企业,不是在使用云原生技术,就是在转向云原生技术的过程中。在容器化进程中,如何保持业务的平稳迁移,如...【详细内容】
2022-09-21  Tags: CoreDNS  点击:(0)  评论:(0)  加入收藏
如果你厌倦了那些老古董的DNS服务,那么可以试试Coredns, 因为Caddy出色的插件设计, 所以Coredns的骨架基于caddy构建, 也就继承了良好的扩展性, 又因为Go语言是一门开发效率...【详细内容】
2022-09-13  Tags: CoreDNS  点击:(17)  评论:(0)  加入收藏
前言 CoreDNS近日在工作中修改DNS,由于CoreDNS pod数量比较多,习惯性地使用脚本批量重启,随之引发了nginx ingress的告警,有大量超时的请求发生,开始并未意识到是修改CoreDNS的原...【详细内容】
2020-11-05  Tags: CoreDNS  点击:(409)  评论:(0)  加入收藏
CoreDNS是SkyDNS的继任者,可以和很多后端(etcd,k8s等)进行通信。CoreDNS非常的灵活,它的灵活性得益于其丰富的插件 (https://coredns.io/plugins/ ),也可以写适合自己的插件。 CoreD...【详细内容】
2020-08-24  Tags: CoreDNS  点击:(246)  评论:(0)  加入收藏
▌简易百科推荐
容器作为近些年最火热的后端技术,加快了很多企业的数字化转型进程。目前的企业,不是在使用云原生技术,就是在转向云原生技术的过程中。在容器化进程中,如何保持业务的平稳迁移,如...【详细内容】
2022-09-21  JAVA数据库  今日头条  Tags:CoreDNS   点击:(0)  评论:(0)  加入收藏
今天给大家聊聊docker具名、匿名挂载的相关知识,一起来学学吧! 匿名挂载1.1 含义匿名挂载就是指定容器内路径,dockers run 每挂载一个目录就会宿主主机自动创建一个随机字符...【详细内容】
2022-09-11  IT技术分享社区  今日头条  Tags:docker   点击:(18)  评论:(0)  加入收藏
1.拉取镜像docker pull nginxdocker pull php:5.6-fpm2.创建网络docker network create php-net3.运行nginx和php-fpmdocker run --name nginx-web -d -p 8080:80 --network...【详细内容】
2022-08-03  it程序员    Tags:docker   点击:(57)  评论:(0)  加入收藏
1 docker下载最新版本提示wsl等异常 低版本无异常如.4https://docs.docker.com/desktop/release-notes/#docker-desktop-444 2 docker加速镜像器配置:"registry-mirrors": [...【详细内容】
2022-08-01  测试开发robonxun    Tags:docker   点击:(34)  评论:(0)  加入收藏
一、docker直接运行一个nginx应用# docker run -d -p 8080:80 nginxUnable to find image 'nginx:latest' locallylatest: Pulling from library/nginxa330b6cecb98...【详细内容】
2022-07-27  阿文系统架构    Tags:docker   点击:(60)  评论:(0)  加入收藏
随着 Kubernetes 成为主流的应用容器编排平台,其命令行客户端 kubectl 也成为了我们日常部署应用,维护集群最常用的工具。 kubectl 自身提供了强大的内置命令来满足我们对集群...【详细内容】
2022-07-23  懵懵哟SRE    Tags:   点击:(31)  评论:(0)  加入收藏
一、Docker的架构和底层技术1.Docker Platform(平台) Docker提供了一个开发、打包、运行app(应用application)的平台 把app和底层infrastructure(基础设备)隔离开来 2.Docker...【详细内容】
2022-07-11  测试店小二    Tags:容器   点击:(54)  评论:(0)  加入收藏
-v 宿主机地址:容器内地址 当宿主机地址为以/开始的绝对路径(挂载) /root/html:/usr/share/nginx/html如果这个绝对路径中为空,会覆盖容器内文件夹内容,形成空挂载;如果希望保...【详细内容】
2022-07-08  凹凸苹果    Tags:docker容器   点击:(89)  评论:(0)  加入收藏
近年来,随着数字设备逐渐普及,个人数据随之攀升,以手机为例,以前16G就够用,现在512G都满足不了某些重度用户的需求。在这种情况下,曾经作为商用存储解决方案的NAS被引入消费级领域...【详细内容】
2022-07-06  定焦科技港  搜狐号  Tags:Docker   点击:(20)  评论:(0)  加入收藏
1. 容器编排技术容器编排是指对多个容器的部署,管理和监控。之所以有容器编排技术,其实是和业务量与系统复杂度与日俱增推动服务部署的演进方式息息相关的,下图是服务部署方式...【详细内容】
2022-07-06  来敲个bug    Tags:Kubernetes   点击:(52)  评论:(0)  加入收藏
站内最新
站内热门
站内头条