ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Kubernetes 的 DNS 延迟问题

2022-07-23 11:32:17  阅读:165  来源: 互联网

标签:UDP DNS Kubernetes 查询 问题 内核 conntrack 延迟


原创链接:https://www.modb.pro/db/101042

由于 Linux 内核中的缺陷,在 Kubernetes 集群中你很可能会碰到恼人的 DNS 间歇性 5 秒延迟问题(社区 issue 为 #56903[1])。虽然 issue 已经关闭了,但并不是说这个问题已经完全解决了,所以在管理和维护 Kubernetes 集群时,我们需要注意绕开这个缺陷。

解决方法

要避免 DNS 延迟的问题,就要设法绕开上述三个问题,所以就有下面几种方法:

  1. 禁止并发 DNS 查询,比如在 Pod 配置中开启 single-request-reopen
    选项强制 A 查询和 AAAA 查询使用相同的 socket:
  options:
    - name: single-request-reopen

禁用 IPv6 从而避免 AAAA 查询,比如可以给 Grub 配置 ipv6.disable=1
来禁止 ipv6(需要重启节点才可以生效)。

  1. 使用 TCP 协议,比如在 Pod 配置中开启 use-vc
    选项强制 DNS 查询使用 TCP 协议:
dnsConfig:
  options:
    - name: single-request-reopen
    - name: ndots
      value: "5"
    - name: use-vc
  1. 使用 Nodelocal DNS Cache[5],所有 Pod 的 DNS 查询都通过本地的 DNS 缓存查询,避免了 DNAT,从而也绕开了内核中的竞争问题。你可以执行下面的命令来部署它(注意它会修改 Kubelet 配置并重启 Kubelet):
kubectl apply -f https://github.com/feiskyer/kubernetes-handbook/raw/master/examples/nodelocaldns/nodelocaldns-kubenet.yaml

为什么会有 DNS 间歇性延迟问题

为什么在 Kubernetes 集群会碰到这个间歇性 5 延迟的问题呢?Weave works 发布了一篇博客Racy conntrack and DNS lookup timeouts[2]详细介绍了问题的原因。

简单来说,由于 UDP 是无连接的,内核 netfilter 模块在处理同一个 socket 上的并发 UDP 包时就可能会有三个竞争问题。以下面的 conntrack 和 DNAT 工作流程为例:
image

由于 UDP 的 connect 系统调用不会立即创建 conntrack 记录,而是在 UDP 包发送之后才去创建,这就可能会导致下面三种问题:

  1. 两个 UDP 包在第一步 nf_conntrack_in
    中都没有找到 conntrack 记录,所以两个不同的包就会去创建相同的 conntrack 记录(注意五元组是相同的)。
  2. 一个 UDP 包还没有调用 get_unique_tuple
    时 conntrack 记录就已经被另一个 UDP 包确认了。
  3. 两个 UDP 包在 ipt_do_table
    中选择了两个不同端点的 DNAT 规则。

所有这三种场景都会导致最后一步 __nf_conntrack_confirm
失败,从而一个 UDP 包被丢弃。由于 GNU C 库和 musl libc 库在查询 DNS 时,都会同时发出 A 和 AAAA DNS 查询,由于上述的内核竞争问题,就可能会发生其中一个包被丢掉的问题。丢弃之后客户端会超时重试,超时时间通常是 5 秒。

上述的第三个问题至今还没有修复,而前两个问题则已经修复了,分别包含在 5.0 和 4.19 中:

  1. netfilter: nf_nat: skip nat clash resolution for same-origin entries[3] (包含在内核 v5.0 中)
  2. netfilter: nf_conntrack: resolve clash for matching conntracks[4] (包含在内核 v4.19 中)

在公有云中,这些补丁有可能也会包含在旧的内核版本中。比如在 Azure 上,这两个问题已经包含在 v4.15.0-1030.31 和 v4.18.0-1006.6 中。

标签:UDP,DNS,Kubernetes,查询,问题,内核,conntrack,延迟
来源: https://www.cnblogs.com/Star-Haitian/p/16511226.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有