千家信息网

k8s中的DNS解析是什么意思

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,本篇内容介绍了"k8s中的DNS解析是什么意思"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!k8s中
千家信息网最后更新 2025年01月23日k8s中的DNS解析是什么意思

本篇内容介绍了"k8s中的DNS解析是什么意思"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

k8s中的DNS解析

粗浅的介绍一下k8s的dns解析:

Pod 中的 DNS 概览

众所周知, DNS 服务器用于将域名转换为 IP 。 Linux 服务器中 DNS 解析配置位于/etc/resolv.conf, 在 Pod 中也不例外, 下面是某个 Pod 中的配置:

nameserver 10.96.0.10search kube-system.svc.cluster.local svc.cluster.local cluster.localoptions ndots:5

如果想要调试 DNS 服务器, 测试返回结果, 可以使用 dig 工具:

> dig baidu.com @8.8.8.8; <<>> DiG 9.16.10 <<>> baidu.com @8.8.8.8;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5114;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 512;; QUESTION SECTION:;baidu.com.   IN A;; ANSWER SECTION:baidu.com.  159 IN A 39.156.69.79baidu.com.  159 IN A 220.181.38.148;; Query time: 10 msec;; SERVER: 8.8.8.8#53(8.8.8.8);; WHEN: Tue Jan 12 09:26:13 HKT 2021;; MSG SIZE  rcvd: 70

DNS 服务器 - nameserver

我们先从nameserver 10.96.0.10来看, 为什么请求这个地址可以进行 DNS 解析. 这个答案就是 iptables, 我仅截取 UDP 的 53 端口, 以下内容可以通过iptables-save获得

-A KUBE-SERVICES -d 10.96.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU# 简单解释下, 这条规则表示, 如果目标地址是 10.96.0.10的udp53端口, 那么就会跳转到这条链上`KUBE-SVC-TCOU7JCQXEZGVUNU`

我们再看下这条链KUBE-SVC-TCOU7JCQXEZGVUNU:

-A KUBE-SVC-TCOU7JCQXEZGVUNU -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-Q3HNNZPXUAYYDXW2-A KUBE-SVC-TCOU7JCQXEZGVUNU -j KUBE-SEP-BBR3Z5NWFGXGVHEZ-A KUBE-SEP-Q3HNNZPXUAYYDXW2 -p udp -m udp -j DNAT --to-destination 172.32.3.219:53-A KUBE-SEP-BBR3Z5NWFGXGVHEZ -p udp -m udp -j DNAT --to-destination 172.32.6.239:53# 联系之前的规则, 这几条规则完整的意思是:# 本机中, 发给10.96.0.10:53的流量, 一半转发到172.32.3.219:53, 另一半转发到172.32.6.239:53

Kubernetes 的 Deployment

再看下我们的 Kubernetes 中 Pod 的 IP 地址, 也就是说, DNS 请求实际上会到我们的 Coredns 容器中被处理.

> kubectl -n kube-system get pods -o wide | grep dnscoredns-646bc69b8d-jd22w                                   1/1     Running   0          57d    172.32.6.239    m1             coredns-646bc69b8d-p8pqq                                   1/1     Running   8          315d   172.32.3.219    m2             

Kubernetes 中 Service 的具体实现

再查看下对应的 Service, 可以看到, 上述机器中的 Iptables 其实就是 Service 的具体实现方式.

> kubectl -n kube-system get svc | grep dnskube-dns   ClusterIP   10.96.0.10           53/UDP,53/TCP,9153/TCP   398d

可能有人会有疑问, 现在是 2 个 Pod 可以均分流量, 如果是 3 个, 4 个 Pod, Iptables 是如何做转发的呢, 正好我有这个疑问, 因此我就再加了 2 个 Pod, 看看iptables是怎么实现对于 4 个 Pod 均分流量的.

这是最后的实现方式:

