k8s集群配置NodeLocal DNSCache

这篇具有很好参考价值的文章主要介绍了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 查询所遵循的路径如下,流程图取自官网:
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生

三、与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服务。
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生

服务访问域名解析结果如下,可以看到已经解析到本地dns:
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生

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

qps 1000 2000 10000 50000 100000
localdns 0.0379s 0.0030s 0.0227s 0.0001s 0.0021s
coredns 0.0104s 0.0046s 0.0026s 0.0177s 0.0061s

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

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

1000qps压测截图:
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生

2000qps压测截图:
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生

10000qps压测截图:
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生
50000qps压测截图:
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生
100000qps压测截图:
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生
对coredns解析压测结果截图如下:

1000qps压测截图:
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生
2000qps压测截图如下:
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生
10000qps压测截图:
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生
50000qps压测截图:
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生
100000qps压测截图:
k8s集群配置NodeLocal DNSCache,kubernetes,容器,云原生文章来源地址https://www.toymoban.com/news/detail-793999.html

到了这里,关于k8s集群配置NodeLocal DNSCache的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • [Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用

    [Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用

    前面讲解了使用Helm部署mysql集群,这里来看看使用Ingress搭建负载均衡功能 功能类似 Nginx ,可以根据域名、路径把请求转发到不同的 Service , Ingress 为外部访问集群提供了一个 统一 入口, 避免 了 对外暴露集群端口 ,可以配置 https,http访问集群应用,接下来看看如何通过腾讯云来

    2024年01月22日
    浏览(17)
  • K8s攻击案例:RBAC配置不当导致集群接管

    K8s攻击案例:RBAC配置不当导致集群接管

    01、概述 Service Account本质是服务账号,是Pod连接K8s集群的凭证。在默认情况下,系统会为创建的Pod提供一个默认的Service Account,用户也可以自定义Service Account,与Service Account关联的凭证会自动挂载到Pod的文件系统中。 当攻击者通过某个web应用获取到一个Pod权限时,如果RBAC权

    2024年02月02日
    浏览(12)
  • k8s containerd集群配置安装完整踩坑教程

    k8s containerd集群配置安装完整踩坑教程

    完整踩坑和精简内容 containerd安装参考 k8s安装参考 两台机器 系统 CentOS 7.9 1、关闭swap 2、网桥设置 3、ipvs设置 4、关闭防火墙 5、禁用selinux 6、添加源 在所有节点上执行 1、安装最新的kubectl kubelet kubeadm 2、安装containerd 安装 配置 重启 3、安装crictl 编写配置文件 下载镜像 mast

    2024年02月09日
    浏览(19)
  • k8s整合istio配置gateway入口、配置集群内部服务调用管理

    curl -HHost:tomcat.shenshuxin.cn “http://node101:32318” 端口号是ingressgateway服务的nodeport 查看方式: kubectl get service -n istio-system | grep istio-ingressgateway 找到80端口对应的nodeport即可 注意部署的两个deployment需要指定一下版本标签 version: ?? 注意这里的hosts名称(demo-tomcat-for-istio-name)要和上面

    2024年02月12日
    浏览(13)
  • 使用rancher rke2配置高可用k8s集群

    使用rancher rke2配置高可用k8s集群

    RKE2 结合了 RKE1.x 版本(以下简称 RKE1)和 K3s 的优点和特性。 从 K3s 中,它继承了可用性、易操作性和部署模式。 从 RKE1 来看,它继承了与上游 Kubernetes 的紧密一致性。在一些地方,K3s 与上游的 Kubernetes 有分歧,以便为边缘部署进行优化,但 RKE1 和 RKE2 可以与上游保持密切一

    2023年04月26日
    浏览(10)
  • 微服务系列文章之 Springboot应用在k8s集群中配置的使用

    微服务系列文章之 Springboot应用在k8s集群中配置的使用

    Docker部署其实也可以再docker run或者dockerfile里面,将配置文件目录映射到宿主机,然后通过宿主机配置文件修改参数。 很多时候Dockerfile文件中需要定义变量,减少对Dockerfile文件的修改,在编译的时候从外部传入参数,这种情况可使用  ARG 参数,然后通过 --build-arg 进行赋值。

    2024年02月16日
    浏览(17)
  • K8S 集群应用配置coredns实现访问内网域名 —— 筑梦之路

    问题: 在内网环境中,服务器不能连接互联网,某些服务直接使用ip访问又不方便,于是直接在hosts中配置域名解析,而K8S集群中的应用需要访问这些服务,pod容器内却不能解析,此时该怎么解决呢? 解决方法: 第一种方法:内网自建DNS服务,每台主机DNS都指向该dnsf服务器

    2024年02月15日
    浏览(15)
  • 本地k8s集群搭建保姆级教程(3)-安装k8s集群

    本地k8s集群搭建保姆级教程(3)-安装k8s集群

    1.1 增加镜像替换脚本 注意:请在master机器上执行 添加脚本内容: 1.2 查看k8s版本 1.3 执行脚本 2.1 初始化master节点 在master机器上执行如下命令: 说明: –apiserver-advertise-address= 你master节点的ip 看到如下内容,说明master节点初始化成功 图片中最后一行记得要保存起来,worker节

    2024年02月15日
    浏览(10)
  • k8s简介、虚拟机快速搭建k8s集群、集群管理方式及K8S工作原理和组件介绍

    k8s简介、虚拟机快速搭建k8s集群、集群管理方式及K8S工作原理和组件介绍

    1.1、部署方式的变迁 传统部署时代: 在物理服务器上运行应用程序 无法为应用程序定义资源边界 导致资源分配问题 例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况, 结果可能导致其他应用程序的性能下降。 一种解决方案是

    2024年02月12日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包