K8s CoreDNS 核心知识点总结

发布于:2025-05-18 ⋅ 阅读:(24) ⋅ 点赞:(0)

一、章节介绍

背景与主旨

Kubernetes(K8s)集群中,服务间通信依赖高效的DNS服务实现服务发现。CoreDNS作为K8s 1.11+版本的默认DNS解决方案,取代了早期的kube-dns,提供高性能、可扩展的集群内DNS解析能力。本章节围绕CoreDNS的核心概念、工作原理、配置方法及实际应用展开,帮助开发者掌握其在服务发现、负载均衡中的关键作用,满足生产环境部署和面试准备需求。

核心知识点及面试频率

知识点 面试频率 核心内容概括
CoreDNS 概述 开源DNS服务器,Go语言开发,插件化架构,K8s默认DNS方案
工作原理 服务发现流程、查询处理逻辑、负载均衡实现
配置与插件系统 Corefile配置语法、常用插件功能(如kubernetes、forward)
Pod DNS策略 Default/ClusterFirst/ClusterFirstWithHostNet/None策略对比
服务发现与负载均衡 通过DNS名称解析后端Pod IP,支持轮询等负载均衡策略

二、知识点详解

1. CoreDNS 概述

  • 定位:K8s集群内置DNS服务,负责处理集群内域名解析,实现服务发现和流量调度。
  • 技术特性
    • 高性能:Go语言编写,轻量高效,资源占用低。
    • 插件化架构:通过插件扩展功能,支持灵活定制DNS行为(如缓存、转发、健康检查)。
    • 兼容性:1.11+版本默认集成,替代kube-dns,无缝对接K8s API。

2. 工作原理(高频考点)

服务发现流程
  1. 请求发起:Pod通过服务域名(如my-service.default.svc.cluster.local)发起DNS查询。
  2. 查询处理
    • CoreDNS解析域名中的服务名(my-service)、命名空间(default)和集群域(svc.cluster.local)。
    • 通过K8s API获取对应Service的Endpoint列表(包含后端Pod IP)。
  3. 响应构造
    • 返回包含Service的Cluster IP(集群内虚拟IP)或Pod IP的DNS记录。
    • 支持A记录(IP地址)、SRV记录(服务端口)等类型。
  4. 负载均衡
    • 内置loadbalance插件,默认采用轮询策略分配流量到后端Pod。
    • 支持基于权重、优先级的高级负载均衡策略(需配置插件)。

3. 配置与插件系统(高频考点)

核心配置文件:Corefile
.:53 {  # 监听所有接口的53端口
  kubernetes cluster.local in-addr.arpa ip6.arpa {  # kubernetes插件,解析集群内域名
    fallthrough in-addr.arpa ip6.arpa  # 未匹配的请求透传
    ttl 30  # DNS记录缓存时间
  }
  forward . /etc/resolv.conf  # forward插件,转发外部域名查询到宿主机DNS
  cache 30  # cache插件,启用查询缓存,有效期30秒
  prometheus :9153  # prometheus插件,暴露监控指标
  health  # health插件,提供健康检查端点
}
常用插件
插件名 功能描述 应用场景
kubernetes 从K8s API获取服务和Pod信息 集群内服务发现核心插件
forward 转发外部域名查询到上游DNS服务器 解析集群外域名(如公网域名)
cache 缓存DNS查询结果 减少API调用,提升解析性能
loadbalance 实现DNS层负载均衡 流量均匀分配到后端Pod
prometheus 导出性能指标(如QPS、延迟) 配合Prometheus监控CoreDNS运行状态

4. Pod DNS策略(中频考点)

策略 解析逻辑 适用场景
Default 继承宿主机/etc/resolv.conf配置 需复用宿主机DNS配置的传统应用容器
ClusterFirst 优先使用CoreDNS解析集群内域名,外部域名转发到宿主机DNS 大多数K8s原生应用(默认策略)
ClusterFirstWithHostNet 与ClusterFirst相同,但适用于hostNetwork模式Pod Pod使用宿主机网络命名空间时
None 完全禁用K8s DNS配置,通过spec.dnsConfig自定义 需严格控制DNS解析的特殊场景

配置示例

spec:
  dnsPolicy: ClusterFirst
  dnsConfig:  # 自定义DNS配置(仅None策略生效)
    nameservers: ["192.168.1.1"]
    searches: ["my-domain.local"]

三、章节总结

CoreDNS是K8s服务发现的核心组件,通过插件化设计实现灵活扩展,支持集群内域名解析、负载均衡和外部域名转发。关键知识点包括:

  1. 核心作用:替代kube-dns,提供高性能DNS解析和服务发现。
  2. 工作流程:基于K8s API获取服务端点,构造DNS响应并支持负载均衡。
  3. 配置核心:通过Corefile定义插件行为,常用插件包括kubernetes、forward、cache。
  4. 策略选择:根据Pod网络模式和需求选择合适的DNS策略(如ClusterFirst为默认最佳实践)。

