CoreDNS篇8-健康检查

2023-10-29

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

1、health插件

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

[root@coredns-10-31-53-1 conf]# 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连接。

[root@coredns-10-31-53-1 conf]# netstat -nt | grep 8080 | grep -c TIME_WAIT
61

2、ready插件

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

[root@coredns-10-31-53-1 conf]# 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状态码并附带一个出现问题的组件名称。

[root@coredns-10-31-53-1 conf]# 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

[root@coredns-10-31-53-1 conf]# 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插件会同时关注组件的工作状态是否正常。

[root@coredns-10-31-53-1 conf]# 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"

3、小结

从上面的对比我们不难发现就单纯的就检测程序本身状态而言,两者都是能够满足需求的。而在默认的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的官方配置文档

The kubelet 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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CoreDNS篇8-健康检查 的相关文章

随机推荐

  • android edittext setonkeylistener,Android EditText 键入事件 —setOnKeyListener

    main xml android orientation vertical android layout width fill parent android layout height fill parent gt android layo
  • Vue简单示例——weex

    weex的生命周期 因为我们的Weex和Vue是绑定在一起的 所以我们讨论关于生命周期时 说的实际上是在Weex中可以使用的Vuex的生命周期 也就是Weex对于Vue生命周期的支持 好消息 Weex支持大部分的Vue中的生命周期钩子函数
  • apple mobile device服务无法启动,错误1053 解决

    本文转载自 https www cnblogs com relax p 3476741 html 作者 relax 转载请注明该声明 我不想安装iTunes 于是下了iTunes64安装包 解压后得到6个文件 安装完 AppleMobile
  • 进程的描述与控制(二)_OS

    目录 1 进程与线程的比较 2 线程的实现方式 内核支持线程 KST 用户级线程 ULT ULT KST 组合方式 3 进程同步的概念 4 两种形式的制约关系 5 临界资源 6 对临界资源访问的过程 7 同步机制应该遵循的规则 8 解决临界
  • 轻松应对IDC机房带宽突然暴涨问题

    轻松应对IDC机房带宽突然暴涨问题 1 提出问题 实际案例一 凌晨3 00点某公司 网站业务 的一个IDC机房带宽流量突然从平时高峰期150M猛增至1000M 如下图 该故障的影响 直接导致数百台服务器无法连接 该机房全部业务中断 实际案例
  • [深度学习实战]基于PyTorch的深度学习实战(下)

    目录 一 前言 二 Mnist手写数字图像识别 2 1 加载数据 2 1 1 下载地址 2 1 2 用 numpy 读取 mnist npz 2 2 定义卷积模型 2 3 开始训练 2 4 完整代码 2 5 验证结果 2 6 修改参数 三
  • vue项目中的路由配置

    公司的项目使用vue脚手架来搭建 是属于后台管理系统 功能页比较多 就使用vue路由来进行跳转 个人比较习惯上面这种方式放置路由文件 并且使用懒加载的模式来配置 如下 import Vue from vue import Router fr
  • qemu 出现Could not access KVM kernel module: No such file or directory failed to initialize KVM: No su...

    使用qemu命令 qemu system x86 64 hda image ubuntu test img cdrom ubuntu 16 04 2 server amd64 iso m 1024 enable kvm boot d 安装u
  • Android终端Termux安装MariaDB/MySQL数据库

    前言 Android移动设备并非设计为服务器 尽管其中一些功能强大 但是 随着技术的进步以及我们可以用手机做更多的事情 总是很有趣的 今天 借助Termux应用程序 我们将了解如何在Android上安装MySQL或MariaDB数据库 为此
  • Linux常用命令学习

    原文转自https www cnblogs com gaojun p 3359355 html 1 ls命令 就是list的缩写 通过ls 命令不仅可以查看linux文件夹包含的文件 而且可以查看文件权限 包括目录 文件夹 文件权限 查看目
  • unity学习-委托(delegate),事件(event),Action,Func

    unity学习 委托 含义 定义 使用 事件 含义 使用 在进行项目的过程中 一直存在着对代码管理不当的问题 所以需要学习一些科学的代码思维 减少后期功能的修改与迭代引发的代码冗杂和内存爆炸 可以看b站这个大神的视频 讲的可以说无敌详细了
  • echarts问题记录

    X轴最后一个刻度标签加粗 问题描述 如图最后一个刻度标签加粗 解决 是因为加了interval 0导致 这个属性又不能去掉 查看文档发现可以使用function 改为interval gt true axisLabel interval g
  • ros下src中的CMakeLists.txt解析

    toplevel CMakeLists txt for a catkin workspace catkin cmake toplevel cmake src下的CMakeLists txt是由toplevel生成的 cmake minimu
  • makefile报错makefile:7: *** missing separator. Stop.

    解决方案 打开vim vimrc 添加 autocmd FileType make set noexpandtab
  • RabbitMQ启动后无法访问http://localhost:15672等问题

    今天重启电脑后遇到了这个问题 rabbitmq服务启动后无法访问localhost 15672 同时项目也无法连接rabbitmq服务 研究了半天终于解决了 下面整理一下解决过程留作备份以及给同样遇到这个问题的人做一个参考 1 找到rabb
  • 代码例子区全区搜索索引(27th Feb 2011 Updated)

    如果以下的链接有错误 或者存在其他问题 请给我发站内短信 或者发送邮件至nono cocoa gmail com希望该帖对大家有帮助 IOS 类代码 我自己做的翻书效果 小猫咪再次登场 2011 03 02 如何实现QQLive HD界面
  • IDEA快速提取maven项目依赖版本号

    操作步骤 提取版本号 1 在pom xml文件中选中需要提取的版本号 2 键入快捷键 ctrl alt v 3 在弹出窗口中设定Name和Project Name为版本号的变量名 Project表示变量提取后存放位置 即放到哪个项目的pom
  • php mysql ajax搜索提示键盘_php+ajax做仿百度搜索下拉自动提示框(有实例)

    php mysql ajax实现百度搜索下拉提示框 主要有3个文件三个文件在同一个目录里 如下图 下面是三个文件的代码 把sql文件导入到mysql数据库里 修改下数据库密码为自己的 记得哦是UTF 8编码 php mysql ajax实现
  • 使用tailwind+next.js写一个github页面进行学习

    目的是学习tailwind语法 如果你也想照着敲可以参考这个视频 点击即刻跳转 仓库地址 点击即刻跳转 不想重复的创建仓库 我的所有内容都在该仓库 只是会通过创建分支来写项目 写的过程发现之前的一些疏忽吧 jsx后缀的尽量就不要写成js后缀
  • CoreDNS篇8-健康检查

    本文主要讲解介绍CoreDNS内置的两个健康检查插件health和ready的使用方式和适用场景 1 health插件 health插件默认情况下会在8080端口的 health路径下提供健康状态查询服务 当CoreDNS服务正常的时候 会