一、探针概述

探针是有 kubelet 对容器执行的定期诊断,并不是由 Master 节点发起的探测,而是由每一个 Node 所在的 kubelet 进行探测,这样可以减轻 Master 节点系统负载压力。

kubelet 要执行诊断,kubelet 调用由容器实现的 Handler (处理程序)。一共有三种类型的处理程序:

  • ExecAction: 在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功,非 0 都属于不成功。

  • TCPSocketAction: 对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。

  • HTTPGetAction: 对容器的 IP 地址上指定端口和路径执行 HTTP Get 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。

每次探测都将获得以下三种结果之一:

  • Success(成功):容器通过了诊断。
  • Failure(失败):容器未通过诊断。
  • Unknown(未知):诊断失败,因此不会采取任何行动。

两种探针方式:

liveness Probe:是一个存活探测器,会随着 Pod 生命周期一直循环检测。探测容器是否正在运行,如果存活探测失败,则 kubelet 会杀死容器,然后根据其容器的重启策略来对容器进行操作,默认为 Always,则 Pod 进行重启。

readiness Probe:是一个就绪探测器,检测 Pod 是否到达就绪状态,只有达到就绪状态了才可以对外提供服务,当一个 Pod 内的所有容器都准备好了,才能把这个 Pod 看作就绪了。

readiness Probe 应用场景:

就绪探针可以应用在 Service 后端的 Pod 探测上,在 Pod 还没有准备好的时候,会从 Service 的负载均衡器中剔除。

二、探针实例测试

2.1 就绪探针 - HTTP Get

readiness-httpget.yaml如下:

apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget # Pod 名称
namespace: test # Pod 所在的命名空间
spec:
containers:
- name: readiness-httpget-container # 容器名称
image: hub.test.com/library/mynginx:v1 # 镜像地址
imagePullPolicy: IfNotPresent # 镜像下载策略
readinessProbe: # 就绪探测
httpGet: # 检测方案
path: /index1.html # 检测路径
port: 80 # 检测端口
initialDelaySeconds: 3 # 启动后多少秒开始第一次检测
periodSeconds: 3 # 每次间隔检测时间

实际就是检测:http://localhost/index1.html,是否正常。

创建 Pod

[root@k8s-master01 ~]# kubectl create -f readiness-httpget.yaml
pod/readiness-httpget created

查看 Pod 状态

虽然已经 Running 了,但是还没就绪状态,因为我们这个容器没有index1.html这个页面。

查看该 Pod 的详细详细

[root@k8s-master01 ~]# kubectl describe pod readiness-httpget -n test
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 5m11s default-scheduler Successfully assigned test/readiness-httpget to k8s-node01
Normal Pulled 5m10s kubelet Container image "hub.test.com/library/mynginx:v1" already present on machine
Normal Created 5m10s kubelet Created container readiness-httpget-container
Normal Started 5m10s kubelet Started container readiness-httpget-container
Warning Unhealthy 8s (x100 over 5m5s) kubelet Readiness probe failed: HTTP probe failed with statuscode: 404

提示就绪检测找不到该页面,返回状态码 404。

接下来进入该容器手动创建index1.html页面

[root@k8s-master01 ~]# kubectl exec readiness-httpget -n test -it -- /bin/bash
root@readiness-httpget:/# cd /usr/share/nginx/html/
root@readiness-httpget:/usr/share/nginx/html# ls
50x.html index.html
root@readiness-httpget:/usr/share/nginx/html# touch index1.html
root@readiness-httpget:/usr/share/nginx/html# exit

再次查看 Pod 状态已经就绪状态了

2.2 存活探针 - exec

liveness-exec.yaml文件如下:

apiVersion: v1
kind: Pod
metadata:
name: liveness-exec # Pod 名称
namespace: test # Pod 所在的命名空间
spec:
containers:
- name: liveness-exec-container # 容器名称
image: hub.test.com/library/busybox:latest # 镜像地址
imagePullPolicy: IfNotPresent # 镜像下载策略
command: ["/bin/sh","-c","touch /tmp/live; sleep 60; rm -rf /tmp/live; sleep 3600"]
# 创建 live 文件,休眠60秒,删除 live 文件,再休眠 1 分钟。
livenessProbe: # 存活探测
exec: # 检测方案
command: ["test","-e","/tmp/live"] # 检测该文件是否存在,返回值 0 成功,非 0 失败
initialDelaySeconds: 3 # 启动后多少秒开始第一次检测
periodSeconds: 3 # 每次间隔检测时间

创建 Pod

[root@k8s-master01 ~]# kubectl create -f liveness-exec.yaml
pod/liveness-exec created

查看 Pod 状态,加上-w实时查看

[root@k8s-master01 ~]# kubectl get pod -n test -w

从上图可以看到 RESTARTS 已经重启一次了,它会循环重启,因为重新创建 Pod 到时候 /tmp/live 就会被创建,但是 60 秒后又被删除。

2.3 存活探针 - HTTPGet

liveness-httpgat.yaml文件如下:

apiVersion: v1
kind: Pod
metadata:
name: liveness-httpgat # Pod 名称
namespace: test # Pod 所在的命名空间
spec:
containers:
- name: liveness-httpgat-container # 容器名称
image: hub.test.com/library/mynginx:v1 # 镜像地址
imagePullPolicy: IfNotPresent # 镜像下载策略
ports:
- name: http
containerPort: 80
livenessProbe: # 存活探测
httpGet: # 检测方案
port: http
path: /index.html
initialDelaySeconds: 3 # 启动后多少秒开始第一次检测
periodSeconds: 3 # 每次间隔检测时间
timeoutSeconds: 10 # 探测的超时时间

创建 Pod

[root@k8s-master01 ~]# kubectl create -f liveness-httpget.yaml
pod/liveness-httpgat created

查看 Pod 状态,此时是正常的

[root@k8s-master01 ~]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
hpa-nginx-deploy-9f8676f85-5fk6c 1/1 Running 0 12m
liveness-httpgat 1/1 Running 0 30s

现在将 nginx 容器里面的 index.html 文件给删除

[root@k8s-master01 ~]# kubectl exec liveness-httpgat -n test -it -- rm -rf /usr/share/nginx/html/index.html

重启次数变为 1 ,由于 liveness没有检测到 index.html 文件,则会删掉主容器,主容器一旦被删除 Pod 也会进行重启。

2.4 存活探针 - TCP

liveness-tcp.yaml文件如下:

apiVersion: v1
kind: Pod
metadata:
name: liveness-tcp # Pod 名称
namespace: test # Pod 所在的命名空间
spec:
containers:
- name: liveness-tcp-container # 容器名称
image: hub.test.com/library/mynginx:v1 # 镜像地址
imagePullPolicy: IfNotPresent # 镜像下载策略
livenessProbe: # 存活探测
tcpSocket: # 检测方案
port: 8080 # 检测端口
initialDelaySeconds: 3 # 启动后多少秒开始第一次检测
periodSeconds: 3 # 每次间隔检测时间

创建 Pod

[root@k8s-master01 ~]# kubectl create -f liveness-tcp.yaml
pod/liveness-tcp created

查看 Pod 状态,此时由于 nginx 端口为 80,所以检测不到 8080 端口,会一直重启。

2.5 就绪探针+存活探针 - HTTPGet

live-readi-httpgat.yaml文件如下:

apiVersion: v1
kind: Pod
metadata:
name: live-readi-httpgat # Pod 名称
namespace: test # Pod 所在的命名空间
spec:
containers:
- name: live-readi-httpgat-container # 容器名称
image: hub.test.com/library/mynginx:v1 # 镜像地址
imagePullPolicy: IfNotPresent # 镜像下载策略
ports:
- name: http
containerPort: 80 # 容器端口
readinessProbe: # 就绪探测
httpGet: # 检测方案
path: /index1.html # 检测路径
port: 80 # 检测端口
initialDelaySeconds: 3
periodSeconds: 3
livenessProbe: # 存活探测
httpGet: # 检测方案
port: http # 检测协议
path: /index.html # 检测路径
initialDelaySeconds: 3 # 启动后多少秒开始第一次检测
periodSeconds: 3 # 每次间隔检测时间
timeoutSeconds: 10 # 探测的超时时间

创建 Pod

[root@k8s-master01 ~]# kubectl create -f live-read-httpget.yaml
pod/live-readi-httpgat created

查看 Pod 状态

虽然是 Running 状态,但是还没 Read,因为就绪探针没有检测到index1.html这个文件存在。

进入容器手动创建测试

[root@k8s-master01 ~]# kubectl exec live-readi-httpgat -n test -it -- /bin/bash
root@live-readi-httpgat:/# cd /usr/share/nginx/html/
root@live-readi-httpgat:/usr/share/nginx/html# touch index1.html

再次查看 Pod 状态,现在已经就绪状态

我们再测试liveness探针,删除 index.html 文件

[root@k8s-master01 ~]# kubectl exec live-readi-httpgat -n test -it -- rm -rf /usr/share/nginx/html/index.html

可以看到 Pod 重启 1 次,又回到未就绪状态了,因为重启完后默认是没有index1.html 文件的

三、配置补充

使用启动探测器保护慢启动容器

有时候,会有一些现有的应用程序在启动时需要较多的初始化时间。 要不影响对引起探测死锁的快速响应,这种情况下,设置存活探测参数是要技巧的。 技巧就是使用一个命令来设置启动探测,针对HTTP 或者 TCP 检测,可以通过设置 failureThreshold * periodSeconds 参数来保证有足够长的时间应对糟糕情况下的启动时间。

实例:

startupProbe:
httpGet:
path: /test
port: liveness-port
failureThreshold: 30
periodSeconds: 10

应用程序可以有最多 5 分钟(30 * 10 = 300s) 的时间来完成它的启动。

还有很多配置字段,可以使用这些字段精确的控制存活和就绪检测的行为:

  • initialDelaySeconds:容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒,最小值是 0。
  • periodSeconds:执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
  • timeoutSeconds:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。
  • successThreshold:探测器在失败后,被视为成功的最小连续成功数。默认值是 1。 存活和启动探测的这个值必须是 1。最小值是 1。
  • failureThreshold:当探测失败时,Kubernetes 的重试次数。 存活探测情况下的放弃就意味着重新启动容器。 就绪探测情况下的放弃 Pod 会被打上未就绪的标签。默认值是 3。最小值是 1。

