剖析 kubernetes 集群内部 DNS 解析原理

1bf3608be18efb240ae997b6225e1b2a.gif

作者 | 江小南

来源 | 江小南和他的小伙伴们

引言

说到DNS域名解析,大家想到最多的可能就是/etc/hosts文件,并没有什么错,但是/etc/hosts只能做到本机域名解析,如果跨机器的解析就有点捉襟见肘了。

在服务器中还有一个配置值得大家注意,/etc/resolv.conf,这个文件用于配置DNS服务器,使域名解析可以扩展到本机以外。

kubernetes集群使用到的就是这种机制。

原理

当kubernetes初始化完成后,在kube-system名称空间下会出现kube-dns的service服务与coredns的pod。

[root@k8s-master etc]# kubectl get svc -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   14d
[root@k8s-master etc]# kubectl get pod -n kube-system -o wide| grep coredns
coredns-5897cd56c4-7ps2n                   1/1     Running   9          14d   192.168.235.220   k8s-master    <none>           <none>
coredns-5897cd56c4-j7psj                   1/1     Running   9          14d   192.168.235.221   k8s-master    <none>           <none>
[root@k8s-master etc]#

CoreDNS是一个DNS解析的组件,作为集群内的DNS服务器,为集群内部提供域名解析服务。比如说一个前端pod要通过service name访问后端pod,前端pod会先通过自身的dns文件(/etc/resolv.conf)指向dns服务器,由dns服务器做域名解析转换成对用的ip,然后通过ip访问到后端pod。

配置策略

在yaml中,通过dnsPolicy字段配置DNS策略,共有4种策略:

  1. ClusterFirst:默认策略,表示使用集群内部的CoreDNS来做域名解析。

  2. Default:Pod直接继承集群node节点的域名解析配置,也就是,Pod会直接使用宿主机上的/etc/resolv.conf文件内容。

  3. None:忽略k8s集群环境中的DNS设置,Pod会使用其dnsConfig字段所提供的DNS配置。

  4. ClusterFirstWithHostNet:宿主机与 Kubernetes 共存,这种情况下的POD,既能用宿主机的DNS服务,又能使用kube-dns的Dns服务,注意的是需要将hostNetwork打开。

部署验证

首先说明一点,CoreDNS本身具有解析集群外域名的能力,但是集群外的DNS服务器并不一定具有解析集群内域名的能力。基于这个认识,我们做下列的测试。

  1. ClusterFirst

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx-deployname: nginx-deploy
spec:replicas: 2selector:matchLabels:app: nginx-deploytemplate:metadata:labels:app: nginx-deployspec:restartPolicy: Alwayscontainers:- name: mynginximage: nginximagePullPolicy: IfNotPresentdnsPolicy: ClusterFirst
[root@k8s-master test]# kubectl apply -f deployment.yaml 
deployment.apps/nginx-deploy created
[root@k8s-master test]# kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-6d79d74f76-qp8pr   1/1     Running   0          77s
nginx-deploy-6d79d74f76-tjcxt   1/1     Running   0          77s
[root@k8s-master test]#
# 进入到容器内部
[root@k8s-master test]# kubectl exec -it nginx-deploy-6d79d74f76-qp8pr -c mynginx -- /bin/bash
root@nginx-deploy-6d79d74f76-qp8pr:/# cat /etc/resolv.conf 
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local pek3.qingcloud.com
options ndots:5
root@nginx-deploy-6d79d74f76-qp8pr:/#
# 访问service成功
root@nginx-deploy-6d79d74f76-qp8pr:/# curl nginx-deploy.default.svc:8000
<!DOCTYPE html>
<html>
...
<body>
<h1>Welcome to nginx!</h1>
...
</body>
</html>
root@nginx-deploy-6d79d74f76-qp8pr:/#

可以发现NDS服务器为10.96.0.10,这个地址我们在上面原理部分获取到的kube-dns的地址一致。说明ClusterFirst的策略使用集群内部的CoreDNS来做域名解析,并且成功解析了service域名。

  1. Default

将yaml中的dnsPolicy: ClusterFirst修改为dnsPolicy: Default

