k8s学习-Health Check

强大的自愈能力是Kubernetes这类容器编排引擎的⼀个重要特性。自愈的默认实现方式是自动重启发生故障的容器。除此之外,用户还可以利用Liveness和Readiness探测机制设置更精细的健康检查,进而实现:
(1)零停机部署。
(2)避免部署无效的镜像。
(3)更加安全的滚动升级。

1.1 默认的健康检查

默认情况下,每个容器启动时都会执行一个进程,由Dockerfile中的CMD或ENTRYPOINT指定。如果进程退出时的返回码不为0,则认为容器发生了故障,K8S会根据重启策略(restartPolicy)重启容器。
vi healthcheck.yaml

apiVersion: v1
kind: Pod
metadata:name: healthcheck-demolabels:test: healthcheck
spec:restartPolicy: OnFailurecontainers:- name: healthcheckimage: busyboximagePullPolicy: IfNotPresentargs:- /bin/sh- -c- sleep 10; exit 1

Pod的restartPolicy设置为OnFailure,默认为Always。sleep10;exit1模拟容器启动10秒后发生故障。
执行kubectlapply创建Pod,命名为healthcheck。

[root@k8s-master ~]# kubectl get pod healthcheck-demo
NAME               READY   STATUS             RESTARTS   AGE
healthcheck-demo   0/1     CrashLoopBackOff   3          101s

可看到容器当前已经重启了3次。
在上面的例子中,容器进程返回值非零,必须等到进程退出后的返回值是非零才会触发重启策略,不能直接监测容器是否是健康。

K8S中有没有更好的机制能够实现智能一点的健康检查呢?答案就是使用Liveness与Readinesss。

1.2 Liveness探测

Liveness的参数:

initialDelaySeconds:容器启动后第一次执行探测是需要等待多少秒,看运行的服务而定。
periodSeconds:执行探测的频率,默认是10秒,最小1秒。
timeoutSeconds:探测超时时间,默认1秒,最小1秒。
successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功,默认是1,对于liveness必须是1,最小值是1。
failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3。最小值是1.

vi liveness-demo.yml

apiVersion: v1
kind: Pod
metadata:labels:test: livenessname: liveness-demo
spec:containers:- name: livenessimage: busyboxargs:- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf/tmp/healthy; sleep 10livenessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 10periodSeconds: 5

这里启动pod后会创建文件夹 /tmp/healthy,30秒后删除,在我们的设置中,如果 /tmp/healthy 存在,则认为容器处于正常状态,否则认为发生故障。

需要注意的就是livenessProbe部分的定义了:

(1)探测方法:通过cat命令查看/tmp/healthy是否存在;如果返回值为0,则探测成功;否则,探测失败;

(2)initialDelaySeconds: 10 => 容器启动10秒之后开始执行liveness探测;

(3)periodSeconds: 5 => 每5秒执行一次liveness探测;如果连续执行3次探测都失败,那么就会杀掉并重启容器;

下面快速地验证一下:

[root@k8s-master ~]# kubectl describe pod liveness-demo
deployment.apps/httpd configuredNormal   Pulling    71s (x4 over 4m29s)  kubelet, k8s-node2  Pulling image "busybox"Normal   Pulled     44s (x4 over 4m27s)  kubelet, k8s-node2  Successfully pulled image "busybox"Normal   Created    44s (x4 over 4m27s)  kubelet, k8s-node2  Created container livenessNormal   Started    44s (x4 over 4m27s)  kubelet, k8s-node2  Started container livenessWarning  BackOff    2s (x7 over 2m49s)   kubelet, k8s-node2  Back-off restarting failed container
[root@k8s-master ~]# kubectl get pod liveness-demo
NAME            READY   STATUS    RESTARTS   AGE
liveness-demo   1/1     Running   4          5m46s

1.3 Readiness探测

用户通过Liveness探测可以告诉Kubernetes什么时候通过重启容器实现自愈;Readiness探测则是告诉Kubernetes什么时候可以将容器加入到Service负载均衡池中,对外提供服务。

vi readiness-demo.yml

apiVersion: v1
kind: Pod
metadata:labels:test: readinessname: readiness-demo
spec:containers:- name: readinessimage: busyboxargs:- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf/tmp/healthy; sleep 10readinessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 10periodSeconds: 5

