一、探针概述

探针是有 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. IP Networks UVA - 1590

     Alex is administrator of IP networks. His clients have a bunch of individual IP addresses and he de ...

  2. golang面向对象分析

    说道面向对象(OOP)编程, 就不得不提到下面几个概念: 抽象 封装 继承 多态 其实有个问题Is Go An Object Oriented Language?, 随便谷歌了一下, 你就发现讨论这个 ...

  3. json 标准库

    1. 序列化的简单概念 2. json 标准库 2.1 json.dumps() 2.2 json.loads() 2.3 json.dump() 2.4 json.load() 1. 序列化的简单概 ...

  4. k8s集群移除node

    先drain节点上的pod 使用kubectl drain node03 --delete-local-data --force --ignore-daemonsets 之后删除node [root@ ...

  5. 【ElasticSearch】文档路由的原理

    ElasticSearch集群环境下新增文档如何确认该文档被分配到哪个分片中? 路由算法: ⾸先这肯定不会是随机的,否则将来要获取⽂档的时候我们就不知道从何处寻找了.实际上,这个过程是根据下⾯这个公式 ...

  6. POJ1149 PIGS(最大流)

    题意:       有一个人,他有m个猪圈,每个猪圈里面有一定数量的猪,但是每个猪圈的门都是锁着的,他自己没有钥匙,只有顾客有钥匙,一天依次来了n个顾客,(记住是依次来的)他们每个人都有一些钥匙,和他 ...

  7. 【python】Leetcode每日一题-删除排序链表中的重复元素

    [python]Leetcode每日一题-删除排序链表中的重复元素 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 . 返回同 ...

  8. .NET Design Patterns

    设计模式分组 GoF设计模式著作中的23种设计模式分为3组:创建型(Creational).结构型(Structural)和行为型(Behavional). 创建型 创建型处理对象构造和引用.它们将对 ...

  9. Docker 部署net5程序

    1.前言 本文讲述使用docker容器部署.net5项目.实现跨平台. 部署环境:docker 容器.liunx系统.这里采用VmWare虚拟机.并采用MobaXterm工具实现终端连接linux系统 ...

  10. babylin使用思路