dns

Kubelet通过--cluster-dns=启动参数,将DNS服务的IP地址写入每个容器的/etc/resolv.conf文件。

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.localdefault.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解析

image

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必须指定全域名

CoreDNS请求处理流程

image

posted @   立勋  阅读(15)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示