2021-08-31 CoreDNS:Kubernetes内部域名解析原理、弊端及优化方式

20211217 更新 ,腾讯云 ipvs模式下 localdns:
https://cloud.tencent.com/developer/article/1813985

20210919解决思路:
文章一:
有可能是集群内CoreDNS负载高,可以尝试下面两种方式:

  1. 扩容下集群内的CoreDNS实例数
  2. 通过LocalDNS方式来优化CoreDNS负载:
    https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/

详细文章2:https://blog.csdn.net/qq_38461443/article/details/107730030
解决方案如下:
方案(一):使用 TCP 协议发送 DNS 请求
通过resolv.conf的use-vc选项来开启 TCP 协议
测试
1、修改/etc/resolv.conf文件,在最后加入一行文本:

options use-vc

2、此压测可根据下面测试的go文件进行测试,编译好后放进一个pod中,进行压测:
#200个并发,持续30秒,记录超过5s的请求个数 ./dns -host {service}.{namespace} -c 200 -d 30 -l 5000

方案(二):避免相同五元组 DNS 请求的并发
通过resolv.conf的single-request-reopen和single-request选项来避免:
single-request-reopen (glibc>=2.9) 发送 A 类型请求和 AAAA 类型请求使用不同的源端口。这样两个请求在 conntrack 表中不占用同一个表项,从而避免冲突。
single-request (glibc>=2.10) 避免并发,改为串行发送 A 类型和 AAAA 类型请求,没有了并发,从而也避免了冲突。

测试 single-request-reopen
修改/etc/resolv.conf文件,在最后加入一行文本:
options single-request-reopen
此压测可根据下面测试的go文件进行测试,编译好后放进一个pod中,进行压测:
#200个并发,持续30秒,记录超过5s的请求个数 ./dns -host {service}.{namespace} -c 200 -d 30 -l 5000

测试 single-request
修改/etc/resolv.conf文件,在最后加入一行文本:
options single-request
此压测可根据下面测试的go文件进行测试,编译好后放进一个pod中,进行压测:
#200个并发,持续30秒,记录超过5s的请求个数 ./dns -host {service}.{namespace} -c 200 -d 30 -l 5000

最后结果,如果你测试过,相信coredns的测试如果还是增加使用 TCP 协议发送 DNS 请求,还是避免相同五元组 DNS 请求的并发,都没有显著的解决coredns延迟的结果

那么其实 k8s 官方也意识到了这个问题比较常见,所以也给出了 coredns 以 cache 模式作为 daemonset 部署的解决方案

在 Kubernetes 集群中使用 NodeLocal DNSCache
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/nodelocaldns

coredns基础知识

一 聊聊 resolv.conf 中 search 和 ndots 配置

原文:https://www.bianchengquan.com/article/409739.html
背景
Kubernetes 集群中,域名解析离不开 DNS 服务,在 Kubernetes v1.10 以前集群使用 kube-dns dns服务,后来在 Kubernetes v1.10+ 使用 Coredns 做为集群dns服务。

使用 Kubernetes 集群时,会发现 Pod /etc/resolv.conf 配置。具体如下:

nameserver 10.10.0.2
search production.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
小伙伴们会好奇,search 或者 ndots 这是干嘛呀!想知道是干嘛的,接着看下文。

名词解释
search:搜索主机名查找列表。搜索列表目前仅限于6个域名,共计256个字符。

ndots:通俗一点说,如果你的域名请求参数中,点的个数比配置的ndots小,则会按照配置的search内容,依次添加相应的后缀直到获取到域名解析后的地址。如果通过添加了search之后还是找不到域名,则会按照一开始请求的域名进行解析。

抓包分析DNS请求
Kubernetes Pod 内抓包,请参考 K8S Pod 内抓包快速定位网络问题:

二 CoreDNS:Kubernetes内部域名解析原理、弊端及优化方式

原文:https://blog.csdn.net/h952520296/article/details/106816680
https://blog.csdn.net/h952520296/article/details/106816680/
在其他的容器中,进行 youku.com 域名查找

复制

1
nslookup youku.com 172.22.121.65

注意:nslookup命令的最后指定DNS服务容器的IP,是因为,如果不指定,且DNS服务的容器存在多个的话,那么DNS请求,可能会均分到所有DNS服务的容器上,我们如果只抓某单个DNS服务容器抓到的包,可能就不全了,指定IP后,DNS的请求,就必然只会打到单个的DNS容器。抓包的数据才完整。
————————————————
版权声明:本文为CSDN博主「Mumunu-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/h952520296/article/details/106816680

coredns 基础知识

理论:https://www.jianshu.com/p/ded59d18ed18

Default: Pod 从运行所在的节点继承名称解析配置
ClusterFirst: 与配置的集群域后缀不匹配的任何 DNS 查询(例如 "www.kubernetes.io") 都将转发到从节点继承的上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。
ClusterFirstWithHostNet:对于以 hostNetwork 方式运行的 Pod,应显式设置其 DNS 策略 "`ClusterFirstWithHostNet`"。
None: 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 `dnsConfig` 字段 所提供的 DNS 设置。

说明:** "Default" 不是默认的 DNS 策略。如果未明确指定 `dnsPolicy`,则使用 "ClusterFirst"

例子:https://blog.csdn.net/qq_34556414/article/details/108999454
在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问。

[root@k8s-master ~]# kubectl get deployment -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
coredns 1/1 1 1 25h
coredns 是一个 DNS 服务器。每当有新的 Service 被创建,coredns 会添加该 Service 的 DNS 记录。Cluster 中的 Pod 可以通过 <SERVICE_NAME>.<NAMESPACE_NAME> 访问 Service。

[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 443/TCP 25d
nodeport-svc NodePort 10.0.0.171 3000:30090/TCP 28h
用 nslookup 查看 nodeport-svc的 DNS 的信息。

/ # nslookup nodeport-svc.default
Server: 10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local

Name: nodeport-svc.default
Address 1: 10.0.0.171 nodeport-svc.default.svc.cluster.local
比如可以用 httpd-svc.default 访问 Service httpd-svc。

/ # wget nodeport-svc.default:3000
Connecting to nodeport-svc.default:3000 (10.0.0.171:3000)
saving to ‘index.html’
index.html 100% |*********************************************************| 41 0:00:00 ETA
‘index.html’ saved
如果要访问其他 namespace 中的 Service,就必须带上 namesapce 了。Kubernetes 集群内部可以通过 Cluster IP 和 DNS 访问 Service。
————————————————
版权声明:本文为CSDN博主「富士康质检员张全蛋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34556414/article/details/108999454

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值