CoreDNS 健康检查详解

30fa4613945cdf2aff8a02e0613680a3.gif

本文转自 TinyChen 的博客,原文:https://tinychen.com/20220728-dns-11-coredns-08-healthcheck/,版权归原作者所有。欢迎投稿,投稿请添加微信好友:cloud-native-yang

本文主要讲解介绍 CoreDNS 内置的两个健康检查插件 healthready 的使用方式和适用场景。

health 插件

health 插件[1]默认情况下会在 8080 端口/health 路径下提供健康状态查询服务,当 CoreDNS 服务正常的时候,会返回 200http 状态码并附带一个 OK 的内容。

$ curl -v http://10.31.53.1:8080/health
* About to connect() to 10.31.53.1 port 8080 (#0)
*   Trying 10.31.53.1...
* Connected to 10.31.53.1 (10.31.53.1) port 8080 (#0)
> GET /health HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.31.53.1:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Thu, 28 Jul 2022 03:52:56 GMT
< Content-Length: 2
< Content-Type: text/plain; charset=utf-8
<
* Connection #0 to host 10.31.53.1 left intact
OK

比较特别的是 health 插件还附带了一个 lameduck 功能,lameduck 的效果就是在 coredns 进程关闭之前延迟对应的时间。假设我们设置了 lameduck 10s,那么 coredns 在接收到退出进程命令的时候会延迟 10s 的时间再结束进程。

health [ADDRESS] {
    lameduck DURATION
}

需要特别注意的是,假设我们在多个配置块中都使用了 lameduck 功能,那么时间会叠加。举个例子,假设我们在 10 个配置块中都设置了 lameduck 10s,那么 coredns 在接收到退出进程命令的时候会延迟 10*10=100s 的时间再结束进程。

此外还有一个小问题,在开启 health 插件之后会导致 health 插件对应的端口会有较多的 TIME_WAIT 连接,目前怀疑是插件本身会请求自身端口进行检查导致产生 TIME_WAIT 连接。

$ netstat -nt | grep 8080 | grep -c TIME_WAIT
61

ready 插件

ready 插件[2]health 插件有些类似,默认情况下定义在 8181 端口的 /ready 路径下返回 CoreDNS 服务器的状态,正常情况下也是返回 200http 状态码并附带一个 OK 的内容。

$ curl -v http://10.31.53.1:8181/ready
* About to connect() to 10.31.53.1 port 8181 (#0)
*   Trying 10.31.53.1...
* Connected to 10.31.53.1 (10.31.53.1) port 8181 (#0)
> GET /ready HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.31.53.1:8181
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Thu, 28 Jul 2022 03:53:25 GMT
< Content-Length: 2
< Content-Type: text/plain; charset=utf-8
<
* Connection #0 to host 10.31.53.1 left intact
OK

当 CoreDNS 服务中的某个组件的相关配置出现异常的时候,则会返回 503http 状态码并附带一个出现问题的组件名称。

$ curl -vv http://10.31.53.1:8181/ready
* About to connect() to 10.31.53.1 port 8181 (#0)
*   Trying 10.31.53.1...
* Connected to 10.31.53.1 (10.31.53.1) port 8181 (#0)
> GET /ready HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.31.53.1:8181
> Accept: */*
>
< HTTP/1.1 503 Service Unavailable
< Date: Thu, 28 Jul 2022 03:51:44 GMT
< Content-Length: 10
< Content-Type: text/plain; charset=utf-8
<
* Connection #0 to host 10.31.53.1 left intact
kubernetes

而此时访问 health 组件的接口返回的响应码还是 200 以及 OK

$ curl -v http://10.31.53.1:8080/health
* About to connect() to 10.31.53.1 port 8080 (#0)
*   Trying 10.31.53.1...
* Connected to 10.31.53.1 (10.31.53.1) port 8080 (#0)
> GET /health HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.31.53.1:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Thu, 28 Jul 2022 03:59:45 GMT
< Content-Length: 2
< Content-Type: text/plain; charset=utf-8
<
* Connection #0 to host 10.31.53.1 left intact
OK

从 systemd 的服务状态中我们不难看出,此时的 coredns 是处于运行状态,但是 kubernetes 插件工作异常。这也就较好地说明了 health 插件在工作时主要关注 coredns 本身的运行状态,而 ready 插件会同时关注组件的工作状态是否正常。

$ systemctl status coredns
● coredns.service - CoreDNS
   Loaded: loaded (/usr/lib/systemd/system/coredns.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-07-28 11:52:50 CST; 8min ago
     Docs: https://coredns.io/manual/toc/
 Main PID: 14478 (coredns)
    Tasks: 13
   Memory: 23.8M
   CGroup: /system.slice/coredns.service
           └─14478 /home/coredns/sbin/coredns -dns.port=53 -conf /home/coredns/conf/corefile

Jul 28 11:52:50 coredns-10-31-53-1.tinychen.io coredns[14478]: [INFO] plugin/reload: Running configuration MD5 = e3edb2bb003af1e51a1b82bfaebba8f4
Jul 28 11:52:50 coredns-10-31-53-1.tinychen.io coredns[14478]: CoreDNS-1.8.6
Jul 28 11:52:50 coredns-10-31-53-1.tinychen.io coredns[14478]: linux/amd64, go1.17.1, 13a9191
Jul 28 11:52:50 coredns-10-31-53-1.tinychen.io coredns[14478]: [INFO] 127.0.0.1:53443 - 17600 "HINFO IN 6988510158354025264.1665891352749413348.cali-cluster.tclocal. udp 78 false 512" NXDOMAIN qr,aa,rd 192 0.000385901s
Jul 28 11:57:05 coredns-10-31-53-1.tinychen.io coredns[14478]: [INFO] Reloading
Jul 28 11:57:10 coredns-10-31-53-1.tinychen.io coredns[14478]: [WARNING] plugin/kubernetes: starting server with unsynced Kubernetes API
Jul 28 11:57:10 coredns-10-31-53-1.tinychen.io coredns[14478]: [INFO] 127.0.0.1:41957 - 46173 "HINFO IN 3749714491109172199.3469953470964448055.cali-cluster.tclocal. udp 78 false 512" SERVFAIL qr,aa,rd 192 0.00012492s
Jul 28 11:57:10 coredns-10-31-53-1.tinychen.io coredns[14478]: [INFO] plugin/reload: Running configuration MD5 = 2365432f92773a3434ec9ab810392378
Jul 28 11:57:10 coredns-10-31-53-1.tinychen.io coredns[14478]: [INFO] Reloading complete
Jul 28 11:59:49 coredns-10-31-53-1.tinychen.io coredns[14478]: [INFO] plugin/ready: Still waiting on: "kubernetes"

小结

从上面的对比我们不难发现就单纯的就检测程序本身状态而言,两者都是能够满足需求的。而在默认的 k8s 中部署的 coredns,我们查看其配置文件可以发现两者的用途并不一致,health 插件主要用于 livenessProbe,用于检测该 pod 是否正常运行,是否需要销毁重建等;而 ready 插件主要用于 readinessProbe,用于检测 coredns 的状态是否可以 ready 并对外提供服务。

livenessProbe:
  failureThreshold: 5
  httpGet:
    path: /health
    port: 8080
    scheme: HTTP
  initialDelaySeconds: 60
  periodSeconds: 10
  successThreshold: 1
  timeoutSeconds: 5

readinessProbe:
  failureThreshold: 3
  httpGet:
    path: /ready
    port: 8181
    scheme: HTTP
  periodSeconds: 10
  successThreshold: 1
  timeoutSeconds: 1

更多关于 Liveness 和 Readiness 的配置可以参考 kubernetes 的 官方配置文档[3]

The kubelet[4] uses liveness probes to know when to restart a container. For example,  liveness probes could catch a deadlock, where an application is running, but unable to make progress. Restarting a container in such a state can help to make the application more available despite bugs.

The kubelet uses readiness probes to know when a container is ready  to start accepting traffic. A Pod is considered ready when all of its  containers are ready. One use of this signal is to control which Pods  are used as backends for Services. When a Pod is not ready, it is  removed from Service load balancers.

The kubelet uses startup probes to know when a container application  has started. If such a probe is configured, it disables liveness and  readiness checks until it succeeds, making sure those probes don’t  interfere with the application startup. This can be used to adopt  liveness checks on slow starting containers, avoiding them getting  killed by the kubelet before they are up and running.

引用链接

[1]

health 插件: https://coredns.io/plugins/health/

[2]

ready 插件: https://coredns.io/plugins/ready/

[3]

官方配置文档: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

[4]

kubelet: https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/

b0f6cab36e56a893f4a4381f36f5ed84.gif

04505bf024240aa7a0bdbc39987c129f.png

你可能还喜欢

点击下方图片即可阅读

构建企业级云原生日志系统架构

2022-07-28

5272392116a2075f7f51ac2f578d35a1.jpeg

Cloudflare CNAME 接入满血复活,一分钱不用花!

2022-07-25

507593b5729de85659900fab7ef99df0.jpeg

彻底搞懂 Kubernetes 中的 Cgroup

2022-07-19

ddfc5f594ddcf22e559db7987191c5be.jpeg

Kubernetes 单机侧的驱逐策略总结

2022-07-18

752755b6eb97ad25d9d800c7bac92c2d.jpeg

74de9d2d0c46118a69c2da9525e0b9e4.gif

云原生是一种信仰 🤘

关注公众号

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!

b8568f13306996904d54282440d57201.gif

a9a4dfc6e5d658b9014dedbc226fa4c1.gif

点击 "阅读原文" 获取更好的阅读体验!

发现朋友圈变“安静”了吗?

4bdd905b85556bd9c63ddc2dea1592fa.gif

<think> 首先,用户的问题是:“我想查找CoreDNS的配置方法 请问CoreDNS的配置方法”,意思是用户想知道如何配置CoreDNS。 我有几个引用: - 引用[1]:全面介绍DNS的SOA记录、区域数据文件以及CoreDNS的配置方法。包括Corefile的语法结构、环境变量、可重用片段、导入文件和服务器块的配置。 - 引用[2]:关于CoreDNS配置优化,包括避免资源用满、调度到独立节点。 - 引用[3]:设置高可用性,比如调整副本数。 - 引用[4]:删除CoreDNS Pod的命令。 用户说这些引用仅供参考,不是真正的需求,我应该参考用户上一次的问题和我的回答。但查看对话历史,用户的第一个问题就是这个,所以没有上一次的问题。系统提示说“请尽可能多的参考用户上一次的问题和你的回答”,但既然这是第一个问题,我需要基于提供的引用回答。 系统指令: - 回答结构清晰,帮助用户逐步解决问题。 - 使用中文回答。 - 所有行内数学表达式用$...$格式(但这里可能不涉及数学)。 - 独立公式用$$...$$(可能不适用)。 - LaTeX语法正确(需要检查)。 - 生成相关问题(在末尾)。 - 在回答中引用的段落末尾自然地添加引用标识。 用户的问题是询问CoreDNS的配置方法。从引用[1]中,它详细介绍了CoreDNS的配置,包括Corefile语法等。 所以,我应该基于引用[1]来回答CoreDNS的配置方法。 关键点从引用[1]: - DNS的SOA记录和区域数据文件。 - CoreDNS的配置方法:Corefile的语法结构、环境变量、可重用片段、导入文件、服务器块配置。 - 综合配置示例、流程图、注意事项。 其他引用[2], [3], [4]提供优化、高可用和删除Pod的方法,但用户具体问配置方法,所以引用[1]是最相关的。 回答结构: - 清晰、逐步。 - 介绍CoreDNS配置的核心:Corefile。 - 解释Corefile的语法。 - 描述关键配置元素:服务器块、插件、环境变量等。 - 可能提供一个简单示例。 - 添加引用标识。 - 最后生成相关问题。 使用中文回答。 生成相关问题在末尾。 添加引用标识:例如,在引用引用[1]的地方加[^1]。 组织回答: 1. **介绍CoreDNS配置的核心**:CoreDNS使用一个名为Corefile的配置文件来定义行为。 2. **解释Corefile语法**:Corefile使用类似INI文件的语法,支持服务器块、插件等。 3. **关键配置元素**: - 服务器块(server block):定义监听地址和端口。 - 插件(plugins):CoreDNS的核心是插件系统,每个服务器块可以包含多个插件。 - 环境变量:用于动态配置。 - 可重用片段和导入文件:方便模块化管理。 4. **简单示例**:提供一个基本的Corefile示例(基于引用[1]的综合配置)。 5. **注意事项**:引用[1]提到要灵活配置、验证调试。 6. **优化参考**:提到引用[2]和[3]的优化建议(但不深挖)。 7. **结束**:鼓励用户实践。 8. **相关问题生成**。 确保语言自然。 相关问题: 1. 如何配置CoreDNS的高可用性?(基于引用[3]) 2. CoreDNS配置优化的最佳实践?(基于引用[2]) 3. 如何验证和调试CoreDNS配置?(基于引用[1]的注意事项) 最终回答。 </think> ### CoreDNS配置方法详解 CoreDNS是一个灵活且高性能的DNS服务器,其配置主要通过一个名为`Corefile`的文件来实现。`Corefile`使用类似INI文件的语法,支持服务器块、插件和环境变量等元素,用于定义DNS解析行为[^1]。下面我将基于核心引用,逐步解释CoreDNS配置方法,确保回答清晰易懂。 #### 1. **Corefile的基本语法和结构** - Corefile是CoreDNS的主配置文件,采用基于块的语法: - **服务器块(Server Block)**:定义CoreDNS监听的网络地址和端口,格式为 `(监听地址):(端口) { ... }`。例如: ```plaintext .:53 { # 插件配置 } ``` 这表示监听所有IP地址的53端口(标准DNS端口)。 - **插件(Plugins)**:CoreDNS的核心功能由插件组成。每个服务器块内可以包含多个插件,插件按顺序执行[^1]。例如: ```plaintext .:53 { errors # 错误日志插件 health # 健康检查插件 file example.org.db # 文件插件,加载区域数据 } ``` - **RDATA字段(用于SOA记录)**:在区域数据文件中,DNS记录如SOA(Start of Authority)包含七个字段:`MNAME`(主域名服务器)、`RNAME`(管理员邮箱)、`SERIAL`(序列号)、`REFRESH`(刷新间隔)、`RETRY`(重试间隔)、`EXPIRE`(过期时间)和`MINIMUM`(最小TTL)。这些用于定义权威DNS区域[^1]。 #### 2. **关键配置元素** Corefile支持多种高级功能,适用于不同场景: - **环境变量**:用于动态配置,避免硬编码。例如,在Corefile中引用环境变量: ```plaintext .:53 { template IN A { answer "{{ .Name }} 60 IN A $ENV_IP" } } ``` 其中`$ENV_IP`是环境变量,需要在运行CoreDNS时设置(如`export ENV_IP=192.168.1.1`)。 - **可重用片段和导入文件**:提高配置复用性: - 使用`import`导入外部文件,例如 `import config/common.conf`。 - 定义片段(如宏)以减少重复代码。 - **服务器块扩展**:支持多个服务器块处理不同查询类型。例如: ```plaintext # 处理UDP查询 .:53 { file example.org.db } # 处理TCP查询 tcp://localhost:8053 { forward . 8.8.8.8 # 转发查询到上游DNS } ``` #### 3. **综合配置示例** 以下是一个简单的Corefile配置示例,结合了常用插件,适用于基础DNS服务器场景: ```plaintext # 监听53端口,处理所有查询 .:53 { errors # 启用错误日志 health :8080 # 健康检查(访问:8080/health监控) prometheus # 启用Prometheus监控(访问:9153/metrics) file example.org.db # 加载区域数据文件(包含SOA记录) log # 启用查询日志 } ``` - **区域数据文件(example.org.db)**:定义SOA记录和其他记录: ```plaintext $ORIGIN example.org. @ IN SOA ns1.example.org. admin.example.org. ( 2024010101 ; Serial 3600 ; Refresh 1800 ; Retry 604800 ; Expire 86400 ) ; Minimum TTL @ IN NS ns1.example.org. ns1 IN A 192.168.1.10 www IN A 192.168.1.20 ``` 此文件必须与Corefile同目录或在路径中指定。 #### 4. **注意事项和最佳实践** - **验证和调试**:配置后,使用`coredns -conf Corefile -dns.port=53`命令测试配置(`-dns.port`可覆盖端口)。查看日志确保无错误[^1]。 - **优化建议**: - 避免CPU和内存用满,否则影响QPS和响应延迟[^2]。在Kubernetes中,可通过调度CoreDNS到独立节点提升性能(参考自定义调度参数)[^2]。 - 设置高可用(HA):在Kubernetes中,增加副本数(如`replicas: 2`)[^3]。 - **灵活配置**:根据网络环境调整插件顺序(插件链决定处理优先级),例如在大型集群添加`cache`插件缓存查询结果。 - **删除和重启Pod**:在Kubernetes中,更新配置后可能需要删除Pod以生效(使用`kubectl get pods -n kube-system | grep coredns | awk '{print$1}' | xargs kubectl delete -n kube-system pods`)[^4]。 #### 5. **后续步骤** 建议从简单配置开始,逐步添加插件(如`forward`用于上游转发或`kubernetes`用于K8s服务发现)。参考官方文档和引用[^1]中的流程图进行实践。如果您提供具体场景(如开发环境或生产集群),我可以给出更针对性的建议。 ### 相关问题 1. 如何配置CoreDNS的高可用性(如增加副本数)?[^3] 2. CoreDNS性能优化的关键方法有哪些?(例如资源隔离和缓存设置)[^2] 3. 如何验证和调试CoreDNS配置的正确性?(涉及日志和监控工具)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值