浅析Kubernetes健康检查与优雅终止

目录

Pod探针

livenessProbe(存活检查)

readinessProbe(就绪检查)

startupProbe(启动检查)

支持的三种检查方法

minReadySeconds

示例Yaml

Hook钩子

postStart 钩子

preStop 钩子

terminationGracePeriodSeconds

示例Yaml


        在 Kubernetes 生态中,容器的生命周期管理和应用的优雅上下线至关重要。Kubernetes 通过 Pod 探针和生命周期钩子等机制,为容器提供了精细的健康监测和状态管理能力。Pod 探针确保只有处于健康状态的容器能够服务请求,而生命周期钩子则在容器启动和终止时执行定制化操作,从而实现应用的平滑启动和优雅终止。这些机制共同保障了应用的稳定运行和数据一致性,是 Kubernetes 高效管理容器化应用不可或缺的工具。

Pod探针

        Kubernetes中提供了三种Pod探针类型,用于确保容器的健康状态和可用性

livenessProbe(存活检查)

        存活检查用于判断容器是否存活。如果检查失败,Kubernetes将杀死容器,并根据Pod的restartPolicy来决定是否重启容器。

readinessProbe(就绪检查)

        就绪检查用于判断容器是否已经准备好接受请求。如果检查失败,Kubernetes会将Pod从Service的endpoints中移除,不再将请求转发给该Pod。这在应用启动时需要加载大量数据或配置文件,或者依赖外部服务的情况下特别有用。就绪检查是周期性运行的。

startupProbe(启动检查)

        启动检查用于保护慢启动的容器,如nacos、mysql等。它会周期性地检查容器,直到第一次成功响应。一旦成功响应,Kubernetes将认为应用已启动成功,并开始进行就绪检查和存活检查。如果提供了启动探针,则所有其他探针都会被禁用,直到此探针成功为止一旦成功响应,Kubernetes 将认为应用已启动成功,并开始进行 Readiness 和 Liveness 探针的检查。如果容器没有提供启动探测,则默认状态为 Success

健康检查的执行顺序为:startupProbe -> readinessProbelivenessProbe

支持的三种检查方法

  • httpGet:发送HTTP请求,返回200-400范围内的状态码视为成功。
  • exec:执行Shell命令,返回状态码为0视为成功。
  • tcpSocket:发起TCP Socket连接,建立成功视为成功。

minReadySeconds

readinessProbe参数 - minReadySeconds

        默认情况下,一旦新创建的Pod变成就绪状态,Kubernetes就会认为该Pod可用,并将旧的Pod删除。但有时问题可能会在新Pod真正处理用户请求时才暴露。因此,一个更稳健的做法是在新Pod就绪后对其观察一段时间再删除旧的Pod。如果配置了readinessProbe,则观察时间为readinessProbe消耗时间 + minReadySeconds

示例Yaml

  1. startupProbe使用HTTP GET请求/healthz路径来进行启动检查。如果连续30次检查失败(failureThreshold: 30),则认为容器启动失败。检查间隔为10秒(periodSeconds: 10)。

  2. readinessProbe使用TCP Socket连接来进行就绪检查。在容器启动5秒后开始第一次检查(initialDelaySeconds: 5),之后每5秒检查一次(periodSeconds: 5)。

  3. livenessProbe使用exec执行命令cat /tmp/healthy来进行存活检查。在容器启动10秒后开始第一次检查(initialDelaySeconds: 10),之后每5秒检查一次(periodSeconds: 5)。

  4. minReadySeconds设置为30,表示新Pod就绪后至少观察30秒再认为其可用。

  5. terminationGracePeriodSeconds设置为60,表示在收到停止请求后,容器有最多60秒的时间进行优雅关闭。

apiVersion: v1
kind: Pod
metadata:
  name: health-check-demo
