理解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.pswp.cn/news/899423.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899423.shtml
英文地址,請注明出處:http://en.pswp.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\…