17、Health Check 健康检查

强大的自愈能力是kubernetes容器编排引擎的重要特性。 自愈的默认实现方式是自动重启发生故障的容器。除此之外,还可通过 Liveness和Readiness探测机制设置更精细的健康检查,进而实现如下要求:
  1. 零停机部署
  2. 避免部署无效的镜像
  3. 更加安全的滚动升级

一、Liveness探测 VS Readiness探测

  1. Liveness探测和Readiness探测是两种healthy check机制,若不特意配置,kubernetes将对两种探测采取相同的默认行为,即通过判断容器启动进程的返回值( echo $?)是否为零来判断探测是否成功。
  2. 两种探测的配置方法完全一样,支持的配置参数也一样。 不同之处在于探测失败后的行为:Liveness 探测是重启容器;Readiness 探测则是将容器设置为不可用,不接收 Service 转发的请求
  3. Liveness 探测和 Readiness 探测是独立执行的,二者之间没有依赖,所以 可以单独使用,也可以同时使用用 Liveness 探测判断容器是否需要重启以实现自愈;用 Readiness 探测判断容器是否已经准备好对外提供服务

1.1、每类探针都支持三种探测方法

  • exec: 通过执行命令来检查服务是否正常, 针对复杂检测或无 HTTP 接口的服务, 命 令返回值为 0 则表示容器健康。
  • httpGet : 通过发送 http 请求检查服务是否正常, 返回 200-400 状态码则表明容器健 康。
  • tcpSocket : 通过容器的 IP 和 Port 执行 TCP 检查, 如果能够建立 TCP 连接, 则表明 容器健康。

1.2、探针探测的结果

  • Success: Container 通过了检查。
  • Failure: Container 未通过检查。
  • Unknown: 未能执行检查, 因此不采取任何措施。

1.3、Pod 重启策略 restartpolicy

  • Always: 总是重启
  • OnFailure: 如果失败就重启
  • Never: 永远不重启

二、默认的健康检查

每个容器启动时都会执行一个进程,此进程由Dockerfile的CMD或ENTRYPOINT指定。如果 进程退出时返回码非零,则认为容器发生故障,kubernetes会根据restartPolicy重启容器。
模拟容器发生故障的场景,Pod配置文件如下:
apiVersion: v1
kind: Pod
metadata:name: healthchecklabels:test: healthcheck
spec:restartPolicy: OnFailure # 默认为Alwayscontainers:- name: healthcheckimage: busyboxargs:- /bin/sh- -c- sleep 10; exit 1   # 模拟容器启动 10 秒后发生故障
可见容器当前已经重启了3次。
上述例子是容器进程返回值非0,kubernetes认为容器发生故障,重启。但在某些时候进程并不会退出,比如访问 Web 服务器时显示 500 内部错误,可能是系统超载,也可能是资源死锁,此时进程并没有异常退出,在这种情况下重启容器可能是最直接最有效的解决方案,那我们如何利用 Health Check 机制来处理这类场景呢?-----答案就是 Liveness 探测

 2.1、Liveness探测

Liveness探测让用户自定义判断容器是否健康的条件,若探测失败,kubernetes就会重启容器。
Pod配置文件如下:
apiVersion: v1
kind: Pod
metadata:name: livenesslabels:test: liveness
spec:restartPolicy: OnFailure # 默认为Alwayscontainers:- name: livenessimage: busyboxargs:- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600livenessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 10 # 指定容器启动10s后开始执行Liveness探测periodSeconds: 5 # 指定每5s执行一次Liveness探测,默认是10s,最小是1stimeoutSeconds: 1 # 探测超时时间,默认是1s,最小是1s

启动进程首先创建文件/tmp/healthy,30s后删除,如果/tmp/healthy文件存在,则认为容器处于正常状态,反之则发生故障。

livenessProbe部分定义如何执行Liveness探测:
  1. 探测的方法:通过cat检查/tmp/healthy文件是否存在。若命令执行成功,返回值为0,kubernetes则认为本次Liveness探测成功;若命令返回值非0,本次Liveness探测失败;
  2. initialDelaySeconds:10,指定容器启动10s后开始执行Liveness探测,一般会根据应用启动的准备时间来设置。比如某个应用正常启动要花 30 秒,那么 initialDelaySeconds 的值就应该大于 30;
  3. periodSeconds:5,指定每5s执行一次Liveness探测。 Kubernetes 如果连续执行 3 次 Liveness 探测均失败,则会杀掉并重启容器
