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

一颗小胡椒2022-07-28 16:36:44

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

以 DNS 为例,如何构建一个云原生的企业 DNS 系统?

CoreDNS 简介

CoreDNS 是一个 Go 语言编写的灵活可扩展的 DNS 服务器,在 Kubernetes 中,作为一个服务发现的配置中心,在 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 解析的系统,并实现主备切换即可。在应用驱动基础架构转型的云原生时代,基础服务应用还更需要考虑异构系统的连接,灵活简便的安装升级管理,更强大的可靠性和自愈能力,日志监控通知系统的完善,还有更适合实际业务需求的弹性设计,来加速应用现代化,推动业务应用持续转型。

kubernetesdns
本作品采用《CC 协议》,转载必须注明作者和本文链接
CoreDNS 社区官方提供了 50 多种插件,开发者亦可根据需求开发个性化的外部插件。
2021年4月,Kubernetes社区披露了一个编号为CVE-2020-8562的安全漏洞,授权用户可以通过此漏洞访问 Kubernetes 控制组件上的私有网络。
近期,Kubernetes披露了一个关键的安全漏洞(容器编排工具迄今为止的第一个主要漏洞)并发布了Kubernetes 1.13。 首先这个安全漏洞会响所有基于Kubernetes的容器产品和服务,并且它为黑客提供了在Kubernetes集群中运行的任何计算节点的完全管理权限。
初识Kubernetes 集群
2022-05-24 15:41:41
Kubernetes (K8s) 集群是一组节点,它们以高效、自动化、分布式和可扩展的方式运行容器化应用程序。 K8s 集群允许工程师跨多个物理、虚拟和云服务器编排和监控容器。这将容器与底层硬件层分离,并实现敏捷和健壮的部署。一个 Kubernetes 集群由一组工作机器组成,称为节点,运行容器化应用程序。 每个集群至少有一个工作节点,工作节点托管豆荚它们是应用程序工作负载的组成部分。这控制平
浅谈云安全之K8S
2021-07-14 05:06:00
Kubernetes 是一个可移植的,可扩展的开源容器编排平台,用于管理容器化的工作负载和服务,方便了声明式配置和自动化。它拥有一个庞大且快速增长的生态系统。Kubernetes 的服务,支持和工具广泛可用。
本文将引入一个思路:“在 Kubernetes 集群发生网络异常时如何排查”。文章将引入 Kubernetes 集群中网络排查的思路,包含网络异常模型,常用工具,并且提出一些案例以供学习。其可能原因为Pod 的 DNS 配置不正确DNS 服务异常pod 与 DNS 服务通讯异常大数据包丢包:主要现象为基础网络和端口均可以连通,小数据包收发无异常,大数据包丢包。
序从 2021 年 10 月开始,NGINX 的 Kubernetes Ingress Controller开始受到安全研究人员的关注。曾披露了CVE-2021-25742漏洞:攻击者可以通过定制化的Snippets特性创建或修改集群中的Ingress实例,从而获取集群中所有的Secret实例信息。
ubuntu20.04,单网卡,能访问互联网, 切换到阿里云的源, sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak, sudo vim /etc/apt/sources.list, deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe mult
Dnsmasq是一种广泛使用的轻量级网络应用工具,旨在为小型网络提供DNS(域名系统)转发器、DHCP(动态主机配置协议)服务器、路由器广告和网络引导服务。
Kubebot介绍Kubebot是一款基于Google 云平台搭建,并且提供了Kubernetes后端的Slackbot安全测试工具。Google云端平台帐户。API服务器将请求以消息的形式转发至PubSub ToolTopic。消息发布至Tool Subscription。Subscription Worker在K8s集群上以Docker容器运行,处理来自Tool Subscription的消息,Worker的数量也可以根据需要进行调整。Tool Worker会将修改信息回传给Slack,并删除Tool Worker,因为它们已经完成了自己的任务。Kubebot集成的自动化工作流程列表随着更多工作流程的添加,此列表将不断更新wfuzz basic authentication bruteforcingSlack中的Slash命令样本/runtool nmap|-Pn -p 1-1000|google.com
一颗小胡椒
暂无描述