Kubernetes之Probe探针

news2024/11/15 14:20:27

目录

存活、就绪和启动探针

存活探针(Liveness Probe)

就绪探针(Readiness Probe)

启动探针(Startup Probe)

检测方式:

exec:

HTTP GET:

TCP Socket:

grpc:

配置探针

配置存活探针:

定义存活探测命令:

定义一个存活态 HTTP 请求接口

定义 TCP 的存活探测

配置就绪探针

配置启动探针

探针的配置字段


存活、就绪和启动探针

存活探针(Liveness Probe)

存活探针决定何时重启容器。 例如,当应用在运行但无法取得进展时,存活探针可以捕获这类死锁。

如果一个容器的存活探针失败多次,kubelet 将重启该容器。

存活探针不会等待就绪探针成功。 如果你想在执行存活探针前等待,你可以定义 initialDelaySeconds,或者使用启动探针。

就绪探针(Readiness Probe)

就绪探针决定何时容器准备好开始接受流量。 这种探针在等待应用执行耗时的初始任务时非常有用,例如建立网络连接、加载文件和预热缓存。

如果就绪探针返回的状态为失败,Kubernetes 会将该 Pod 从所有对应服务的端点中移除,并且不会将该Pod的IP地址添加到对应Service的负载均衡池中,从而避免将流量路由到该容器。

就绪探针在容器的整个生命期内持续运行。

启动探针(Startup Probe)

启动探针检查容器内的应用是否已启动。 启动探针可以用于对慢启动容器进行存活性检测,避免它们在启动运行之前就被 kubelet 杀掉。

如果配置了这类探针,它会禁用存活检测和就绪检测,直到启动探针成功为止。

这类探针仅在启动时执行,不像就绪探针那样周期性地运行。

检测方式

exec:

在容器内执行特定命令,根据命令的退出状态码来判断是否成功。如果命令返回状态码为0,则认为容器是健康的;否则,认为容器不健康。


HTTP GET:

对容器的IP地址上的指定端口和路径执行HTTP GET请求。如果响应的状态码在200-399之间,则认为容器是健康的。


TCP Socket:

检查容器的指定端口是否能够接受TCP连接。如果连接成功,则认为容器是健康的。

grpc:

v1.27以上版本适用

通过gRPC协议与容器内的应用程序通信,并基于应用程序的响应来判断其是否健康。如"SERVING",Kubernetes会认为这次健康检查是成功的,并据此判断容器是健康的。

配置探针

配置存活探针:

定义存活探测命令:

创建pod并以 busybox 为基础镜像的yaml文件:

[root@k8s-master-1 probe]# vim liveness.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

在这个配置文件中, periodSeconds 字段指定了 kubelet 应该每 5 秒执行一次存活探测;

initialDelaySeconds 字段告诉 kubelet 在执行第一次探测前应该等待 5 秒;

kubelet 在容器内执行命令 cat /tmp/healthy 来进行探测,如果命令执行成功并且返回值为 0,kubelet 就会认为这个容器是健康存活的;

如果这个命令返回非 0 值,kubelet 会杀死这个容器并重新启动它。

/bin/sh -c "touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600"

这个容器生命的前 30 秒,/tmp/healthy 文件是存在的。 所以在这最开始的 30 秒内,执行命令 cat /tmp/healthy 会返回成功代码, 30 秒之后,执行命令 cat /tmp/healthy 就会返回失败代码。

创建pod并查看其信息:

[root@k8s-master-1 probe]# kubectl apply -f liveness.yaml

[root@k8s-master-1 probe]# kubectl describe pod liveness-exec

前30s显示的信息,表明还没有存活探针失败:

再过5s后显示的信息,在输出结果的最下面,表示有信息显示存活探针失败了,这个失败的容器被杀死并且被重建了。

再等 30 秒,输出结果显示 RESTARTS 的值增加了 1, 失败的容器恢复为运行状态,RESTARTS 计数器就会增加 1,确认这个容器被重启了:

定义一个存活态 HTTP 请求接口

 下面是一个 Pod 的配置文件,其中运行一个基于 registry.k8s.io/e2e-test-images/agnhost 镜像的容器

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: registry.k8s.io/e2e-test-images/agnhost:2.40
    args:
    - liveness
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