四、知识点补充

1. 相关扩展知识点

  • K8s服务发现机制:除DNS外,还支持环境变量(如SERVICE_HOST),但DNS方式更灵活通用。
  • DNS解析优先级:集群内域名遵循固定格式(服务名.命名空间.svc.cluster.local),解析优先级高于外部域名。
  • 插件开发:CoreDNS支持自定义插件,开发者可基于Go语言扩展功能(如自定义负载均衡算法)。
  • 性能优化:通过cache插件减少API调用,结合health插件实现端点健康检查,避免转发请求到故障Pod。
  • 与其他DNS对比:相比kube-dns,CoreDNS内存占用降低50%+,支持热更新配置,无需重启服务。

2. 最佳实践:生产环境CoreDNS配置优化

高可用性部署
  • 部署多个CoreDNS副本,通过K8s Deployment管理,避免单点故障。
  • 配合kube-dns服务的Cluster IP(默认10.96.0.10)实现客户端负载均衡。
监控与日志
  • 启用prometheus插件,采集coredns_requests_total(请求总数)、coredns_cache_hits(缓存命中率)等指标。
  • 通过K8s日志系统(如EFK栈)收集CoreDNS日志,监控解析失败率(response_code != 0)。
外部域名解析优化
.:53 {
  kubernetes cluster.local {
    fallthrough  # 未匹配的集群内域名透传
  }
  forward . 114.114.114.114 8.8.8.8 {  # 转发外部域名到公共DNS
    policy sequential  # 按顺序尝试上游DNS,提高解析成功率
  }
  cache 60  # 延长外部域名缓存时间,减少公网请求
  log  # 记录详细查询日志(生产环境建议分级开启)
}

3. 编程思想指导

  • 模块化设计:CoreDNS的插件架构体现"单一职责原则",每个插件专注特定功能(如解析、转发、监控),可独立扩展。
  • 接口抽象:通过定义统一的Plugin接口,支持不同插件无缝集成,降低系统耦合度(类似K8s控制器模式)。
  • 性能优先:Go语言的并发模型(Goroutine)和零拷贝技术优化I/O性能,启示在分布式系统中需关注资源效率。
  • 可观测性:内置Prometheus监控和日志系统,实践中需为核心组件设计完善的指标体系,便于故障排查和容量规划。

五、程序员面试题

1. 简单题

问题:CoreDNS在K8s中的主要作用是什么?
答案
CoreDNS是K8s集群的默认DNS服务,主要作用包括:

  • 提供服务发现能力,通过域名解析获取Service对应的Pod IP。
  • 实现负载均衡,将流量分发到后端多个Pod。
  • 支持灵活配置和扩展,通过插件系统集成K8s API、缓存、监控等功能。

2. 中等难度题

问题1:简述CoreDNS的工作流程,当Pod访问my-service.default时,解析过程如何进行?
答案

  1. Pod发送DNS查询到CoreDNS(默认IP 10.96.0.10)。
  2. CoreDNS解析域名为my-service.default.svc.cluster.local(补充默认后缀)。
  3. 通过K8s API查询default命名空间下的my-service服务,获取其Endpoint对应的Pod IP列表。
  4. 构造包含Pod IP的DNS响应,返回给Pod,Pod通过IP访问目标服务。

问题2:CoreDNS的Corefile中,kubernetes插件和forward插件的作用分别是什么?
答案

  • kubernetes插件:连接K8s API,解析集群内服务域名(以cluster.local结尾),返回Service或Pod的IP。
  • forward插件:将无法解析的外部域名转发到指定的上游DNS服务器(如宿主机/etc/resolv.conf或公共DNS)。

3. 高难度题

问题1:如何通过CoreDNS实现对后端Pod的健康检查?若某个Pod故障,流量如何处理?
答案

  • 启用health插件,配置对Endpoint的健康检查:
    kubernetes cluster.local {
      health  # 自动检查Pod的就绪状态(Readiness Probe)
    }
    
  • 当Pod故障时,K8s API会更新Endpoint列表,CoreDNS从API获取最新状态,自动剔除未就绪的Pod IP,避免流量转发到故障实例。

问题2:在微服务架构中,如何利用CoreDNS的负载均衡插件实现加权轮询策略?
答案

  1. 确保loadbalance插件已启用(默认包含在CoreDNS镜像中)。
  2. 在Corefile中为服务配置权重:
    my-service.default.svc.cluster.local {
      loadbalance {
        policy round_robin_weighted  # 启用加权轮询
        endpoint 10.0.0.1 weight 2  # 权重为2
        endpoint 10.0.0.2 weight 1  # 权重为1
      }
    }
    
  3. CoreDNS根据权重比例分配流量(如上述配置中,10.0.0.1获得2/3流量,10.0.0.2获得1/3流量)。

网站公告

今日签到

点亮在社区的每一天
去签到