spec:
  containers:
  - name: my-app
    image: my-app:v1
    ports:
    - containerPort: 8080
    startupProbe:  # 启动检查
      httpGet:
        path: /healthz
        port: 8080
      failureThreshold: 30  # 失败阈值,最多重试30次
      periodSeconds: 10     # 检查间隔,每10秒检查一次
    readinessProbe:  # 就绪检查
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5  # 延迟5秒后开始第一次检查
      periodSeconds: 5        # 检查间隔,每5秒检查一次
    livenessProbe:   # 存活检查
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 10  # 延迟10秒后开始第一次检查
      periodSeconds: 5         # 检查间隔,每5秒检查一次
    minReadySeconds: 30  # 新Pod就绪观察时间,至少30秒
  terminationGracePeriodSeconds: 60  # 优雅关闭宽限期,最多60秒


Hook钩子

        Kubernetes 提供了两种容器生命周期钩子,用于在容器启动后和终止前执行特定的操作:postStart 和 preStop。

postStart 钩子

        postStart 钩子在容器启动后执行,适用于需要在容器启动后进行初始化的场景。postStart 不能保证钩子在容器的 ENTRYPOINT 和 CMD 之前运行。

应用场景

  • 初始化配置文件:在容器启动后,可以使用 postStart 钩子从配置管理系统(如 Consul、etcd)中获取最新的配置文件,并将其写入容器内的指定位置,以确保应用程序使用最新的配置。

  • 注册服务:对于微服务架构,可以在容器启动后使用 postStart 钩子将服务实例注册到服务发现系统(如 Eureka、Zookeeper),以便其他服务能够发现和调用该服务。

  • 初始化缓存:在容器启动后,可以使用 postStart 钩子预先加载常用数据到内存缓存(如 Redis),以提高应用程序的性能和响应速度。

preStop 钩子

     preStop 钩子是 Kubernetes 在终止容器前立即调用的一个机制,其主要目的是为了使应用程序能够优雅地关闭,同时也能够向其他系统发送必要的通知。这个钩子的执行是同步进行的,这意味着在 Kubernetes 发起删除容器的操作之前,preStop 钩子里的任务必须全部执行完毕。如果这个钩子在执行过程中出现了挂起的情况,那么相关的 Pod 将会一直保持在 Running 状态,并不会转变为 Failed 状态。

        在使用 preStop 钩子时,有一点需要特别注意:它与 SIGTERM 信号的处理是异步的,即 Kubernetes 在发送 SIGTERM 信号后,不会等待 preStop 钩子的执行完成。因此,在设计 preStop 钩子时,开发者需要考虑到 preStop 钩子的执行可能会与处理 SIGTERM 信号的逻辑同时进行。为了避免在终止过程中出现未完成的操作和潜在的数据丢失,开发者应确保 preStop 钩子中的所有操作都能在 terminationGracePeriodSeconds 指定的宽限期内完成如果容器因为崩溃等原因异常终止,preStop 钩子将不会被触发执行

应用场景

  • 关闭长连接:对于使用长连接的应用程序(如 WebSocket),可以在容器终止前使用 preStop 钩子优雅地关闭这些连接,以避免客户端出现连接中断的问题。

  • 刷新缓存到持久化存储:在容器终止前,可以使用 preStop 钩子将内存中的缓存数据刷新到持久化存储(如数据库),以确保数据的一致性和持久性。

  • 通知依赖服务:在微服务架构中,当一个服务实例即将终止时,可以使用 preStop 钩子通知依赖该服务的其他服务,以便它们能够及时更新服务调用的目标地址,避免出现服务不可用的情况。

  • 上传调试信息:在容器终止前,可以使用 preStop 钩子收集和上传应用程序的调试信息(如内存快照、线程转储等)到调试平台,以便开发人员进行问题排查和性能优化。