在这个配置文件中, periodSeconds 字段指定了 kubelet 每隔 3 秒执行一次存活探测,initialDelaySeconds 字段告诉 kubelet 在执行第一次探测前应该等待 3 秒;

kubelet 会向容器内运行的服务(服务在监听 8080 端口)发送一个 HTTP GET 请求来执行探测, 如果服务器上 /healthz 路径下的处理程序返回成功代码,则 kubelet 认为容器是健康存活的, 如果处理程序返回失败代码,则 kubelet 会杀死这个容器并将其重启;

返回大于或等于 200 并且小于 400 的任何代码都标示成功,其它返回代码都标示失败。

容器存活期间的最开始 10 秒中,/healthz 处理程序返回 200 的状态码, 之后处理程序返回 500 的状态码。

kubelet 在容器启动之后 3 秒开始执行健康检查。所以前几次健康检查都是成功的。 但是 10 秒之后,健康检查会失败,并且 kubelet 会杀死容器再重新启动容器。

10 秒之后,通过查看 Pod 事件来确认存活探针已经失败,并且容器被重新启动了:

[root@k8s-master-1 probe]# kubectl describe pod liveness-http

定义 TCP 的存活探测

使用这种配置时,kubelet 会尝试在指定端口和容器建立套接字链接。

如果能建立连接,这个容器就被看作是健康的,如果不能则这个容器就是不健康的。

apiVersion: v1
kind: Pod
metadata:
  name: goproxy
  labels:
    app: goproxy
spec:
  containers:
  - name: goproxy
    image: registry.k8s.io/goproxy:0.1
    ports:
    - containerPort: 8080
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 10
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 10

这个例子同时使用就绪探针和存活探针;

kubelet 会在容器启动 15 秒后运行第一次存活探测, 此探测会尝试连接 goproxy 容器的 8080 端口, 如果此存活探测失败,容器将被重启,kubelet 将继续每隔 10 秒运行一次这种探测。

除了存活探针,这个配置还包括一个就绪探针, kubelet 会在容器启动 15 秒后运行第一次就绪探测, 与存活探测类似,就绪探测会尝试连接 goproxy 容器的 8080 端口。 如果就绪探测失败,Pod 将被标记为未就绪,且不会接收来自任何服务的流量。

15 秒之后,通过查看 Pod 事件来检测存活探针:

[root@k8s-master-1 probe]# kubectl describe pod goproxy

配置就绪探针

就绪探针的配置和存活探针的配置相似,唯一区别就是要使用 readinessProbe 字段,而不是 livenessProbe 字段。

readinessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 5
  periodSeconds: 5

HTTP 和 TCP 的就绪探针配置也和存活探针的配置完全相同。

就绪和存活探测可以在同一个容器上并行使用。 两者共同使用,可以确保流量不会发给还未就绪的容器,当这些探测失败时容器会被重新启动。

配置启动探针

直接使用命名端口进行 HTTP 或 TCP 检测:

ports:
- name: liveness-port
  containerPort: 8080

livenessProbe:
  httpGet:
    path: /healthz
    port: liveness-port

一般来说,需要使用相同的命令来设置启动探测;

针对 HTTP 或 TCP 检测,可以通过将 failureThreshold * periodSeconds 参数设置为足够长的时间来应对最差情况下的启动时间。

使用启动探针保护,例如:

ports:
- name: liveness-port
  containerPort: 8080

livenessProbe:
  httpGet:
    path: /healthz
    port: liveness-port
  failureThreshold: 1
  periodSeconds: 10

startupProbe:
  httpGet:
    path: /healthz
    port: liveness-port
  failureThreshold: 30
  periodSeconds: 10

在启动探测的保护下,应用将会有最多 5 分钟(30 * 10 = 300s)的时间来完成其启动过程;

一旦启动探测成功一次,存活探测任务就会接管对容器的探测,对容器死锁作出快速响应, 如果启动探测一直没有成功,容器会在 300 秒后被杀死,并且根据 restartPolicy 来执行进一步处置。

探针的配置字段

initialDelaySeconds:

容器启动后要等待多少秒后才启动启动、存活和就绪探针, 如果定义了启动探针,则存活探针和就绪探针的延迟将在启动探针已成功之后才开始计算, 如果 periodSeconds 的值大于 initialDelaySeconds,则 initialDelaySeconds 将被忽略,默认是 0 秒,最小值是 0。


