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的更多相关文章

  1. Health Check in eShop -- 解析微软微服务架构Demo(五)

    引言 What is the Health Check Health Check(健康状态检查)不仅是对自己应用程序内部检测各个项目之间的健康状态(各项目的运行情况.项目之间的连接情况等),还包括了应 ...

  2. 如何配置 Health Check?- 每天5分钟玩转 Docker 容器技术(107)

    容器状态是 UP 的,应用就是健康的吗? 还真不一定!Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解. 执行 docker run 命令时,通常会根据 ...

  3. Health Check - 每天5分钟玩转 Docker 容器技术(142)

    强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness 探测机制设置更精 ...

  4. 在 Scale Up 中使用 Health Check - 每天5分钟玩转 Docker 容器技术(145)

    对于多副本应用,当执行 Scale Up 操作时,新副本会作为 backend 被添加到 Service 的负责均衡中,与已有副本一起处理客户的请求.考虑到应用启动通常都需要一个准备阶段,比如加载缓存 ...

  5. 在 Rolling Update 中使用 Health Check - 每天5分钟玩转 Docker 容器技术(146)

    上一节讨论了 Health Check 在 Scale Up 中的应用,Health Check 另一个重要的应用场景是 Rolling Update.试想一下下面的情况: 现有一个正常运行的多副本应 ...

  6. centos7下安装docker(26如何配置Health Check)

    Docker只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行状况基本没有了解 执行docker run命令时,通常根据dockerfile中的CMD或ENTRYPOINT启动一个进程, ...

  7. 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 ...

  8. k8s的Health Check(健康检查)

    强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness 探测机制设置更精 ...

  9. 转 安装EBS前期检查工具 - RDA - Health Check / Validation Engine Guide

    http://blog.itpub.net/35489/viewspace-1295028/ 参考文档        RDA - Health Check / Validation Engine Gu ...

随机推荐

  1. LeetCode之Longest Substring Without Repeating Characters

    [题目描述] Given a string, find the length of the longest substring without repeating characters. Exampl ...

  2. 词频统计 ——Java

    github地址 :https://github.com/NSDie/personal-project 一.计划表 PSP2.1 Personal Software Process Stages 预估 ...

  3. about system (pause) in cpp

    Which is best way to pause the console in C++ programs? using cin.get() or using system("pause& ...

  4. java事务(三)

    java事务(三)——自己实现分布式事务 在上一篇<java事务(二)——本地事务>中已经提到了事务的类型,并对本地事务做了说明.而分布式事务是跨越多个数据源来对数据来进行访问和更新,在J ...

  5. Java API操作ZK node

    创建会话 建立简单连接 /** * 测试创建Zk会话 * Created by liuhuichao on 2017/7/25. */ public class ZooKeeper_Construct ...

  6. Web访问控制

    最近某婚介公司的实习生赵大胖的领导姚无发给赵大胖安排了一个任务: 给网站加上访问控制,游客不能访问看到美女的资料,只有注册的会员才能浏览. 赵大胖一时没有很好的思路,然后找到了研发组大佬老郑头. 老郑 ...

  7. 创建Azure Function

    azure function的用途在于运行一些逻辑简单的执行逻辑,比如batch job,定时任务,webhook等等.1. 创建azure function创建完毕后,进入app service,选 ...

  8. python爬虫入门(3)-环境搭建

    下载集成包 链接:http://pan.baidu.com/s/1pKD2zBP 密码:f75b 这里采用python2.7.9   安装步骤:1.安装python2.7(默认安装即可) 2.打开“运 ...

  9. 【pandas】pandas.Series.str.split()---字符串分割

    原创博文,转载请注明出处! 本文代码的github地址       series中的元素均为字符串时,通过str.split可将字符串按指定的分隔符拆分成若干列的形式. 例子: 拆分以逗号为分隔符的字 ...

  10. 如何最快速地将旧的 NuGet 包 (2.x, packages.config) 升级成新的 NuGet 包 (4.x, PackageReference)

    最近我将项目格式进行了升级,从旧的 csproj 升级成了新的 csproj:NuGet 包管理的方式也从 packages.config 升级成了 PackageReference.然而迁移完才发现 ...