Kubernetes应用健康检查

在实际生产环境中,想要使得开发的应用程序完全没有bug,在任何时候都运行正常,几乎 是不可能的任务。因此,我们需要一套管理系统,来对用户的应用程序执行周期性的健康检查和修复操作。这套管理系统必须运行在应用程序之外,这一点非常重要一一如果它是应用程序的一部分,极有可能会和应用程序一起崩溃。因此,在Kubernetes中,系统和应用程序的健康检查是由Kubelet来完成的。

1、进程级健康检查

  最简单的健康检查是进程级的健康检查,即检验容器进程是否存活。这类健康检查的监控粒 度是在Kubernetes集群中运行的单一容器。Kubelet会定期通过Docker Daemon获取所有Docker进程的运行情况,如果发现某个Docker容器未正常运行,则重新启动该容器进程。目前,进程级的健康检查都是默认启用的。

2.业务级健康检查

  在很多实际场景下,仅仅使用进程级健康检查还远远不够。有时,从Docker的角度来看,容器进程依旧在运行;但是如果从应用程序的角度来看,代码处于死锁状态,即容器永远都无法正常响应用户的业务

  为了解决以上问题,Kubernetes引人了一个在容器内执行的活性探针(liveness probe)的概念,以支持用户自己实现应用业务级的健康检查。这些检查项由Kubelet代为执行,以确保用户的应用程序正确运转,至于什么样的状态才算“正确”,则由用户自己定义。Kubernetes支持3种类型的应用健康检查动作,分别为HTTP Get、Container Exec和TCP Socket。个人感觉exec的方式还是最通用的,因为不是每个服务都有http服务,但每个服务都可以在自己内部定义健康检查的job,定期执行,然后将检查结果保存到一个特定的文件中,外部探针就不断的查看这个健康文件就OK了。

2.1 Container Exec

  Kubelet将在用户容器内执行一次命令,如果命令执行的退出码为0,则认为容器运转正常,否则认为容器运转不正常。其中执行命令的默认目录是容器文件系统的根目录/,要执行的命令在Pod配置文件中定义。每进行一次Container Exec健康检查,都会执行一次livenessprobe:exec:command段下的Shell命令。以下给出exec探针的示例:

由yaml的配置可以看出,健康探针主要探测的是/home/laizy/test/hostpath/下是否存在healthy文件,对应的是宿主机上/home/testhost这个文件夹。若不存在则判定不健康,若存在则健康。笔者在实验的过程中发现,当在宿主机上删除这个文件的时候,大概需要40S的时间,系统才会判定pod失败,并将其删除;之后一直不断重启,且不会将pod调度到别的node上;当在宿主机上重新生成这个文件之后,大概需要四五分钟的时间,pod一直处于CrashLoopBackOff的状态,之后才正常提供服务。对于这两个时间的产生,还需要进一步的探究其原理。

2.1 HTTP Get

  Kubelet将调用容器内Web应用的web hook,如果返回的HTTP状态码在200和399之间,则认为容器运转正常,否则认为容器运转不正常。每进行一次HTTP健康检查都会访问一次指定的URL。给出httpGet的简单示例如下:

在容器内部kill掉jboss进程之后(我的镜像用脚本run.sh启动,kill掉业务主进程之后,还可以通过其他的程序将容器“卡住”),模拟出调用http接口返回不在200~399之间,在node的/var/log/messages下会出现如下日志,并随后将pod创建。

2.3 TCP Socket

  理论上Kubelet将会尝试打开一个到用户容器的Socket连接。如果能够建立这条连接,则可以认为容器运转正常,否则认为容器运转不正常。

  不论哪种检查类型,一旦Kubelet发现容器运转不正常,就会重新启动该容器。容器的健康检查行为在容器配置文件的livenessprobe字段下配置。需要注意的是,livenessprobe:initialDelaySecods字段代表了一个从容器启动到执行健康检查的延迟时间,设计这个延迟时间的目的是让容器进程有时间完成必要的初始化工作。

本文分享自微信公众号 - IT技术精选文摘(ITHK01)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏热爱IT

Centos7上安装docker 转

Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。

11010
来自专栏Y大宽

linux全套教程【黑马】:4 用户管理

15420
来自专栏热爱IT

为centos添加第三方源[未试验] 转

默认centos自带的源少了很多好软件,所以需要添加第三方源 一、安装CentOS yum源优先级插件yum-priorities yum install ...

16310
来自专栏java思维导图

常用Maven插件介绍(收藏大全)

我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-p...

18110
来自专栏热爱IT

Centos中如何解决apache目录浏览文件名乱码? 转

在Centos中apache服务器的目录浏览功能非常有用,特别是在共享文件的时候,如果不希望使用FTP,而直接使用目录浏览功能会非常方便,但是如果是中文目录或者...

15620
来自专栏运维笔记

supervisor 管理进程

Supervisor是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程.

12110
来自专栏Java技术栈

为什么 Redis 单线程能支撑高并发?

最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分...

10140
来自专栏Java识堂

Linux文本分析命令awk的妙用

awk是一个强大的文本分析工具,简单来说awk就是把文件逐行读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理

9910
来自专栏新智元

开源也要有备胎!安卓遭禁GitHub会闭源?专家:无需恐慌但要警醒

昨日,安卓遭禁的新闻引发轩然大波。随后,开源中国在其博客中指出:Apache 许可证分发的软件也受美国出口管制。

29260
来自专栏数据分析1480

再见虚拟机!在Win10中使用Linux版本的R和Python

想象一下,你用 Linux 版本的 Tensorflow 建立了一个美妙的 RNN 模型,然后无缝切换到 Windows 用 Excel 直接编辑结果,画了一幅...

42030

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励