periodSeconds:

执行探测的时间间隔(单位是秒),默认是 10 秒,最小值是 1。


timeoutSeconds:

探测的超时后等待多少秒,默认值是 1 秒,最小值是 1。
successThreshold:探针在失败后,被视为成功的最小连续成功数,默认值是 1, 存活和启动探测的这个值必须是 1,最小值是 1。


failureThreshold:

探针连续失败了 failureThreshold 次之后, Kubernetes 认为总体上检查已失败(Unready、Unhealthy、Pending、Failed、Terminated)。默认值为 3,最小值为 1, 对于启动探针或存活探针而言,如果至少有 failureThreshold 个探针已失败, Kubernetes 会将容器视为不健康并为这个特定的容器触发重启操作, kubelet 遵循该容器的 terminationGracePeriodSeconds 设置,对于失败的就绪探针,kubelet 继续运行检查失败的容器,并继续运行更多探针; 因为检查失败,kubelet 将 Pod 的 Ready 状况 设置为 false。


terminationGracePeriodSeconds:

为 kubelet 配置从为失败的容器触发终止操作到强制容器运行时停止该容器之前等待的宽限时长, 默认值是继承 Pod 级别的 terminationGracePeriodSeconds 值(如果不设置则为 30 秒),最小值为 1。

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

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

相关文章

linux DHCP和VSFTP原理与配置

目录 一、DHCP工作原理 1.1 了解DHCP服务 1.1.1 DHCP基本描述 1.1.2 使用DHCP的好处 1.1.3 DHCP的分配方式 1.2 DHCP的租约过程 1.3 使用DHCP动态配置主机地址 1.4 安装DHCP服务器 二、DHCP服务器的配置 2.1 实验环境准备 2.2 实验实战示列 三、DHCP客户端的使用 …

【数据结构】汇总八、排序算法

排序Sort 【注意】本章是 排序 的知识点汇总,全文1万多字,含有大量代码和图片,建议点赞收藏(doge.png)!! 【注意】在这一章,记录就是数据的意思。 排序可视化网站: D…

Python - PyQt5环境搭建与基本配置和使用教程

****前期准备:PyQt5以及其他组件的下载与安装 python的图形界面开发过程中,我们需要三个组件,分别是:PyQt5、pyqt5-tools、PyQt5Designer 一、安装 确保Python和pip已安装: PyQt5是基于Python的图形用户界面库&…

WEB渗透免杀篇-Bypass-AMSI

往期文章 WEB渗透免杀篇-加载器免杀-CSDN博客 WEB渗透免杀篇-分块免杀-CSDN博客 WEB渗透免杀篇-Powershell免杀-CSDN博客 WEB渗透免杀篇-Python源码免杀-CSDN博客 WEB渗透免杀篇-C#源码免杀-CSDN博客 WEB渗透免杀篇-MSFshellcode免杀-CSDN博客 WEB渗透免杀篇-Bypass-AMSI-…

【大模型从入门到精通28】开源库框架LangChain 语义搜索:高级检索策略2

这里写目录标题 利用元数据与自我查询检索器元数据作为上下文信息初始化环境并定义元数据导入必要的模块定义元数据属性 配置自我查询检索器执行带有自动元数据推断的查询实现上下文压缩设置环境导入必要的类 初始化压缩工具创建上下文压缩检索器检索压缩文档 利用元数据与自我…

Nginx--日志

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、Nginx日志介绍 nginx 有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的…

别等GPT-4o啦,国产「开源版」GPT-4o 来了!支持全模态、无障碍交流

夕小瑶科技说 原创 作者 | 谢年年 腾讯最近的多模态进展有点子“一路高歌”,先是腾讯元宝升级了一波多模态能力,就差把GPT-4o从榜一拉下来了。 最近,又搞了一个和GPT-4o对标的交互式多模态模型——VITA,而且率先开源了。 每次…

算法-IMM