[root@k8s-master test]# kubectl apply -f deployment.yaml 
deployment.apps/nginx-deploy created
[root@k8s-master test]# kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-85bd9d5f4c-js6fv   1/1     Running   0          5s
nginx-deploy-85bd9d5f4c-q8pxb   1/1     Running   0          5s
[root@k8s-master test]#
# 进入到容器内部
[root@k8s-master test]# kubectl exec -it nginx-deploy-85bd9d5f4c-js6fv -c mynginx -- /bin/bash
root@nginx-deploy-85bd9d5f4c-js6fv:/# cat /etc/resolv.conf 
nameserver 100.64.9.5
search pek3.qingcloud.com
root@nginx-deploy-85bd9d5f4c-js6fv:/#
# 查看本机的 /etc/resolv.conf
[root@k8s-master test]# cat /etc/resolv.conf 
# Generated by NetworkManager
search pek3.qingcloud.com
nameserver 100.64.9.5
[root@k8s-master test]#
# 访问service不成功
root@nginx-deploy-85bd9d5f4c-js6fv:/# curl nginx-deploy.default.svc:8000
curl: (6) Could not resolve host: nginx-deploy.default.svc
root@nginx-deploy-85bd9d5f4c-js6fv:/#
# 访问百度成功
root@nginx-deploy-85bd9d5f4c-js6fv:/# curl www.baidu.com
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
root@nginx-deploy-85bd9d5f4c-js6fv:/#

说明使用Default策略,Pod会直接使用宿主机上的/etc/resolv.conf文件内容,当然解析service域名是不能成功的。

  1. None

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx-deployname: nginx-deploy
spec:replicas: 2selector:matchLabels:app: nginx-deploytemplate:metadata:labels:app: nginx-deployspec:restartPolicy: Alwayscontainers:- name: mynginximage: nginximagePullPolicy: IfNotPresentdnsPolicy: NonednsConfig:nameservers: ["172.31.0.3","172.31.0.4"]searches:- default.svc.cluster.local- svc.cluster.local- cluster.localoptions:- name: ndotsvalue: "5"
[root@k8s-master test]# kubectl apply -f deployment.yaml 
deployment.apps/nginx-deploy created
[root@k8s-master test]# kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-6699fcc589-7nrn7   1/1     Running   0          7s
nginx-deploy-6699fcc589-8sk8p   1/1     Running   0          7s
[root@k8s-master test]#
# 进入到容器内部
[root@k8s-master test]# kubectl exec -it nginx-deploy-6699fcc589-7nrn7 -c mynginx -- /bin/bash
root@nginx-deploy-6699fcc589-7nrn7:/# cat /etc/resolv.conf 
nameserver 172.31.0.3
nameserver 172.31.0.4
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
root@nginx-deploy-6699fcc589-7nrn7:/#

说明None策略Pod会使用其dnsConfig字段所提供的DNS配置。nameserver最多可配置3个ip。域名解析能力视DNS服务器的解析能力而定。

  1. ClusterFirstWithHostNet

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx-deployname: nginx-deploy
spec:replicas: 2selector:matchLabels:app: nginx-deploytemplate:metadata:labels:app: nginx-deployspec:restartPolicy: Alwayscontainers:- name: mynginximage: nginximagePullPolicy: IfNotPresentdnsPolicy: ClusterFirstWithHostNethostNetwork: true
[root@k8s-master test]# kubectl apply -f deployment.yaml 
deployment.apps/nginx-deploy created
[root@k8s-master test]# kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-74bd47ccdd-cjbmv   1/1     Running   0          4s
nginx-deploy-74bd47ccdd-m6bm6   1/1     Running   0          4s
[root@k8s-master test]#
[root@k8s-master test]# kubectl exec -it nginx-deploy-74bd47ccdd-cjbmv -c mynginx -- /bin/bash
root@k8s-worker2:/# cat /etc/resolv.conf 
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local pek3.qingcloud.com
options ndots:5
root@k8s-worker2:/#
# 访问service成功
root@k8s-worker2:/# curl nginx-deploy.default.svc:8000
<!DOCTYPE html>
<html>
...
<body>
<h1>Welcome to nginx!</h1>
...
</html>
root@k8s-worker2:/#
# 访问百度成功
root@k8s-worker2:/# curl www.baidu.com
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
root@k8s-worker2:/#

能同时访问service和百度,说明此配置既能使用集群内部的CoreDNS来做域名解析,又可以使用宿主机的DNS做域名解析。

注意点:我们有时也会看到如下的配置。

dnsPolicy: ClusterFirst
hostNetwork: true

hostNetwork表示与宿主机共享网络空间。但是只有dnsPolicy: ClusterFirstWithHostNet时生效。而此处配置的ClusterFirst由于打开了hostNetwork为true,会自动转换为Default,那么此时解析集群内的域名是不能成功的。

d8eb211e16d531cea334c60a7159c0c8.gif

往期推荐

Docker 那些事儿:如何安全地停止、删除容器?

容器跑不动网络可不背锅!

