1、何为健康检查

Kubernetes架构中,每个节点都会有kubelet,容器健康检查(Container Probe)的任务就是由Kubelet定期执行的。

Kubelet会通过调用Pod中容器的Handler来执行检查动作,Handler有以下三种类型:

  • ExecAction:在容器中执行特定的命令,命令退出返回0(命令执行返回值:$?)表示成功
  • TCPSocketAction:根据容器IP地址及特定的端口进行TCP检查,端口访问/开放/暴露表示成功
  • HTTPGetAction:根据容器IP、端口及访问路径发起一次HTTP请求,如果返回状态码在200到400之间表示成功

每种检查动作都可能会有三种返回状态:

  • Success:表示通过健康检查
  • Failure:表示没有通过健康检查
  • Unknown:表示检查动作失败

2、探针分类

创建Pod时,可通过livenessreadiness两种方式来探测Pod内容器的运行情况。

2.1、LivenessProbe探针(存活性探测)

判断容器是否健康(Running状态)并反馈给Kubelet。其实有很多应用长时间的后台运行后会逐渐的转为不可用状态,并且仅能通过重启Pod操作恢复,那么存活性探针机制就可以发现此类问题,并依据探测结果结合重启策略触发后续的执行。

kubernetes存活性探针支持的检测方法为三种:ExecAction、TCPSocketAction和HTTPGetAction

如果一个容器没有LivenessProbe探针,那么kubelet就会认为该容器的LivenessProbe探针返回的值永远都会是Success。

2.2、ReadinessProbe探针(就绪型探测)

判断容器服务是否可用(Ready状态)能否对外提供服务,只有达到了Ready状态的Pod才能接收请求,当容器里跑的业务起来之后容器的状态才能为Ready,负责认为容器探测失败,如果探测失败,则系统会将Service后端Endpoint列表中移除其Pod IP,后续再恢复到Ready,则探测成功会将其Pod IP加回Endpoint列表。

3、探针实现方法

LivenessProbeReadinessProbe都可配置以下三种探针实现方式:

ReadinessProbe的配置和LivenessProbe类似,只需要将yaml中的livenessProbe修改为readinessProbe

3.1、Container Exec

创建一个容器,通过检查一个文件是否存在来判断容器运行是否正常,如果文件存在则会返回状态码为0,容器运行30秒后,会将文件删除,LivenessProbe检查失败则将重启容器。

apiVersion: v1
kind: Pod
metadata:
name: exec
spec:
containers:
- name: nginx
image: nginx:1.13
ports:
- containerPort: 80
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5

检测到目录不存在

[root@k8s-master01 health]# kubectl describe pod exec  |grep "Liveness"
Liveness: exec [cat /tmp/healthy] delay=5s timeout=1s period=5s #success=1 #failure=3
Warning Unhealthy 4s (x3 over 14s) kubelet, k8s-node01 Liveness probe failed: cat: /tmp/healthy: No such file or directory

3.2、HTTP Check

创建一个Nginx容器,通过访问/index.html来判断服务是否存活,通过手动移除该文件的方式,能导致检查失败,从而重启容器

apiVersion: v1
kind: Pod
metadata:
name: httpget
spec:
containers:
- name: nginx
image: nginx:1.13
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /index.html # 访问路径
port: 80 # 容器端口
initialDelaySeconds: 5
periodSeconds: 5

手动将nginx容器的index.html文件移除

[root@k8s-master01 health]# kubectl exec -it httpget bash
root@httpget:/# mv /usr/share/nginx/html/index.html /tmp/

当index.html访问返回状态码不为200时,就会重启容器

[root@k8s-master01 health]# kubectl describe pod httpget |grep "Liveness"
Liveness: http-get http://:80/index.html delay=5s timeout=1s period=5s #success=1 #failure=3
Warning Unhealthy 59s (x3 over 69s) kubelet, k8s-node01 Liveness probe failed: HTTP probe failed with statuscode: 404

3.3、TCP Socket Check

通过对IP地址(请求连接的目标IP地址,默认为Pod IP)和端口号进行TCP检查,如果可以建立TCP连接的话,则认为容器健康,它会比基于HTTP检测方式更加的高效(HTTP是七层,TCP是四层),更节约资源,但是精确度微低,能建立成功并不代表页面可展示。

apiVersion: v1
kind: Pod
metadata:
name: tcpSocket
spec:
containers:
- name: nginx
image: nginx:1.13
ports:
- containerPort: 80
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 3
periodSeconds: 3

4、探测行为参数