-A KUBE-SVC-TCOU7JCQXEZGVUNU -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-HTZHQHQPOHVVNWZS-A KUBE-SVC-TCOU7JCQXEZGVUNU -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-3VNFB2SPYQJRRPK6-A KUBE-SVC-TCOU7JCQXEZGVUNU -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-Q3HNNZPXUAYYDXW2-A KUBE-SVC-TCOU7JCQXEZGVUNU -j KUBE-SEP-BBR3Z5NWFGXGVHEZ

这些语句的意思是:

  1. 前 1/4 的流量到一条链中, 剩 3/4

  2. 剩下 3/4 的流量, 1/3到一条链, 剩 2/4

  3. 剩下 2/4 的浏览, 1/2到一条链, 剩 1/4

  4. 最后 1/4 到一条链

通过这样的方式对流量进行了均分, 还是挺巧妙的, 这样, 5个,10个也是可以依次去分的.

resolv.conf 中其他参数解析

search kube-system.svc.cluster.local svc.cluster.local cluster.localoptions ndots:5

详细的介绍可以看这里: resolv.conf 手册, 我简单的说下我的理解.

search 参数

假如没有这个search参数, 我们查找时:

> ping kube-dnsping: kube-dns: Name or service not known

如果增加了search参数后, 再去查找:

> ping kube-dnsPING kube-dns.kube-system.svc.psigor-dev.nease.net (10.96.0.10) 56(84) bytes of data.

可以看到, 解析域名时, 如果给定的域名无法查找, 会添加search后面的后缀进行查找(假如以.结尾, 类似kube-dns., 这样的域名不会再去尝试, FQDN域名(Fully Qualified Domain Name)全限定域名).

search的工作就是帮我们去尝试, 用在 Kubenetes 中, 配置kube-system.svc.cluster.local svc.cluster.local cluster.local 就会帮我们尝试, 我们ping abc, 就会这样进行查询

[INFO] 10.202.37.232:50940 - 51439 "A IN abc.kube-system.svc.cluster.local. udp 51 false 512" NXDOMAIN qr,aa,rd 144 0.000114128s[INFO] 10.202.37.232:51823 - 54524 "A IN abc.svc.cluster.local. udp 39 false 512" NXDOMAIN qr,aa,rd 132 0.000124048s[INFO] 10.202.37.232:41894 - 15434 "A IN abc.cluster.local. udp 35 false 512" NXDOMAIN qr,aa,rd 128 0.000092304s[INFO] 10.202.37.232:40357 - 43160 "A IN abc. udp 21 false 512" NOERROR qr,aa,rd,ra 94 0.000163406s

ndots 以及其优化问题

search配置需要与ndots一起使用, 默认的ndots是 1, 它的作用是: 如果检查到被查询的域名中dot的数量小于该值时, 就会优先尝试添加search域中的后缀.

Resolver queries having fewer thanndots dots (default is 1) in them will be attempted usingeach component of the search path in turn until a match isfound.

实际举例

假如我们的 DNS 配置如下:

search kube-system.svc.cluster.local svc.cluster.local cluster.localoptions ndots:2

当我们ping abc.123(此域名只有一个 dot ), DNS 服务器的日志如下, 可以注意到日志中最先尝试的是abc.123.kube-system.svc.cluster.local., 最后才会尝试我们的域名.

[INFO] 10.202.37.232:33386 - 36445 "A IN abc.123.kube-system.svc.cluster.local. udp 55 false 512" NXDOMAIN qr,aa,rd 148 0.001700129s[INFO] 10.202.37.232:51389 - 58489 "A IN abc.123.svc.cluster.local. udp 43 false 512" NXDOMAIN qr,aa,rd 136 0.001117693s[INFO] 10.202.37.232:32785 - 4976 "A IN abc.123.cluster.local. udp 39 false 512" NXDOMAIN qr,aa,rd 132 0.001047215s[INFO] 10.202.37.232:57827 - 56555 "A IN abc.123. udp 25 false 512" NXDOMAIN qr,rd,ra 100 0.001763186s

那我们ping abc.123.def(此域名有两个 dot), DNS 服务器的日志像下面这样, 注意到日志中最优先尝试的是abc.123.def.