这个配置文件只是将前面例⼦中的liveness替换为了readiness。

[root@k8s-master ~]# kubectl get pod readiness-demo
NAME             READY   STATUS    RESTARTS   AGE
readiness-demo   1/1     Running   1          107s
Events:Type     Reason     Age                  From                Message----     ------     ----                 ----                -------Normal   Scheduled  <unknown>            default-scheduler   Successfully assigned default/readiness-demo to k8s-node2Normal   Pulling    61s (x3 over 3m13s)  kubelet, k8s-node2  Pulling image "busybox"Normal   Pulled     44s (x3 over 2m51s)  kubelet, k8s-node2  Successfully pulled image "busybox"Normal   Created    44s (x3 over 2m51s)  kubelet, k8s-node2  Created container readinessNormal   Started    44s (x3 over 2m51s)  kubelet, k8s-node2  Started container readinessWarning  BackOff    4s (x2 over 73s)     kubelet, k8s-node2  Back-off restarting failed containerWarning  Unhealthy  4s                   kubelet, k8s-node2  Readiness probe failed: OCI runtime exec failed: exec failed: unable to sta

(1)刚被创建时,其READY状态为不可用;
(2)15秒(initialDelaySeconds + periodSeconds = 10 + 5 = 15)之后,第一次进行Readiness探测成功,其READY状态变为可用。
(3)30秒之后,/tmp/healthy被删除,连续3次Readiness探测均失败后,其READY状态又变为了不可用。

与Liveness的对比

Liveness与Readiness都是K8S的Health Check机制,Liveness探测是重启容器,而Readiness探测则是将容器设置为不可用,不让其再接受Service转发的请求。
Liveness与Readiness是独立执行的,二者无依赖,可以单独使用也可以同时使用。

1.4 Health Check在Scale Up中的应用

对于多副本应用,当执行ScaleUp操作时,新副本会作为backend被添加到Service的负载均衡中,与已有副本⼀起处理客户的请求。考虑到应用启动通常都需要⼀个准备阶段,比如加载缓存数据、连接数据库等,从容器启动到真正能够提供服务是需要⼀段时间的。我们可以通过Readiness探测判断容器是否就绪,避免将请求发送到还没有准备好的backend。

apiVersion: apps/v1
kind: Deployment
metadata:name: web
spec:replicas: 3selector:matchLabels:run: webtemplate:metadata:labels:run: webspec:containers:- name: webimage: myhttpdports:- containerPort: 8080readinessProbe:httpGet:path: /healthyport: 8080initialDelaySeconds: 10periodSeconds: 5---
apiVersion: v1
kind: Service
metadata:name: web-svc
spec:selector:run: webports:- protocol: TCPport: 8080targetPort: 8080

重点关注readinessProbe部分。这里我们使用了不同于exec的另⼀种探测方法httpGet。
Kubernetes对于该方法探测成功的判断条件是http请求的返回代码在200〜400之间。
上⾯配置的作用是:
(1)容器启动10秒之后开始探测。
(2)如果http://[container_ip]:8080/healthy返回代码不是200〜 400,表示容器没有就绪,不接收Serviceweb-svc的请求。
(3)每隔5秒探测⼀次。
(4)直到返回代码为200〜400,表明容器已经就绪,然后将其加入
到web-svc的负载均衡中,开始处理客户请求。
(5)探测会继续以5秒的间隔执行,如果连续发生3次失败,容器又
会从负载均衡中移除,直到下次探测成功重新加入。

1.5 Health Check在Rolling Update中的应用

假设现在有一个正常运行的多副本应用,我们要对其进行滚动更新即Rolling Update,K8S会逐步用新Pod替换旧Pod,结果就有可能发生这样的一个场景:
(1)正常情况下新副本需要10秒钟完成准备工作,在此之前无法响应业务请求。
(2)当所有旧副本被替换之后,而新的Pod由于人为配置错误一直无法启动,因此整个应用将无法处理请求,无法对外提供服务,后果很严重!

如果正确配置了HealthCheck,新副本只有通过了Readiness探测才会被添加到Service;如果没有通过探测,现有副本不会被全部替换,业务仍然正常进行。

因此,Readiness探测还提供了用于避免滚动更新中出现这种情况的一些解决办法,比如maxSurge和maxUnavailable两个参数,用来控制副本替换的数量。