支持的两种方式

  • Exec:通过执行容器内的命令来触发操作。这种方式是直接在容器内部执行指定的 shell 命令或脚本。当使用 exec 方式时,需要提供一个命令(可能带有参数),Kubernetes 会在容器内部环境中执行这个命令。例如,可以使用 exec 方式在容器启动后初始化一些数据,或者在容器停止前清理临时文件。

  • HTTP Get:通过发送 HTTP GET 请求到容器的某个端口上的指定路径。这种方式适用于触发容器内部的 Web 服务接口,如健康检查端点或其他 RESTful API。使用 HTTP Get 方式时,需要指定请求的路径和端口,Kubernetes 会向该路径发送一个 HTTP GET 请求。如果请求成功,即视为操作成功完成。

terminationGracePeriodSeconds

  terminationGracePeriodSeconds 参数指定了从 Kubernetes 发送 SIGTERM 信号给 Pod 开始,到 Kubernetes 强制结束 Pod 为止的时间窗口长度。这个时间段允许 Pod 有序地进行关闭流程,包括执行 preStop 钩子里定义的任务。系统默认的 terminationGracePeriodSeconds 时间为 30 秒。

        如果 Pod 在执行 preStop 钩子的过程中,如关闭数据库连接或者完成正在处理的请求,所需时间超过了 terminationGracePeriodSeconds 所设定的时间,那么 Kubernetes 将不会等待 preStop 钩子执行完毕,Pod 将会在 preStop 钩子完成之前被强制终止。这可能会导致应用程序的不稳定和数据的不一致性。因此设置一个合理的terminationGracePeriodSeconds 值尤为重要!

示例Yaml

postStart 和 preStop 钩子可以在 Kubernetes 的 Pod 配置中的 spec.containers.lifecycle 字段中定义。可以指定在容器启动后(postStart)或终止前(preStop)执行的操作。这些操作可以是执行命令(exec)或发送 HTTP 请求(httpGet)。

        在这个例子中,在MySQL 容器的生命周期中使用 postStart 和 preStop 钩子执行特定的操作,如初始化数据库、导出数据和优雅地关闭 MySQL 进程:

  1. postStart 钩子

    • 在 MySQL 容器启动后,通过 exec 执行一系列 MySQL 命令。
    • 首先,使用 mysqladmin 创建一个名为 mydb 的数据库。
    • 然后,使用 mysql 命令将 /init-data.sql 文件中的 SQL 语句导入到 mydb 数据库中,用于初始化数据。
    • /init-data.sql 文件通过 ConfigMap 挂载到容器中。
  2. preStop 钩子

    • 在 MySQL 容器终止前,通过 exec 执行一系列 MySQL 命令。
    • 首先,使用 mysqldump 将 mydb 数据库的数据导出到 /final-data.sql 文件中,用于持久化数据。
    • 然后,使用 mysql 命令执行 STOP SLAVE; 语句,停止 MySQL 复制进程(如果有的话)。
    • /final-data.sql 文件通过 emptyDir 卷挂载到容器中,用于临时存储导出的数据。
apiVersion: v1
kind: Pod
metadata:
  name: mysql-with-lifecycle
spec:
  containers:
  - name: mysql
    image: mysql:5.7
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "password"
    ports:
    - containerPort: 3306
    lifecycle:
      postStart:
        exec:
          command:
          - /bin/bash
          - -c
          - |
            # 在容器启动后执行的操作
            # 1. 创建名为 mydb 的数据库
            mysqladmin -uroot -p$MYSQL_ROOT_PASSWORD create mydb
            # 2. 将 /init-data.sql 文件中的 SQL 语句导入到 mydb 数据库中
            mysql -uroot -p$MYSQL_ROOT_PASSWORD mydb < /init-data.sql
      preStop:
        exec:
          command:
          - /bin/bash
          - -c
          - |
            # 在容器终止前执行的操作
            # 1. 将 mydb 数据库的数据导出到 /final-data.sql 文件中
            mysqldump -uroot -p$MYSQL_ROOT_PASSWORD mydb > /final-data.sql
            # 2. 停止 MySQL 复制进程(如果有的话)
            mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "STOP SLAVE;"
    volumeMounts:
    - name: init-data
      mountPath: /init-data.sql
      subPath: init-data.sql
    - name: final-data
      mountPath: /final-data.sql
      subPath: final-data.sql
  volumes:
  - name: init-data
    configMap:
      name: mysql-init-data
  - name: final-data
    emptyDir: {}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】chatgpt pictureproxy.php SSRF漏洞(CVE-2024-27564)

