【Kubernetes运维篇】零故障升级Pod健康探测详解

2023-11-19

一、Pod健康探测介绍

中文官方参考文档:

Pod探测是Kubernetes中的一种机制,用于检测Pod的状态和健康状况。当探测到Pod状态不正常时,根据重启策略进行相应的Pod操作,探测可以帮助Kubernetes集群自动化地管理容器的健康状态,提高应用程序的可靠性和可用性。

探测针对Pod中容器进行操作,所以探测定义在kubectl explain pod.spec.containers 字段下面

1、三种容器探测方法

  • 启动探测(StartupProbe):探测Pod中容器中的应用 是否已经启动,如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。

  • 存活探测(Liveness Probe):探测Pod中容器是否正常运行,如果探测失败,kubelet根据重启策略判断是否重启该容器。

  • 就绪探测(Readiness Probe):检测容器中的应用是否可以接受请求,当探测成功后才使Pod对外提供网络访问,将容器标记为就绪状态,可以加到pod前端负载,如果探测失败,则将容器标记为未就绪状态,会把pod从前端负载移除。

三种探测的优先级是 启动探测最高,存活探测、就绪探测并行,启动探测成功后才会进行下面的探测。

2、常用三种探测探针

启动探测、存活探测、就绪探测都支持下面三种探针:

  • exec:在容器执行命令,通过返回码判断是否执行成功,非零表示失败。
  • tcpSocket:通过容器的IP地址和端口执行TCP检查,如果可以建立TCP连接,则表示探测成功。
  • httpGet:通过容器的IP地址、端口号及路径调用 HTTP Get方法,如果响应的状态码大于等于200且小于400,则认为容器健康。

探针探测结果有以下值:

  • Success:表示通过检测。

  • Failure:表示未通过检测。

  • Unknown:表示检测没有正常进行

3、探针相关属性说明

使用帮助命令查看相关属性:

kubectl explain pod.spec.containers.startupProbe
  • periodSeconds:执行探测的间隔时间,单位秒,默认10秒
  • timeoutSeconds:执行探测后,超时时间,单位秒,默认1秒
  • successThreshold:连续探测几次成功,才算成功,默认1秒
  • failureThreshold:探测失败重试次数,默认3次,最小1次

二、探测案例

1、Pod启动探测案例-startupProbe

案例一:使用 exec 探测容器内是否可以查看到tomcat进程,如果没有表示探测失败,根据重启策略做出对应的操作。

cat startupProbe-exec.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-startupprobe
  namespace: default
  labels:
    app: tomcat
    env: uat
spec:
  containers:
  - name: container-startupprobe
    image: tomcat
    startupProbe:
      exec:      # 探测命令,返回非零表示失败
        command: ["/bin/bash", "-c", "ps -ef |grep  tomcat|grep -v grep|awk '{print $2}'"]

      initialDelaySeconds: 20  # 容器启动后多久开始探测
      periodSeconds: 20        # 执行探测间隔时间
      successThreshold: 1      # 成功多少次才算成功
      timeoutSeconds: 30       # 执行探针后,等待多少s,才算超时
      failureThreshold: 2      # 失败多少次才算失败

执行YAML文件:

kubectl apply -f startupProbe-exec.yaml

动态查看Pod状态:

get pods pod-startupprobe  -w

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IWivIjV7-1685189668254)(D:\MD归档文档\IMG\image-20230527131605293.png)]

案例二:使用 tcpSocket 探测容器内是否可以查看到 8080端口,如果探测失败,根据重启策略做出对应的操作。

cat startupProbe-tcpsocket.yaml 

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-startupprobe
  namespace: default
  labels:
    app: tomcat
    env: uat
spec:
  containers:
  - name: container-startupprobe
    image: tomcat
    ports:
    - containerPort: 8080
    startupProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 20  # 容器启动后多久开始探测
      periodSeconds: 20        # 执行探测间隔时间
      successThreshold: 1      # 成功多少次才算成功
      timeoutSeconds: 30       # 执行探针后,等待多少s,才算超时
      failureThreshold: 2      # 失败多少次才算失败

执行YAML文件:

kubectl apply -f startupProbe-tcpsocket.yaml 

案例三:使用 httpGet 探测容器内网络是否可以正常访问,如果探测失败,根据重启策略做出对应的操作。

cat startupProbe-httpget.yaml 

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-startupprobe
  namespace: default
  labels:
    app: nginx
    env: uat
spec:
  containers:
  - name: container-1
    image: nginx
    ports:
    - containerPort: 80
    startupProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 20
      periodSeconds: 20
      successThreshold: 1
      failureThreshold: 2
      timeoutSeconds: 20

执行YAML文件:

kubectl apply -f startupProbe-httpget.yaml 

2、Pod存活探测案例-livenessProbe

案例一:使用 tcpSocket80端口 进行存活检测,如果探测失败,根据重启测试做出相应操作。