下面创建 Pod liveness:
从配置文件可知,最开始的 30 秒,/tmp/healthy 存在,cat 命令返回 0,Liveness 探测成功,这段时间 kubectl describe pod liveness 的 Events部分会显示正常的日志:
35 秒之后,日志会显示 /tmp/healthy 已经不存在,Liveness 探测失败。再过几十秒,几次探测都失败后,容器会被重启。

2.2、Readiness探测

用户通过Liveness探测可以告诉kubernetes什么时候通过重启容器实现自愈;
Readiness探测则是告诉kubernetes什么时候可以将容器加入到Service负载均衡池中,对外提供服务
readinessProbe探测方法:
  1. exec,通过命令的方式
  2. httpGet,判断成功的方法是http请求返回的代码在200-400之间,若不在此范围,则不接收service请求;每隔 periodSeconds时间探测一次,连续 3次探测失败,容器会从负载均衡中移除,直到下次探测成功加入。探测方式http://[container_ip]:8080/path返回值
Readiness 探测的 Pod配置文件如下:
apiVersion: v1
kind: Pod
metadata:name: readinesslabels:test: readiness
spec:restartPolicy: OnFailure # 默认为Alwayscontainers:- name: readinessimage: busyboxargs:- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600readinessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 10 # 指定容器启动10s后开始执行Readiness探测periodSeconds: 5 # 指定每5s执行一次Liveness探测
Pod readiness 的 READY 状态经历了如下变化:
  1. 刚被创建时,READY状态为不可用;
  2. 15s后( initialDelaySeconds+ periodSeconds),第一次进行Readiness探测并成功返回,设置READY为可用;
  3. 30s后,/tmp/healthy被删除,连续3次 Readiness探测均失败后,READY被设置为不可用。
通过 kubectl describe pod readiness 也可以看到 Readiness 探测失败的日志:

三、在scale up中使用Healthy Check

针对多副本应用,当执行Scale Up操作时,新副本会作为backend被添加到Service的负载均衡中,与已有副本一起处理客户请求。考虑到应用程序启动需要准备阶段(加载缓存数据、连接db),从容器启动到真正提供服务需要一段时间, 可以通过Readiness探测判断容器是否就绪,避免将请求发送到还没有ready的backend
示例应用的配置文件
apiVersion: apps/v1
kind: Deployment
metadata:name: web-deployment
spec:selector: # 通过标签选择被控制的podmatchLabels:app: webreplicas: 2template:metadata:labels:app: webspec:containers:- name: webimage: web:1.0ports:- containerPort: 8080 # 转发到后端pod的端口号readinessProbe:httpGet:scheme: HTTPpath: /pythonport: 8080initialDelaySeconds: 10periodSeconds: 5---
apiVersion: v1
kind: Service
metadata:name: web-svc
spec:type: NodePort # 添加NodePort类型的Serviceselector:app: webports:   # 将 Service 的 8080 端口映射到 Pod 的 8080 端口,使用 TCP 协议- protocol: TCPport: 8080   # service监听端口targetPort: 8080 # 转发到后端pod的端口号
readinessProbe使用了不同于exec的另一种探测方法: httpGet
kubernetes对于httpGet方法探测成功的判断条件是http请求的返回代码在200-400之间。
  • schema 指定协议,支持 HTTP(默认值)和 HTTPS。
  • path 指定访问路径。
  • port 指定端口。
上面配置的作用是:
  1. 容器启动10s后开始探测;
  2. 如果http://container_ip:8080/python返回代码不是200-400,表示容器没有就绪,不接收Service web-svc的请求;
  3. 每隔5s再探测一次;
  4. 直至代码返回200-400,表明容器已经就绪,然后将其加入到web-svc的负载均衡中,开始处理客户请求;
  5. 探测会继续以5s的间隔请求,若连续3次失败,容器又会从负载均衡中移除。直到下次探测成功重新加入。

四、在Rolling Update中使用Healthy Check