继续以上面的YAML配置文件为例,重点关注strategy部分:

apiVersion: apps/v1
kind: Deployment
metadata:name: web
spec:strategy:rollingupdate:maxSurge: 25%maxUnavailable: 25%replicas: 3selector:matchLabels:run: webtemplate:metadata:labels:run: webspec:containers:- name: webimage: myhttpdports:- containerPort: 8080readinessProbe:httpGet:path: /healthyport: 8080initialDelaySeconds: 10periodSeconds: 5---
apiVersion: v1
kind: Service
metadata:name: web-svc
spec:selector:run: webports:- protocol: TCPport: 8080targetPort: 8080

(1)maxSurge:25%=>控制滚动更新过程中副本总数超过预期(这里预期是10个副本replicas:10)的上限,可以是数值也可以是百分比,然后向上取整。这里写的百分比,默认值是25%;
如果预期副本数为10,那么副本总数的最大值为RoundUp(10+1025%)=13个。
(2)maxUnavailable:25%=>控制滚动更新过程中不可用的副本(这里预期是10个副本replicas:10)占预期的最大比例,可以是数值也可以是百分比,然后向下取整,同样地默认值也是25%;
如果预期副本总数为10,那么可用的副本数至少要为10-roundDown(10
25%)=10-2=8个。
综上看来,maxSurge的值越大,初始创建的新副本数量就越多;maxUnavaliable值越大,初始销毁的旧副本数量就越多;

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

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

相关文章

DVI接口主机连接VGA显示器解决方案:DVI转VGA转换器DV

DVI转VGA转换器概述 DVI转VGA转换器能够将DVI数字信号转换成VGA模拟信号&#xff0c;通过VGA线缆传输给VGA显示设备使用&#xff0c;这样就能实现DVI接口主机连接VGA接口的显示器。 DVI转VGA转换器DV DVI转VGA转换器DV接口说明 DVI转VGA转换器DV接口介绍 DVI转VGA转换器连接示…

在next.js的13.2.1版本中使用中间件,实现禁止特定ip访问网址所有页面

在实现实现禁止特定ip访问网址所有页面时&#xff0c;有两种方式&#xff0c;一种是针对单个页面&#xff0c;另一种是针对整个网站 在pages/api中创建文件使用&#xff0c;针对单个页面,也可以应用于所有页面 之前是在pages/api下创建的中间件去实现的&#xff0c;但是使用p…

Spring Boot集成RocketMQ

本文目的是&#xff1a;教会你使用Spring Boot集成RocketMQ。 pom.xml文件引入rocketMQ依赖 <!-- rocketmq 依赖--><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId>&…

XCTF:warmup[WriteUP]

CtrlU查看页面源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible&q…

嵌入式学习第十四天!(结构体、共用体、枚举、位运算)

1. 结构体&#xff1a; 1. 结构体类型定义&#xff1a; 嵌入式学习第十三天&#xff01;&#xff08;const指针、函数指针和指针函数、构造数据类型&#xff09;-CSDN博客 2. 结构体变量的定义&#xff1a; 嵌入式学习第十三天&#xff01;&#xff08;const指针、函数指针和…

KAFKA鉴权设计以及相关探讨

文章目录 1. kafka的鉴权设计2. kafka鉴权应用范围3. kafka鉴权的常用方法3.1 SASL/GSSAPI3.2 SASL/PLAIN3.2.1 配置jaas3.2.2 配置服务启动参数3.2.3 配置server.perperties 4. 参考文档 鉴权&#xff0c;分别由鉴和权组成 鉴&#xff1a; 表示身份认证&#xff0c;认证相关用…

深度学习侧信道攻击的集成方法

深度学习侧信道攻击的集成方法 深度学习侧信道攻击的集成方法项目背景与意义摘要项目链接作者数据集CHES CTF 数据集ASCAD FIXED KEY 数据集ASCAD RANDOM KEY 数据集 代码代码执行神经网络 深度学习侧信道攻击的集成方法 项目背景与意义 在TCHES2020&#xff08;第4期&#x…

安卓线性布局LinearLayout

<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:…

如何用MapTalks IDE来发布网站?

