当前位置: 首页 > news >正文

k8s集群配置NodeLocal DNSCache

一、简介

当集群规模较大时,运行的服务非常多,服务之间的频繁进行大量域名解析,CoreDNS将会承受更大的压力,可能会导致如下影响:
延迟增加:有限的coredns服务在解析大量的域名时,会导致解析结果返回慢。
业务访问异常:集群内的服务基本都是通过域名进行访问,coredns在解析压力大时会存在慢或者丢包的情况,导致服务之间解析异常。

二、原理架构
NodeLocal DNSCache 通过在集群节点上作为 DaemonSet 运行 DNS 缓存代理来提高集群 DNS 性能。 在当今的体系结构中,运行在 ‘ClusterFirst’ DNS 模式下的 Pod 可以连接到 kube-dns serviceIP 进行 DNS 查询。 通过 kube-proxy 添加的 iptables 规则将其转换为 kube-dns/CoreDNS 端点。 而借助新架构,Pod 将可以访问在同一节点上运行的 DNS 缓存代理,从而避免 iptables DNAT 规则和连接跟踪。 本地缓存代理将查询 kube-dns 服务以获取集群主机名的缓存缺失(默认为 “cluster.local” 后缀)

启用 NodeLocal DNSCache 之后,DNS 查询所遵循的路径如下,流程图取自官网:
在这里插入图片描述

三、与coredns对比
1、 使用当前的 DNS 体系结构,如果没有本地 kube-dns/CoreDNS 实例,则具有最高
DNS QPS 的 Pod 可能必须延伸到另一个节点。 在这种场景下,拥有本地缓存将有助于改善延迟。
2、 跳过 iptables DNAT 和连接跟踪将有助于减少 conntrack 竞争并避免 UDP DNS 条目填满 conntrack 表。
3、 从本地缓存代理到 kube-dns 服务的连接可以升级为 TCP。 TCP conntrack 条目将在连接关闭时被删除,相反 UDP 条目必须超时 (默认 nf_conntrack_udp_timeout 是 30 秒)。
4、 将 DNS 查询从 UDP 升级到 TCP 将减少由于被丢弃的 UDP 包和 DNS 超时而带来的尾部等待时间; 这类延时通常长达 30 秒(3 次重试 + 10 秒超时)。 由于 nodelocal 缓存监听 UDP DNS 查询,应用不需要变更。
5、 在节点级别对 DNS 请求的度量和可见性。
6、 可以重新启用负缓存,从而减少对 kube-dns 服务的查询数量。
四、NodeLocal DNSCache部署
1)修改kubelet.config文件,添加NodeLocal DNS的本地侦听IP。本文使用的地址为:169.254.20.10。

kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
cgroupDriver: systemd
clusterDNS: [“169.254.20.10”,“169.169.0.100”]
clusterDomain: cluster.local
failSwapOn: false
allow-privileged: true
tlsCipherSuites: [“TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256”,“TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256”,“TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305”,“TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384”,“TLS_ECDHE_R
SA_WITH_CHACHA20_POLY1305”,“TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384”,“TLS_RSA_WITH_AES_256_GCM_SHA384”,“TLS_RSA_WITH_AES_128_GCM_SHA256”]authentication:
anonymous:
enabled: false
x509:
clientCAFile: /etc/kubernetes/ssl/ca.crt

2)部署NodeLocal DNS的yaml如下:

apiVersion: v1
kind: ServiceAccount
metadata:
name: node-local-dns
namespace: kube-system
labels:
kubernetes.io/cluster-service: “true”
addonmanager.kubernetes.io/mode: Reconcile

apiVersion: v1
kind: Service
metadata:
name: kube-dns-upstream
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: “true”
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/name: “KubeDNSUpstream”
spec:
ports:

– name: dns
port: 53
protocol: UDP
targetPort: 53

  • name: dns-tcp
    port: 53
    protocol: TCP
    targetPort: 53
    selector:
    k8s-app: kube-dns

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: node-local-dns
    namespace: kube-system
    labels:
    addonmanager.kubernetes.io/mode: Reconcile
    data:
    Corefile: |
    cluster.local:53 {
    errors
    cache {
    success 9984 30
    denial 9984 5
    }
    reload
    loop
    bind 169.254.20.10 #NodeLocal DNS的本地侦听IP。
    forward . 169.169.0.100 { #转发到coredns地址
    force_tcp #转发协议
    }
    prometheus :9253
    health 169.254.20.10:8080
    }
    in-addr.arpa:53 {
    errors
    cache 30
    reload
    loop
    bind 169.254.20.10
    forward . 169.169.0.100 {
    force_tcp
    }
    prometheus :9253
    }
    ip6.arpa:53 {
    errors
    cache 30
    reload
    loop
    bind 169.254.20.10
    forward . PILLAR__CLUSTER__DNS {
    force_tcp
    }
    prometheus :9253
    }
    .:53 {
    errors
    cache 30
    reload
    loop
    bind 169.254.20.10
    forward . 169.169.0.100
    prometheus :9253
    }

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
    name: node-local-dns
    namespace: kube-system
    labels:
    k8s-app: node-local-dns
    kubernetes.io/cluster-service: “true”
    addonmanager.kubernetes.io/mode: Reconcile
    spec:
    updateStrategy:
    rollingUpdate:
    maxUnavailable: 10%
    selector:
    matchLabels:
    k8s-app: node-local-dns
    template:
    metadata:
    labels:
    k8s-app: node-local-dns
    annotations:
    prometheus.io/port: “9253”
    prometheus.io/scrape: “true”
    spec:
    priorityClassName: system-node-critical
    serviceAccountName: node-local-dns
    hostNetwork: true
    dnsPolicy: Default # Don’t use cluster DNS.
    tolerations:
    - key: “CriticalAddonsOnly”
    operator: “Exists”
    - effect: “NoExecute”
    operator: “Exists”
    - effect: “NoSchedule”
    operator: “Exists”
    containers:
    - name: node-cache
    image: 127.0.0.1:1120/panji_microservice/k8s-dns-node-cache:1.22.9
    resources:
    limits: #根据自己环境设置合适的资源限制
    cpu: 50m
    memory: 50Mi
    requests:
    cpu: 25m
    memory: 5Mi
    args: [ “-localip”, “169.254.20.10”, “-conf”, “/etc/Corefile”, “-upstreamsvc”, “kube-dns-upstream” ]
    securityContext:
    capabilities:
    add:
    - NET_ADMIN
    ports:
    - containerPort: 53
    name: dns
    protocol: UDP
    - containerPort: 53
    name: dns-tcp
    protocol: TCP
    - containerPort: 9253
    name: metrics
    protocol: TCP
    livenessProbe:
    httpGet:
    host: 169.254.20.10
    path: /health
    port: 8080
    initialDelaySeconds: 60
    timeoutSeconds: 5
    volumeMounts:
    - mountPath: /run/xtables.lock
    name: xtables-lock
    readOnly: false
    - name: config-volume
    mountPath: /etc/coredns
    - name: kube-dns-config
    mountPath: /etc/kube-dns
    volumes:
    - name: xtables-lock
    hostPath:
    path: /run/xtables.lock
    type: FileOrCreate
    - name: kube-dns-config
    configMap:
    name: kube-dns
    optional: true
    - name: config-volume
    configMap:
    name: node-local-dns
    items:
    - key: Corefile
    path: Corefile.base

    apiVersion: v1
    kind: Service
    metadata:
    annotations:
    prometheus.io/port: “9253”
    prometheus.io/scrape: “true”
    labels:
    k8s-app: node-local-dns
    name: node-local-dns
    namespace: kube-system
    spec:
    clusterIP: None
    ports:
    - name: metrics
    port: 9253
    targetPort: 9253
    selector:
    k8s-app: node-local-dns

**注:**1、以上配置文件中 169.169.0.100 为k8s集群中得coredns的svc地址。
169.254.20.10为本地NodeLocal dns 监听服务地址。
2、NodeLocal dns会使用主机网络监听8080端口到宿主机,防止和业务服务端口冲突。

3)NodeLocal DNS在kube-proxy不同模式下的配置

一、kube-proxy 运行在 IPTABLES 模式:
可以在kubelet的kubelet.config配置文件中添加NodeLocal dns的本地地址即可。

