k8s 系列之 CoreDNS 解读

2023-11-10

k8s 系列之 CoreDNS

CoreDNS工作原理

kuberntes 中的 pod 基于 service 域名解析后,再负载均衡分发到 service 后端的各个 pod 服务中,如果没有 DNS 解析,则无法查到各个服务对应的 service 服务

 在 Kubernetes 中,服务发现有几种方式:

基于环境变量的方式
基于内部域名的方式

从 K8S 1.11 开始,K8S 已经使用 CoreDNS,替换 KubeDNS 来充当其 DNS 解析, DNS 如何解析,依赖容器内 resolv 文件的配置
# cat /etc/resolv.conf 
nameserver 10.200.254.254
search default.svc.cluster.local. svc.cluster.local. cluster.local.
options ndots:5
 ndots:5:如果查询的域名包含的点 “.” 不到 5 个,那么进行 DNS 查找,将使用非完全限定名称(或者叫绝对域名),如果你查询的域名包含点数大于等于 5,那么 DNS 查询,默认会使用绝对域名进行查询。



 Kubernetes 域名的全称,必须是 service-name.namespace.svc.cluster.local 这种模式,服务名
# nslookup kubernetes.default.svc.cluster.local
Server:        10.200.254.254
Address:    10.200.254.254:53

Name:    kubernetes.default.svc.cluster.local
Address: 10.200.0.1

 

DNS策略,在Pod,Deployment RC等资源设置 dnsPolicy
None

用于想要自定义 DNS 配置的场景,而且需要和 dnsConfig 配合一起使用

Default

让 kubelet 来决定使用何种 DNS 策略。而 kubelet 默认使用宿主机的 /etc/resolv.conf(使用宿主机的DNS策略)

但 kubelet 可以配置使用什么文件来进行 DNS 策略,使用 kubelet 的参数:–resolv-conf=/etc/resolv.conf 来决定 DNS 解析文件地址

ClusterFirst

表示 POD 内的 DNS 使用集群中配置的 DNS 服务,使用 Kubernetes 中 kubedns 或 coredns 服务进行域名解析。如果解析不成功,才会使用宿主机的 DNS 进行解析

ClusterFirstWithHostNet
POD 是用 HOST 模式启动的(HOST模式),用 HOST 模式表示 POD 中的所有容器,都使用宿主机的 /etc/resolv.conf 进行 DNS 查询,但如果使用了 HOST 模式,还继续使用 Kubernetes 的 DNS 服务,那就将 dnsPolicy 设置为 ClusterFirstWithHostNet

配置文件使用 configmap

health:CoreDNS 健康检查为 http://$IP:8080/health,返回为 OK
kubernetes:CoreDNS 将根据 Kubernetes 服务和 pod 的 IP 回复 DNS 查询
prometheus:CoreDNS 度量 http://$IP:9153/metrics
proxy:不在 Kubernetes 集群域内的查询都将转发到预定义的解析器(/etc/resolv.conf),可以配置多个upstream 域名服务器,也可以用于延迟查找 /etc/resolv.conf 中定义的域名服务器
cache:启用缓存,30 秒 TTL
loop:检测简单的转发循环,如果找到循环则停止 CoreDNS 进程
reload:允许自动重新加载已更改的 Corefile
loadbalance:DNS 负载均衡器,默认round_robin
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: namespace-test
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local  10.200.0.0/16 {
          pods insecure
          upstream 114.114.114.114
          fallthrough in-addr.arpa ip6.arpa
          namespaces namespace-test
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
 

Coredns 规定协议

当前 CoreDNS 接受4种协议: DNS, DNS over TLS (DoT), DNS over HTTP/2 (DoH)
and DNS over gRPC。可以通过在服务器配置文件,在zone 前加个前缀来指定服务器接收哪种协议。

dns:// for plain DNS (the default if no scheme is specified).
tls:// for DNS over TLS, see RFC 7858.
https:// for DNS over HTTPS, see RFC 8484.
grpc:// for DNS over gRPC.
UDP非标准端口只在某些地区某些运营商有用,DoT,即DNS over TLS,支持DoT的公共DNS服务有Quad9的9.9.9.9,Google的8.8.8.8以及Cloudflare的1.1.1.1,可以这么使用:

.:5301 {
   forward . tls://9.9.9.9 {
       tls_servername dns.quad9.net
   }
   cache
}
.:5302 {
    forward . tls://1.1.1.1 tls://1.0.0.1 {
        tls_servername 1dot1dot1dot1.cloudflare-dns.com
    }
    cache
}
.:5303 {
    forward . tls://8.8.8.8 tls://8.8.4.4 {
        tls_servername dns.google
    }
    cache
}
   由于proxy插件新版本已经移除,作为external plugin,需要自己编译CoreDNS。
