理解Kubernetes中CoreDNS域名解析与DNS策略

CoreDNS是什么

CoreDNS是一个灵活可扩展的DNS服务器,使用Go语言编写,旨在提供快速、灵活的DNS服务

为什么需要CoreDNS

CoreDNS为Kubernetes集群内部的DNS解析提供服务,使得服务之间能够通过域名互相通信
Kubernetes集群中, CoreDNS是运行在kube-system这个namespace下的Pod

kubectl -n kube-system get pod coredns-66f779496c-b7mmz
NAME                       READY   STATUS    RESTARTS      AGE
coredns-66f779496c-b7mmz   1/1     Running   4 (28m ago)   4d23h

k8s集群中的域名是如何解析的

比如服务a访问服务b:

  • 如果a和b在同一个namespace下, 可以直接在pod a中, 通过curl b来访问b
  • 如果a和b不在同一个namespace下, 在pod a中需要通过curl b.namespaceb来访问b

以下动手测试

测试同一个namespace下的服务间域名解析

创建一个名为foo的namespace, 再创建两个Flask服务(svca, svcb)

kubectl get all -n foo
NAME                        READY   STATUS    RESTARTS   AGE
pod/svca-78f6c85d4-sd97h    1/1     Running   0          43s
pod/svcb-5fccb7d86b-mkqg7   1/1     Running   0          43sNAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/svca   ClusterIP   10.98.115.242    <none>        8000/TCP   24s
service/svcb   ClusterIP   10.111.107.194   <none>        8000/TCP   23sNAME                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/svca   1/1     1            1           24s
deployment.apps/svcb   1/1     1            1           23s

进入pod a, 通过curl http://svcb 访问 b

kubectl exec -it pod/svca-78f6c85d4-sd97h -n foo -- sh# curl http://svcb:8000
hello foo

测试不同namespace下的服务间域名解析

两个服务(svca, svcb), svca在foo命名空间, svcb在bar命名空间, 在pod a中访问b, 使用curl http://svcb.bar

kubectl exec -it pod/svca-78f7c85d4-sd97h -n foo -- sh
# curl http://svcb.bar:8000
hello foo

