学习笔记二十一:Pod容器健康探测

这里写目录标题

  • 为什么要对容器做探测
    • 默认的健康检查
  • k8s 提供了三种来实现容器探测的方法
      • 三种探针
      • Pod探针相关的属性:
  • 启动探测startupprobe
      • exec模式
      • tcpsocket模式
      • httpget模式
  • 存活性探测livenessProbe
    • LivenessProbe 探针使用示例
    • 通过HTTP方式做健康探测
      • httpGet探测方式有如下可选的控制字段:
    • 通过TCP方式做健康探测
  • 就绪性探测readinessProbe
    • ReadinessProbe 探针使用示例
  • 三种探测配合使用示例

为什么要对容器做探测

在 Kubernetes 中 Pod 是最小的计算单元,而一个 Pod 又由多个容器组成,相当于每个容器就是一个应用,应用在运行期间,可能因为某些意外情况致使程序挂掉。那么如何监控这些容器状态稳定性,保证服务在运行期间不会发生问题,发生问题后进行重启等机制,就成为了重中之重的事情,考虑到这点 kubernetes 推出了活性探针机制。有了存活性探针能保证程序在运行中如果挂掉能够自动重启,但是还有个经常遇到的问题,比如说,在Kubernetes 中启动Pod,显示明明Pod已经启动成功,且能访问里面的端口,但是却返回错误信息。还有就是在执行滚动更新时候,总会出现一段时间,Pod对外提供网络访问,但是访问却发生404,这两个原因,都是因为Pod已经成功启动,但是 Pod 的的容器中应用程序还在启动中导致,考虑到这点Kubernetes推出了就绪性探针机制。

默认的健康检查

Kubernetes默认的健康检查机制: 每个容器启动时都会执行一个进程, 此进程由Dockerfile的CMD或ENTRYPOINT指定。 如果进程退出时返回码非零, 则认为容器发生故障, Kubernetes就会根据restartPolicy策略决定是否重启容器。

cat check.yaml 
apiVersion: v1
kind: Pod
metadata:name: checknamespace: defaultlabels:app: check
spec:containers:- name: checkimage: busybox:1.28imagePullPolicy: IfNotPresentcommand:- /bin/sh- -c- sleep 10;exit
kubectl get pods -w
NAME        READY   STATUS    RESTARTS   AGE
check       0/1     Pending   0          0s
check       0/1     Pending   0          0s
check       0/1     ContainerCreating   0          0s
check       0/1     ContainerCreating   0          1s
check       1/1     Running             0          1s
check       0/1     Completed           0          11s
check       1/1     Running             1 (1s ago)   12s
check       0/1     Completed           1 (11s ago)   22s
check       0/1     CrashLoopBackOff    1 (13s ago)   34s
check       1/1     Running             2 (13s ago)   34s
check       0/1     Completed           2 (23s ago)   44s

在上面的例子中, 容器进程返回值非零, Kubernetes则认为容器发生故障, 需要重启。 有不少情况是发生了故障, 但进程并不会退出。 比如访问Web服务器时显示500内部错误, 可能是系统超载, 也可能是资源死锁, 此时httpd进程并没有异常退出, 在这种情况下重启容器可能是最直接、 最有效的解决方案。

k8s 提供了三种来实现容器探测的方法

  • startupProbe:探测容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。
  • livenessprobe:用指定的方式(exec、tcp、http)检测pod中的容器是否正常运行,如果检测失败,则认为容器不健康,那么Kubelet将根据Pod中设置的 restartPolicy策略来判断Pod 是否要进行重启操作,如果容器配置中没有配置 livenessProbe,Kubelet 将认为存活探针探测一直为success(成功)状态。
  • readnessprobe:就绪性探针,用于检测容器中的应用是否可以接受请求,当探测成功后才使Pod对外提供网络访问,将容器标记为就绪状态,可以加到pod前端负载,如果探测失败,则将容器标记为未就绪状态,会把pod从前端负载移除。
  • 可以自定义在pod启动时是否执行这些检测,如果不设置,则检测结果均默认为通过,如果设置,则顺序为startupProbe>readinessProbe和livenessProbe,readinessProbe和livenessProbe是并发关系