[INFO] 10.202.37.232:39314 - 794 "A IN abc.123.def. udp 29 false 512" NXDOMAIN qr,rd,ra 104 0.025049846s[INFO] 10.202.37.232:51736 - 61456 "A IN abc.123.def.kube-system.svc.cluster.local. udp 59 false 512" NXDOMAIN qr,aa,rd 152 0.001213934s[INFO] 10.202.37.232:53145 - 26709 "A IN abc.123.def.svc.cluster.local. udp 47 false 512" NXDOMAIN qr,aa,rd 140 0.001418143s[INFO] 10.202.37.232:54444 - 1145 "A IN abc.123.def.cluster.local. udp 43 false 512" NXDOMAIN qr,aa,rd 136 0.001009799s

希望借这个例子让大家明白两点:

  1. 无论 ndots 是多少, search 参数中~~的后缀都会被以此查找(~~我们测试时使用了一个不存在的域名, 解析工具尝试了全部的可能)

  2. ndots 的不妥当设置, 可能会给 DNS 服务器造成压力(假如域名是存在的, dns查询会尽快返回, 不会继续查找了, 会减少服务器压力)

优化讨论

假如现在 ndots 是 2, 我们想要查询baidu.com, 由于 dot 数目为 1 小于配置中的 2, 会首先添加后缀进行查找:

[INFO] 10.202.37.232:42911 - 55931 "A IN baidu.com.kube-system.svc.cluster.local. udp 57 false 512" NXDOMAIN qr,aa,rd 150 0.000116042s[INFO] 10.202.37.232:53722 - 33218 "A IN baidu.com.svc.cluster.local. udp 45 false 512" NXDOMAIN qr,aa,rd 138 0.000075077s[INFO] 10.202.37.232:46487 - 50053 "A IN baidu.com.cluster.local. udp 41 false 512" NXDOMAIN qr,aa,rd 134 0.000067313s[INFO] 10.202.37.232:48360 - 51853 "A IN baidu.com. udp 27 false 512" NOERROR qr,aa,rd,ra 77 0.000127309s

那么, 我们会产生 3 个无用的 DNS 查询记录. 对于DNS服务器来说, 仅仅是baidu.com这个域名, 流量就变成了4倍. 假如 n继续增大呢, 就像是Kubernetes中默认给定的5, 那我们会产生更多的无效请求, 因为不只是baidu.com, 就连map.baidu.com, m.map.baidu.com, 这些域名也要从search域中开始尝试, 会对 DNS 服务器造成比较大的压力.

我个人建议:

  1. 如果内部服务之间请求十分频繁, 也就是我们需要经常访问xxx.svc.cluster.local这样的域名, 那么可以保持 ndots 较大

  2. 但是内部服务之间请求比较少时, 强烈建议调小 ndots, 以减少无用流量的产生, 减轻 dns 服务器的压力 我个人用的话, 改成 2 就好

"k8s中的DNS解析是什么意思"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

域名 服务 服务器 尝试 流量 配置 参数 查询 意思 压力 后缀 日志 内容 地址 实际 就是 方式 更多 规则 个人 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 智慧云怎么添加服务器 广东标准网络技术优化 管家婆数据库版本 网络安全产品类型 币软件开发 网络技术方向的职业发展 天津私人服务器操作系统虚拟主机 网络安全攻击主要来自哪里 中国知网数据库中有哪些疑问 <网络安全法>违法记录 软件开发有发展吗 能不能用数据库技术分析股票 衡阳软件开发培训有哪些 自制简单数据库 服务器再建立一个管理员账户 redis客户端访问数据库 如何清空数据库一个表 黑龙江开放式服务器机柜云服务器 服务器运维如何保证服务器稳定 公路网络技术指标 软件开发和界面设计哪个好 国家网络安全法什么部门监督 网络安全防护用品专项整治 江苏通信软件开发服务参考价格 吃鸡小技巧如何连接服务器 ftp服务器c实现 摩羯座网络技术有限公司 网络营销软件开发值得推荐 软件开发 三大原则 贵州边缘计算服务器云空间
0