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压测截图:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海外云手机助力企业拓展海外市场

在当前全球化的商业环境中,由于政策限制,许多企业面临着无法顺利将产品推广到国外的困境,使得海外市场的机遇白白流失。而随着科技的不断创新,一种解决企业海外拓展困境的工具应运而生,那就是海外云手机。本文将深入探…

【python】搭配Miniconda使用VSCode

现在的spyder总是运行出错,启动不了,尝试使用VSCode。 一、在VSCode中使用Miniconda管理的Python环境,可以按照以下步骤进行: a. 确保Miniconda环境已经安装并且正确配置。 b. 打开VSCode,安装Python扩展。 打开VS…

仅用三张图片实现任意场景三维重建:ReconFusion

论文题目: ReconFusion: 3D Reconstruction with Diffusion Priors 论文作者: Rundi Wu, Ben Mildenhall, Philipp Henzler, Keunhong Park, Ruiqi Gao, Daniel Watson, Pratul P. Srinivasan, Dor Verbin, Jonathan T. Barron, Ben Poole, Aleksande…

【huggingface】【pytorch-image-models】timm框架中使用albumentations库数据增广

文章目录 一、前言二、实操2.1 声明库2.2 定义你的数据增广算子2.3 加入其中 一、前言 问题是这样的,在使用timm框架训练时,发现数据增广不够,想用Albumentations库的数据增广,怎么把后者嵌入到前者的训练中。 其实也是比较简单…

Codeforces Round 919 (Div. 2) D题 偏移量,二分,子问题

Problem - D - Codeforces 题意: 用两种方式制作一个很大的数组,然后查询对应下标对应的数字。 难点: 制作的方式有复制n次原数组接到后面,样例的数据很大,很快就会溢出unsigned long long。暴力做出这个数组是不可…

第7章-第9节-Java中的Stream流(链式调用)

1、什么是Stream流 Lambda表达式,基于Lambda所带来的函数式编程,又引入了一个全新的Stream概念,用于解决集合类库既有的鼻端。 2、案例 假设现在有一个需求, 将list集合中姓张的元素过滤到一个新的集合中;然后将过滤…

【C++】Qt:Qt事件介绍与正弦曲线绘制示例

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Qt事件介绍与正弦曲线绘制示例。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更…

[软件工具][windows]yolov8自动标注工具自动打标签工具

软件截图如下: 这个工具可以自动将图片识别为指定类别并保存为VOC格式xml文件, 软件只支持官方80类别,您可以选择其中一部分或者一部分进行自动标注,标注的效果依据图片而定,通过自动标注您可以减少很多标注工作量&…

制造知识普及--MES系统中的调度排产管理

要想弄清楚MES系统调度排产的管理机制,则要首先搞清楚车间调度排产是一套怎样的工作流程,它的难点在什么地方? 生产调度指的是具体组织实现生产作业计划的工作,是对执行生产作业计划过程中发生的问题和可能出现的问题&#xff0c…

Unity 工具 之 Azure 微软连续语音识别ASR的简单整理

Unity 工具 之 Azure 微软连续语音识别ASR的简单整理 目录 Unity 工具 之 Azure 微软连续语音识别ASR的简单整理 一、简单介绍 二、实现原理 三、注意实现 四、实现步骤 五、关键脚本 一、简单介绍 Unity 工具类,自己整理的一些游戏开发可能用到的模块&#x…

重磅!ESI高被引论文阈值发布

1月11日,科睿唯安(Clarivate Analytics)公布了最新的ESI数据。 注:ESI的更新时间为每奇数月的第二个星期四。 Essential Science Indicators (ESI) 是一种分析工具,可帮助识别 Web of Science 核心合集中表现最好的研…

Lamp架构从入门到精通

系列文章目录 lnmp架构 lnmp架构-nginx负载均衡以及高可用 系列文章目录一、源码编译configure(检测预编译环境是否可行)makemake install优化关闭Debug 二、 nginx负载均衡三、nginx的高并发nginx work数量的设定nginx work进程与cpu的静态绑定压力测试nginx高并发修改操作系…

Unity使用Protobuf

1.下载Protobuf ProtoBuf 2.打开它并且编译 如果有报错下载相应的.net版本即可 这里默认是6.0.100 由于我本机是8.0.100所以我改了这个文件 3.编译后的文件复制到Unity Assets/Plugins下 4.写个测试的proto文件 5.然后使用protoc生成 这里实现了一个简单的bat批量生成 Protos C…

从0开始学Git指令(3)

从0开始学Git指令 因为网上的git文章优劣难评,大部分没有实操展示,所以打算自己从头整理一份完整的git实战教程,希望对大家能够起到帮助! 远程仓库 Git是分布式版本控制系统,同一个Git仓库,可以分布到不…

MySQL体系结构

MySQL体系结构 MySQL采用的是客户/服务器体系结构,实际是有两个程序,一个是MySQL服务器程序,指的是mysqld程序,运行在存放数据库的机器上,负责在网络上监听并处理来自客户的服务请求,根据这些请求去访问数据…

运筹说 第84期 | 网络计划-网络图的基本概念

自华罗庚教授将网络计划技术引入我国,网络计划已取得巨大发展。本期开始,小编将从网络图基本概念、时间参数计算、网络计划优化和图解评审法等方面对网络计划进行系统的介绍。 01前言 20世纪50年代以来,产生了许多计划管理的新方法&#xf…

如何使用Docker一键部署WBO白板并实现固定公网地址远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板,允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

详解ISIS动态路由协议

华子目录 前言应用场景历史起源ISIS路由计算过程ISIS的地址结构ISIS路由器分类ISIS邻居关系的建立P2PMA ISIS中的DIS与OSPF中DR的对比链路状态信息的交互ISIS的最短路径优先算法(SPF)ISIS区域划分ISIS区域间路由访问原理ISIS与OSPF的不同ISIS与OSPF的术语…

【Python机器学习系列】建立随机森林模型预测心脏疾病(完整实现过程)

这是Python机器学习系列原创文章,我的第200篇原创文章。 一、引言 对于表格数据,一套完整的机器学习建模流程如下: 针对不同的数据集,有些步骤不适用即不需要做,其中橘红色框为必要步骤,由于数据质量较高&…

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

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