真正的启动顺序:官方文档:Caution: Liveness probes do not wait for readiness probes to succeed. If you want to wait before executing a liveness probe you should use initialDelaySeconds or a startupProbe
也就是 Liveness probes 并不会等到 Readiness probes 成功之后才运行,根据上面的官方文档,Liveness 和 readiness 应该是某种并发的关系。

三种探针

目前LivenessProbe和ReadinessProbe、startupprobe探测都支持下面:

  • exec:在容器中执行指定的命令,如果执行成功,退出码为 0 则探测成功。
  • TCPSocket:通过容器的 IP 地址和端口号执行 TCP 检 查,如果能够建立 TCP 连接,则表明容器健康。
  • HTTPGet:通过容器的IP地址、端口号及路径调用 HTTP Get方法,如果响应的状态码大于等于200且小于400,则认为容器健康

探针探测结果有以下值:

  • Success:表示通过检测。
  • Failure:表示未通过检测。
  • Unknown:表示检测没有正常进行。

Pod探针相关的属性:

探针(Probe)有许多可选字段,可以用来更加精确的控制Liveness和Readiness两种探针的行为

  • initialDelaySeconds:容器启动后要等待多少秒后探针开始工作,单位“秒”,默认是 0 秒,最小值是 0
  • periodSeconds: 执行探测的时间间隔(单位是秒),默认为 10s,单位“秒”,最小值是1
  • timeoutSeconds: 探针执行检测请求后,等待响应的超时时间,默认为1,单位“秒”。
  • successThreshold:连续探测几次成功,才认为探测成功,默认为 1,在 Liveness 探针中必须为1,最小值为1。
  • failureThreshold: 探测失败的重试次数,重试一定次数后将认为失败,在 readiness 探针中,Pod会被标记为未就绪,默认为 3,最小值为 1

两种探针区别:

  • ReadinessProbe 和 livenessProbe 可以使用相同探测方式,只是对 Pod 的处置方式不同:
  • readinessProbe 当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除。
  • livenessProbe 当检测失败后,将杀死容器并根据 Pod 的重启策略来决定作出对应的措施。

启动探测startupprobe

exec模式

cat startup-exec.yaml 
apiVersion: v1
kind: Pod
metadata:name: startupprobe
spec:containers:- name: startup
image: k8s/tomcat-8.5-jre8:v1
imagePullPolicy: IfNotPresentports:- containerPort: 8080startupProbe:exec:command:- "/bin/sh"- "-c"- "aa ps aux | grep tomcat"initialDelaySeconds: 20 #容器启动后多久开始探测periodSeconds: 20 #执行探测的时间间隔timeoutSeconds: 10 #探针执行检测请求后,等待响应的超时时间successThreshold: 1 #成功多少次才算成功failureThreshold: 3 #失败多少次才算失败

tcpsocket模式

cat startup-tcpsocket.yaml 
apiVersion: v1
kind: Pod
metadata:name: startupprobe
spec:containers:- name: startup
image: k8s/tomcat-8.5-jre8:v1
imagePullPolicy: IfNotPresentports:- containerPort: 8080startupProbe:tcpSocket:port: 8080initialDelaySeconds: 20 #容器启动后多久开始探测periodSeconds: 20 #执行探测的时间间隔timeoutSeconds: 10 #探针执行检测请求后,等待响应的超时时间successThreshold: 1 #成功多少次才算成功failureThreshold: 3 #失败多少次才算失败

httpget模式

cat startup-httpget.yaml 
apiVersion: v1
kind: Pod
metadata:name: startupprobe
spec:containers:- name: startup
image: k8s/tomcat-8.5-jre8:v1
imagePullPolicy: IfNotPresentports:- containerPort: 8080startupProbe:httpGet:path: /port: 8080initialDelaySeconds: 20 #容器启动后多久开始探测periodSeconds: 20 #执行探测的时间间隔timeoutSeconds: 10 #探针执行检测请求后,等待响应的超时时间successThreshold: 1 #成功多少次才算成功failureThreshold: 3 #失败多少次才算失败

存活性探测livenessProbe

官网地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

LivenessProbe 探针使用示例