cat livenessProbe-tcp.yaml 

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-liveness
  namespace: default
  labels:
    app: nginx
    env: uat

spec:
  containers:
  - name: container-1
    image: nginx
    imagePullPolicy: IfNotPresent
    livenessProbe: 
      tcpSocket:
        port: 80
      timeoutSeconds: 15
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1

执行YAML文件:

kubectl apply -f livenessProbe-tcp.yaml 

案例二:使用 httpGet/index.html 进行 存活检测,如果探测失败,根据重启测试做出相应操作。

cat livenessProbe-http.yaml

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-liveness
  namespace: default
  labels:
    app: nginx
    env: uat

spec:
  containers:
  - name: container-1
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    livenessProbe: 
      httpGet:
        path: /index.html
        port: 80
      timeoutSeconds: 15
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1

执行YAML文件:

kubectl apply -f livenessProbe-tcp.yaml 

3、Pod就绪探测案例-readinessProbe

就绪探测,如果探测失败会从Pod前端负载移除,所以我们要借助Service 资源才能看到效果,如下案例检测 80端口是否启动,如果没有检查到,则从 Service 中移除:

cat readinessProbe-http.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: svc-readiness
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - name: server
    port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-readiness
  namespace: default
  labels:
    app: nginx
spec:
  containers:
  - name: container-1
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    readinessProbe: 
      httpGet:
        path: /index.html
        port: 80
      timeoutSeconds: 15
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1

查看service、pod资源信息:

kubectl get pod,svc -l app=nginx

查看service 中关联的Pod:

kubectl describe svc|grep Endpoints

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3Ri7rQR-1685189668255)(D:\MD归档文档\IMG\image-20230527195046169.png)]

4、启动、存活、就绪探测混合使用案例

案例:

cat probe.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: svc-probe
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - name: server
    port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-probe
  namespace: default
  labels:
    app: nginx
spec:
  containers:
  - name: container-1
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

    livenessProbe: # 存活探测,探测服务是否正常
      httpGet:
        path: /index.html
        port: 80
      timeoutSeconds: 15
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1

    readinessProbe: # 就绪探测,探测服务是否可以接受请求
      httpGet:
        path: /index.html
        port: 80
      timeoutSeconds: 15
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1

    startupProbe:  # 启动探测,探测容器内程序是否启动
      httpGet:
        path: /index.html
        port: 80
      timeoutSeconds: 15
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1

执行YAML文件:

kubectl apply -f probe.yaml 

三、总结

1、探测总结:

一共演示了三种探测,分别是启动探测,存活探测、就绪探测,启动顺序是启动探测最先执行,当启动探测成功后,存活探测和就绪探测并行,三种探测场景如下:

  • 启动探测(startupProbe):探测容器中程序是否启动,如果失败,根据重启策略进行对应操作。
  • 存活探测(livenessProbe):探测容器中程序是否正常运行,如果失败,根据重启策略进行对应操作。
  • 就绪探测(readinessProbe):探测容器中程序是否可以接受请求,如果失败,将从前端代理移除。

2、存活探测和就绪探测区别:

存活探测,探测失败是根据重启策略做对应操作,而就绪探测,探测失败,是将从前端代理移除,如service中移除,移除后就无法正常对外访问了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Kubernetes运维篇】零故障升级Pod健康探测详解 的相关文章