initiaDelaySeconds // 容器启动之后多久开始检测,默认为0秒
periodSeconds // 每隔多久检测一次,默认为10秒,最小为1秒
failureThreshold // 检测失败几次后则认为健康检测失败,默认为3次
successThreshold // 从检测错误到成功需要几次才认为健康检测成功,默认为1次
timeoutSeconds // 执行检测命令的最长时间,默认为1秒,最小为1秒 httpGet的属性
host:主机名或IP
scheme:链接类型,HTTP或HTTPS,默认为HTTP
path:请求路径
httpHeaders:自定义请求头
port:请求端口

Kubernetes中Pod健康检查的更多相关文章

  1. kubernetes之pod健康检查

    目录 kubernetes之pod健康检查 1.概述和分类 2.LivenessProbe探针(存活性探测) 3.ReadinessProbe探针(就绪型探测) 4.探针的实现方式 4.1.ExecA ...

  2. K8s中Pod健康检查源代码分析

    了解k8s中的Liveness和Readiness Liveness: 表明是否容器正在运行.如果liveness探测为fail,则kubelet会kill掉容器,并且会触发restart设置的策略. ...

  3. Kubernetes中Pod的健康检查

    本文介绍 Pod 中容器健康检查相关的内容.配置方法以及实验测试,实验环境为 Kubernetes 1.11,搭建方法参考kubeadm安装kubernetes V1.11.1 集群 0. 什么是 C ...

  4. 如何从Serilog请求日志记录中排除健康检查终结点

    这是在ASP.NET Core 3.X中使用Serilog.AspNetCore系列文章的第四篇文章:. 第1部分-使用Serilog RequestLogging减少日志详细程度 第2部分-使用Se ...

  5. 在.NET Core 中实现健康检查

    .NET Core中提供了开箱即用的运行状况检查,首先,我将在.NET Core API应用程序中执行运行状况检查,接下来,我们将使用DbContext集成SQL Server或数据库的运行状况检查, ...

  6. 如何在 ASP.Net Core 中实现 健康检查

    健康检查 常用于判断一个应用程序能否对 request 请求进行响应,ASP.Net Core 2.2 中引入了 健康检查 中间件用于报告应用程序的健康状态. ASP.Net Core 中的 健康检查 ...

  7. Kubernetes Pod 健康检查

    参考文档: https://jimmysong.io/kubernetes-handbook/guide/configure-liveness-readiness-probes.html 一.Pod的 ...

  8. pod健康检查(liveness probe存活探针&&readiness probe 可读性探针)

    在Kubernetes集群当中,我们可以通过配置liveness probe(存活探针)和readiness probe(可读性探针)来影响容器的生存周期.参考文档:https://kubernete ...

  9. Kubernetes中pod创建流程

    转自:https://blog.csdn.net/yan234280533/article/details/72567261 Pod是Kubernetes中最基本的部署调度单元,可以包含contain ...

随机推荐

  1. JXJJOI2018_三题

    这次比赛的话其实还挺满意的,虽然T1 20pts(指的是分数,考试时知道有坑但是考完都没找到的我就知道切不掉这题qwq),T3爆零是在意料之外,不过其实T2贪心能切掉也是意料之外的,所以作此判断.当然 ...

  2. SWUST OJ 爬不出去的水井(0333)

    爬不出去的水井(0333) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 1069 Accepted: 150 Descriptio ...

  3. 851. spfa求最短路

    给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible. 数据保证不存在负权回路. 输入格式 ...

  4. Leetcode 946. Validate Stack Sequences 验证栈序列

    946. Validate Stack Sequences 题目描述 Given two sequences pushed and popped with distinct values, retur ...

  5. 漫说测试 | 研发虐我千百遍,我待bug如初恋

    的行业之一他们的运筹帷幄,他们的勾心斗角,只有自己知道.000,但绝对也是最枯燥的行业之一! IT可能是几个最高薪行业之一,但同时也绝对是最辛苦的行业之一!IT业是最需要创新能力的行业之一,但绝对也是 ...

  6. javascript中的function命名空間與模擬getter、setter

    function的命名空間 在javascript中,function也可以擁有自己的命名空間例如以下這段程式碼: 12345678 function () { return 'I am A';} A ...

  7. 从国内APP更新“精雕细琢” 看国内外产品理念之差

    看国内外产品理念之差" title="从国内APP更新"精雕细琢" 看国内外产品理念之差"> 对于当下的大众来说,智能手机已经成为新的" ...

  8. Mac上各种实用命令

    下载Github资源:git clone 显示隐藏文件:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏隐藏文件:defa ...

  9. Leetcode 142题 环形链表 II(Linked List Cycle II) Java语言求解

    题目描述: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 p ...

  10. IP 数据报

    IP 数据报 1.IP 数据报的格式 一个 IP 数据报由首部和数据两部分组成.(数据报也可以说是数据包) 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的. 在首部的固定部分 ...