【七】Kubernetes 探针介绍 - 存活、就绪探针案例测试的更多相关文章

  1. kubernetes的存活探针和就绪探针

    1.存活探针 使用Kubernetes的一个主要好处是,可以给Kubernetes-个容器列表来由其保持容器在集群中的运行.可以通过让Kubernetes创建pod资源,为其选择一个工作节点并在该节点 ...

  2. Kubernetes 存活、就绪探针

    在设计关键任务.高可用应用程序时,弹性是要考虑的最重要因素之一. 当应用程序可以快速从故障中恢复时,它便具有弹性. 云原生应用程序通常设计为使用微服务架构,其中每个组件都位于容器中.为了确保Kuber ...

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

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

  4. kubernets之就绪探针

    一 介绍就绪探针 1.1  开始介绍就绪探针之前,让我们来提问几个问题?第一,在sevice这章我们了解到, 当流量从Ingress被转发到服务,然后服务从其维护当Endponits 里面列表查找到任 ...

  5. Kubernetes --- 详细介绍和架构详解

    Kubernetes是一个跨主机集群的开源的容器调度平台,它可以自动化应用容器的部署,扩展和操作,提供以容器为中心的基础架构 目录 一. Kubernetes用途 二. Kubernetes特点 三. ...

  6. _00019 Storm架构介绍和Storm获取案例(简单的官方网站Java案例)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

  7. 2017.11.6 JavaWeb-----第七章 JavaWeb常用开发模式与案例

    JavaWeb-----第七章 JavaWeb常用开发模式与案例 (1)单纯的JSP页面开发模式 通过在JSP中的脚本标记,直接在JSP页面中实现各种功能.称为"单纯的JSP页面编程模式&q ...

  8. _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

  9. 三十五、kubernetes NameSpace介绍

    Kubernetes NameSpace 介绍 Kubernetes使用命名空间的概念帮助解决集群中在管理对象时的复杂性问题.命名空间允许将对象分组到一起,便于将它们作为一个单元进行筛选和控制.无论是 ...

随机推荐

  1. 另类的曲线方式定时Start up/Shut down VM 的解决方案

    一,引言 最近看到一位小兄弟在为了做 Azure 云虚拟机的自动关机开启 在群里求助,最后也不知道结果咋样了. 至于他提到的利用 Automation Account 我是没有接触过,并且也没有看资料 ...

  2. 什么是JWT?原理是什么?

    什么是JWT JWT 是Json Web Tokens的简称.用百度上面的解释讲,是目前流行的跨域认证解决方案,一种基于JSON的.用于在网络上声明某种主张的令牌(token). JTW原理 jwt验 ...

  3. PAT归纳总结——关于C++输入输出格式问题的一些总结

    自从使用了C++就不再想使用C语言来刷题了,C++便捷的输入输出方式,以及一些STL库函数的使用都要比使用C语言方便的多.但是使用的时候还有一些需要注意的地方,在这篇博客中写一下.(更好的教程可以参看 ...

  4. 11- client测试

    client是客户端,软件分为客户端与服务端,客户端就是我们使用的软件,比如浏览器,QQ,抖音等.服务端就是客户端使用操作,服务端给你响应的请求.

  5. js收藏展开与隐藏,返回顶部

    var a = document.getElementById("more");var b = document.getElementById("moreList&quo ...

  6. Android动态调试so库JNI_Onload函数-----基于IDA实现

    之前看过吾爱破解论坛一个关于Android'逆向动态调试的经验总结帖,那个帖子写的很好,对Android的脱壳和破解很有帮助,之前我们老师在上课的时候也讲过集中调试的方法,但是现在不太实用.对吾爱破解 ...

  7. Linux中正则表达式和字符串的查询、替换(tr/diff/wc/find)

    目录 正则表达式 基本正则表达式 扩展正则表达式 grep tr diff du wc find 正则表达式 正则表达式,又称正规表示法.常规表示法( Regular Expression,在代码中常 ...

  8. Linux中常见的150个命令(干货)

    目录 线上查询及帮助命令 文件和目录操作命令 查看文件和内容处理命令 文件压缩及解压缩命令 信息显示命令 搜索文件命令 进程管理相关命令 用户管理命令 基础网络操作命令 深入网络操作命令 有关磁盘与文 ...

  9. Andrew Ng机器学习算法入门((七):特征选择和多项式回归

    特征选择 还是回归到房价的问题.在最开始的问题中,我们假设房价与房屋面积有关,那么最开始对房价预测的时候,回归方程可能如下所示: 其中frontage表示的房子的长,depth表示的是房子的宽. 但长 ...

  10. Idea创建Maven Web项目的web.xml版本问题

    问题描述:创建Maven Web项目时,选择MavenWebapp模板时,自动生成的web.xml文件版本为1.4,如图所示 如何才能修改为常用的4.0版本的xml文件呢? 这个文件是从Maven仓库 ...