云原生时代,开发者应具备这5大能力

实战 Kubectl 创建 Deployment 部署应用

edeb4e1fe18b4285ec197ac1cfa8e852.gif

点分享

2ab9a202fc7e2e09d5242dfe26feb4ba.gif

点收藏

24db49b12f64758748305462568e933b.gif

点点赞

ae90227da35081b8df6cac5c9ba08f07.gif

点在看

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

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

相关文章

首次公开,阿里云开源PolarDB总体架构和企业级特性

简介&#xff1a;在3月2日的阿里云开源 PolarDB 企业级架构发布会上&#xff0c;阿里云 PolarDB 内核技术专家北侠带来了主题为《PolarDB 总体架构设计和企业级特性》的精彩演讲。 在3月2日的阿里云开源 PolarDB 企业级架构发布会上&#xff0c;阿里云 PolarDB 内核技术专家 北…

阿里云数据库开源发布:PolarDB HTAP的功能特性和关键技术

简介&#xff1a;在3月2日的阿里云开源 PolarDB 企业级架构发布会上&#xff0c;阿里云 PolarDB 内核技术专家严华带来了主题为《PolarDB HTAP详解》的精彩演讲。在PolarDB存储计算分离架构的基础上&#xff0c;我们研发了基于共享存储的MPP分布式执行引擎&#xff0c;解决了单…

倒计时 2 天!2022 中国算力大会:移动云邀您共见算力网络,创新发展

7 月 29 日 - 31 日由工业和信息化部、山东省人民政府主办的首届中国算力大会将在泉城济南盛大举行&#xff01;中国移动受邀承办“算力网络&#xff0c;创新发展” 论坛并设立展区分享行业前瞻洞察&#xff0c;构建开放共赢生态7 月 29 日下午&#xff0c;邀您共话算力精彩&am…

什么是好的错误消息? 讨论一下Java系统中的错误码设计

简介&#xff1a;一个好的Error Message主要包含三个部分&#xff1a;Context: 什么导致了错误&#xff1f;发生错误的时候代码想做什么&#xff1f;The error itself: 到底是什么导致了失败&#xff1f;具体的原因和当时的数据是什么&#xff1f;Mitigation: 有什么解决方案来…

阿里巴巴在开源压测工具 JMeter 上的实践和优化

简介&#xff1a;Apache JMeter 是 Apach 旗下的开源压测工具&#xff0c;创建于 1999 年初&#xff0c;迄今已有超过 20 年历史。JMeter 功能丰富&#xff0c;社区&#xff08;用户群体&#xff09;庞大&#xff0c;是主流开源压测工具之一。 作者&#xff1a;灵苒、涧泉 Ap…

普洛斯荣获两项“数据中心绿色等级评估”5A级认证

7月29日&#xff0c;由工业和信息化部及山东省人民政府主办的首届中国算力大会在济南成功举办&#xff0c;会上同时公布了本年度“数据中心绿色等级评估”评审结果。普洛斯常熟东南数据中心B栋及普洛斯怀来数据中心3号楼均荣获“数据中心绿色等级评估”&#xff08;规划类/基础…

深度解读企业云上办公利器「无影云电脑」

简介&#xff1a;信息化进程高速发展的今天&#xff0c;用户桌面办公的需求正不断发生变化&#xff1a;远程办公&#xff0c;BYOD的需求不断增长&#xff1b;快速交付&#xff0c;高效运维的需求接连上升&#xff1b;数据及网络安全的关注度持续提高&#xff1b;整体办公成本在…

云风:不加班、不炫技,把复杂的问题简单化

小学时跟随母亲去成人大学学习编程&#xff0c;初中开始参加信息学奥赛&#xff0c;高中写出人生中第一个成熟软件——Cview&#xff0c;大学发布开源软件风魂系列&#xff0c;后用于网易开发的《大话西游》《梦幻西游》等热门游戏&#xff0c;离开网易创立简悦科技……随着云风…

Timing:在线自习室快速搭建

通过超低延迟的音视频通信技术、视频连麦、弱网传输算法&#xff0c;快速搭建自习场景&#xff0c;提升自习效率。 客户简介 氪细胞主打产品Timing&#xff0c;是国内最早推出&#xff0c;也是规模最大的在线自习室&#xff0c;是新一代的教育与社交融合平台&#xff0c;主打高…

Nacos2.0的K8s服务发现生态应用及规划