二、 kube-proxy 运行在 IPVS 模式:
node-local-dns Pod 会设置 PILLAR__UPSTREAM__SERVERS
在此模式下,node-local-dns Pod 只会侦听 的地址。 node-local-dns 接口不能绑定 kube-dns 的集群 IP 地址,因为 IPVS 负载均衡使用的接口已经占用了该地址。
如果 kube-proxy 运行在 IPVS 模式,需要修改 kubelet 的 --cluster-dns 参数
NodeLocal DNSCache 正在侦听的 地址。

五、部署结果
部署node-local-dns服务。
在这里插入图片描述

服务访问域名解析结果如下,可以看到已经解析到本地dns:
在这里插入图片描述

六、压力测试
使用queryperf对NodeLocal dns 和DNS分别进行压测。
测试结果如下图,仅供参考:

qps100020001000050000100000
localdns0.0379s0.0030s0.0227s0.0001s0.0021s
coredns0.0104s0.0046s0.0026s0.0177s0.0061s

以看到,在解析压力较大时,Node localDNS的 解析性能优于coreDNS。

使用Node localDNS压测结果截图如下:

1000qps压测截图:
在这里插入图片描述

2000qps压测截图:
在这里插入图片描述

10000qps压测截图:
在这里插入图片描述
50000qps压测截图:
在这里插入图片描述
100000qps压测截图:
在这里插入图片描述
对coredns解析压测结果截图如下:

1000qps压测截图:
在这里插入图片描述
2000qps压测截图如下:
在这里插入图片描述
10000qps压测截图:
在这里插入图片描述
50000qps压测截图:
在这里插入图片描述
100000qps压测截图:
在这里插入图片描述

相关文章:

k8s集群配置NodeLocal DNSCache

一、简介 当集群规模较大时,运行的服务非常多,服务之间的频繁进行大量域名解析,CoreDNS将会承受更大的压力,可能会导致如下影响: 延迟增加:有限的coredns服务在解析大量的域名时,会导致解析结果…...

Superpoint Transformer for 3D Scene Instance Segmentation

Abstract 现有的大多数方法通过扩展用于3D物体检测或3D语义分割的模型来实现3D实例分割。然而,这些非直接的方法存在两个缺点:1) 不精确的边界框或不令人满意的语义预测限制了整体3D实例分割框架的性能。2) 现有方法需要一个耗时的中间聚合步骤。为了解决这些问题,本文提出…...

adb调试软件下载 及 常用调试命令

一、软件下载 Windows版本:下载 Mac版本:下载 Linux版本:下载 二、常见调试命令 进入ADB调试 在文件路径栏输入cmd,回车,即可进入adb调试。注意:以下3条不要登录设备 shell (一)显…...

变电站综合自动化监控系统在某物流园35kV变电站中应用

摘 要:Acrel-1000变电站综合自动化系统,是我司根据电力系统自动化及无人值守的要求,总结国内外的研究和生产的先进经验,专门研制出的新一代电力监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、遥控功能,可实现无人…...

技术的本质,是解决需求

分享下今日朋友圈精华内容。 很多人在初学时,走了很多弯路,一味追求热门、高性能、高复杂的芯片,或者系统,学了一堆东西,最后连个简单的功能,都实现不了。 大概是忘了,学技术的本质,…...

【刷题】leetcode 1 . 两数之和

两数之和 两数之和1 思路一 (简单突破)2 思路二 (进行优化)3 思路三 (哈希表 我还不会) 谢谢阅读Thanks♪(・ω・)ノ下一篇文章见!!! 两数…...

Sip - Ubuntu 配置 miniSIPServer 服务器(测试用)

客户提供的账号过期了,简单搭建 SIP 服务器,以便测试使用。个人认为这个配置起来最为简单,且测试功能足够。 官网miniSIPServer - 基于 Windows 以及 Linux 平台的 VoIP (SIP) 服务器软件. miniSIPServer 可能是最容易使用的 VoIP(SIP) 服务器…...

SpringCloud openFeign 之 获取被调用服务名