现有一个正常运行的多副本应用,接下来对应用进行更新(比如使用更高版本的 image),Kubernetes 会启动新副本,然后发生了如下事件:
  1. 正常情况下新副本需要 10 秒钟完成准备工作,在此之前无法响应业务请求。
  2. 但由于人为配置错误,副本始终无法完成准备工作(比如无法连接后端数据库)。
先别继续往下看,现在请花一分钟思考这个问题:如果没有配置 Health Check,会出现怎样的情况?-------- 因为新副本本身没有异常退出,默认的 Health Check 机制会认为容器已经就绪,进而会逐步用新副本替换现有副本,其结果就是:当所有旧副本都被替换后,整个应用将无法处理请求,无法对外提供服务。如果这是发生在重要的生产系统上,后果会非常严重。
如果正确配置了 Health Check,新副本只有通过了 Readiness 探测,才会被添加到 Service;如果没有通过探测,现有副本不会被全部替换,业务仍然正常进行。
示例应用的配置文件
apiVersion: apps/v1
kind: Deployment
metadata:name: app
spec:selector: # 通过标签选择被控制的podmatchLabels:app: appreplicas: 10template:metadata:labels:app: appspec:containers:- name: appimage: busyboxargs:- /bin/sh- -c- sleep 10; touch /tmp/healthy; sleep 30000readinessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 10periodSeconds: 5
10 秒后副本能够通过 Readiness 探测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24265.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩与学 | 《乐高EV3机器人搭建与编程》

如果你正在寻找不需要焊接电线或学习高深的编程语言就能够一窥机器人奥妙的方法,那么LEGO MINDSTORMS EV3正是你要找的。你可以通过LEGO连接部件和图形界面来搭建机器人并为其编程。当你准备好接受新挑战的时候,你还可以破解操作系统并使用更高级的编程语…

像玩乐高一样玩simpletun

netcat小巧而灵活,能应付各种你需要的网络测试。 但要明白netcat所能应对的网络场景基本都和端到端有关,比如和TCP,UDP有关。 网络还有另一面,即链路本身。如果你想模拟一个防火墙,模拟一个NAT怎么办?用n…

LeGO-LOAM学习

前言 在学习了LOAM之后,了解到LeGO-LOAM(面向复杂情况的轻量级优化地面的雷达里程计),进行了一个学习整理。 Github:https://github.com/RobustFieldAutonomyLab/LeGO-LOAM 论文:https://github.com/Robu…

乐高大颗粒作品10:滑板车的搭建

温馨提示 如果你喜欢本文,请点击收藏、在看并分享到朋友圈,想要获得更多乐高大颗粒图纸,请点击蓝字关注“Scratch青少儿编程课堂”,不定期更新更多优质作品。 ⭐ 详细步骤图 -end- 乐高大颗粒作品9:水井的搭建 2021-01…

乐高打印机robotc

目录 一、实验原理 二、实验目的 三、实验内容 四、实验器材(设备、元器件) 五、实验步骤 六、实验数据及结果分析 七、实验结论 八、总结及心得体会 九、对本实验过程及方法、手段的改进建议 代码附录 温馨提示 一、实验原理 1.取模&#x…

乐高大颗粒作品6:打地鼠的搭建

温馨提示 如果你喜欢本文,请点击收藏、在看并分享到朋友圈,想要获得更多乐高大颗粒图纸,请点击蓝字关注“Scratch青少儿编程课堂”,不定期更新更多优质作品。 ⭐ 打地鼠第一种搭建方法(曲柄) 打地鼠第二种搭…

LEGO® Education BricQ 乐高教育发布BricQ趣动系列套装

乐高教育今日宣布其发布两款无需额外技术辅助,寓学于乐的动手实践式STEAM学习解决方案,LEGO Education BricQ趣动系列套装。此次发布的两款解决方案均以体育运动为主题,在物理科学学科教学中通过实际场景应用,帮助学生们以有趣且独…

如何搜索相似的图片,如何通过识别图像搜索图片

最近有一张图片,想搜索这张图片的来源,搜索图片里的内容也没有搜索出来。比如搜索一个明星的照片,输入名字可以出来很多,但是有了图片想知道这个图片更多的信息,或者类似的图片,怎么搜索呢。 百度提供了一个…