0x01 漏洞概述 ChatGPT pictureproxy.php接口存在服务器端请求伪造 漏洞&#xff08;SSRF&#xff09; &#xff0c;未授权的攻击者可以通过将构建的 URL 注入 url参数来强制应用程序发出任意请求。 0x02 测绘语句 fofa: icon_hash"-1999760920" 0x03 漏洞复现 G…

Machine Learning机器学习之统计分析

目录 前言 机器学习之统计分析 统计学的主要目标包括&#xff1a; 统计学核心概念&#xff1a; 统计基础&#xff1a; 训练误差&#xff1a; 常见的损失函数&#xff1a; 正则化和交叉验证 博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉…

使用pytorch构建一个初级的无监督的GAN网络模型

在这个系列中将系统的构建GAN及其相关的一些变种模型&#xff0c;来了解GAN的基本原理。本片为此系列的第一篇&#xff0c;实现起来很简单&#xff0c;所以不要期待有很好的效果出来。 第一篇我们搭建一个无监督的可以生成数字 (0-9) 手写图像的 GAN&#xff0c;使用MINIST数据…

进阶了解C++(6)——二叉树OJ题

Leetcode.606.根据二叉树创建字符串&#xff1a; 606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 难度不大&#xff0c;根据题目的描述&#xff0c;首先对二叉树进行一次前序遍历&#xff0c;即&#xff1a; class Solution { public:string tree2str(Tr…

TheMoon 恶意软件短时间感染 6,000 台华硕路由器以获取代理服务

文章目录 针对华硕路由器Faceless代理服务预防措施 一种名为"TheMoon"的新变种恶意软件僵尸网络已经被发现正在侵入全球88个国家数千台过时的小型办公室与家庭办公室(SOHO)路由器以及物联网设备。 "TheMoon"与“Faceless”代理服务有关联&#xff0c;该服务…

【算法题】三道题理解算法思想--滑动窗口篇

滑动窗口 本篇文章中会带大家从零基础到学会利用滑动窗口的思想解决算法题&#xff0c;我从力扣上筛选了三道题&#xff0c;难度由浅到深&#xff0c;会附上题目链接以及算法原理和解题代码&#xff0c;希望大家能坚持看完&#xff0c;绝对能有收获&#xff0c;大家有更好的思…

Flask学习(六):蓝图(Blueprint)

蓝图&#xff08;Blueprint&#xff09;&#xff1a;将各个业务进行区分&#xff0c;然后每一个业务单元可以独立维护&#xff0c;Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法&#xff0c;它并不是必须要实现应用的视图和函数的。 Demo目录结构&#xf…

计算机专业学习单片机有什么意义吗?

玩单片机跟玩计算机区别还是很大的, 单片机有众多的种类,每一种又可能有很多个系列.可以说单片机就是为了专款专用而生的.这样来达到产品成本的降低,这就是现在身边的很多的电子产品价格一降再降的原因之一.在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一…

Python拆分PDF、Python合并PDF

WPS能拆分合并&#xff0c;但却是要输入编辑密码&#xff0c;我没有。故写了个脚本来做拆分&#xff0c;顺便附上合并的代码。 代码如下&#xff08;extract.py) #!/usr/bin/env python """PDF拆分脚本(需要Python3.10)Usage::$ python extract.py <pdf-fil…

腾讯云4核8g服务器多少钱?2024轻量和CVM收费价格表

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