cat liveness-exec.yaml
apiVersion: v1
kind: Pod
metadata:name: liveness-execlabels:app: liveness
spec:containers:- name: liveness
image: busybox:1.28
imagePullPolicy: IfNotPresentargs:                       #创建测试探针探测的文件- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600livenessProbe:initialDelaySeconds: 10   #延迟检测时间periodSeconds: 5          #检测时间间隔exec:command:- cat- /tmp/healthy

容器启动设置执行的命令:
/bin/sh -c “touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600”
容器在初始化后,首先创建一个 /tmp/healthy 文件,然后执行睡眠命令,睡眠 30 秒,到时间后执行删除 /tmp/healthy 文件命令。而设置的存活探针检检测方式为执行 shell 命令,用 cat 命令输出 healthy 文件的内容,如果能成功执行这条命令,存活探针就认为探测成功,否则探测失败。在前 30 秒内,由于文件存在,所以存活探针探测时执行 cat /tmp/healthy 命令成功执行。30 秒后 healthy 文件被删除,所以执行命令失败,Kubernetes 会根据 Pod 设置的重启策略来判断,是否重启 Pod。

通过HTTP方式做健康探测

上传springboot.tar.gz 至节点服务器
链接:https://pan.baidu.com/s/1SvEeYsOUl8uU0E6uwLi73Q?pwd=hplo
提取码:hplo

ctr -n k8s.io images import springboot.tar.gz
cat  liveness-http.yaml
apiVersion: v1
kind: Pod
metadata:name: liveness-httplabels:test: liveness
spec:containers:- name: liveness
image: mydlqclub/springboot-helloworld:0.0.1
imagePullPolicy: IfNotPresentlivenessProbe:initialDelaySeconds: 20   #延迟加载时间periodSeconds: 5          #重试时间间隔timeoutSeconds: 10        #超时时间设置httpGet:scheme: HTTPport: 8081path: /actuator/health

上面 Pod 中启动的容器是一个 SpringBoot 应用,其中引用了 Actuator 组件,提供了 /actuator/health 健康检查地址,存活探针可以使用 HTTPGet 方式向服务发起请求,请求 8081 端口的 /actuator/health 路径来进行存活判断:

  • 任何大于或等于200且小于400的代码表示探测成功。
  • 任何其他代码表示失败。
  • 如果探测失败,则会杀死 Pod 进行重启操作。

httpGet探测方式有如下可选的控制字段:

  • scheme: 用于连接host的协议,默认为HTTP。
  • host:要连接的主机名,默认为Pod IP,可以在http request head中设置host头部。
  • port:容器上要访问端口号或名称。
  • path:http服务器上的访问URI。
  • httpHeaders:自定义HTTP请求headers,HTTP允许重复headers。

通过TCP方式做健康探测

cat liveness-tcp.yaml
apiVersion: v1
kind: Pod
metadata:name: liveness-tcplabels:app: liveness
spec:containers:- name: liveness
image: docker.io/k8s/nginx:v1
imagePullPolicy: IfNotPresentlivenessProbe:initialDelaySeconds: 15periodSeconds: 20tcpSocket:port: 80

TCP 检查方式和 HTTP 检查方式非常相似,在容器启动 initialDelaySeconds 参数设定的时间后,kubelet 将发送第一个 livenessProbe 探针,尝试连接容器的 80 端口,如果连接失败则将杀死 Pod 重启容器。

就绪性探测readinessProbe

ReadinessProbe 探针使用示例

Pod 的ReadinessProbe 探针使用方式和 LivenessProbe 探针探测方法一样,也是支持三种,只是一个是用于探测应用的存活,一个是判断是否对外提供流量的条件。这里用一个 Springboot 项目,设置 ReadinessProbe 探测 SpringBoot 项目的 8081 端口下的 /actuator/health 接口,如果探测成功则代表内部程序以及启动,就开放对外提供接口访问,否则内部应用没有成功启动,暂不对外提供访问,直到就绪探针探测成功。

