一、探针概述

探针是有 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. Python 3.10 中新的功能和变化

    随着最后一个alpha版发布,Python 3.10 的功能更改全面敲定! 现在,正是体验Python 3.10 新功能的理想时间!正如标题所言,本文将给大家分享Python 3.10中所有重要的功能 ...

  2. ASP封装DLL 直接上代码

    ASP转DLL 基本引用类库 OLE Automation Com+ services Type Library Microsoft Active Server Pages Object Micros ...

  3. linux下python调用.so文件

    前言 使用python 调用Fanuc的动态链路库.so 文件读取数据 环境要求 环境 需求 ubuntu16.04 32位 python3.5 32位 配置 把so文件添加到默认路径 ln -s / ...

  4. 请解释Spring事务传播传播行为

    什么叫事务传播行为? 听起来挺高端的,其实很简单. 即然是传播,那么至少有两个东西,才可以发生传播.单体不不存在传播这个行为. 事务传播行为(propagation behavior)指的就是当一个事 ...

  5. hdu4847 水题

    题意:       你看了上面很长很长的一片英语课文之后,发现根本不用看,直接看输入输出就行了,就是给你一坨字符串,然后问你里面有几个doge(不区分大小写). 思路:       没啥说的,直接写吧 ...

  6. [ssh登录]ssh登录报警

    1.报警脚本 mkdir /scripts vim /scripts/telegram_ssh.sh #!/bin/bash text="用户: $PAM_USER 用户IP: $PAM_R ...

  7. Android最新敲诈者病毒分析及解锁

    一.情况简介 从去年开始PC端的敲诈者类病毒在不断的爆发,今年年初的时候手机上也开始出现了敲诈者之类的病毒,对这类病毒很无语也是趋势,因为很多时候病毒的产生是和金钱利益相关的.前天去吾爱破解论坛病毒样 ...

  8. hdu 3721 树的最小直径

    题意:       给你一棵树,让你改变一条边,改变之后依然是一棵树,然后问你怎样改变才能让树的直径最短.这里的改变一条边指的是指把一条边长度不变,连在别的两个点上. 思路:       首先求出树的 ...

  9. LA3971组装电脑

    题意:       你有b块钱,想要组装一台电脑,给你提供一些零件,每种零件提供一个或几个,组装电脑的前提是每种零件只能也必须选择一个,每种零件都有自己的种类,名字,价格,还有品质,要求是在能配成电脑 ...

  10. 用户模式下的线程同步的分析(Windows核心编程)

    线程同步 同一进程或者同一线程可以生成许多不同的子线程来完成规定的任务,但是多个线程同时运行的情况下可能需要对某个资源进行读写访问,比如以下这个情况:创建两个线程对同一资源进行访问,最后打印出这个资源 ...