K8S-CoreDNS组件

一、CoreDNS 与 Kubernetes 服务发现

Kubernetes 提供两种服务发现方式:

  • 环境变量方式:通过注入环境变量暴露服务信息,仅适用于简单场景
  • 内部域名方式:通过 DNS 解析服务名称,是主流且推荐的方式

自 Kubernetes 1.11 版本起,CoreDNS 已取代 kube-dns 成为默认 DNS 组件,负责处理集群内部所有 Service 和 Pod 的域名解析请求。

二、域名解析的底层依赖:resolv.conf

容器内的 /etc/resolv.conf 文件是 DNS 解析的核心配置,典型内容如下:

复制代码
cat /etc/resolv.conf
nameserver 169.254.25.10  # 通常是 CoreDNS 或 NodeLocalDNS 的地址
search default.svc.test.com svc.test.com test.com
options ndots:5

配置解析:

  • nameserver:指定 DNS 服务器地址,集群内通常指向 CoreDNS 的 ClusterIP
  • search:域名搜索域列表,用于自动补全域名后缀
  • options ndots:5:控制域名搜索行为的阈值参数

三、Pod 的 DNS 策略

Kubernetes 为 Pod 提供四种 DNS 策略,通过 dnsPolicy 字段配置:

  1. Default:继承所在节点的 DNS 配置
  2. ClusterFirst(默认):优先使用集群 CoreDNS 解析,未命中则转发到上游 DNS
  3. ClusterFirstWithHostNet:适用于 hostNetwork 模式的 Pod,规则同 ClusterFirst
  4. None :忽略集群默认配置,仅使用 dnsConfig 自定义配置

示例:使用自定义 DNS 配置

复制代码
spec:
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 114.114.114.114  # 自定义 DNS 服务器
    searches:
      - default.svc.test.com
    options:
      - name: ndots
        value: "5"

四、CoreDNS 解析规则详解

CoreDNS 的解析行为由 resolv.conf 配置决定,核心规则如下:

1. 域名搜索机制

访问短域名时,会自动结合 search 字段补全后缀。例如访问 nginx 时,解析顺序为:

复制代码
nginx.default.svc.test.com. → nginx.svc.test.com. → nginx.test.com.

2. ndots 参数的影响

  • 当域名包含的点(.)小于 5:先使用 search 域补全,再尝试绝对域名
  • 当域名包含的点(.)大于等于 5:先尝试绝对域名,再使用 search 域补全

示例(ndots=5):

  • 访问 a.b.c.e.(4 个点):先补全搜索域,再查绝对域名
  • 访问 a.b.c.e.f.g(5 个点):先查绝对域名,再补全搜索域

五、Pod 间通信的域名解析实践

1. 通过 Service 名称通信

Kubernetes 中 Service 的完整域名格式为:

复制代码
<service-name>.<namespace>.svc.<cluster-domain>

通信示例

  • 同命名空间:直接使用 Service 名称(如 nginx-svc

  • 跨命名空间:需指定命名空间(如 harbor-core.harbor

    跨命名空间访问示例

    [root@mypod /]# ping harbor-core.harbor
    PING harbor-core.harbor.svc.test.com (10.10.30.184) 56(84) bytes of data.
    64 bytes from harbor-core.harbor.svc.test.com (10.10.30.184): icmp_seq=1 ttl=64 time=0.095 ms

2. 通过 hostname 和 subdomain 通信

可通过自定义主机名和子域名直接解析到 Pod IP:

复制代码
spec:
  hostname: nginx          # 自定义主机名
  subdomain: subdomain-test # 自定义子域名
  containers:
  - name: nginx
    image: nginx:latest

配合同名 Service 可形成 nginx.subdomain-test.default.svc.test.com 域名,直接解析到该 Pod 的 IP 地址。

六、CoreDNS 核心配置(Corefile)解析

CoreDNS 的配置通过 ConfigMap 管理,典型配置如下:

复制代码
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors                   # 启用错误日志
        health {                 # 健康检查配置
           lameduck 5s
        }
        ready                    # 就绪探针支持
        # Kubernetes 域名解析配置
        kubernetes test.com in-addr.arpa ip6.arpa {
           pods insecure         # 允许 Pod 域名解析
           fallthrough in-addr.arpa ip6.arpa
           ttl 30                # DNS 记录缓存时间
        }
        prometheus :9153         # 监控指标暴露
        # 转发非集群域名到上游 DNS
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30                 # 缓存时间
        loop                     # 循环检测
        reload                   # 配置自动重载
        loadbalance              # 负载均衡
    }
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system

七、添加外部域名解析

如需在集群内解析外部域名,可通过 hosts 插件配置:

  • 导出当前配置:

    kubectl get cm coredns -n kube-system -o yaml > coredns-configmap.yaml

  • 添加 hosts 配置:

    hosts {
    10.151.30.11 git.k8s.local # 自定义域名映射
    fallthrough # 未匹配时继续处理
    }

  • 应用配置并重启:

    kubectl apply -f coredns-configmap.yaml
    kubectl delete pod -n kube-system -l k8s-app=kube-dns # 重启 CoreDNS

  • 验证配置:

    dig @10.96.0.10 git.k8s.local # 应返回 10.151.30.11

总结

CoreDNS 作为 Kubernetes 服务发现的核心组件,通过灵活的插件机制和配置方式,实现了集群内部高效的域名解析。理解其解析规则、DNS 策略和配置方法,对于排查服务通信问题、优化集群网络至关重要。合理配置 CoreDNS 不仅能保障集群内部服务的稳定通信,还能灵活对接外部域名,满足复杂业务场景需求。

相关推荐
无限大.2 小时前
为什么网站需要“域名“?——从 IP 地址到网址的演进
网络·网络协议·tcp/ip
sdszoe49222 小时前
思科DHCP服务1
网络·思科网络·dhcp服务基础
JANG10242 小时前
【Linux】进程
linux·网络·chrome
濊繵3 小时前
Linux网络--网络层协议 IP
服务器·网络·tcp/ip
Upper9993 小时前
简单记录:TCP数据包的抓取--3次握手、4次挥手
网络·网络协议·tcp/ip
ZeroNews内网穿透3 小时前
Dify AI 结合ZeroNews 实现公网快速访问
网络·人工智能·网络协议·tcp/ip·安全·web安全
ShiMetaPi3 小时前
GM-3568JHF丨ARM+FPGA异构开发板系列教程:外设教程 04 WIFI
网络·arm开发·fpga开发·智能路由器·fpga
黑贝是条狗3 小时前
用mormot2 orm模式搭建一个http服务验证设备的注册信息
网络·网络协议·http
wearegogog1234 小时前
基于C#的FTP客户端实现方案
java·网络·c#