git clone https://github.com/coredns/coredns.git
cd coredns
make
 
   CoreDNS使用了go modules机制,所以在make过程中会自动下载依赖的package。可以通过HTTP_PROXY环境变量指定,或者使用国内的一些镜像(如果你信得过的话)通过GOPROXY环境变量指定。

   则在make前,要修改plugin.cfg文件,加入以下:

proxy:github.com/coredns/proxy
再make,就会把插件编译进去。如果发现没有编译进去,可以先执行一下go generate coredns.go再make

coredns 安装部署
下载:https://github.com/coredns/deployment/tree/master/kubernetes

deploy.sh 用于生成用于 kube-dns 的集群上运行 CoreDNS 的 yaml 文件

coredns.yaml.sed 文件作为模板,它创建一个 ConfigMap 和一个 CoreDNS deployment 的yaml 文件

./deploy.sh 172.18.0.0/24 cluster.local 生成 yaml 文件,在使用 kubectl apply 部署在 k8s 中

官方性能
计算表达式: MB required (default settings) = (Pods + Services) / 1000 + 54

  cache 需要 30 MB,大约缓存 10000 条记录
  操作 buffer 需要 5 MB,用于处理查询,大约可以承受 30 K QPS 量

CoreDNS 的性能优化

概述
CoreDNS 作为 Kubernetes 集群的域名解析组件,如果性能不够可能会影响业务,本文介绍几种 CoreDNS 的性能优化手段。

合理控制 CoreDNS 副本数
考虑以下几种方式:

根据集群规模预估 coredns 需要的副本数,直接调整 coredns deployment 的副本数:
kubectl -n kube-system scale --replicas=10 deployment/coredns
为 coredns 定义 HPA 自动扩缩容。
安装 cluster-proportional-autoscaler 以实现更精确的扩缩容(推荐)。
禁用 ipv6
如果 K8S 节点没有禁用 IPV6 的话,容器内进程请求 coredns 时的默认行为是同时发起 IPV4 和 IPV6 解析,而通常我们只需要用到 IPV4,当容器请求某个域名时,coredns 解析不到 IPV6 记录,就会 forward 到 upstream 去解析,如果到 upstream 需要经过较长时间(比如跨公网,跨机房专线),就会拖慢整个解析流程的速度,业务层面就会感知 DNS 解析慢。

CoreDNS 有一个 template 的插件,可以用它来禁用 IPV6 的解析,只需要给 CoreDNS 加上如下的配置:

template ANY AAAA {
rcode NXDOMAIN
}
这个配置的含义是:给所有 IPV6 的解析请求都响应空记录,即无此域名的 IPV6 记录。

优化 ndots
默认情况下,Kubernetes 集群中的域名解析往往需要经过多次请求才能解析到。查看 pod 内 的 /etc/resolv.conf 可以知道 ndots 选项默认为 5:

意思是: 如果域名中 . 的数量小于 5,就依次遍历 search 中的后缀并拼接上进行 DNS 查询。

举个例子,在 debug 命名空间查询 kubernetes.default.svc.cluster.local 这个 service:

域名中有 4 个 .,小于 5,尝试拼接上第一个 search 进行查询,即 kubernetes.default.svc.cluster.local.debug.svc.cluster.local,查不到该域名。
继续尝试 kubernetes.default.svc.cluster.local.svc.cluster.local,查不到该域名。
继续尝试 kubernetes.default.svc.cluster.local.cluster.local,仍然查不到该域名。
尝试不加后缀,即 kubernetes.default.svc.cluster.local,查询成功,返回响应的 ClusterIP。
可以看到一个简单的 service 域名解析需要经过 4 轮解析才能成功,集群中充斥着大量无用的 DNS 请求。

