目录

问题现象一

导致原因

优化方案

问题现象二

导致原因

优化方案

Core DNS配置优化和说明

参考文章:


问题现象一

重启coredns pod导致集群业务解析域名五分钟可不用

导致原因

当集群使用IPVS作为kube-proxy负载均衡模式时,您可能会在CoreDNS缩容或重启时遇到DNS概率性解析超时的问题。该问题由社区Linux内核缺陷导致,具体信息,请参见。ipvs: queue delayed work to expire no destination connections if expi… · torvalds/linux@35dfb01 · GitHubLinux kernel source tree. Contribute to torvalds/linux development by creating an account on GitHub.https://github.com/torvalds/linux/commit/35dfb013149f74c2be1ff9c78f14e6a3cd1539d1?spm=a2c63.p38356.0.0.56a3eb84uFgUly

粗浅的理解一下大概意思就是当coredns节点有变更例如ip变化了,由于有会话保持的机制pod还会复用之前的连接。

优化方案

1. 部署NodeLocal DNSCache(推荐)

另外一篇文章我会详细介绍一下NodeLocaDNS,先简单的说一下带来的收益

链接:NodeLocal DNS介绍及部署应用_Cloud孙文波的博客-CSDN博客NodeLocal DNSCache通过在集群节点上运行一个 DaemonSet 来提高 clusterDNS 性能和可靠性。处于ClusterFirst的 DNS 模式下的 Pod 可以连接到kube-dns的 serviceIP 进行 DNS 查询。通过kube-proxy组件添加的iptables规则将其转换为CoreDNS端点。通过在每个集群节点上运行 DNS 缓存,NodeLocal DNSCache 可以缩短 DNS 查找的延迟时间、使 DNS 查找时间更加一致,以及减少https://blog.csdn.net/weixin_43798031/article/details/131123908?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22131123908%22%2C%22source%22%3A%22weixin_43798031%22%7D

1)pod首先会访问nodelocaldns,nodelocaldns会将每次请求缓存到本地。可以大大的提高性能。相当于集群的每个节点都是一个dns服务器

2) 降低coredns 80% - 90%的请求量,减轻coredns的压力和瓶颈问题

3) 如果coredns有变更时,由于我们使用nodelocaldns,pod会首先访问nodelocaldns 如果请求没有命中,nodelocaldns 再去请求coredns 进行tcp协议的请求重新建立连接三次握手,几乎不影响业务

2.  修改kube-proxy 会话保持超时时间 --ipvs-udp-timeout=10s

修改方式两种,都需要重启kube-proxy

1) 一般通常会在kube-system命名空间下有一个kube-proxy的configmap,configmap中把这行配置加上即可。

2)修改kube-proxy daemonsets 增加参数

简单说一下不推荐第二种方式的原因

默认超时时间为300s,我当时遇到的现象就是服务五分钟无法解析。

1)可以修改为10s或者5s这样可以减少一些业务流量的损失,但是没有解决本质的问题。

2)如果设置为0则代表不开启会话保持,这种情况下我们的业务pod每进行一次域名方式的请求都会去和coredns 建立udp的连接。频繁建连首先一定会造成很多不必要的网络开销。

3)其次就是如果我们coredns 将65535个端口都占用完这个时候就会建立连接失败意味着业务会解析失败。

4)重启集群所有kube-proxy pod 尤其是在线业务这种操作对服务来说是毁灭性的

问题现象二

服务部署到集群后,业务反馈有些接口会报无法解析部分外网域名的问题。

导致原因

因为我们的Deployment默认使用的dnsPolicy策略为ClusterFirstWithHostNet,这种模式会优先走集群内部的coredns解析,如果coredns无法解析就会通过coredns的配置文件 forward 到宿主机的/etc/resolv.conf文件使用nameserver dns。我们宿主机的dns是自建的,我们的dns只做内网域名的解析,公网域名都会forward到公有云的DNS服务器。 画个简图如下

注意我上面说的是部分公网无法解析并不是所有公网域名都不行。之后我们为了快速恢复业务,将dnsPolicy 策略改为了Default模式这个模式会将宿主机的 resolv.conf文件挂载到pod中相当于使用宿主机的nameserver。改成这种方式也没有恢复。

测试发现用dig命令直接解析时会报错 connection timed out; no servers could be reached,用nslookup 解析则正常由于隐私问题我就不截解析结果的图了。从nslookup的解析结果来看这个域名包含了70多条A记录。如下图

这里说明了一个问题,nslookup解析域名是用的TCP协议,dig 默认不指定协议的情况是UDP,之后我又用dig +tcp 再次解析这个域名结果符合预期使用tcp解析时没有问题的。

那么问题又来了,为什么使用UDP协议解析时会失败呢。抓包分析由于这个域名有很多A记录导致返回结果超过了512 字节 达到了1866字节。

抓包的路径如下

服务器---> LB --> IDC DNS Server 这个包是在dns 服务器上看到的。同时我们也在服务器抓包发现服务器并没有接收到response只有query的包。那这个问题又是为什么呢?dns 服务器分明给我返回数据了但是我的客户端没有接收到。结合我们整体的链路判断应该是LB出现了问题

询问云厂商后得知他们LB用的NAT模式也就是说请求的结果一定还会通过LB将结果返回,而且云厂商LB还有一个限制当使用UDP请求的返回结果大于1500byte 就会丢弃。而且之前我们还测试过nameserver绑定某一台rs是没有问题。足以说明一定是LB的问题。

优化方案

1.  将LB  TCP 后端rs增加为9个确保每个rs都能正常响应tcp请求

2.  部署NodeLocal DNSCache,pod 访问NodeLocalDNS默认协议是UDP,但是NodeLocal DNS 请求core DNS使用的是TCP协议。

