k8s集群配置NodeLocal DNSCache

news2024/9/28 9:19:15

一、简介

当集群规模较大时,运行的服务非常多,服务之间的频繁进行大量域名解析,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压测截图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1379544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Maven】002-Maven 安装和配置

【Maven】002-Maven 安装和配置 文章目录 【Maven】002-Maven 安装和配置一、官网1、官网2、历史版本列表 二、下载 Maven 3.8.8 版本1、进入 Maven 3.8.8 版本发行说明页2、进入下载页3、下载4、下载得到 apache-maven-3.8.8-bin.zip 三、Maven 安装1、将安装包解压到想放置的…

牛客周赛 Round 1 解题报告 | 珂学家 | 分类计数 + 同余DP

前言 生于生时,亡于亡刻。遵从自心,尽人之事。 整体评价 终于等来了侧重面试的比赛,而且题量刚刚好,不超纲,不涉及算法竞赛。 第一场的比赛,感觉题目出的比较典,A是简单模拟,B则是…

NX二次开发PK获取对象类型

PK_ENTITY_ask_class(),获取对象类型建议用这个函数,比较通用,包含所有对象类型,可以替代UF_MODL_ask_edge_type(),UF_MODL_ask_body_type(),UF_MODL_ask_face_type()等函数 PK_ENTITY_t entity; PK_CLASS_t PK_TYPE; PK_ENTITY_ask_class(e…

玩转Mysql 六(MySQL数据存储结构)

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。如有侵权,请留言,我及时删除! 一、MySQL数据存储结构解析 1、mysql数据存储结构的组成 ​ 从 InnoDB 逻辑存储结构来看&a…

HandlerInterceptor拦截器 postHandle执行addHeader无效,postHandle执行setStatus无效的解决方案

问题描述 想在postHandle方法里执行addHeader方法来补充一些Header信息(如分页信息),但是最后执行却未如期显示 拦截器源码 import com.zhangziwa.practisesvr.utils.response.ResponseContext; import jakarta.servlet.http.HttpServletR…

【降龙算法】基于QT插件机制实现一个机器视觉算法小框架

机器视觉行业有各种各样的拖拉拽框架,也叫做低代码平台,例如国内海康的VisionMaster: 一个机器视觉框架需要包含各种算法模块,日志窗口,图像显示窗口等等,【降龙算法】就是做了一个入门级的机器视觉算法框…

What does `HandlerInterceptor` do?

HandlerInterceptor 是 SpringMVC 中的一个接口&#xff0c;在SpringMVC应用中它提供了一种实现应用级拦截器的机制。 第1步&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web<…

自动化测试框架pytest系列之8个常用的装饰器函数

自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客 自动化测试框架pytest系列之21个命令行参数介绍(二)-CSDN博客 自动化测试框架pytest系列之强大的fixture功能&#xff0c;为什么fixture强大&#xff1f;一文拆解它的功能参数。(三)-CSDN博客 接上文 3.5 pytest的8…

当一堆数据差异过大如何选?

我们通过采样获得一对数组&#xff0c;但是他们差异过大&#xff0c;所以我们选择进行一次滤除。 先看基本概念&#xff1a; 移动平均&#xff08;Moving Average&#xff09;&#xff1a; 计算每个数据点及其相邻数据点的平均值&#xff0c;可以使用不同的窗口大小。这有助于…

获取 Dll 模块的加载字符串资源

概要 获取 Dll 模块中加载的字符串资源&#xff0c;可以通过 LoadString 实现。这个函数可以用于在不同版本索引系统字符串&#xff0c;对于一些根据名称操作系统菜单的功能&#xff0c;可以使用这种方法动态获取系统模块当前的加载字符串。 LoadStringW 从与指定模块关联的可…

Linux中断 -- 中断应答、嵌套、

接上文&#xff0c;本文继续介绍Linux软件部分逻辑。 参考内核版本&#xff1a;kernel-4.19 目录 1.中断信号在各级中断控制器中的应答 2.supports_deactivate_key意义 3.中断嵌套 1.中断信号在各级中断控制器中的应答 本章主要从内核软件层面来看各中断控制器对中断信号处…

反敏捷宣言

很多时候&#xff0c;敏捷在实践中并没有帮助团队更好的完成工作&#xff0c;而是成为了某种障碍以及僵化的流程。原文: The Anti-Agile Manifesto 警告1: 如果你是敏捷教练或Scrum Master或任何其他形式的敏捷支持者&#xff0c;本文的很多内容都会让你不爽。本文的目的之一是…

Spring MVC组件

1.DispatcherServlet前端控制器 用户请求到达前端控制器&#xff0c;它就相当于mvc模式中的c&#xff0c;dispatcherServlet 是整个流程控制的中心&#xff0c;由它调用其它组件处理用户的请求&#xff0c;dispatcherServlet 的存在降低了组件之间的耦合性。 2.HandlerMappin…

poi解析word取参数方法${参数名}获取参数异常处理(2024-01-12)

poi 读取word模板&#xff0c;确保 ${参数名} 在一个XWPFRun XWPFDocument读取word模板&#xff0c;经常遇到 ${参数名} 没有被识别在一个XWPFRun中&#xff0c;导致参数解析异常如法实现参数替换。 这里只是介绍word模板参数解析问题&#xff0c;让word格式如何转换为可以正常…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存&#xff08;C#&#xff09;&#xff09; Baumer工业相机Baumer工业相机的图像高速保存的技术背景Baumer工业相机通过NEOAPI SDK函数图像高速保存在NEOAPI SDK里实现线程高速图像保存&#xff1a;工业相机高…

多输入多输出 | Matlab实现PSO-CNN粒子群优化卷积神经网络多输入多输出预测

多输入多输出 | Matlab实现PSO-CNN粒子群优化卷积神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现PSO-CNN粒子群优化卷积神经网络多输入多输出预测预测效果基本介绍模型背景程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-CNN粒子群优化卷积神经网络多输入多输出…

性能测试分析案例-使用动态追踪定位性能瓶颈

所谓动态追踪&#xff0c;就是在系统或者应用程序正常运行的时候&#xff0c;通过内核中提供的探针&#xff0c;来动态追踪它们的行为&#xff0c;从而辅助排查出性能问题的瓶颈。 使用动态追踪&#xff0c;可以在不修改代码、不重启服务的情况下&#xff0c;动态了解应用程序或…

《 乱弹篇(二)》

题记 昨&#xff08;2024年1月12日&#xff09;天&#xff0c;既然笔者因感到写时评文力不从心&#xff0c;新辟一专栏《乱弹篇》&#xff0c;开始了“ 东西南北&#xff0c;古今中外&#xff0c;谈而不乱&#xff0c;抒怀而已”的写作路径&#xff0c;就要走下去&#xff0c;…

debian12部署Gitea服务

首先安装git、wget、sqlite&#xff0c;然后进行用户和组的相关设置 sudo apt install -y git wget sqlite3 新增一个git用户与一个git组 sudo adduser --system --group --disabled-password --shell /bin/bash --home /home/git --gecos Git Version Control git 给git用户设…

必看!2023年机器人领域十大事件!

原创 | 文 BFT机器人 2023年&#xff0c;机器人产业快速发展&#xff0c;成就了机器人领域的一个又一个里程碑。机器人行业涌现了许多令人瞩目的事件&#xff0c;实现了重大突破&#xff0c;展示了机器人技术在各个领域的广泛应用和革命性变革。 本文将对2023年机器人领域的十…