文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何在Kubernetes上有效使用CoreDNS?

2024-12-03 03:59

关注

随着我们进一步的深入研究,发现大多数的失败都与DNS解析有关。这就是我们开始在Kubernetes上深入研究DNS解析的原因。

CoreDNS指标

DNS服务器在其数据库中存储记录,并使用该数据库回答域名查询。如果DNS服务器没有此数据,它会尝试从其他DNS服务器找到解决方案。

CoreDNS成为Kubernetes 1.13+之后的默认DNS服务。如今,当使用托管Kubernetes集群或为应用程序工作负载自我管理集群时,通常调整应用程序,而没有过多的关注Kubernetes提供的服务或如何利用它们。

DNS解析是任何应用程序的基本要求,即使是在Kubernetes集群上,也要确保CoreDNS正确配置和运行。

默认情况下,集群应该始终有一个仪表板盘观察关键的CoreDNS指标。为了获得CoreDNS指标,你应该启用Prometheus插件作为CoreDNS配置的一部分。

下面是使用Prometheus插件从CoreDNS实例中启用度量集合的配置示例。

.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods verified
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}

以下是我们建议您在仪表板中使用的关键指标。如果你正在使用Prometheus、DataDog、Kibana等,可以从社区/提供者那里找到现成的仪表板模板。

a.高速缓存命中百分比:使用CoreDNS高速缓存响应的请求的百分比;

b.DNS请求延迟:

c.转发到上行服务器的请求数;

d.请求的错误代码:

e.CoreDNS资源使用情况:服务器消耗的不同资源,例如内存,CPU等。

我们使用DataDog来监视特定的应用程序。下面是用DataDog构建的一个示例仪表板:

减少DNS错误

当我们开始深入研究应用程序如何向CoreDNS发出请求时,我们观察到大多数出站请求都是通过应用程序向外部API服务器发出的。

这通常是resolv.conf在应用程序部署窗格中的外观:

nameserver 10.100.0.10
search kube-namespace.svc.cluster.local svc.cluster.local cluster.local us-west-2.compute.internal
options ndots:5

Kubernetes尝试通过不同级别的DNS查找来解析FQDN。

考虑到上述DNS配置,当DNS解析器向CoreDNS服务器发送查询时,它会根据搜索路径尝试搜索域。

如果我们正在寻找一个域boktube.io,它将执行以下查询来在最后一个查询中接收成功的响应:

botkube.io.kube-namespace.svc.cluster.local <= NXDomain
botkube.io.svc.cluster.local <= NXDomain
boktube.io.cluster.local <= NXDomain
botkube.io.us-west-2.compute.internal <= NXDomain
botkube.io <= NoERROR

由于我们进行了过多的外部查找,因此我们收到了很多NXDomain DNS搜索的响应。为了优化这一点,我们在Deployment对象中定制了spec.template.spec.dnsConfig。这是改变的样子: 

dnsPolicy: ClusterFirst
dnsConfig:
options:
- name: ndots
value: "1"

通过以上改变,pods上的resolve.conf也改变了。只对外部域执行搜索。

这减少了对DNS服务器的查询数量,也有助于减少应用程序的5xx错误。通过下图可以看出NXDomain响应次数的差异:

因此我们收到了许多NXDomain响应DNS搜索。为了对此进行优化,我们在Deployment对象中自定义了spec.template.spec.dnsConfig。这是变化的样子:

针对此问题的更好解决方案是在Kubernetes 1.18+中引入的[Node Level Cache](https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/)。

根据您的需要自定义CoreDNS

我们可以使用插件自定义CoreDNS。Kubernetes支持不同类型的工作负载,而标准的CoreDNS配置可能无法满足你的所有需求。CoreDNS有两个树内插件和外部插件。

您尝试解析的FQDN的类型可能会根据你在集群上运行的工作负载的类型而有所不同,例如应用程序之间是否相互通信或在Kubernetes集群外部进行交互的独立应用程序。

我们应该尝试相应地调整CoreDNS的旋钮。假设您在特定的公共/私有云中运行Kubernetes,并且大多数由DNS支持的应用程序都在同一云中。在这种情况下,CoreDNS还提供特定的云相关或通用插件,可用于扩展DNS区域记录。

决定的关键因素之一是你是否在Kubernetes集群中运行适当数量的CoreDNS实例。建议至少运行两个CoreDNS服务器实例,以更好地保证DNS请求得到服务。

你可能需要为您的集群添加额外的CoreDNS实例或配置HPA (Horizontal Pod Autoscaler),具体取决于服务的请求数量、请求的性质、在集群上运行的工作负载数量和集群的大小。

诸如被服务的请求数量、请求的性质、在集群上运行的工作负载数量以及集群大小等因素应该有助于你决定CoreDNS实例的数量。

本强调了Kubernetes中DNS请求循环的重要性。很多时候,我们会觉得这不是DNS的问题,但最终会发现确实的DNS问题,小心这个坑。

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