【K8s】Kubernetes 网络之 CoreDNS

文摘   科技   2024-12-10 16:32   北京  

下内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~





基本介绍

CoreDNS 是一种使用 Golang 编写、由配置文件控制的插件式 DNS 服务器,自 Kubernetes 1.13 版本起,成为 Kubernetes 的默认 DNS 服务器,通常用于 Kubernetes 集群内部服务发现,允许应用程序之间直接、或通过 Service 对象名称互相访问。

CoreDNS 采用 Apache License Version 2 开源协议,是 CNCF 孵化的开源项目,并已正式毕业,成为云原生环境下 DNS 服务器和服务发现的一种成熟解决方案。

CoreDNS 采用插件式架构,可以轻松实现功能扩展。各类插件用于处理 DNS 请求、转发请求、缓存结果、记录日志等。CoreDNS 具有高性能、自动重试、健康检查和负载均衡等功能,确保了 DNS 服务的可靠性。




功能特性

  • 插件化(Plugins):CoreDNS 的核心理念是插件化,每个插件执行 DNS 功能,如 Kubernetes 服务发现、Prometheus 指标或重写查询
  • 简单(Simplicity):CoreDNS 使配置文件变得简单,采用 Caddy 中的 DSL 配置方案,即 Corefile 形式的配置文件
  • 服务发现 (Service Discovery):CoreDNS 通过 Kubernetes 插件与 Kubernetes 集成,或通过 ETCD 插件直接与 ETCD 集成
  • 快速和弹性(Fast and Flexible):CoreDNS 的目标是快速高效,因此插件也很灵活,可以根据需要编译 CoreDNS




Corefile 配置示例

# kubectl get cm coredns -oyaml -n kube-system ...data:  Corefile: |    .:53 {        errors        health {           lameduck 5s        }        ready        kubernetes cluster.local in-addr.arpa ip6.arpa {           pods insecure           fallthrough in-addr.arpa ip6.arpa           ttl 30        }        prometheus :9153        forward . /etc/resolv.conf {           max_concurrent 10000        }        cache 30        loop        reload        loadbalance    }...
每部分配置语句的解释如下:
  • .:53:表示 CoreDNS 监听在 53 端口上,处理所有到达该端口的 DNS 请求

  • errors:该插件用于将错误记录到标准输出,以便在 CoreDNS 遇到问题时进行调试

  • health:该插件用于提供 CoreDNS 的健康报告,会在 http://localhost:8080/health 处提供健康检查端点

  • lameduck 5s:health 插件的一个选项,表示当 CoreDNS 进程被标记为不健康时等待 5 秒钟才关闭,这段时间允许继续处理未完成请求

  • ready:该插件用于在端口 8181 上提供一个 HTTP 端点,以指示 CoreDNS 是否准备好处理请求。当所有能够表达自身就绪的插件都已就绪时,在此端点返回 200 状态码

  • kubernetes:该插件用于处理 Kubernetes 内部 DNS 解析,将请求解析为集群内部的 Pod 和服务地址

  • cluster.local in-addr.arpa ip6.arpa:指定 Kubernetes 集群的域和反向 DNS 查找域

  • pods insecure:允许 CoreDNS 返回 Pod 的 IP 地址,即使这些 Pod 的 IP 地址没有在 DNS 中注册

  • fallthrough in-addr.arpa ip6.arpa:如果请求无法在 Kubernetes 集群内解析,CoreDNS 会将请求转发到外部 DNS 服务器

  • ttl 30:设置 DNS 记录的生存时间为 30 秒

  • prometheus:该插件用于以 Prometheus 格式在 http://localhost:9153/metrics 上提供 CoreDNS 的度量指标值

  • forward:该插件用于将不在 Kubernetes 集群域内的任何查询转发到预定义的解析器(通常是 /etc/resolv.conf 中指定的 DNS 服务器)

  • max_concurrent 10000:设置最大并发请求的数量为 10000

  • cache:该插件用于启用前端缓存,缓存查询结果 30 秒,以减少对外部 DNS 服务器的请求负载

  • loop:该插件用于检测简单的转发环,如果发现死循环,则中止 CoreDNS 进程

  • reload:该插件用于在 Corefile 内容发生变更后,等待一段时间后自动重新加载使更改生效

  • loadbalance:该插件用于声明一个轮转式 DNS 负载均衡器,它在应答中随机分配 A、AAAA 和 MX 记录的顺序




DNS 策略

在 Deployment、StatefulSet 等资源对象中,可以通过 spec.template.spec.dnsPolicy 声明以下几种类型 DNS 策略:

  • Default: Pod 从所在节点继承 DNS 配置,即使用所在节点的 /etc/resolv.conf 来进行解析

  • ClusterFirst:默认策略,Pod 使用 CoreDNS 进行 DNS 解析,若解析不成功,才会从所在节点继承 DNS 配置进行解析

  • ClusterFirstWithHostNet:针对以 HOST 模式(hostNetwork)启动的 Pod,若还需要使用 CoreDNS 进行 DNS 解析,则设置为 ClusterFirstWithHostNet

  • None:不会使用 CoreDNS 或从所在节点继承 DNS 配置进行解析,而是使用自定义的 dnsConfig 配置,示例如下:

...spec:  ...  template:    spec:      containers:      ...      dnsPolicy: "None"      dnsConfig:        nameservers:        - 10.96.0.10        searches:        - suffix1.povilasv.me        - suffix2.povilasv.me        - suffix3.povilasv.me        - kube-system.svc.cluster.local        - svc.cluster.local        - cluster.local        options:        - name: ndots          value: "5"...



书籍推荐

最后推荐一本笔者从 Docker 进阶到 Kubernetes 自学过程中,受益较深的书籍。笔者经常复读,并结合工作实践不断加深理解和体会,可谓常读常新。希望这本书可以帮助到更多对 Kubernetes 感兴趣或刚开始学习的读者。


实施运维知识交流
专注于运维、实施交付领域,持续分享个人笔记、学习心得,欢迎关注,共同交流、成长!
 最新文章