uniapp 微信小程序 canvas 手写板获取书写内容区域并输出

uni.canvasGetImageData 返回一个数组&#xff0c;用来描述 canvas 区域隐含的像素数据&#xff0c;在自定义组件下&#xff0c;第二个参数传入自定义组件实例 this&#xff0c;以操作组件内 组件。 // 获取目标 canvas 的像素信息 pixelData let canvas uni.createSelector…

Linux 系统 CentOS7 上搭建 Hadoop HDFS集群详细步骤

集群搭建 整体思路:先在一个节点上安装、配置,然后再克隆出多个节点,修改 IP ,免密,主机名等 提前规划: 需要三个节点,主机名分别命名:node1、node2、node3 在下面对 node1 配置时,先假设 node2 和 node3 是存在的 **注意:**整个搭建过程,除了1和2 步,其他操作都使…

linux 内存介绍

大致共有四类&#xff1a;VSS、RSS、PSS、USS &#xff0c;通常情况下&#xff0c;VSS > RSS > PSS > USS 1.VSS(Virtual Set Size)虚拟耗用内存&#xff08;包含共享库占用的内存&#xff09; VSS表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已…

Vue3使用vue-office插件实现word预览

首先, 我们先来创建一个Vue3项目 npm init vuelatest pnpm i npm run dev运行起来之后, 我们将App.vue中的代码全部删除掉 现在, 页面干净了, 我们需要安装vue-office插件 npm install vue-office/docx vue-demi安装完成之后, 我们就可以在页面中进行使用了 需要我们将组件…

边缘计算AI盒子目前支持的AI智能算法、视频智能分析算法有哪些,应用于大型厂矿安全生产风险管控

一、前端设备实现AI算法 主要是基于安卓的布控球实现&#xff0c;已有的算法包括&#xff1a; 1&#xff09;人脸&#xff1b;2&#xff09;车牌&#xff1b;3&#xff09;是否佩戴安全帽&#xff1b;4&#xff09;是否穿着工装&#xff1b; 可以支持定制开发 烟雾&#xf…

(免费分享)基于springboot,vue超市管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plusredis 本项目分为系统管理员、…

|行业洞察·手机|《2024手机行业及营销趋势报告-18页》

报告的主要内容解读&#xff1a; 手机行业概述及品牌分布&#xff1a; 2022年&#xff0c;受疫情影响&#xff0c;中国国内手机市场出货量下降22.6%&#xff0c;总计2.72亿部。5G手机市场占有率中&#xff0c;苹果领先&#xff0c;其次是vivo、OPPO和华为。消费者换机时更注重性…

鸿蒙OS开发实战:【悬浮窗口】

背景 悬浮视图或者窗体&#xff0c;在Android和iOS两大移动平台均有使用&#xff0c;HarmonyOS 也实现了此功能&#xff0c;如下为大家分享一下效果 准备 熟读HarmonyOS 悬浮窗口指导 熟读HarmonyOS 手势指导 熟读ALC签名指导&#xff0c;用于可以申请 “ohos.permission.S…

github | ssh拉取github仓库报错connect to host github.com port 22: Connection refused

配置ssh key 通过 ssh key 解决本地和服务器连接的问题 $ cd ~/. ssh #检查本机已存在的ssh密钥 如果提示 No such file or directory 则表示第一次使用git 输入&#xff1a; ssh-keygen -t rsa -C "邮件地址" 并且连续3次回车&#xff0c;最终会生成一个文件&am…

如何在Flutter中进行网络请求?

Hello&#xff01;大家好&#xff0c;我是咕噜铁蛋&#xff0c;你们的好朋友&#xff01;今天&#xff0c;我想和大家分享一下在Flutter中如何进行网络请求。Flutter作为一个跨平台的开发框架&#xff0c;网络请求是其实现数据交互的重要一环。下面&#xff0c;我将详细介绍几种…