怎么办呢?我们可以设置较小的 ndots,在 Pod 的 dnsConfig 中可以设置:
在这里插入图片描述
然后业务发请求时尽量将 service 域名拼完整,这样就不会经过 search 拼接造成大量多余的 DNS 请求。

不过这样会比较麻烦,有没有更好的办法呢?有的!请看下面的 autopath 方式。

启用 autopath
启用 CoreDNS 的 autopath 插件可以避免每次域名解析经过多次请求才能解析到,原理是 CoreDNS 智能识别拼接过 search 的 DNS 解析,直接响应 CNAME 并附上相应的 ClusterIP,一步到位,可以极大减少集群内 DNS 请求数量。

启用方法是修改 CoreDNS 配置:

kubectl -n kube-system edit configmap coredns
修改红框中圈出来的配置:
在这里插入图片描述
加上 autopath @kubernetes。
默认的 pods insecure 改成 pods verified。
需要注意的是,启用 autopath 后,由于 coredns 需要 watch 所有的 pod,会增加 coredns 的内存消耗,根据情况适当调节 coredns 的 memory request 和 limit。

CoreDNS 的排障

报错:***********************dns: overflowing header size
在这里插入图片描述
此时需修改参数:

#kubectl describe  configmap   coredns   -n kube-system
Name:         coredns
Namespace:    kube-system
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"v1","data":{"Corefile":".:53 {\n    errors\n    health {\n      lameduck 5s\n    }\n    ready\n    kubernetes cluster.local...

Data
====
Corefile:
----
.:53 {
    errors
    health {
      lameduck 5s
    }
    ready
    kubernetes cluster.local in-addr.arpa ip6.arpa {
      fallthrough in-addr.arpa ip6.arpa
    }
    template ANY AAAA {
      rcode NXDOMAIN
    }
    prometheus :9153
    forward . /etc/resolv.conf
    bufsize 2048     ##调大此参数 或增加此参数
    cache 30
    loop
    reload
    loadbalance
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s 系列之 CoreDNS 解读 的相关文章

随机推荐

  • MySQL技术内幕InnoDB存储引擎 学习笔记 第四章 表

    InnoDB引擎表中 每张表都有一个主键 如果创建表时没有显式定义主键 则 1 首先看表中是否有非空的唯一索引 如果有 则该列为主键 2 否则自动创建一个6字节大小的指针作为主键 InnoDB所有数据都逻辑地放在一个表空间中 表空间又由段
  • 基于SSM的校园旧书交易交换平台

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • KMeans算法

    目录 一 基本概念 二 Centroid Initialization Methods 三 Mini Batch K Means 四 找寻最优的聚类数量 4 1 拐点 4 2 silhouette score 轮廓分数 五 Kmeans的优
  • Java基础怎么样才算牢固,能熟练使用还是深入源码?

    java就是一门工具 本质上跟你开的车没什么区别 java的熟练程度 就犹如你的驾驶技术 本质上就是工具操作的熟练度 对于工具的操作而言 绝大多数人 会用就行了 源码基本上没有深入的必要 因为对于绝大多数程序员以及非程序员而言 这个轮不到你
  • B端产品的交互设计流程探索:乐高设计法和用户体验的二次提升

    面对突如其来的B端体验设计的挑战 可以解决吗 或者说设计师的思路该如何针对B端设计的特点进行调整 甚至设计管理的思路如何调整 一起来文章中看看解决办法 如何应对B端到来的挑战 随着互联网常规C端业务逐渐由蓝海转为红海 B端设计迎来了各种挑战
  • VS-SQL 连接DBHelper类

    using System using System Collections Generic using System Data using System Data SqlClient using System Text using Syst
  • 阿里云实习生部门笔试2020.04

    月初申请阿里c c 实习生 公司很快安排了上机笔试 是两道算法题大题 很难 没刷过题导致题目也看不怎么懂 笔试完第二天阿里云打电话安排另一场笔试 题目如下 评测题目 无 第一题 char str http www ibegroup com
  • python 题(附答案)

    1 一行代码实现1 100之和 gt gt 5050 2 描述 join 和split 区别 join用来连接字符串 split恰好相反拆分字符串 gt gt my name is huihui gt gt my name is huihu
  • vba可以放服务器上处理文档,当Word Doc位于服务器上时,如何从Excel VBA更改Word Doc中的文本?...

    我有一个宏 可以根据单词模板创建实验报告 然后将其保存到远程服务器 在我的Excel工作表中选择一个单元格 运行宏 使用空白模板打开Word实例 并根据所选单元格和其他数据保存文件 我想要做的是编辑空白模板中的标题 并将其更新为实验名称 该
  • 70进货卖100利润是多少_服装批发利润大揭秘!让你拿货砍价心里有个底

    你以为服装批发档口卖货的策略是薄利多销 你以为一包货只要小几百元很便宜 错 不要用零售的价格参考服装批发的价格 服装批发还可以更便宜 只要你了解服装批发商的利润空间 你就知道他们的价格底线在哪 拿货砍价更有目标 首先 我们从服装在市场上的来
  • python高性能服务器编写,Tornado的高性能服务器开发常用方法

    最近一直开发AI人脸识别相关的项目 需要提供给客户一些服务 所以我需要开发一些服务端程序 由于AI算法都是用python3写的 所以我就索性用起了python开发服务端 毕竟速度也快 以前用过Flask Django 这次决定有Tornad
  • 编译与链接

    把C 当脚本语言写 https www cnblogs com index html archive 2012 07 28 cppscript html vc 调用exe时 如何获取exe的输出信息 输出显示在IDE的输出中 http bl
  • [Python人工智能] 五.theano实现神经网络正规化Regularization处理

    从本系列文章开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前四篇文章讲解了神经网络基础概念 Theano库的安装过程及基础用法 theano实现回归神经网络 theano实现分类神经网络 这篇文章讲解Overfit
  • Hibenate技术详解

    一 Hibernate的基本用法 1 Hibernate的数据库操作 在所有的ORM框架中有一个非常重要的媒介 PO Persistence Object 持久化对象 持久化对象的作用是完成持久化操作 简单的说 通过该对象可以对数据进行增删
  • 逻辑回归介绍及statsmodels、sklearn实操

    目录 1 逻辑回归简要介绍 2 statsmodels中实现逻辑回归 3 sklearn实现逻辑回归 3 1 基础案例代码 3 2 样本不平衡问题处理 3 3 LogisticRegression模型参数说明 3 4 模型调优方法 1 逻辑
  • java 获取两个日期之间的所有月份 (年月)、以及月数、年数

    获取两个日期之间的所有月份 年月 param startTime param endTime return YYYY MM public static List
  • 347. 前 K 个高频元素

    1 哈希记录元素出现次数 2 放入优先队列 最大堆 3 依次出队获取结果 public class Solution public int TopKFrequent int nums int k 收集元素次数 Dictionary
  • linux内核设置选择硬件,Linux内核中USB充电器的解决方案

    当前最新的内核 v3 5 对USB充电器的整体方案支持的不是太好 这里讨论的USB充电器的方案仅指软件 方案 即充电器的检测需要由软件干预 比如读取USB PHY的寄存器 同时电池的充电值根据 充电器的不同类型 需要由软件来设置 硬件检测充
  • 导学:从提笔就怕,到写什么都赚钱

    做最懂技术的传播者 最懂传播的工程师 课程内容分析 课程的标题非常 标题党 实际课件的标题收敛很多 如何为系统学习新媒体写作做准备 正式开始课程前的建议 本节课程为正式课程开始前的一节导论课程 主要目的是 使学员明确 新媒体写作内容提升的学
  • k8s 系列之 CoreDNS 解读

    k8s 系列之 CoreDNS CoreDNS工作原理 kuberntes 中的 pod 基于 service 域名解析后 再负载均衡分发到 service 后端的各个 pod 服务中 如果没有 DNS 解析 则无法查到各个服务对应的 se