专栏首页IT技术精选文摘Kubernetes应用健康检查

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 条评论
登录 后参与评论

相关文章

  • Kubernetes资源管理

      虛拟化技术是云计算平台的基础,其目标是对计算资源进行整合或划分,这是云计算管理平台中的关键技术。虚拟化技术为云计算管理乎台的资源管理提供了资源调配上的灵活性...

    用户1263954
  • 面试题: Docker的优缺点

    由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环境配置操作。

    用户1263954
  • Kubernetes与容器设计模式

    在程序设计领域,面向对象设计和面向对象语言是大家最为熟悉和强大的工具,而面向对象除了其强大的核心特性之外,还有人们通过实践总结出来的一系列设计模式,可以用来解决...

    用户1263954
  • docker中容器如何实现通信

    默认情况下docker的网络模式为Bridge,当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到...

    IT大咖说
  • Docker in Action:共享内存命名空间

    本文摘自“ Docker in Action ”(Docker实战)一书,将向您展示在容器之间共享内存的方法。

    用户1209583
  • Rocket 希望以硬件隔离引领容器市场,Docker说“NO!”

    下一代CoreOS的容器使用基于Intel的硬件隔离来增加安全性。其他容器系统也会如法炮制吗? 编者注:CoreOS是一个基于Linux 内核的轻量级操作系统,...

    静一
  • 转发就送容器技术实践书籍活动来了

    ? 转发送书活动在文末,心急的小伙伴直接往下拉哦~ 随着云原生技术的成熟和普及,越来越多的企业 IT 架构正在往云原生架构转型。12月20日,北京 Tech...

    腾讯云原生
  • 转载|使用PaddleFluid和TensorFlow训练RNN语言模型

    在图像领域,最流行的 building block 大多以卷积网络为主。上一篇我们介绍了转载|使用PaddleFluid和TensorFlow实现图像分类网络S...

    用户1386409
  • CVPR 2020 论文大盘点-图像分割完整篇

    本文对剩余所有分割论文进行了总结,每个方向论文数量较少,但不少论文都很有意思,非常值得关注。

    CV君
  • Python-EEG工具库MNE中文教程(7)-读取.edf文件

    EDF,全称是 European Data Format,是一种标准文件格式,用于交换和存储医疗时间序列。

    脑机接口社区

扫码关注云+社区

领取腾讯云代金券