随机推荐

  • 关于element-ui中表单重置不生效的原因,及解决方法

    resetFields这个方法是将表单重置为初始值 也就是说 是将表单中的数据重置为dom节点渲染时的值 而不是重置为空对象 也就是说 当你的表单数据 是在dom节点渲染前被赋值的 那么他的初始值就不为空了 还有就是vue中对象是不能直接赋
  • excalidraw 添加手绘中文字体

    Excalidraw是一个矢量绘图工具 支持在绘图中添加文字 Excalidraw目前支持一些常见的中文字体 例如微软雅黑 宋体等 如果你想添加其他的手绘中文字体 可以按照以下步骤进行操作 打开Excalidraw 选择文字工具 在工具栏中
  • 使用python中的SVM进行数据回归预测

    在Python中使用支持向量机 SVM 进行数据回归预测 你可以遵循以下步骤 导入必要的库 from sklearn svm import SVR from sklearn model selection import train test
  • 【数据分析】业务指标的几个相关思考

    业务指标的几个相关思考 1 如何理解数据 拿到数据后 第一步 弄清楚数据里每一列的含义 第二步 对数据进行分类 有助于后期的分析 通常将数据分为 用户数据 行为数据 产品数据 三类 用户数据 指的是用户的基本情况 包括姓名 性别 邮箱 年龄
  • linux下查看redis是否正常运行 和设置密码

    一 查找redis conf文件 我们服务器已经安装了redis 现在通过命令查看下redis的进程 root lnp ps aux grep redis root 7374 0 0 0 0 145312 7524 Ssl 16 37 0
  • Error:(28, 8) java: 类Demo01Array是公共的, 应在名为 Demo01Array.java 的文件中声明

    public 修饰的class类必须与 Java文件名一致 若声明的class非public则文件名无需与类名相同 必须一致
  • Android原生系统真的那么好用吗?安卓原生系统吊打其他系统,因为有Google-Play

    Android原生系统真的那么好用吗 这种问题当然是否定的 原生 Android 指的是直接基于 AOSP 构建的而非手机厂商出厂固件修改的第三方 ROM 但包括 Nexus Pixel 或其它被 Google 直接支持的手机的可能是闭源的
  • 你们所不了解的程序员思维黑洞

    如果你也是程序员 看看你中了几条 1 数数会从 0 开始数起 比如 程序员吵架的时候会说 我数三下 你再不闭嘴 我就不客气了 零 一 二 或者 在列清单的时候 编号会从 0 开始写 为什么会这样 因为 0 是数组的第一个元素 在经过无数次的
  • 1分钟部署自己的AutoGPT

    4 月初 AutoGPT 引发热潮 短短一个多月 它已经在全球最大的开源软件社区 Github 上累积了131 000颗星 其热度依然持续上升 我体验后发现 虽然基于 3 5 模型的 AutoGPT 还无法最终生成完整的报告 但是它确实可以
  • MySQL高级学习笔记(一)

    文章目录 MySQL高级学习笔记 一 1 索引 1 1索引概述 1 2索引优势劣势 1 3索引结构 1 3 1BTREE 结构 1 3 2B TREE 结构 1 3 3MySQL中的B Tree 1 4索引分类 1 5索引语法 1 5 1
  • agplv3_我是否需要根据AGPLv3许可证提供对源代码的访问?

    agplv3 GNU Affero通用公共许可证版本3 AGPLv3 是与GPLv3几乎相同的copyleft许可证 两种许可证具有相同的版权保留范围 但在一个重要方面存在实质性差异 AGPLv3的第13节规定了GPLv2或GPLv3中不存
  • 断点续传----位图

    首先了解什么是位图和他的工作原理 定义 位图就是bitmap的缩写 所谓bitmap 就是用每一位来存放某种状态 适用于大规模数据 该数据都是不重复的简单数据 通常是用来判断某个数据存不存在的 工作原理 查找一个数是否存在 其实答案就是存在
  • Cmake的使用

    简介 CMake是一个跨平台的安装 编译 工具 可以用简单的语句来描述所有平台的安装 编译过程 他能够输出各种各样的makefile或者project文件 能测试编译器所支持的C 特性 类似UNIX下的automake 只是 CMake 的
  • matlab 右侧,matlab错误提示无法执行赋值,因为左侧和右侧的元素数目不同

    compute pdf of fpe corr to Levy noise with absorbing BC in a bounded symmetric domain r r central differencing for 2nd o
  • UE4 UE4 C++ Gameplay Abilities 的AttributeSet和GameplayEffect

    UE4 UE4 C Gameplay Abilities 的AttributeSet和GameplayEffect GAS参考文档 仅是个人理解 参考 AttributeSet是设置玩家属性的比如生命值 最大生命值 GameplayEffe
  • GPU压力测试和故障定位

    压力测试 获取gpu burn https codeload github com wilicc gpu burn zip master 解压缩 unzip gpu burn master zip 进入目录编译 cd gpu burn ma
  • 关于python爬虫的准备工作

    目录 1 什么是网络爬虫 2 准备工作 1 什么是网络爬虫 百度百科所给注释如下 网络爬虫 又称为网页蜘蛛 网络机器人 在FOAF社区中间 更经常的称为网页追逐者 是一种按照一定的规则 自动地抓取万维网信息的程序或者脚本 另外一些不常使用的
  • vm使用PE安装系统(2)

    接上次教程 vm使用PE安装系统 1 提要 此虚拟机安装方法适用于所有系统格式如ISO ESD GHO WIM等系统格式 第一步 打开DG硬盘分区 选择左侧栏进行的 HD0 右键选择快速分区 一般情况下选择自定义选择两个分区 然后右边内容栏
  • 芯片开发语言的简单区别介绍。Verilog、VHDL、System Verilog、SystemC、Matlab、C/C++等

    芯片开发语言的简单区别介绍 芯片设计前端的流程很长 和芯片前端相关的语言也很多 比如Verilog VHDL System Verilog SystemC Matlab C C 等等 但没有一个语言能够做到适合于整个前端流程 每种语言都有适
  • 【Kubernetes运维篇】零故障升级Pod健康探测详解

    文章目录 一 Pod健康探测介绍 1 三种容器探测方法 2 常用三种探测探针 3 探针相关属性说明 二 探测案例 1 Pod启动探测案例 startupProbe 2 Pod存活探测案例 livenessProbe 3 Pod就绪探测案例