17、Health Check 健康检查

news2024/11/26 20:25:14
强大的自愈能力是kubernetes容器编排引擎的重要特性。 自愈的默认实现方式是自动重启发生故障的容器。除此之外,还可通过 Liveness和Readiness探测机制设置更精细的健康检查,进而实现如下要求:
  1. 零停机部署
  2. 避免部署无效的镜像
  3. 更加安全的滚动升级

一、Liveness探测 VS Readiness探测

  1. Liveness探测和Readiness探测是两种healthy check机制,若不特意配置,kubernetes将对两种探测采取相同的默认行为,即通过判断容器启动进程的返回值( echo $?)是否为零来判断探测是否成功。
  2. 两种探测的配置方法完全一样,支持的配置参数也一样。 不同之处在于探测失败后的行为:Liveness 探测是重启容器;Readiness 探测则是将容器设置为不可用,不接收 Service 转发的请求
  3. Liveness 探测和 Readiness 探测是独立执行的,二者之间没有依赖,所以 可以单独使用,也可以同时使用用 Liveness 探测判断容器是否需要重启以实现自愈;用 Readiness 探测判断容器是否已经准备好对外提供服务

1.1、每类探针都支持三种探测方法

  • exec: 通过执行命令来检查服务是否正常, 针对复杂检测或无 HTTP 接口的服务, 命 令返回值为 0 则表示容器健康。
  • httpGet : 通过发送 http 请求检查服务是否正常, 返回 200-400 状态码则表明容器健 康。
  • tcpSocket : 通过容器的 IP 和 Port 执行 TCP 检查, 如果能够建立 TCP 连接, 则表明 容器健康。

1.2、探针探测的结果

  • Success: Container 通过了检查。
  • Failure: Container 未通过检查。
  • Unknown: 未能执行检查, 因此不采取任何措施。

1.3、Pod 重启策略 restartpolicy

  • Always: 总是重启
  • OnFailure: 如果失败就重启
  • Never: 永远不重启

二、默认的健康检查

每个容器启动时都会执行一个进程,此进程由Dockerfile的CMD或ENTRYPOINT指定。如果 进程退出时返回码非零,则认为容器发生故障,kubernetes会根据restartPolicy重启容器。
模拟容器发生故障的场景,Pod配置文件如下:
apiVersion: v1
kind: Pod
metadata:
  name: healthcheck
  labels:
    test: healthcheck
spec:
  restartPolicy: OnFailure # 默认为Always
  containers:
  - name: healthcheck
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 10; exit 1   # 模拟容器启动 10 秒后发生故障
可见容器当前已经重启了3次。
上述例子是容器进程返回值非0,kubernetes认为容器发生故障,重启。但在某些时候进程并不会退出,比如访问 Web 服务器时显示 500 内部错误,可能是系统超载,也可能是资源死锁,此时进程并没有异常退出,在这种情况下重启容器可能是最直接最有效的解决方案,那我们如何利用 Health Check 机制来处理这类场景呢?-----答案就是 Liveness 探测

 2.1、Liveness探测

Liveness探测让用户自定义判断容器是否健康的条件,若探测失败,kubernetes就会重启容器。
Pod配置文件如下:
apiVersion: v1
kind: Pod
metadata:
  name: liveness
  labels:
    test: liveness
spec:
  restartPolicy: OnFailure # 默认为Always
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 10 # 指定容器启动10s后开始执行Liveness探测
      periodSeconds: 5 # 指定每5s执行一次Liveness探测,默认是10s,最小是1s
      timeoutSeconds: 1 # 探测超时时间,默认是1s,最小是1s

启动进程首先创建文件/tmp/healthy,30s后删除,如果/tmp/healthy文件存在,则认为容器处于正常状态,反之则发生故障。

livenessProbe部分定义如何执行Liveness探测:
  1. 探测的方法:通过cat检查/tmp/healthy文件是否存在。若命令执行成功,返回值为0,kubernetes则认为本次Liveness探测成功;若命令返回值非0,本次Liveness探测失败;
  2. initialDelaySeconds:10,指定容器启动10s后开始执行Liveness探测,一般会根据应用启动的准备时间来设置。比如某个应用正常启动要花 30 秒,那么 initialDelaySeconds 的值就应该大于 30;
  3. periodSeconds:5,指定每5s执行一次Liveness探测。 Kubernetes 如果连续执行 3 次 Liveness 探测均失败,则会杀掉并重启容器
