dns
Kubelet通过--cluster-dns=
Kubernetes 的 DNS记录类型
- A 记录(Address Record)
A 记录用于将主机名映射到 IPv4 地址。
在 Kubernetes 中,A 记录通常用于将服务的 DNS 名称解析为服务的群集 IP 地址。每个服务都有一个默认的 A 记录,用于将服务名称解析为群集内部的 IP 地址。
{service name}.{service namespace}.svc.{domain} -> Cluster IP # 普通service的dns记录
{service name}.{service namespace}.svc.{domain} -> 后端Pod IP列表 # headless的dns记录
{pod-ip}.{pod namespace}.pod.{domain} -> Pod IP # pod的dns记录
# 如果在Pod.Spec指定hostname和subdomain,那么Kubernetes DNS会额外生成Pod的A记录
{hostname}.{subdomain}.{pod namespace}.pod.cluster.local -> Pod IP
- SRV 记录(Service Record)
SRV 记录用于提供有关服务的信息,如服务的主机名、端口和协议。
在 Kubernetes 中,SRV 记录通常用于提供服务发现功能。当客户端尝试连接到一个服务时,它们可以查询 SRV 记录以获取服务的主机名和端口信息,从而直接与服务通信。
_{port name}._{port protocol}.{service name}.{service namespace}.svc.cluster.local -> Service Port
- CNAME 记录(Canonical Name Record)
CNAME 记录用于将一个域名指向另一个域名。
在 Kubernetes 中,CNAME 记录通常用于服务别名或跨命名空间服务的别名。通过创建一个 CNAME 记录,可以将一个服务的 DNS 名称指向另一个服务的 DNS 名称,从而实现服务的别名和重定向。
DNS使用
root@nginx:/# cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
options ndots:5的含义是当查询的域名字符串内的点字符数量超过5时,则认为是完整域名,直接解析,
否则Linux系统会自动尝试用default.pod.cluster.local、default.svc.cluster.local或svc.cluster.local补齐域名后缀
Pod的dnspolicy
ClusterFirst:
默认值。Pod 使用集群内部的 DNS 解析服务进行域名解析。在这种模式下,Pod 首先尝试解析本地 DNS 缓存中的域名,如果找不到则转发到集群 DNS 服务器。
ClusterFirstWithHostNet:
与 ClusterFirst 类似,但是当 Pod 使用 HostNetwork 模式时,Pod 将使用主机的 DNS 解析服务而不是集群内部的 DNS 服务。
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: busybox:latest
command: ["/bin/sh", "-c", "while true; do echo Hello World; sleep 3600; done"]
restartPolicy: Always
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
None:
在此模式下,Pod 不会自动配置 DNS 解析。这意味着 Pod 内部的 DNS 解析需要由用户自行配置。
apiVersion: v1
kind: Pod
metadata:
name: custom-dns-pod
namespace: default
spec:
dnsPolicy: None
dnsConfig:
nameservers:
- 8.8.8.8
- 8.8.4.4
searches:
- example.com
options:
- name: ndots
value: "2"
containers:
- name: my-container
image: busybox
command: ["/bin/sh", "-c", "while true; do echo Hello World; sleep 3600; done"]
Default:
此模式等同于 ClusterFirst。已弃用,建议使用 ClusterFirst 代替。
集群中不同组件之间的DNS解析以及集群中的组件和服务之间的DNS解析
Service和Pod的域名格式
- 每当创建Service时, Kubernetes 的DNS服务都会为该Service创建一条记录。它将Service名称映射到IP地址, 因此,在集群中, 和Service处于同一个命名空间的Pod都可以使用其Service名称访问此Service。
- 假设Web Service位于名为Apps的单独名称空间中。然后, 要从默认名称空间引用它,Kubernetes 的DNS服务会多维护几个子域,完全限定域名web-service.apps.svc.cluster.local
- 对Pod的解析,将其IP变为短线连接,完全限定域名10-244-2-5.apps.pod.cluster.local
coreDNS
- coreDNS的上一个版本叫kube-DNS
- coreDNS在kube-system命名空间中以pod的形式创建,由deploy创建多个副本。pod./Coredns的可执行文件
- coreDNS的配置文件 /etc/coredns/Corefile
- coreDNS在创建时,会创建一个Service,默认叫kube-dns。pod的dns地址为该Service的Cluster IP。kubelet配置文件中的clusterDNS指定的就是service的IP
- Pod的/etc/resolv.conf文件中的search条目指定的Service的子域名,所以可以不使用Service的全域名对其进行访问。对Pod必须指定全域名
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)