第八章 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(13)
1原文打字 32w/m 错词27个 After her husband had gone to work, Mrs Richards sent her children to school and w ...
- charles抓包unknow
如果能抓到包,可是解析不出请求,那一定是证书问题,注意以下几点: 1.设备安装证书,注意要抓包的每一个设备都要安装证书,每一个设备! 2.pc端也要安装证书 如果以上两点都做到一定可以解析https请 ...
- 数据库连接池----Druid配置详解
什么是连接池? 数据库连接池出现的原因在数据库连接资源的低效管理,使用数据库连接池是基于设计模式中的资源池的概念,从而解决资源频繁是分配.释放所造成的问题. 数据库连接池的基本思想就是为数据库连接建立 ...
- iOS TUN之避免UDP包ip分片
iOS的NetworkExtension给应用暴露了一个虚拟网卡TUN设备,可以设置其MTU值.如果上层应用发送的IP包大于这个MTU就会被分片.(详见:http://blog.csdn.net/n5 ...
- json中的dumps和loads
常用有2个方法,也是最基本的使用方法: 1.dumps:把字典转成json字符串 进行post的请求的时候就要用json.dumps来进行装换,利用get方法就可以不用了. 2.loads:把json ...
- 内联汇编实现 memcpy 和 memset
#pragma check_stack( off) LPVOID __cdecl _memcpy(void * dst, void* src, size_t size) { int dwSize = ...
- windows上安装Gradle并配置环境变量
安装Gradle 下载Gradle,然后配置运行环境就可以了,有一点要注意的是gradle使用的是Groovy语言,而这个语言依赖于java,因此你必须安装配置java环境. 首先下载gradle,我 ...
- ORACLE PL/SQL:触发器
ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...
- 算法导论进度帖startedby20131029
2013.10.29 今天开始啃难啃的算法导论,俗一点说,光阴似箭,剩下的时间已经不多了,所以开始好好奋进吧~ 第一章翻过去了,对附录中的数学基础再补看一遍,发现很多东西其实掌握的都很薄弱的,附录A的 ...
- #ifndef/#define/#endif以及#if defined/#else/#endif使用详解
1.#ifndef_WINDOWS_PLAYM4_H_ #define _WINDOWS_PLAYM4_H_ #endif 问题:想必很多人都看过"头文件中的 #ifndef/#d ...