trajectory-prediction程序的imm.cc中的以下代码的对应的算法原理在后面 void IMM_UKF::InputInteract() {if (std::isnan(model_pro_(0)) || std::isnan(model_pro_(1)) || std::isnan(model_pro_(2)))std::abort();if (model_pro_.sum() ! 0)model_pro_ / model_pro_.sum();…

模组卡死?五步排查法助你快速定位并解决问题!

直线模组是许多机械设备中不可或缺的组件,在使用过程中可能会遇到各种故障,卡死是模组运行过程中最常出现的现象。以下是一些常见的直线模组卡死解决方法: 1、模组内部可能积聚了灰尘、杂质等,这些物质在模组运行过程中可能进入关…

Windows系统下两个不同版本的java切换

前言:在电脑中,已经安装好了两个不同版本的java,为了使用CMD随意切换两个不同版本的java,我们通过创建批处理文件来达到目的。 假设目前电脑中存在的两个java版本分别是java8和java21。 首先,创建java8的批处理文件“j…

minio下载镜像地址及启动脚本

MinIO下载 | 中国镜像下载加速站https://dl.minio.org.cn/server/minio/release/linux-amd64/archive/ MinIO下载 | 中国镜像下载加速站https://dl.minio.org.cn/client/mc/release/linux-amd64/ 文档: 单节点单硬盘部署MinIO — MinIO中文文档 | MinIO Linux中文文档 启动脚…

leetcode刷题-动态规划part01

代码随想录动态规划part01|动态规划理论基础、 509. 斐波那契数、 70. 爬楼梯 、746. 使用最小花费爬楼梯 动态规划基础509. 斐波那契数70.爬楼梯746. 使用最小花费爬楼梯 动态规划基础 动规五部曲: dp数组以及下标的含义:dp[i][j] dp[i]递推公式dp数组…

大模型格局变天:Llama3.1诞生

一、Llama3.1的背景 北美时间7月23日,Meta公司(原Facebook)宣布了一项重大突破:开源模型Llama 3.1的正式发布。这一举措预示着AI技术的又一次飞跃,Llama 3.1有望成为迄今为止最强大的开源大型语言模型(LLM&…

Startup-SBOM:一款针对RPM和APT数据库的逆向安全工具

关于Startup-SBOM Startup-SBOM是一款针对RPM和APT数据库的逆向分析与安全检测工具,该工具本质上是一个简单的 SBOM 实用程序,旨在提供正在执行的包的内部视图,可以帮助广大研究人员枚举所有软件包以及可执行文件、服务和版本。 该工具的流程…

Docker 部署loki日志 用于微服务

因为每次去查看日志都去登录服务器去查询相关日志文件,还有不同的微服务,不同日期的文件夹,超级麻烦,因为之前用过ELK,原本打算用ELK,在做技术调研的时候发现了一个轻量级的日志系统Loki,果断采…

【大模型从入门到精通29】开源库框架LangChain 语义搜索:高级检索策略3

这里写目录标题 实现上下文压缩与 MMR 的文档检索设置基于压缩的检索器与 MMR探索替代文档检索方法加载和准备文档实现 TF-IDF 和 SVM 检索器最佳实践结论理论问题实践问题 实现上下文压缩与 MMR 的文档检索 设置基于压缩的检索器与 MMR 上下文压缩的目标是通过关注与查询最相…

tomcat的初实现与memcache

文章目录 1. tomcat实现多虚拟机2. tomcat定制访问日志格式3. tomcat实现MSM集群4. JVM垃圾回收算法和分代5. memcache使用,安装和MSM原理 1. tomcat实现多虚拟机 一键安装tomcat并启动,使用openjdk #!/bin/bash version10.1.28 usertomcat grouptomcat…

【C++初阶】:C++入门篇(一)

文章目录 前言一、C命名空间1.1 命名空间的定义1.2 命名空间的使用 二、C的输入和输出2.1 cin和cout的使用 三、缺省参数3.1 缺省参数的分类 四、函数重载4.1 函数重载概念及其条件4.2 C支持函数重载原理 -- 名字修饰 前言 C是在C语言的基础之上,增加了一些面向对象…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector

1.杨辉三角 . - 力扣&#xff08;LeetCode&#xff09; 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> arr;int i 0;int j 0;for (i…

Git入门 -- 区域详解

Git入门 – 区域详解 1.Git 1.1 Git与SVN的区别 Git不仅仅是版本控制系统&#xff0c;同时也是内容管理系统。以下是Git与SVN的区别&#xff1a; 分布式&#xff1a;Git是分布式但SVN不是&#xff0c;这是Git与其他系统的核心区别。存储方式为元数据&#xff1a;Git在存储数…