下面创建 Pod liveness:
从配置文件可知,最开始的 30 秒,/tmp/healthy 存在,cat 命令返回 0,Liveness 探测成功,这段时间 kubectl describe pod liveness 的 Events部分会显示正常的日志:
35 秒之后,日志会显示 /tmp/healthy 已经不存在,Liveness 探测失败。再过几十秒,几次探测都失败后,容器会被重启。

2.2、Readiness探测

用户通过Liveness探测可以告诉kubernetes什么时候通过重启容器实现自愈;
Readiness探测则是告诉kubernetes什么时候可以将容器加入到Service负载均衡池中,对外提供服务
readinessProbe探测方法:
  1. exec,通过命令的方式
  2. httpGet,判断成功的方法是http请求返回的代码在200-400之间,若不在此范围,则不接收service请求;每隔 periodSeconds时间探测一次,连续 3次探测失败,容器会从负载均衡中移除,直到下次探测成功加入。探测方式http://[container_ip]:8080/path返回值
Readiness 探测的 Pod配置文件如下:
apiVersion: v1
kind: Pod
metadata:
  name: readiness
  labels:
    test: readiness
spec:
  restartPolicy: OnFailure # 默认为Always
  containers:
  - name: readiness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    readinessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 10 # 指定容器启动10s后开始执行Readiness探测
      periodSeconds: 5 # 指定每5s执行一次Liveness探测
Pod readiness 的 READY 状态经历了如下变化:
  1. 刚被创建时,READY状态为不可用;
  2. 15s后( initialDelaySeconds+ periodSeconds),第一次进行Readiness探测并成功返回,设置READY为可用;
  3. 30s后,/tmp/healthy被删除,连续3次 Readiness探测均失败后,READY被设置为不可用。
通过 kubectl describe pod readiness 也可以看到 Readiness 探测失败的日志:

三、在scale up中使用Healthy Check

    针对多副本应用,当执行Scale Up操作时,新副本会作为backend被添加到Service的负载均衡中,与已有副本一起处理客户请求。考虑到应用程序启动需要准备阶段(加载缓存数据、连接db),从容器启动到真正提供服务需要一段时间, 可以通过Readiness探测判断容器是否就绪,避免将请求发送到还没有ready的backend
示例应用的配置文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
spec:
  selector: # 通过标签选择被控制的pod
    matchLabels:
      app: web
  replicas: 2
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: web:1.0
        ports:
        - containerPort: 8080 # 转发到后端pod的端口号
        readinessProbe:
          httpGet:
            scheme: HTTP
            path: /python
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5
         
---
apiVersion: v1
kind: Service
metadata:
  name: web-svc
spec:
  type: NodePort # 添加NodePort类型的Service
  selector:
    app: web
  ports:   # 将 Service 的 8080 端口映射到 Pod 的 8080 端口,使用 TCP 协议
  - protocol: TCP
    port: 8080   # service监听端口
    targetPort: 8080 # 转发到后端pod的端口号
readinessProbe使用了不同于exec的另一种探测方法: httpGet
kubernetes对于httpGet方法探测成功的判断条件是http请求的返回代码在200-400之间。
  • schema 指定协议,支持 HTTP(默认值)和 HTTPS。
  • path 指定访问路径。
  • port 指定端口。
上面配置的作用是:
  1. 容器启动10s后开始探测;
  2. 如果http://container_ip:8080/python返回代码不是200-400,表示容器没有就绪,不接收Service web-svc的请求;
  3. 每隔5s再探测一次;
  4. 直至代码返回200-400,表明容器已经就绪,然后将其加入到web-svc的负载均衡中,开始处理客户请求;
  5. 探测会继续以5s的间隔请求,若连续3次失败,容器又会从负载均衡中移除。直到下次探测成功重新加入。

四、在Rolling Update中使用Healthy Check

现有一个正常运行的多副本应用,接下来对应用进行更新(比如使用更高版本的 image),Kubernetes 会启动新副本,然后发生了如下事件:
  1. 正常情况下新副本需要 10 秒钟完成准备工作,在此之前无法响应业务请求。
  2. 但由于人为配置错误,副本始终无法完成准备工作(比如无法连接后端数据库)。