3. 业务代码改用TCP方式(需要研发配合修改代码,如果涉及到底层依赖的库不是太友好)

Core DNS配置优化和说明

apiVersion: v1
data:Corefile: |.:53 {errorsready  # 节点就绪探测,默认监听端口8181,检测通过后挂到endpoint#logdebughealth {  #CoreDNS自身健康状态报告,默认监听端口8080,一般用来做健康检查lameduck 15s}kubernetes cluster.local in-addr.arpa ip6.arpa {pods insecurefallthrough in-addr.arpa ip6.arpa}hosts {198.18.96.191 xxx.xxx.xxx.xxxfallthrough}#template IN AAAA .      #禁用ipv6#template ANY AAAA {     #ipv6解析时返回NXDOMAIN#    rcode NXDOMAIN#    fallthrough#}prometheus :9153forward . /etc/resolv.conf {prefer_udp             #优先使用udp协议}cache 30loop                     #环路检测,如果检测到环路,则停止CoreDNS。reload                   #动态加载配置文件loadbalance              #循环DNS负载均衡器,可以在答案中随机A、AAAA、MX记录的顺序}
kind: ConfigMap
metadata:name: corednsnamespace: kube-system

参考文章:

CoreDNS配置说明 - 容器服务 ACK - 阿里云

ipvs: queue delayed work to expire no destination connections if expi… · torvalds/linux@35dfb01 · GitHub

coreDNS 常见问题及优化方案相关推荐

  1. 测试工作中常见问题及优化方案

    本文内容主要总结日常测试过程中遇到的问题,并总结对应的优化方案 1.产品需求文档为A,开发的技术实现为B,需求文档与实现不一致(可能产品最后同意技术实现方案B) 存在的问题: 由于测试同学分析需求时按 ...

  2. mysql数据库开发常见问题及优化

    mysql 数据库是被广泛应用的关系型数据库,其体积小.支持多处理器.开源并免费的特性使其在 Internet 中小型网站中的使用率尤其高.在使用 mysql 的过程中不规范的 SQL 编写.非最优的 ...

  3. TiDB 实战优化之 SQL 常见问题与优化案例

    原文来源: https://tidb.net/blog/90a37e62 我今天分享的内容高度融合了很多跟 TiDB 相关内容.其实我在积极地助力 TiDB 在贝壳找房落地,因为我发现一个特点,如果我 ...

  4. 史上最全Android性能优化方案解析

    Android中的性能优分为以下几个方面: 布局优化 网络优化 安装包优化 内存优化 卡顿优化 启动优化 -- 一.布局优化 布局优化的本质就是减少View的层级.常见的布局优化方案如下: 在Line ...

  5. SQL数据库不用SQL语句能显示全表的内容_MySQL百万级数据库优化方案

    一.百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断 ...

  6. 电信号簿助手APP的官网优化方案

    该优化方案二八于2015年12月提交给电信号簿助手负责的相关公司一个朋友后,目前首页已做修改,对比之前更符合一个作为APP下载的展示官网.本文主要侧重从SEO.用户体验等几个角度,操作难度低,如果按照 ...

  7. mysql 百万级数据库优化方案【转】

    一.百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断 ...

  8. 数据库SQL优化方案

    转载地址:https://mp.weixin.qq.com/s?__biz=MzIxMjg4NDU1NA==&mid=2247483684&idx=1&sn=f5abc60e6 ...

  9. TensorRT优化方案图例

    TensorRT优化方案图例 图 12. TensorRT 循环由循环边界层设置.数据流只能通过下方式离开循环环输出层. 唯一允许的后边缘是第二个输入递归层. 图 13. 一个 if 条件构造抽象模型 ...

最新文章

  1. OpenCV 【四】————Watershed Algorithm(图像分割)——分水岭算法的原理及实现
  2. android 截长图 方法,Android实现截屏与截长图功能
  3. jsforeach异步的问题_js中forEach回调同异步题目
  4. sql创建计算机用户,2015年计算机四级数据库复习要点:SQL Server 登录账户
  5. CentoS7 and MySql 5.7下载安装
  6. Android 访问本地 HTML
  7. sql server management studio 快速折叠object explorer中的instance
  8. cmd指令大全指令_汇编语言常用指令大全
  9. 我觉得吧,这么学JavaScript,你才能通
  10. informix mysql,Informix相当于mysql的SHOW CREATE TABLE
  11. 数据库表的基本操作——创建一个表,索引和查询
  12. matlab中求均值的mean()函数的使用
  13. crazybox路由器解决授权码问题
  14. 数学建模之lingo使用
  15. 统计学习之第四天(可汗学院公开课:统计学)
  16. 分享一个查看外网IP的工具
  17. while循环CPU占用率高问题深入分析与解决方案
  18. 阿里发布虚拟美女“俪知”,会说东北话、四川话、河南话和粤语等
  19. 我的读书清单(持续更新)
  20. 虚拟机搭建Ubuntu16.04系统

热门文章

  1. mysql pdo查询语句,PHP PDO准备语句 – mysql LIKE查询
  2. Python 绝对路径引用
  3. 新商品发布接口,商品上下架接口,店铺上传接口,oAuth2.0商品发布新的接口对接方式
  4. 实用的Java回调实现
  5. shell命令查阅端口信息_linux查看端口状态相关命令
  6. [国家集训队2011]拆迁队nbsp;解题报告
  7. BZOJ2149 : 拆迁队
  8. IBM 3650 M4服务器问题总结
  9. 苹果在高端手机市场独舞,国产手机拥挤在千元机市场争锋
  10. 【Javascript高级知识】深入剖析JS中New一个对象的过程(实现原理)