简介 MapTalks IDE 全称 MapTalks集成设计环境&#xff08;Integrated Design Environment&#xff09;&#xff0c;是由MapTalks技术团队开发的新一代web地图设计软件。 通过MapTalks IDE&#xff0c;您可以自由的创建二维和三维地图&#xff0c;在其中载入或创建地理数据&a…

什么是okhttp?

OkHttp简介&#xff1a; OkHttp 是一个开源的、高效的 HTTP 客户端库&#xff0c;由 Square 公司开发和维护。它为 Android 和 Java 应用程序提供了简单、强大、灵活的 HTTP 请求和响应的处理方式。OkHttp 的设计目标是使网络请求变得更加简单、快速、高效&#xff0c;并且支持…

【数据结构与算法】之哈希表系列-20240130

这里写目录标题 一、383. 赎金信二、387. 字符串中的第一个唯一字符三、389. 找不同四、409. 最长回文串五、448. 找到所有数组中消失的数字六、594. 最长和谐子序列 一、383. 赎金信 简单 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不…

【Midjourney】新手指南:命令

1./ask 向Midjourney提问&#xff0c;不过问题和回答都是英文的&#xff0c;例如&#xff1a; 2./blend 将两张图片合并为一张 ​ 3./describe 上传一张图片&#xff0c;Midjourney会生成四组该图片相关的关键词&#xff0c;可以使用这些关键词再生成图片。 ​ 4./turbo …

力扣 55.跳跃游戏

思路&#xff1a; 从后往前遍历&#xff0c;遇到元素为0时&#xff0c;记录对应的下标位置&#xff0c;再向前遍历元素&#xff0c;看最大的跳跃步数能否跳过0的位置&#xff0c;不能则继续往前遍历 代码&#xff1a; class Solution { public:bool canJump(vector<int>…

毕业设计过程学习

传统的目标检测算法主要通过人工设计与纹理、颜色和形状相关的特征来进行目标区域特征的提取。随着深度学习和人工智能技术的飞速发展&#xff0c;目标检测技术也取得了很大的成就。早期基于深度学习的目标检测算法的研究方向仍然是将目标定位任务和图像分类任务分离开来的&…

uni-app在hbuilderx打开微信开发工具运行

一、运行设置配置微信开发者工具路径 运行-运行到小程序模拟器-运行设置 配置微信开发工具的安装路径&#xff08;可浏览文件位置选择&#xff09;&#xff1b;web服务器端口号在第二步骤获得&#xff1b; 二、打开微信开发者工具设置-安全设置 打开服务端口开关&#xff0…

使用ffmpeg madiamtx制作一个rtsp源

有很多人在跑rtsp解码的demo的时候, 苦于找不到一个可以拉流的源, 这里说一个简单的方法. 使用mediamtx, 加ffmpeg加mp4文件方式, 模拟一个rtsp的源. 基本架构就是这样. 在PC上, 这里说的PC可以是远程的服务器, 也可以是你的开发用的windows, 都行. 把mediamtx, 在pc上跑起来 …

书写触感细腻的电容触控笔,透明造型超好看,西圣Pencil2上手

iPad在配上手写笔之后&#xff0c;才能才能充分发挥优势&#xff0c;实现除看视频之外的更多功能。很多人入手iPad的初衷都是工作或者学习&#xff0c;如果只拿来观剧或玩游戏就太浪费了。当然了&#xff0c;现实情况下&#xff0c;Apple Pencil高昂的定价也是很多人望而却步的…

【2024-01-20】 瑞幸咖啡小程序-blackbox

需要联系主页V 瑞幸咖啡小程序 登入需要过同盾滑块下单需要balckbox参数 测试 下单 过滑块 登入发短信 加密参数

理解React中的setState()方法

在React中&#xff0c;setState()方法是一个非常重要的概念&#xff0c;它用于更新组件的状态并触发重新渲染。本文将探讨setState()的使用方法、工作原理以及一些基本的用法。 setState()方法简介 setState()是React组件中用于更新状态的方法之一。它接受一个对象或一个函数作…

第九节HarmonyOS 常用基础组件20-Divider

1、描述 提供分割器组件&#xff0c;分割不同内容块或内容元素。 2、接口 Divider() 3、属性 名称 参数类型 描述 vertical boolean 使用水平分割线还是垂直分割线。 false&#xff1a;水平分割线 true&#xff1a;垂直分割线 color ResourceColor 分割线颜色 默认…