先别继续往下看,现在请花一分钟思考这个问题:如果没有配置 Health Check,会出现怎样的情况?-------- 因为新副本本身没有异常退出,默认的 Health Check 机制会认为容器已经就绪,进而会逐步用新副本替换现有副本,其结果就是:当所有旧副本都被替换后,整个应用将无法处理请求,无法对外提供服务。如果这是发生在重要的生产系统上,后果会非常严重。
如果正确配置了 Health Check,新副本只有通过了 Readiness 探测,才会被添加到 Service;如果没有通过探测,现有副本不会被全部替换,业务仍然正常进行。
示例应用的配置文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  selector: # 通过标签选择被控制的pod
    matchLabels:
      app: app
  replicas: 10
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
      - name: app
        image: busybox
        args:
        - /bin/sh
        - -c
        - sleep 10; touch /tmp/healthy; sleep 30000
        readinessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 10
          periodSeconds: 5
10 秒后副本能够通过 Readiness 探测。

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

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

相关文章

有没有免费的视频剪辑软件?快来看看这些视频裁剪软件

我们有时候将视频拍好后,会觉得视频中有些画面的边缘出现了瑕疵,就想要将那些边缘裁剪掉,但是却不知道要怎么操作才能裁剪视频的画面。其实想要裁剪视频的画面很简单,我们只需要借助一些视频处理工具就可以实现裁剪视频画面的操作…

Swift 周报 第十八期 |技术汇总

前言 本期是 Swift 编辑组自主整理周报的第九期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。 欢迎投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。 蝴蝶的生命之所以如此短暂&#xff0c…

解决git中出现的“fatal ‘xxxx‘ does not appear to be a git repository”错误的方法

今天来分享一下我在使用git中出现的一个错误提示,话不多说,我们直接来分析~ 这个错误是我在通过SSH方式pull远程仓库时候出现的,错误提示如下: fatal: xxx(你的仓库别名) does not appear to be a git repository fatal: Could n…

【C++学习】string的模拟实现

🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! 上篇文章中本喵介绍了C标准库中string类的使用,下面本喵来模拟实现一下string类。库中的s…

【Spring框架】爆gan两万六千字,助你通关IoC和DI

✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:【Spring】 🥭本文内…

navicat连接mysql数据库

一、打开navicat软件 二、创建一个测试连接 1、点击【连接】,选择【MySQL】 2、创建连接。 3、连接出现报错 三、解决方式: 1、键盘上wins r 同时按,输入cmd,调出命令行窗口。 2、通过cmd登陆mysql 3、输入以下语句修改密码 更…

拿下50亿后,岚图能否一绘蓝图?

近两年,我国新能源汽车市场呈现出一派百家争鸣、高歌猛进的势头。2021年,A股新能源汽车指数全年上涨42.72%,大幅跑赢沪深300、中证500和汽车指数。 然而进入2022年寒冬,新能源汽车市场却集体打了个“哆嗦”。 美股特斯拉自今年4…

设备安装CoreELEC系统,并配置遥控:实现低成本NAS影音播放器

目录0. 前言CoreELEC简介动机硬件1.准备工作1.1下载镜像1.2 制作启动U盘2.安装CoreELEC2.1 从U盘启动2.2 CoreELEC写入盒子emmc3.设置遥控器本文原首发于zdm,由于该平台审核机制出现问题且编辑器极其不好用,所以发布于此 仅作为记录操作的用途 0. 前言 …

代码随想录66——额外题目【回溯、贪心】:52N皇后II、649Dota2 参议院、1221分割平衡字符串

文章目录1.52N皇后II1.1.题目1.2.解答2.649Dota2 参议院2.1.题目2.2.解答3.1221分割平衡字符串3.1.题目3.2.解答1.52N皇后II 参考:代码随想录,52N皇后II;力扣题目链接 1.1.题目 1.2.解答 这道题和之前做过的 51.N皇后 是一模一样的&#x…

怿星科技参加2022(第六届)高工智能汽车年会