为什么同一Namespace下, 直接访问服务名<service-name>就可以, 不同Namespace下, 必须带上namespace(<service-name>.<namespace> ?
进入pod a, 查看/etc/resolve.conf

search foo.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5

这里的DNS Server(10.96.0.10)是kube-dns的ClusterIP

# kubectl -n kube-system get svc
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   9d

查看/etc/resolv.conf, 其中的关键点在于search指令和ndots选项:

  • search:这个指令定义了一系列的后缀,当DNS查询失败时,会依次尝试将这些后缀附加到原始查询域名后面,直到找到匹配项或所有后缀都已尝试过。
  • ndots:如果一个域名中包含的点(.)数量小于ndots值,则该域名会被认为是“不完整”的域名。在这种情况下,DNS 客户端会尝试将 /etc/resolv.conf 中的 search 路径逐一追加到该域名后进行解析。如果域名中的点数大于或等于 ndots,则直接将其作为完整的域名进行查询。

k8s集群中某个服务完整的域名格式是<service-name>.<namespace>.svc.<cluster-domain>, 验证一下:

# nslookup svcb.foo.svc.cluster.local 10.96.0.10
Server:         10.96.0.10
Address:        10.96.0.10#53Name:   svcb.foo.svc.cluster.local
Address: 10.111.107.194

同一命名空间下的服务访问
CoreDNS会按照svcb.foo.svc.cluster.local -> svcb.svc.cluster.local -> svcb.cluster.local顺序解析, 可以看出第一次解析(svcb.foo.svc.cluster.local)就会成功

不同命名空间下的服务访问
必须使用<service-name>.<namespace>的形式,例如svcb.bar, CoreDNS会按照 svcb.bar.foo.svc.cluster.local -> svcb.bar.svc.cluster.local -> svcb.bar.cluster.local, 可以看出第二次解析(svcb.bar.svc.cluster.local)就会成功

访问外部域名是否走search域 ?

测试一下, 进入pod, 使用nslookup指定coreDNS, 查询外部域名www.trendmicro.com

kubectl -n bar exec -it svcb-5fccb7d86b-wj6nv -- sh
sh-5.1# nslookup www.trendmicro.com 10.96.0.10
Server:         10.96.0.10
Address:        10.96.0.10#53Non-authoritative answer:
www.trendmicro.com      canonical name = ion.trendmicro.com.edgekey.net.
ion.trendmicro.com.edgekey.net  canonical name = e3576.a.akamaiedge.net.
Name:   e3576.a.akamaiedge.net
Address: 23.217.64.161抓包
# tcpdump -i eth0 udp
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
13:13:54.687483 IP svcb-5fccb7d86b-wj6nv.37345 > kube-dns.kube-system.svc.cluster.local.domain: 44803+ A? www.trendmicro.com.bar.svc.cluster.local. (58)
13:13:54.687791 IP kube-dns.kube-system.svc.cluster.local.domain > svcb-5fccb7d86b-wj6nv.37345: 44803 NXDomain*- 0/1/0 (151)
13:13:54.688531 IP svcb-5fccb7d86b-wj6nv.47832 > kube-dns.kube-system.svc.cluster.local.domain: 45213+ A? www.trendmicro.com.svc.cluster.local. (54)
13:13:54.688671 IP kube-dns.kube-system.svc.cluster.local.domain > svcb-5fccb7d86b-wj6nv.47832: 45213 NXDomain*- 0/1/0 (147)
13:13:54.688877 IP svcb-5fccb7d86b-wj6nv.56239 > kube-dns.kube-system.svc.cluster.local.domain: 52750+ A? www.trendmicro.com.cluster.local. (50)
13:13:54.689073 IP kube-dns.kube-system.svc.cluster.local.domain > svcb-5fccb7d86b-wj6nv.56239: 52750 NXDomain*- 0/1/0 (143)
13:13:54.689225 IP svcb-5fccb7d86b-wj6nv.41094 > kube-dns.kube-system.svc.cluster.local.domain: 46754+ A? www.trendmicro.com. (36)
13:13:54.720336 IP svcb-5fccb7d86b-wj6nv.36285 > kube-dns.kube-system.svc.cluster.local.domain: 55747+ PTR? 10.0.96.10.in-addr.arpa. (41)
13:13:54.721011 IP kube-dns.kube-system.svc.cluster.local.domain > svcb-5fccb7d86b-wj6nv.36285: 55747*- 1/0/0 PTR kube-dns.kube-system.svc.cluster.local. (116)
13:13:54.731442 IP kube-dns.kube-system.svc.cluster.local.domain > svcb-5fccb7d86b-wj6nv.41094: 46754 3/0/0 CNAME ion.trendmicro.com.edgekey.net., CNAME e3576.a.akamaiedge.net., A 23.208.168.135 (202)
13:13:54.735385 IP svcb-5fccb7d86b-wj6nv.37844 > kube-dns.kube-system.svc.cluster.local.domain: 29753+ AAAA? e3576.a.akamaiedge.net. (40)
13:13:54.775441 IP kube-dns.kube-system.svc.cluster.local.domain > svcb-5fccb7d86b-wj6nv.37844: 29753 0/1/0 (131)
————————————————

可以看出, 解析www.trendmicro.com走了search域, 有3次无用的DNS请求
www.trendmicro.com.bar.svc.cluster.local. -> www.trendmicro.com.svc.cluster.local. -> www.trendmicro.com.cluster.local. -> www.trendmicro.com.

如果我们只用到了同namespace下的访问、或者跨namespace下的service访问, 可以把ndots默认值改成2, 减少DNS查询, 提高性能

Kubernetes DNS 策略

在Kubernetes中,dnsPolicy字段定义了Pod的DNS配置策略,提供了四种不同的策略:ClusterFirst、 ClusterFirstWithHostNet、 Default 和 None

ClusterFirst(默认)

Kubernetes的默认DNS策略, Pod优先使用CoreDNS进行域名解析, 如果CoreDNS无法解析,回退到宿主机的DNS配置进行解析
这是最常见的配置, 适用于需要访问集群内其他服务的应用

ClusterFirstWithHostNet

这个策略专为使用主机网络(hostNetwork: true)的Pod设计, 仍然优先使用CoreDNS进行解析
适用于需要直接监听宿主机上网络接口, 但仍需访问集群内其他服务的应用

Default

使用宿主机的DNS设置,完全不使用CoreDNS
适用于主要访问外部服务的应用, 避免CoreDNS解析外部域名带来的延迟问题

None

完全忽略Kubernetes和宿主机的DNS配置,要求用户自行指定DNS设置。 适用于对DNS配置有高度定制需求的应用. 配置示例如下:

apiVersion: v1
kind: Pod
metadata:name: custom-dns-pod
spec:dnsPolicy: NonednsConfig:nameservers:- 8.8.8.8- 8.8.4.4searches:- ns1.svc.cluster.local- mycompany.localoptions:- name: ndotsvalue: "2"- name: edns0

参考

【1】 https://coredns.io/manual/toc/
【2】 https://cloud.tencent.com/developer/article/2126510

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

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

相关文章

日报日报流量分析

快捷键 CtrlK&#xff0c;选择需要抓包的网卡 CtrlF可以进行关键字搜索 CtrlM&#xff0c;标记数据包 CtrlShiftN跳到标记处 查看包有多少协议Protocol Hierarchy&#xff08;协议分级&#xff09; 搜了一下TCP协议&#xff0c;是互联网最基本的协议&#xff0…

docker-Dify外接Fastgpt知识库

参考地址&#xff1a;https://mp.weixin.qq.com/s/crQrneHZ0sT-c04YanofSw 总体步骤 部署fda(fastgpt-dify-adapter)docker 部署dify&#xff0c;fastgpt在fastgpt创建open apikey&#xff0c;复制知识库id&#xff1b;在dify外接fastgpt知识库&#xff1b; docker安装 下载…

蓝桥杯 之 图论基础+并查集

文章目录 习题联盟X蓝桥幼儿园 图论基础 并查集 并查集&#xff0c;总的来说&#xff0c;操作分为三步初始化(每一个节点的父亲是自己)&#xff0c;定义union(index1,index2)函数&#xff0c;定义find(index)函数 并查集详细内容博客 习题 联盟X 联盟X 典型的求解连通分支…

JavaScript运算符与逻辑中断

目录 JavaScript运算符 一、运算符分类与优先级 1. 运算符优先级表 二、算术运算符 1. 基础算术运算 2. 自增/自减运算符 三、比较运算符 1. 基础比较 2. 相等性判断 四、逻辑运算符 1. 基础逻辑运算 2. 短路求值&#xff08;Short-Circuiting&#xff09; 3. 逻辑…

Unity顶点优化:UV Splits与Smoothing Splits消除技巧

一、顶点分裂问题概述 1. 什么是顶点分裂 顶点分裂(Vertex Splits)是3D渲染中常见的性能问题&#xff0c;当模型需要为同一顶点位置存储不同属性值时&#xff0c;会创建多个顶点副本。主要分为两类&#xff1a; UV Splits&#xff1a;由UV不连续引起 Smoothing Splits&#…

OpenCV、YOLO与大模型的区别与关系

OpenCV、YOLO 和大模型的区别与关系 1. OpenCV&#xff08;Open Source Computer Vision Library&#xff09; 定位&#xff1a;开源的计算机视觉基础库。功能&#xff1a;提供传统的图像处理算法&#xff08;如图像滤波、边缘检测、特征提取&#xff09;和基础工具&#xff…

CentOS 7 挂载与卸载文件系统笔记

挂载文件系统 挂载的基本概念 挂载是将存储设备&#xff08;如硬盘分区、U 盘、光盘等&#xff09;连接到 Linux 文件系统的特定目录&#xff08;挂载点&#xff09;&#xff0c;使得系统能够访问存储设备上的数据。 查看已挂载的文件系统 命令&#xff1a;mount 或 df -h mo…

Git项目要改变仓库地址

去掉原仓库git地址和清除原项目的git版本信息的方法 场景需求: 如果是使用自己以前的项目、或者拉取了别人的项目到自己本地。想在此基础上重新开发、初始化项目的话,最好先删掉以前的git信息。 因为如果不删除的话: 1.看着不舒服。根本不需要保留原来的版本信息。 2.我们…

NC,GFS、ICON 数据气象信息可视化--降雨量的实现

随着气象数据的快速发展和应用&#xff0c;气象信息的可视化成为了一项不可或缺的技术手段。它不仅能帮助气象专家快速解读数据&#xff0c;还能为公众提供直观的天气预报信息。今天&#xff0c;我们将从降雨量的可视化出发&#xff0c;带大家一起了解如何实现气象数据的可视化…

质量工程师的2025:从“找bug“到“造质量“的职业进化

想象一下&#xff0c;2025年的某天&#xff1a;阅读原文 早晨&#xff0c;AI测试助手已经自动运行了夜间回归测试&#xff0c;并将可疑问题标记出来 你喝着咖啡&#xff0c;通过质量数据看板分析系统健康度 下午的会议上&#xff0c;你正用业务语言向产品经理解释&#xff1a…

Python实现将字典中键相同的值合并

在Python字典中键是唯一的&#xff0c;但是业务需求是将不同的数据传递到不同的接口&#xff0c;接口列表中存在3个相同的接口&#xff0c;需要将3个接口对应的数据合并一同发送&#xff0c;逻辑实现如下 merge_dict {}for file in files:path os.path.join(folder_path, fil…

数据大屏点亮工业互联网的智慧之眼

在当今数字化飞速发展的时代&#xff0c;数据已成为企业决策的核心依据&#xff0c;而数据大屏作为数据可视化的重要工具&#xff0c;正逐渐成为工业互联网领域不可或缺的一部分。通过直观、动态的可视化展示&#xff0c;数据大屏能够将复杂的数据转化为易于理解的图表和图形&a…

洛谷题单1-B2005 字符三角形-python-流程图重构

题目描述 给定一个字符&#xff0c;用它构造一个底边长 5 5 5 个字符&#xff0c;高 3 3 3 个字符的等腰字符三角形。 输入格式 输入只有一行&#xff0c;包含一个字符。 输出格式 该字符构成的等腰三角形&#xff0c;底边长 5 5 5 个字符&#xff0c;高 3 3 3 个字符…

UE4学习笔记 FPS游戏制作29 更换武器时更换武器的图标

文章目录 制作物体图标UI添加获取武器图标的方法使用事件分发器&#xff0c;通知UI要换枪定义事件分发器调用事件分发器注册事件分发器 制作物体图标UI 在Fpp-UI上添加一个图片&#xff0c;改名为五weaponIcon&#xff0c;勾选SizeToContent,锚点放在右下角&#xff0c;对齐改…

SpringMVC 请求与响应处理详解

引言 在 Java Web 开发中&#xff0c;SpringMVC 作为 Spring 框架的重要模块&#xff0c;提供了强大的请求和响应处理机制。本文将深入探讨 SpringMVC 中请求和响应的处理方式&#xff0c;结合实际案例&#xff0c;帮助开发者更好地理解和应用这些功能。 一、SpringMVC 请求处…

从零开始的 Kafka 学习(四)| 生产消息

1. 生产消息 1.1 生产消息的基本步骤 &#xff08;一&#xff09;创建Map类型的配置对象&#xff0c;根据场景增加相应的配置属性&#xff1a; 参数名参数作用类型默认值推荐值bootstrap.servers集群地址&#xff0c;格式为&#xff1a;brokerIP1:端口号,brokerIP2:端口号必…

k8s1.22 kubeadm 部署

k8s1.22 kubeadm 部署 1、更改hostname hostnamectl set-hostname master-001 && su root hostnamectl set-hostname node-001 && su root hostnamectl set-hostname node-002 && su root配置hsots cat >> /etc/hosts <<EOF 192.168.20.…

新手村:逻辑回归-理解04:熵是什么?

新手村&#xff1a;逻辑回归04&#xff1a;熵是什么? 熵是什么? 前置条件 在开始学习逻辑回归中的熵理论之前&#xff0c;需要掌握以下基础知识&#xff1a; 概率论与统计学&#xff1a; 概率分布&#xff08;如伯努利分布、正态分布&#xff09;。条件概率和贝叶斯定理。期…

STM32通用定时器结构框图

STM32单片机快速入门 通用定时器框图 TIM9和TIM12 通用定时器框图 TIM9和TIM12 &#xff08;二&#xff09; 通用定时器框图

3.28-2 jmeter读取mysql

jmeter操作mysql 1.下载数据驱动&#xff0c;安装数据驱动 &#xff08;1&#xff09;存放四个路径 a.jre下的lib C:\Program Files\Java\jre1.8.0_60\lib &#xff08;2&#xff09;存放在jre 下的lib 中的ext 路径&#xff1a; C:\Program Files\Java\jre1.8.0_60\lib\…