简介&#xff1a;Nacos 是阿里巴巴于 2018 年开源的注册中心及配置中心产品&#xff0c;帮助用户的分布式微服务应用进行服务发现和配置管理功能。随着 Nacos2.0 版本的发布&#xff0c;在性能和扩展性上取得较大突破后&#xff0c;社区开始考虑如何提供更加云原生方向的功能和…

webview 和 React Native 中吸顶效果实现

作者 | &#x1f47d;来源 | Sharing一、前言 在跨端开发中&#xff0c;离不开一些吸顶的交互场景&#xff0c;可以参考淘宝或是京东类电商 app 中一些 tab &#xff0c;在整个容器滑动的过程中&#xff0c;吸顶效果非常的连贯和丝滑的&#xff0c;当然这些 tab 可能是用 nativ…

AHPA:开启 Kubernetes 弹性预测之门

简介&#xff1a;阿里巴巴云原生团队和阿里达摩院决策智能时序团队合作开发 AHPA 弹性预测产品&#xff0c;该产品主要出发点是基于检测到的周期做“定时规划”&#xff0c;通过规划实现提前扩容的目的&#xff0c;在保证业务稳定的情况下&#xff0c;让你真正实现按需使用。 …

Kubernetes 在科技革命中的演变

作者 | Anthony Spiteri仅在一两年前&#xff0c;对于那些希望通过向现代数据平台转型走在前沿的企业来讲&#xff0c;容器化可是热门词汇。Kubernetes&#xff0c;也被称为 K8s&#xff0c;当时还不成熟&#xff0c;仅处于起步阶段&#xff0c;对更广泛的IT界来说仍然有些陌生…

在阿里巴巴,我们如何先于用户发现和定位 Kubernetes 集群问题?

简介&#xff1a;本文整理自阿里云高级研发工程师彭南光(光南) 在 KubeCon China 2021 大会的演讲实录&#xff0c;分享了阿里巴巴是如何通过自研通用链路探测定向巡检工具 KubeProbe 应对大规模集群的稳定性挑战的。关于阿里云云原生团队在本次 KubeCon 上分享的全部内容沉淀于…

“虎力全开”采购季,存储产品已就位

简介&#xff1a;两百多年前&#xff0c;有个叫吴锡麒的少年&#xff0c;在“江南三月听莺天&#xff0c;买酒莫论钱”。如今又逢暮春三月&#xff0c;一年一度的开年大促——阿里云上云采购季也拉开了序幕。 两百多年前&#xff0c;有个叫吴锡麒的少年&#xff0c;在“江南三月…

武汉高性能计算大会2022举办,高性能计算生态发展再添新动力

武汉高性能计算大会2022会上&#xff0c;华为重磅发布了鲲鹏高性能计算解决方案&#xff0c;为了进一步推进高性能产业的生态繁荣&#xff0c;武汉高性能计算产业联盟成立启动&#xff0c;长江欧拉生态创新中心签约并揭牌&#xff0c;首批鲲鹏科研创新使能计划成员也正式亮相。…

学信网:研究生云复试平台快速搭建上线

通过覆盖全球的音视频通信服务&#xff0c;支撑学信网视频面试稳定运行和效率提升。 案例简介 研究生复试工作碰到疫情&#xff0c;各大院校先后发布复试流程调整通知&#xff0c;将复试工作从线下搬到了线上&#xff0c;这也是历史上的第一次。要在短期内完成视频面试系统的…

企业深入使用微服务后会面临哪些问题?云原生全链路灰度给了新思路

简介&#xff1a;如何落地可灰度、可观测、可回滚的安全生产三板斧能力&#xff0c;满足业务高速发展情况下快速迭代和小心验证的诉求&#xff0c;是企业在微服务化深入过程中必须要面对的问题。在云原生流行的当下&#xff0c;这个问题又有了一些新的思路与解法。 作者&#…

40 张图 详解 Docker 容器监控

作者 | 飞向星的客机来源 | CSDN博客前言在企业中&#xff0c;通常业务是不允许随意停止的&#xff0c;否则将给企业带来巨大的经济损失。运维工程师要保证业务正常运行&#xff0c;就必须利用工具时刻监控业务的运行状态&#xff0c;容器中的业务也不例外。除了容器自身的监控…

Spring Cloud Gateway 突发高危漏洞,下一代云原生网关恰逢其时?

简介&#xff1a;Log4j2 的漏洞刚告一段落&#xff0c;Spring 官方在 2022 年 3 月 1 日发布了 Spring Cloud Gateway 的两个 CVE 漏洞&#xff1a;分别为 CVE-2022-22946&#xff08;严重性&#xff1a;Medium&#xff09;与 CVE-2022-22947&#xff08;代码注入漏洞&#xff…