本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发、订阅专栏!
专栏订阅入口
| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |
往期精彩文章
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法
目录
一、基本介绍
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"
...
标签:插件,解析,Kubernetes,arpa,DNS,CoreDNS,K8s
From: https://blog.csdn.net/2401_82795112/article/details/144374432