基于eBPF的云原生可观测性开源项目Kindling之容器环境下的DNS问题排查

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: DNS是容器化环境下很重要且使用频繁的功能,但DNS问题却又是比较难以排查的,本文主要介绍DNS问题排查。

问题描述

最近在协助用户做业务的容器化迁移时,对业务做压力测试,发现ui服务的/homepage接口出现了偶发性的响应请求超时。给大家分享下排查问题过程。

问题定位

先通过skywalking看看相关ui的/homepagetrace,通过下图可以看到总耗时超过5828ms。

发现延时出现在ui/homepage的self上,共耗时4005ms。其他依赖调用的时间只用了1823ms。可以确认从ui/homepage调用app/homepage的请求发生到请求数据传输完成耗时太多。现在没有更好的方法进一步排查具体的耗时情况,进入ui容器内,只能使用curl访问app/homepage看看。

$curl -4 -w "@curl-format.txt" -o /dev/null -l "http://app.default.svc.cluster.local:8091/homepage"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:03 --:--:--     0
time_namelookup: 4.150
time_connect: 0.800
time_appconnect: 0.000
time_redirect: 0.000
time_pretransfer: 0.021
time_starttransfer: 0.000
----------
time_total: 4.981

直接在pod中使用tcpdump抓包,使用wireshark分析结果如下:

  1. app.default.svc.cluster.local 域名解析成IP的总共耗时4.1s。
  2. 在app.default.svc.cluster.local 的基础上,依次添加default.svc.cluster.local、svc.cluster.local、cluster.local、openstacklocal 后缀进行域名解析,都失败了。
  3. 最后一次使用app.default.svc.cluster.local 进行解析成功了。

为啥会有多次请求DNS,百度了下发现K8S的DNS解析机制,和resolv.conf文件中ndots和search两个参数的机制作用有关系。查看容器的/etc/resolv.conf配置:

nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local openstacklocal
options ndots:5 single-request-reopen
ndots: 5 表示如果域名包含的 "." 少于5个,则先添加 search 后缀,再使用绝对域名;如果域名包含的 "." 大于等于5个,则先使用绝对域名,再添加 search 后缀。

原因是app.default.svc.cluster.local少于5个点,所以先加search后缀。最后再使用app.default.svc.cluster.local进行解析。

解决方案

  1. 使用简短域名,app.default.svc.cluster.local改成app
  2. 修改/etc/resolv.conf配置,将ndots: 5 修改为 ndots: 4

问题复盘

DNS是Kubernetes集群中至关重要的基础服务之一,因为K8S的机制,造成DNS域名解析请求是Kubernetes最高频的网络行为之一。如果DNS有问题,很容易出现性能问题。但DNS很难通过apm等监控工具的trace定位问题,只能通过登录容器进行抓包分析,这种除了耗时耗力外,很可能相关的POD都已经消亡了。

可以实时监控DNS吗?

Kindling的eBPF探针可以实时获取到被监控POD间的所有请求,包括DNS请求。部署完成后,通过Kindling来排查DNS问题就很方便了。DNS Request Detiail 面板显示了单个K8S集群下DNS请求的监控数据。可以在此面板中分析网络的DNS性能。面板显示了DNS的关键KPI指标,例如:请求量、延时、错误数等。通过面板可以清晰了解DNS的运行状态,像前面介绍的场景可以直接看到发起了4次状态为NXDomain的DNS解析。下面通过一段视频简单介绍一下Kindling轻量版的DNS面板功能。


Kindling项目地址:Kindling

在云可观测性方面有任何疑问欢迎与我们联系:Kindling官网

目录
相关文章
|
2月前
|
Kubernetes Cloud Native 容器
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
188 1
|
2月前
|
监控 Cloud Native 安全
浅谈云原生可观测性
【1月更文挑战第23天】
|
2月前
|
域名解析 Kubernetes 网络协议
【域名解析DNS专栏】云原生环境下的DNS服务:Kubernetes中的DNS解析
【5月更文挑战第29天】本文探讨了Kubernetes中的DNS解析机制,解释了DNS如何将服务名转换为网络地址,促进集群内服务通信。Kubernetes使用kube-dns或CoreDNS作为内置DNS服务器,每个Service自动分配Cluster IP和DNS条目。通过示例展示了创建Service和使用DNS访问的流程,并提出了优化DNS解析的策略,包括使用高性能DNS解析器、启用DNS缓存及监控日志,以实现更高效、可靠的DNS服务。
|
2月前
|
Dubbo Cloud Native 应用服务中间件
【阿里云云原生专栏】云原生环境下的微服务治理:阿里云 Dubbo 与 Nacos 的深度整合
【5月更文挑战第25天】阿里云Dubbo和Nacos提供微服务治理的强大工具,整合后实现灵活高效的治理。Dubbo是高性能RPC框架,Nacos则负责服务发现和配置管理。整合示例显示,通过Nacos注册中心,服务能便捷注册发现,动态管理配置。简化部署,提升适应性,但也需注意服务稳定性和策略规划。这种整合为云原生环境的微服务架构带来强大支持,未来应用前景广阔。
219 2
|
2月前
|
Cloud Native 测试技术 持续交付
构建高效稳定的云原生应用部署策略云端防御:云计算环境中的网络安全与信息保护策略
【5月更文挑战第27天】 在快速迭代和持续交付成为企业软件开发新常态的今天,如何确保云原生应用的部署效率与稳定性是每个运维工程师面临的重要挑战。本文将探讨一种综合性部署策略,该策略结合了容器化技术、微服务架构、自动化测试以及持续集成/持续部署(CI/CD)流程,旨在为现代云原生应用提供一个可靠且高效的部署模式。通过分析传统部署模式的不足,并引入先进的技术和实践,我们的目标是降低部署风险,提高部署速度,同时确保产品质量和服务的稳定性。
|
2月前
|
存储 Prometheus 运维
【阿里云云原生专栏】云原生下的可观测性:阿里云 ARMS 与 Prometheus 集成实践
【5月更文挑战第25天】阿里云ARMS与Prometheus集成,为云原生环境的可观测性提供强大解决方案。通过集成,二者能提供全面精准的应用监控,统一管理及高效告警,助力运维人员及时应对异常。集成示例代码展示配置方式,但需注意数据准确性、监控规划等问题。这种集成将在云原生时代发挥关键作用,不断进化以优化用户体验,推动业务稳定发展。
152 0
|
2月前
|
监控 Cloud Native 测试技术
持续集成与持续交付(CI/CD)在云原生环境中的应用与优化
传统软件开发模式下的集成和交付流程往往繁琐且易出错,而随着云原生技术的快速发展,持续集成与持续交付(CI/CD)在云原生环境中的应用变得尤为重要。本文将探讨CI/CD在云原生环境中的应用及优化策略,包括自动化测试、容器化部署以及监控和反馈机制等方面,旨在帮助开发团队更好地应对云原生时代的挑战。
41 2
|
2月前
|
监控 安全 Linux
|
2月前
|
算法 NoSQL Linux
Linux C++环境下避免死锁的全面策略解析与实践指南
Linux C++环境下避免死锁的全面策略解析与实践指南
81 0
|
2月前
|
IDE Cloud Native 开发工具
云原生之在Docker环境下部署Atheos云IDE平台
【2月更文挑战第3天】云原生之在Docker环境下部署Atheos云IDE平台
437 2