cat readiness-exec.yaml
apiVersion: v1
kind: Service
metadata:name: springbootlabels:app: springboot
spec:type: NodePortports:- name: serverport: 8080targetPort: 8080nodePort: 31180- name: managementport: 8081targetPort: 8081nodePort: 31181selector:app: springboot
---
apiVersion: v1
kind: Pod
metadata:name: springbootlabels:app: springboot
spec:containers:- name: springboot
image: mydlqclub/springboot-helloworld:0.0.1
imagePullPolicy: IfNotPresentports:- name: servercontainerPort: 8080- name: managementcontainerPort: 8081readinessProbe:initialDelaySeconds: 20   periodSeconds: 5          timeoutSeconds: 10   httpGet:scheme: HTTPport: 8081path: /actuator/health

三种探测配合使用示例

一般程序中需要设置三种探针结合使用,并且也要结合实际情况,来配置初始化检查时间和检测间隔,下面列一个简单的 SpringBoot 项目的例子。

cat start-read-live.yaml 
apiVersion: v1
kind: Service
metadata:name: springboot-livelabels:app: springboot
spec:type: NodePortports:- name: serverport: 8080targetPort: 8080nodePort: 31180- name: managementport: 8081targetPort: 8081nodePort: 31181selector:app: springboot
---
apiVersion: v1
kind: Pod
metadata:name: springboot-livelabels:app: springboot
spec:containers:- name: springbootimage: mydlqclub/springboot-helloworld:0.0.1imagePullPolicy: IfNotPresentports:- name: servercontainerPort: 8080- name: managementcontainerPort: 8081readinessProbe:initialDelaySeconds: 20   periodSeconds: 5          timeoutSeconds: 10   httpGet:scheme: HTTPport: 8081path: /actuator/healthlivenessProbe:initialDelaySeconds: 20periodSeconds: 5timeoutSeconds: 10httpGet:scheme: HTTPport: 8081path: /actuator/healthstartupProbe:initialDelaySeconds: 20periodSeconds: 5timeoutSeconds: 10httpGet:scheme: HTTPport: 8081path: /actuator/health

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s day08

metric-server概述: Metrics Server从kubelets收集资源指标,并通过Metrics API将它们暴露在Kubernetes apiserver中,以供HPA(Horizontal Pod Autoscaler)和VPA(Vertical Pod Autoscaler)使用。 Metrics API也可以通过kubectl top访问&…

高压放大器在扫描显微镜中的应用及优势是什么

随着科技的不断进步,扫描显微镜成为了现代显微镜技术的重要组成部分。它能够提供更高的分辨率、更广的视场和更强的功能,用于研究各种微观结构和材料的特性。而高压放大器在扫描显微镜系统中发挥着至关重要的作用。下面安泰电子Aigtek将详细介绍高压放大…

hive针对带有特殊字符非法json数据解析

一、背景 有的时候前端或者后端进行埋点日志,会把json里面的数据再加上双引号,或者特殊字符,在落日志的时候,组装的格式就不是正常的json数据了,我们就需要将带有特殊字符的json数据解析成正常的json数据。 二、正则…

算法题:最大出牌数量

最近遇到的一个算法题,在这里记录一下找到的答案。 完整题目: 手里给一副手牌,数字从0-9,有r(红色),g(绿色),b(蓝色),y(黄色)四种颜色,出牌规则为每次打出的牌必须跟上…

一百九十二、Flume——Flume数据流监控工具Ganglia单机版安装