SpringCloud openFeign 之 获取被调用服务名 一. 概述 低版本 feign 只能获取到被调用方法的信息。 只有高版本 feign 才支持获取到被调用服务的信息。 二. 代码实现 package com.zxguan.springcloud2.template.user;import com.zxguan.springcloud2.template.user.config…...

ChatGPT和文心一言哪个更好用?

ChatGPT和文心一言都是基于深度学习技术的自然语言处理模型,它们各自具有优势和局限性,需要根据具体需求进行选择。以下是两者的比较: 算力:ChatGPT由OpenAI开发,具有强大的文本生成能力和语言理解能力,其训…...

第07章_面向对象编程(进阶)拓展练习(关键字:this,继承性和方法重写,关键字:super,多态性,Object类)

文章目录 第07章_面向对象编程(进阶)拓展练习01-关键字:this1、Circle类2、MyDate类3、Card类 02-继承性和方法重写4、Person、Student、Teacher类5、DepositCard、CreditCard类6、Employee、Programmer、Designer、Architect类7、判断输出结…...

小米路由器有线中继模式设置固定IP

第一步 小米路由器切换为有线中继模式后,进电脑版web管理界面,点击中继设置,把web页面地址中apsetting修改为setting(如下)后按回车键加载新页面。 修改前: http://192.168.1.168/cgi-bin/luci/;stokxxxx…...

用python实现给出关键字查找并标注pdf文件中关键字

要在Python中标注PDF文件中的关键字,可以使用Python的PDFMiner库和Python的matplotlib库。 首先,需要安装这两个库。可以使用pip命令进行安装: shell 复制代码 pip install pdfminer.six matplotlib 接下来,可以使用以下代码实现…...

postman自动化接口测试

背景描述 有一个项目要使用postman进行接口测试,接口所需参数有: appid: 应用标识;sign:请求签名,需要使用HMACSHA1加密算法计算,签名串是:{appid}${url}${stamp};stamp&#xff1…...

React入门 - 04(从编写一个简单的 TodoList 说起)

继上一节我们已经对 React组件和 ”JSX语法“有了大概的了解,这一节我们继续在 react-demo这个工程里编写代码。这一节我们来简单实现一个 TodoList来更加了解编写组件的一些细节。 1、在编辑器中打开 react-demo这个工程 2、打开 index.js文件,将组件 …...

EDM群发的优势

在当今这个数字化的时代,电子邮件营销(EDM)已经成为企业与客户沟通的重要手段。相较于传统的营销方式,EDM群发具有许多独特的优势,使其在商业竞争中占据了不可替代的地位。 首先,EDM群发具有精准的目标定位…...

AI对决:ChatGPT与文心一言的深度比较

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 引言ChatGPT与文心一言的比较Chatgpt的看法文心一言的看法Copilot的观点chatgpt4.0的回答 模型的自我评价自我评价 ChatGPT的优势在这里插入图片描述 文…...

在国产操作系统下管理Oracle数据库

Oracle公司是全球最大的信息管理软件及服务供应商,其开发的数据库产品因性能卓越而闻名,占有最大的市场份额,被广泛用于各个市场领域。 然而在信创化的时代,国产操作系统已然是大势所趋,但是由于历史原因,…...

RTSP/Onvif安防视频监控平台EasyNVR漏洞扫描及解决方法

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。安防视频监控平台可提供视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频…...

Ovtio不同版本下载

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩! 主要专栏内容包括: †《LAMMPS小技巧》: ‾ \textbf…...

【MATLAB】Linux版本 高分辨率屏 调整显示缩放

0 引言 安装了linux版本的MATLAB R2023b之后,发现工具栏字体很小不方便使用,所以上网找到了MATLAB论坛上某位大佬的教程:参考链接,放在这里供各位参考 。 1 环境 这里注明我的matlab安装环境仅供参考,未在其他环境下…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

CTF show 数学不及格

拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 ​ 根据题目…...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式:打开软件后,根据要处理的文件类型,选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件,就选择 “PDF 识别模式”;若是处理图片文件&…...

以太网PHY布局布线指南

1. 简介 对于以太网布局布线遵循以下准则很重要,因为这将有助于减少信号发射,最大程度地减少噪声,确保器件作用,最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确,然…...