第八章 Health Check
8.1 默认的健康检查
每个容器启动时会执行一个进程,此进程由Dockerfile的CMD或ENTRYPOINT指定。如果进程退出时返回码非零,则认为容器发生故障,K8s就会根据restartPolicy.
如果容器进程返回非零,K8s就认为容器发生故障,需要重启。
可是有时候,容器发生了故障,但是容器并不退出。
apiVersion: v1
kind: Pod
metadata:
labels:
test: healthcheck
name: healthcheck
spec:
restartPolicy: OnFailure
containers:
- name: healthcheck
image: busybox
args:
- /bin/sh
- -c
- sleep ; exit
8.2 Liveness探测
Liveness探测让用户可以自定义判断容器是否健康的条件。如果探测失败,K8是就会重启容器。
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness
spec:
restartPolicy: OnFailure
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep ; rm -rf /tmp/healthy; sleep 600 # 创建文件,30秒后删除
livenessProbe:
exec:
command:
- cat
- /tmp/healthy # 如果文件存在,则认为容器处于正常状态,反之则发生故障;
initialDelaySeconds: 10 # 容器启动10秒后开始探测
periodSeconds: 5 # 每5秒执行一次探测
开始30秒,/tmp/healthy文件存在,cat 命令返回0,liveness探测成功,
kubectl describe pod liveness:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 32s default-scheduler Successfully assigned liveness to galaxykubernetes03
Normal SuccessfulMountVolume 32s kubelet, galaxykubernetes03 MountVolume.SetUp succeeded for volume "default-token-qjj5t"
Normal Pulling 22s kubelet, galaxykubernetes03 pulling image "busybox"
Normal Pulled 21s kubelet, galaxykubernetes03 Successfully pulled image "busybox"
Normal Created 21s kubelet, galaxykubernetes03 Created container
Normal Started 21s kubelet, galaxykubernetes03 Started container
35秒之后,文件本删除,cat返回非零,Liveness 探测失败;
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 1m default-scheduler Successfully assigned liveness to galaxykubernetes03
Normal SuccessfulMountVolume 1m kubelet, galaxykubernetes03 MountVolume.SetUp succeeded for volume "default-token-qjj5t"
Warning Unhealthy 34s (x3 over 44s) kubelet, galaxykubernetes03 Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
Normal Pulling 4s (x2 over 1m) kubelet, galaxykubernetes03 pulling image "busybox"
Normal Killing 4s kubelet, galaxykubernetes03 Killing container with id docker://liveness:Container failed liveness probe.. Container will be killed and recreated.
Normal Pulled 3s (x2 over 1m) kubelet, galaxykubernetes03 Successfully pulled image "busybox"
Normal Created 3s (x2 over 1m) kubelet, galaxykubernetes03 Created container
Normal Started 3s (x2 over 1m) kubelet, galaxykubernetes03 Started container
kubeusr@GalaxyKubernetesMaster:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE # 反复重启
liveness / Running 6m
8.3 Readiness探测
Readiness探测:告诉k8s什么时候可以将容器加入到Service负载均衡池中,对外提供服务。
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness
spec:
restartPolicy: OnFailure
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep ; rm -rf /tmp/healthy; sleep
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds:
periodSeconds:
kubectl describe pod liveness Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 51s default-scheduler Successfully assigned liveness to galaxykubernetes03
Normal SuccessfulMountVolume 51s kubelet, galaxykubernetes03 MountVolume.SetUp succeeded for volume "default-token-qjj5t"
Normal Pulling 41s kubelet, galaxykubernetes03 pulling image "busybox"
Normal Pulled 40s kubelet, galaxykubernetes03 Successfully pulled image "busybox"
Normal Created 40s kubelet, galaxykubernetes03 Created container
Normal Started 40s kubelet, galaxykubernetes03 Started container
Warning Unhealthy 1s (x2 over 6s) kubelet, galaxykubernetes03 Readiness probe failed: cat: can't open '/tmp/healthy': No such file or directory
liveness 和 Readiness 比较:
(1)默认情况二者都是看容器退出时返回值是否为0,来判断是否失败。
(2)二者的配置方法完全相同,不同的是探测失败后的处理:Liveness重启容器;Readiness将容器设置为不可用。
(3) 二者独立执行,没有依赖。Liveness探测判断容器是否需要重启来自愈; Readiness探测容器是否已经准备好对外提供服务。
8.4 Health Check 在 Scale Up中的应用
当执行scale up(扩容)的时候,新的副本添加到service的负载均衡中,与已有副本一起处理客户请求。应用启动通常需要一个准备阶段,比如加载缓存、连接数据库等,从容器启动到真正提供服务需要一段时间。可以通过Readiness探测判断容器是否就绪,避免将请求发到没有准备好的backend.
httpGet: 探测成功的判断条件是http请求返回码在200 ~ 400之间。(支持HTTP 和 HTTPS)
需要实现 http://[container_ip]:8080/healthy 接口。
readinessProbe:
httpGet:
scheme: HTTP
path: /healthy # 访问路径
port: 8080 # 指定端口
initialDealySeconds: 10 # 容器启动10秒后开始探测
periodSeconds: 5 # 每隔5秒探测一次
8.5 Health check 在滚动更新中的应用
kubeusr@GalaxyKubernetesMaster:~$ kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
httpd 6s DESIRED: 期望有多少个副本
CURRENT: 当前副本数目, 旧的 + 新的
UP-TO-DATE: 已经完成更新的副本数
AVAILABLE: 状态是READY可以提供服务的副本数
第八章 Health Check的更多相关文章
- Health Check in eShop -- 解析微软微服务架构Demo(五)
引言 What is the Health Check Health Check(健康状态检查)不仅是对自己应用程序内部检测各个项目之间的健康状态(各项目的运行情况.项目之间的连接情况等),还包括了应 ...
- 如何配置 Health Check?- 每天5分钟玩转 Docker 容器技术(107)
容器状态是 UP 的,应用就是健康的吗? 还真不一定!Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解. 执行 docker run 命令时,通常会根据 ...
- Health Check - 每天5分钟玩转 Docker 容器技术(142)
强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness 探测机制设置更精 ...
- 在 Scale Up 中使用 Health Check - 每天5分钟玩转 Docker 容器技术(145)
对于多副本应用,当执行 Scale Up 操作时,新副本会作为 backend 被添加到 Service 的负责均衡中,与已有副本一起处理客户的请求.考虑到应用启动通常都需要一个准备阶段,比如加载缓存 ...
- 在 Rolling Update 中使用 Health Check - 每天5分钟玩转 Docker 容器技术(146)
上一节讨论了 Health Check 在 Scale Up 中的应用,Health Check 另一个重要的应用场景是 Rolling Update.试想一下下面的情况: 现有一个正常运行的多副本应 ...
- centos7下安装docker(26如何配置Health Check)
Docker只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行状况基本没有了解 执行docker run命令时,通常根据dockerfile中的CMD或ENTRYPOINT启动一个进程, ...
- service citrix xcenserver health check service (xenserver healthcheck) failed to start verfy that you have sufficient privileges to srart system services
citrix XcenServer版本:7.2 citrix Xcencenter版本:7.2 安装citrix Xcencenter的时候报错: service citrix xcenserver ...
- k8s的Health Check(健康检查)
强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness 探测机制设置更精 ...
- 转 安装EBS前期检查工具 - RDA - Health Check / Validation Engine Guide
http://blog.itpub.net/35489/viewspace-1295028/ 参考文档 RDA - Health Check / Validation Engine Gu ...
随机推荐
- New Concept English three(10)
The great ship, Titanic, sailed for New York from Southampton on April 10th, 1912. She was carrying ...
- Django部署时为什么要用 uWSGI与 Nginx? 以及 WSGI,uwsgi等协议
Django框架的服务器架构一般是 Nginx + uWSGI + Django (1)一些基本概念 1 WSGI协议,uwsgi协议 WSGI协议(通讯协议):Python用于Web开发的协议(用于 ...
- obj-y,obj-m 区别
obj-y:把由foo.c 或者 foo.s 文件编译得到foo.o 并连接进内核.obj-m: 则表示该文件作为模块编译.除了y.m以外的obj-x 形式的目标都不会被编译. 除了obj-形式的目标 ...
- PHP常见带有下划线的常量
1.__PHP_Incomplete_Class <?php echo __PHP_Incomplete_Class::class; ?> __PHP_Incomplete_Class 2 ...
- runtime查找 UIAlertAction 的key 及 UIActionSheet 设置字体颜色
修改不了颜色了 结果发现kvo 的key 不对 哎 直接上代码 设置正确的属性找到对应的key 还以为iOS 11改变了方法 unsigned int count; Ivar *ivars = c ...
- IOS开发 GCD介绍: 基本概念和Dispatch Queue
iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØN ...
- 每天一个linux命令(文件操作):【转载】whiereis命令
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis查找的速度非 ...
- JQ 知识点集合
数组与字符串间的转换 一.数组转字符串(将数组元素用某个字符连接成字符串) var a, b; a = new Array(0,1,2,3,4); b = a.join("-"); ...
- SQL中char、varchar、nchar、nvarchar 详解
char char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值.当你输入的字符大于指定的数时,它会截取超出的字符. varchar[ ...
- BZOJ5369 [Pkusc2018]最大前缀和
题意 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C是一个非常有自知之 ...