一、目的 在安装好Flume之后,需要用一个工具可以对Flume数据传输进行实时监控,这就是Ganglia 二、Ganglia介绍 Ganglia 由 gmond、gmetad 和 gweb 三部分组成。 (一)第一部分——gmond gmond(Ganglia Monitoring Da…

阶乘(Python)

一、定义 整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,0的阶乘为1。即:n!123...n 二、方法说明 python求整数n阶乘的方法: 1、使用math模块factorial(n)来计算n的阶乘 2、for循环语句…

JAVA毕业设计102—基于Java+Springboot+vue的个人理财管理系统(源码+数据库)

基于JavaSpringbootvue的个人理财管理系统(源码数据库) 一、系统介绍 本系统前后端分离 管理员功能: 登录、注册、添加账单、导出账单、统计分析、个人信息修改、消费对比 二、所用技术 后端技术栈: SpringbootSpringMvcmybatismysql 前端技术栈…

[MoeCTF 2023]——Web方向详细Write up、Re、Misc、Crypto部分Writeup

签到 hello CTFer 将url地址复制然后打开即可 得到flag Web http 听说这个http里还有个什么东西叫饼干,也不知道是不是吃的 踩坑了,这里用连接器。。。 开启题目环境 GET方式请求,然后把各种请求头往里加 GET ?UwUuHeader: …

ConcurrentHashMap底层具体实现知道吗?实现原理是什么

从这三个方面来回答: ConcurrentHashMap 的整体架构 ConcurrentHashMap 的基本功能 ConcurrentHashMap 在性能方面的优化 ConcurrentHashMap 的整体架构 这个是 ConcurrentHashMap 在 JDK1.8 中的存储结构,它是由数组、单向链表、红黑树组成. 当我们初始…

mysql的锁介绍

从共享性上来说,mysql的数据库锁分为: 共享锁(读锁):lock in share mode;一个事务获取了读锁之后,不排斥其他事务读数据,但排斥其他事务增删改。 排它锁(写锁):for update;一个事务获…

【ROS 2 基础-常用工具】-7 Rviz仿真机器人

所有内容请查看:博客学习目录_Howe_xixi的博客-CSDN博客

读书笔记——富兰克林自传

富兰克林自传 1.我从这件事得到一个启发,只要人们专心工作,就会活得非常快乐。在工作的日子里,他们往往温顺和气,心情愉快。白天痛痛快快地干活,晚上开开心心地吃喝。但是,一旦空闲无事,他们就…

Java的反射(reflection)机制的简单使用

目录 一、定义 二、用途 三、反射基本信息 四、反射相关的类 五、反射示例 六、反射的优点和缺点 一、定义 Java的反射机制是运行时的状态,可以通过反射来调用类里面的属性和方法,私有的属性和方法也可以调用,也可以对它们进行修改。 二…

常见面试题-Netty专栏(一)

typora-copy-images-to: imgs Netty 是什么呢?Netty 用于做什么呢? 答: Netty 是一个 NIO 客户服务端框架,可以快速开发网络应用程序,如协议服务端和客户端,极大简化了网络编程,如 TCP 和 UDP …

LVS+keepalived高可用集群

1、定义 keepalived为lvs应运而生的高可用服务。lvs的调度器无法做高可用,keepalived实现的是调度器的高可用,但keepalived不只为lvs集群服务的,也可以做其他代理服务器的高可用,比如nginxkeepalived也可实现高可用(重…

多模态笔记

Transformer 对文本输入进行tokenizer时,调用的接口batch_encode_plus,过程大致是这样的(参考:tokenizer用法) #这里以bert模型为例,使用上述提到的函数 from transformers import BertTokenizer tokenizer BertTokenizer.from…

spring tx:advice事务配置—— tx:advice中不允许出现属性 ‘transaction-manager‘

今天在配置java事务管理时出现了一些问题。 提示:只有这几个属性 经过查询资料发现是bean的配置少了一些。 可以在xml文件顶部添加: xmlns:tx"http://www.springframework.org/schema/tx" 下面也提供一份bean文件配置的模板: &a…

下列软件包有未满足的依赖关系: libqt5svg5-dev : 依赖: libqt5svg5 (= 5.12.8-0ubuntu1) 但是它将不会被安装

有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是 因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件 包尚未被创建或是它们已被从新到(Incoming)目录移出。 下列信息可能会对解决问题有所帮助: 下列软件包有未满足…

Java入门讲解(1)---让你瞬间明白如何安装jdk

博主有话说:学习这个东西一定要持之以恒!!!博主之前因为点事情半个月没学习,重新来过时,发现自己错过好多知识,正在一点一点往回补,博客也会陆续开始更新,希望大家多多支…

HarmonyOS SDK,赋能开发者实现更具象、个性化开发诉求

#鸿蒙生态千帆起#随着移动互联网的逐步成熟,用户的需求越来越细化。鸿蒙生态为开发者提供的HarmonyOS SDK开放能力,高效赋能美团外卖等合作伙伴实现更具象、个性化的开发诉求,给用户提供更丰富便捷的体验。 HarmonyOS SDK,赋能开发…