搜索引擎(包括图片搜索)

转自:http://blog.csdn.net/v_july_v/article/details/6827391 1、什么是搜索引擎 搜索引擎指自动从因特网搜集信息,经过一定整理以后,提供给用户进行查询的系统。因特网上的信息浩瀚万千,而且毫无秩序,所有的信息像汪…

安卓性能测试(三):耗电量 (batterystats)

使用条件: android 5.0及以上系统 (在6.0及以上系统的数据更详细) 使用方法: 1、打开电池数据获取 adb shell dumpsys batterystats --enable full-wake-history 2、数据重置 adb shell dumpsys batterystats --reset 3、拔掉…

BatteryStatsService电池电量统计服务源码分析

BatteryStatsService主要负责电池电量的统计信息,首先我们简单的看下电量统计服务的启动过程。 BatteryStatsService启动过程 从BatteryStatsService的启动时序图可以看出,BatteryStatsService服务是在ActivityManagerService服务中启动的 1. 在SystemSe…

android 4.4 batteryservice 电池电量显示分析

转载地址:http://blog.csdn.net/daweibalang717/article/details/40615453 最近工作接触到这么的东西,这是我对整个电池管理方面Java 层的分析。如果想了解底层的话,请看我的博客: android 4.4 电池电量管理底层分析(C\C层) &a…

Battery Historian分析手机耗电神器

极力推荐Android 开发大总结文章:欢迎收藏程序员Android 力荐 ,Android 开发者需要的必备技能 本篇文章主要介绍 Android 开发中 电量 的部分知识点,通过阅读本篇文章,您将收获以下内容: 1.安装Battery Historian 2.收集Batteryst…

卡尔曼滤波预测应用python实践

1. 什么是卡尔曼滤波 最佳线性滤波理论起源于二十世纪40年代美国科学家Wiener和前苏联科学家KOnMoropOB等人的研究工作,后人统称为维纳滤波理论。60年代Kalman把状态空间模型引入滤波理论,并导出了一套递推估计算法,后人称之为卡尔曼滤波理论…

BatteryStatsService电池电量统计服务分析

BatteryStatsService主要负责电池电量的统计信息,首先我们简单的看下电量统计服务的启动过程。 BatteryStatsService启动过程 从BatteryStatsService的启动时序图可以看出,BatteryStatsService服务是在ActivityManagerService服务中启动的 1. 在SystemServer中startBootstra…

使用Battery Historian采集android耗电数据

一、简介 Battery Historian是由Google提供的查看电量相关信息及事件的工具,Battery historian还可以上传bugreport文件,分析用户手机中App的电池耗电情况。详见:GitHub - google/battery-historian: Battery Historian is a tool to analyz…

利用XGBoost实现短期电力负荷预测

💥 项目专栏:【机器学习项目实战案例目录】项目详解 + 完整源码 文章目录 一、利用XGBoost实现短期电力负荷预测二、数据集介绍三、将数据进行标准化四、形成训练数据五、划分训练集、测试集六、定义模型七、模型训练八、训练集、测试集验证九、网络搜索十、绘制结果🌠 『…

性能优化十四之电量分析工具Battery Historian使用

上篇博客中并没有讲解BatterHistory该如何使用,这篇博客就开始给大家进行介绍。 数据准备 battery-historian工具需要使用bugreport中的BatteryHistory 1. 先断开adb服务,然后开启adb服务 adb kill-server 这一步很重要,因为当我们开…

使用BatteryHistorian分析和优化应用电量

欢迎Follow我的GitHub, 关注我的CSDN. 本文的合集已经编著成书,高级Android开发强化实战,欢迎各位读友的建议和指导。在京东即可购买:https://item.jd.com/12385680.html 在Android项目中, 较难监控应用的电量消耗, 但是用户却非常关心手机的…

Android 使用 Batterystats 和 Battery Historian 分析电池用量

Android 使用 Batterystats 和 Battery Historian 分析电池用量 专注于Android开发,分享经验总结,欢迎加入 Android开发中涉及到耗电量怎么分析呢 google官方提供了文档,链接:https://developer.android.com/studio/profile/batt…