2022(第六届)高工智能汽车年会将于下周三在上海虹桥拉开帷幕,怿星科技作为本次活动的赞助商,将在11月30日下午的【座舱算力与系统】分论坛与大家分享关于智能汽车软硬分离探索与实践的专题演讲。此外,在活动期间&#…

docker 之间相互通讯

方式一:通过IP直接访问(不推荐) 查询容器对应的IP命令: docker inspect 容器 | grep IPAddress 通过docker容器启动的实例分配的ip地址,直接访问,docker重启时IP会发生变化,所以不推荐 方式二:通过端口…

html 多按钮点击按钮颜色改变 捷弘和宇乐两个按钮,在点击选中时颜色做区分

捷弘和宇乐两个按钮&#xff0c;在点击选中时颜色做区分 点击捷弘按钮&#xff0c;捷弘按钮颜色改变&#xff1b;点击宇乐按钮&#xff0c;宇乐按钮颜色改变&#xff0c;捷弘按钮颜色恢复 如图&#xff1a; html代码&#xff1a; <a id"jiehong" class"bt…

安泰测试-Keithley吉时利2461数字源表产品参数

Keithley SMU 2461,吉时利2461数字源表&#xff1a; Keithley SMU 2400 图形系列 SourceMeter 溯源、测量、绘图和分析功能触手可及 Keithley 的触摸屏图形源测量单元仪器可带来直观的测试平台体验&#xff0c;满足电源和测量需求。 应用&#xff1a;离散设备、组件、FET、二管…

cpu设计和实现(pc跳转和延迟槽)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 cpu按部就班地去取指执行是理想情况。很多时候&#xff0c;cpu的pc寄存器会跳来跳去的。跳转的情况很多&#xff0c;一般可以分成三种。第一&#…

CRM软件哪个好?国内外6大顶级CRM软件盘点

CRM软件哪个好&#xff1f;国内外8大顶级CRM软件盘点 市场上存在上千种CRM管理系统&#xff0c;他们各有特色&#xff0c;难免让企业在选型时遇到诸多困难&#xff0c;有人说这款好用&#xff0c;有人说哪款好用... 所以本文将整理国内外那些顶级的CRM软件。 一、国内外6款CR…

分省/市/县最低工资标准-12-2021年1949-2020全国/省/市/县GDP数据

一、最低工资数据 1、数据来源&#xff1a;各省\市\县政府公布资料 2、时间跨度&#xff1a;2012-2021年 3、区域范围&#xff1a;全国各省\市\县 4、指标说明&#xff1a; 部分数据如下&#xff1a; 二、各省市县人均GDP 1、数据来源&#xff1a;地方统计局 2、时间跨度…

客户CRM能给企业带来哪些用处?

一、民营企业增加更多的总收入 CRM控制系统透过软件系统数个沟通沟通交流平台&#xff0c;不断扩大了与客人的沟通沟通交流距&#xff0c;保有终端版CRM&#xff0c;产品销售项目组足不出户与客人沟通交流&#xff0c;给民营企业增添了极高的股权投资股权投资回报。 简道云CR…

centos7中sshd -t没内容输出日志也没内容但sshd服务重启一直失败解决方法、strace命令的使用以及使用场景说明

文章目录ssh服务启动报错问题sshd启动报错说明解决方法常规排除定位法解决修改ssh的selinux上下文扩展知识【strace命令】ssh服务启动报错问题 sshd启动报错说明 sshd服务如果起不来&#xff0c;查日志一般都会有相应信息记录&#xff0c;如果sshd -t中有输出&#xff0c;不会…

都要2023年了,Android开发是否还值得入场?

随着手机行业的飞速发展&#xff0c;现在国产手机也迎来了高速发展时期&#xff0c;越来越多的人使用国产手机&#xff0c;同时开发安卓APP的人也越来越多了&#xff0c;下面来看看安卓app开发市场前景如何&#xff1f; 1、 消费用户群体成熟。安卓智能手机的市场份额可以说是庞…

Linux进程通信:命名管道,System V共享内存

目录 1.命名管道 2.共享内存 3.共享内存和管道的生命周期 4.共享内存的优缺点 1.命名管道 命名管道和匿名管道的最大差别是&#xff1a;命名管道是创建在磁盘里的一个有名字的文件。这个文件不存实际的数据。但是不同进程可以通过文件路径找到相同的struct file&#xff08…