Kubernetes入门 五、深入Pod:探针和生命周期

news2024/10/6 12:29:37

目录

  • 探针
    • 探针类型
      • LivenessProbe
      • ReadinessProbe
      • StartupProbe:
    • 探测方式
      • ExecAction
      • TCPSocketAction
      • HTTPGetAction
    • 参数配置
    • 操作示例
  • 生命周期
    • 钩子函数
    • 生命周期

探针

所谓的探针就是容器内应用的监测机制,为了确保容器在部署后确实处在正常运行状态。

比如Pod内的容器因为内存等其他原因挂掉了,但是其实Pod还是在的,但是其实已经不可用了,需要做一定的处理,比如重启(基于重启策略)。那么Pod是如何知道容器是否还可用,就是通过存活探针来检测这个容器。

探针类型

可根据不同的探针来判断容器应用当前的状态,有以下三种类型:

LivenessProbe

存活探针。

作用:用于探测容器中的应用是否运行,如果探测失败,kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。

配置如下:

livenessProbe:
  failureThreshold: 5
  httpGet:
    path: /health
    port: 8080
    scheme: HTTP
  initialDelaySeconds: 60  # 第一次检测的延迟时间
  periodSeconds: 10  # 间隔时间
  successThreshold: 1  # 检测成功1次就代表成功了
  timeoutSeconds: 5 

注意:如果配置了这个探针,需要注意periodSeconds时间,如果Pod的启动时间大于这个时间,到时间发现还没启动成功,就会出现一直重启的情况。

ReadinessProbe

就绪探针。

作用:探测应用是否启动完成并且处于正常服务状态,它的返回值如果返回 success,那么就认为该容器已经完全启动,并且该容器是可以接收外部流量的,如果不正常则不会接收来自 Kubernetes Service 的流量,即将该Pod从Service的endpoint中移除。

readinessProbe:
  failureThreshold: 3 # 错误次数
  httpGet:
    path: /ready
    port: 8181
    scheme: HTTP
  periodSeconds: 10 # 间隔时间
  successThreshold: 1
  timeoutSeconds: 1

StartupProbe:

启动探针。

k8s 1.16 版本新增的探针,用于判断应用程序是否已经启动了。

当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe 成功后,其他探针才会继续。

作用:由于有时候不能准确预估应用一定是多长时间启动成功,因此配置另外两种方式不方便配置初始化时长来检测,而配置了 statupProbe 后,只有在应用启动成功了,才会执行另外两种探针,可以更加方便的结合使用另外两种探针使用。

配置如下:

startupProbe:
  httpGet:
    path: /api/startup
    port: 80

探测方式

ExecAction

在容器内部执行一个命令,如果返回值为 0,则任务容器时健康的。

配置如下:

livenessProbe:
  exec:
    command:
      - cat
      - /health

TCPSocketAction

通过 tcp 连接监测容器内端口是否开放,如果开放则证明该容器健康。

配置如下:

livenessProbe:
  tcpSocket:
    port: 80

HTTPGetAction

生产环境用的较多的方式,发送 HTTP 请求到容器内的应用程序,如果接口返回的状态码在 200~400 之间,则认为容器健康。

配置如下:

livenessProbe:
  failureThreshold: 5
  httpGet:
    path: /health
    port: 8080
    scheme: HTTP
    httpHeaders:
      - name: xxx
        value: xxx

参数配置

  1. initialDelaySeconds

初始化延迟时间。即等待这么长时间后才开始探测。一般LivenessProbe和ReadinessProbe探针配置。在一定程度上可以代替StartupProbe探针,但是一般我们是不知道容器到底需要启动多久的,时间设置短了,可能出现前面说的一直重启,设置长了,又有无效等待。所以并不能完全替代StartupProbe探针。

  1. timeoutSeconds

超时时间。即执行检测的时候,如果等待这么多时间还没有返回,就认为失败。

  1. periodSeconds

监测间隔时间。即上次检测完成后,间隔多长时间再去检测。

  1. successThreshold

成功次数阈值。比如配置成1,则认为检查 1 次成功就成功了。

  1. failureThreshold

失败次数阈值。比如配置成3,则认为检查了3次失败就算失败了。如果设置1次,可能不太准确,可能由于网络等其他原因,有延迟,下一次可能就好了。

操作示例

下面我们在上面Nginx的pod 的yaml文件的基础上加上启动探针,如下:

apiVersion: v1 # api 文档版本
kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-pod # Pod 的名称
  labels: # 定义 Pod 的标签
    type: app # 自定义 label 标签,名字为 type,值为 app
    test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
  namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    startupProbe:  # 启动探针
      httpGet:   # 采用http的方式
        path: /api/path  # http的请求路径
        port: 80  # 请求端口
      periodSeconds: 5 # 监测间隔时间
      successThreshold: 1 # 检查 1 次成功就表示成功
      failureThreshold: 3 # 监测失败 2 次就表示失败
      timeoutSeconds: 5  # 超时时间
    command: # 指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'
    workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
    ports:
    - name: http # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP # 描述该端口是基于哪种协议通信的
    env: # 环境变量
    - name: JVM_OPTS # 环境变量名称
      value: '-Xms128m -Xmx128m' # 环境变量的值
    resources:
      requests: # 最少需要多少资源
        cpu: 100m # 限制 cpu 最少使用 0.1 个核心
        memory: 128Mi # 限制内存最少使用 128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制 cpu 最多使用 0.2 个核心
        memory: 256Mi # 限制 最多使用 256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启

上面文件中,我们添加了启动探针,采用的方式是http。

注意,这里故意写了一个不存在的请求路径,为了演示启动探针失败时是神经样子的。

下面创建pod:

kubectl apply -f nginx-pod.yaml

然后查看pod的状态:

kubectl get po

结果如下:

NAME         READY   STATUS    RESTARTS   AGE
nginx-pod    0/1     Running   0          3s

现在状态是非Ready的,然后我们隔一段时间继续查看:

NAME         READY   STATUS    RESTARTS     AGE
nginx-pod    0/1     Running   3 (8s ago)   53s

# 最终的状态如下:
NAME         READY   STATUS      RESTARTS   AGE
nginx-pod    0/1     Completed   3          9m17s

可以看到,RESTARTS是3,也就是重启了3次,而且最终的READY还是0。

下面看下具体的信息:

kubectl describe po nginx-pod

可以看到具体的探针信息:

在这里插入图片描述

然后翻到最后的Events,可以看到最后一行打印出检测失败:

在这里插入图片描述

看完启动失败的情况,再看下检测成功的情况,修改http的请求路径如下:

apiVersion: v1 # api 文档版本
kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-pod # Pod 的名称
  labels: # 定义 Pod 的标签
    type: app # 自定义 label 标签,名字为 type,值为 app
    test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
  namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    startupProbe:  # 启动探针
      httpGet:   # 采用http的方式
        path: /index.html #http的请求路径
        port: 80  # 请求端口
      periodSeconds: 5 # 监测间隔时间
      successThreshold: 1 # 检查 1 次成功就表示成功
      failureThreshold: 3 # 监测失败 2 次就表示失败
      timeoutSeconds: 5  # 超时时间
    command: # 指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'
    workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
    ports:
    - name: http # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP # 描述该端口是基于哪种协议通信的
    env: # 环境变量
    - name: JVM_OPTS # 环境变量名称
      value: '-Xms128m -Xmx128m' # 环境变量的值
    resources:
      requests: # 最少需要多少资源
        cpu: 100m # 限制 cpu 最少使用 0.1 个核心
        memory: 128Mi # 限制内存最少使用 128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制 cpu 最多使用 0.2 个核心
        memory: 256Mi # 限制 最多使用 256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启

然后删除以前的pod,重启创建:

kubectl apply -f nginx-pod.yaml

查看状态:

$ kubectl get po
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          7s

可以看到pod正常创建出来了。

然后查看下下容器的具体信息,也是没有任何问题的。

也可以试下TCP方式和命令行的方式,配置如下:

# 1.tcp方式
startupProbe:  # 启动探针
  tcpSocket:   # 采用tcp的方式
  	port: 80  # 请求端口
  periodSeconds: 5 # 监测间隔时间
  successThreshold: 1 # 检查 1 次成功就表示成功
  failureThreshold: 3 # 监测失败 2 次就表示失败
  timeoutSeconds: 5  # 超时时间
# 2.命令行的方式
startupProbe:  # 启动探针
  exec:   # 采用命令行的方式
  	command:
  	-sh
  	- -c
  	- "sleep 3; echo 'success' > /inited"
  periodSeconds: 5 # 监测间隔时间
  successThreshold: 1 # 检查 1 次成功就表示成功
  failureThreshold: 3 # 监测失败 2 次就表示失败
  timeoutSeconds: 5  # 超时时间

生命周期

钩子函数

钩子函数能够感知自身生命周期中的事件,并在相应的时刻到来时运行用户指定的程序代码。

支持两种钩子:

  • postStart:容器创建之后执行,如果失败会重启容器。
  • preStop:容器终止前执行,常用于资源清理。如果失败,容器同样也会被杀死。

而钩子的回调函数支持两种方式:

  • exec:在容器内执行命令,如果命令的退出状态码是 0 表示执行成功,否则表示失败
  • httpGet:向指定 URL 发起 GET 请求,如果返回的 HTTP 状态码在 [200, 400) 之间表示请求成功,否则表示失败
  • tcpSocket:在当前容器尝试访问指定的 socket 。

postStart不能保证该操作一定在容器的 command 之前执行,一般不使用。

preStop一般用于注册中心下线、数据清理、数据销毁等。

注意:当pod删除时,变为删除中的状态后,会给 pod 一个宽限期,让 pod 去执行一些清理或销毁操作。

配置参数:terminationGracePeriodSeconds: 30

也就是当删除时,会等30s后才真的删除pod,而且删除到30s也不会管preStop有没有执行完,都会删除。

示例:

apiVersion: v1 # api 文档版本
kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-pod # Pod 的名称
  labels: # 定义 Pod 的标签
    type: app # 自定义 label 标签,名字为 type,值为 app
    test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
  namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    lifecycle: # 生命周期配置
    	postStart: # 容器创建之后执行,如果失败会重启容器
      	exec: # 在容器启动的时候,执行一条命令,修改掉Nginx的首页内容
        	command: ["/bin/sh","-c","echo postStart ... > /usr/share/nginx/html/index.html"]
      preStop: # 容器终止之前执行,执行完成之后容器将成功终止,在其完成之前会阻塞删除容器的操作
        exec: # 在容器停止之前停止Nginx的服务
          command: ["/usr/sbin/nginx","-s","quit"]
    command: # 指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'
    workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
    ports:
    - name: http # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP # 描述该端口是基于哪种协议通信的
    env: # 环境变量
    - name: JVM_OPTS # 环境变量名称
      value: '-Xms128m -Xmx128m' # 环境变量的值
    resources:
      requests: # 最少需要多少资源
        cpu: 100m # 限制 cpu 最少使用 0.1 个核心
        memory: 128Mi # 限制内存最少使用 128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制 cpu 最多使用 0.2 个核心
        memory: 256Mi # 限制 最多使用 256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启

生命周期

Pod的状态(Status)有以下几种:

  • 挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。
  • 运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
  • 成功(Succeeded):Pod 中的所有容器都被成功终止,并且不会再重启。
  • 失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
  • 未知(Unknown):因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。

在这里插入图片描述

一个Pod从启动到结束有如下几个步骤:

  • 初始化容器执行(如果有的话)
  • 执行启动探针
  • 执行command命令(定义在yaml中的command标签下)和postStart钩子函数,两个没有先后顺序
  • 就绪探针和存活探针执行
  • 执行preStop钩子函数
  • 删除Pod

如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rGnKwUuc-1692189492504)(./imgs/5-3.png)]

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

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

相关文章

系统驱动-点亮LED灯

实现LED点亮 demo.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include <linux/device.h> #include "head.h" int major; char kbuf[12…

GitHub星标11.9k的机器学习开源项目分享,3 万行代码,30多个主流模型

今天给大家分享一个超剽悍的开源项目&#xff0c;目前在github上已获11.9k星标。 项目作者是普林斯顿博士后David Bourgin&#xff0c;他用 NumPy 手推了一大波 ML 模型&#xff0c;基本上把主流模型都实现了一遍&#xff0c;这个工作量我直呼牛X。 虽然现在手写模型已经不是…

星星之火:国产讯飞星火大模型的实际使用体验(与GPT对比)

#AIGC技术内容创作征文&#xff5c;全网寻找AI创作者&#xff0c;快来释放你的创作潜能吧&#xff01;# 文章目录 1 前言2 测试详情2.1 文案写作2.2 知识写作2.3 阅读理解2.4 语意测试&#xff08;重点关注&#xff09;2.5 常识性测试&#xff08;重点关注&#xff09;2.6 代码…

摄影馆预约小程序开发指南:打造高效预约管理系统

随着数字化时代的到来&#xff0c;越来越多的行业开始借助互联网工具提升服务质量和效率。摄影行业也不例外&#xff0c;为了更好地满足用户的需求&#xff0c;许多摄影店开始搭建预约小程序&#xff0c;方便用户在线预约和管理。 首先&#xff0c;进入乔拓云网后台&#xff0c…

回归预测 | MATLAB实现BiLSTM双向长短期记忆神经网络多输入多输出预测

回归预测 | MATLAB实现BiLSTM双向长短期记忆神经网络多输入多输出预测 目录 回归预测 | MATLAB实现BiLSTM双向长短期记忆神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现BiLSTM双向长短期记忆神经网络多输入多输出预测&#x…

深入剖析低代码平台的优势与挑战

近年来&#xff0c;我国高度重视数字经济的发展&#xff0c;强化数字技术创新应用&#xff0c;全面推进企业数字化转型工作。在全国各行业数字化转型的浪潮中&#xff0c;低代码通过可视化、模块化开发操作&#xff0c;降低软件开发门槛&#xff0c;强化资源扩展和信息集成&…

分布式学习:从分布式系统的特征开始

正文   在延伸feature&#xff08;分布式系统需要考虑的特性&#xff09;的时候&#xff0c;我逐渐明白&#xff0c;这是因为要满足这些feature&#xff0c;才设计了很多协议与算法&#xff0c;也提出了一些理论。比如说&#xff0c;这是因为要解决去中心化副本的一致性问题&…

司徒理财:8.16黄金行情走势分析及策略美盘看涨

黄金早盘已经给了1902的现价多单&#xff0c;日内最高触及1907&#xff01;如期拉升&#xff01;黄金现在筑底阶段&#xff0c;维持低多看涨思路&#xff0c;美盘1900附近继续做多看涨&#xff0c;等待反弹&#xff01;黄金现在的下跌已经到达日线前低位置&#xff0c;继续破位…

程序员的新型生产力工具,效率起飞了~

文章目录 一、低代码平台存在的意义 二、国内外低代码开发研究现状 三、低代码开发平台设计与实现 系统架构总体设计 01.表单引擎设计 02.流程引擎设计 03.数据库设计 四、总结 一、低代码平台存在的意义 传统软件开发交付链中&#xff0c;需求经过3次传递&#xff0c;用户→业…

录取查询页面怎么做?

招生录取工作开始后&#xff0c;负责招生的老师需要完成一系列任务&#xff0c;其中包括确定招生录取名单和及时向考生公布录取情况。为了快速完成录取查询工作的发布&#xff0c;招生老师们可以采取以下步骤&#xff1a; 1. 整理录取名单&#xff1a;招生老师们首先需要整理好…

使用爱校对软件保证公文材料质量的关键步骤

在日常的公文处理中&#xff0c;保证材料质量是每个企业和机构都追求的目标。而要实现这个目标&#xff0c;使用正确的工具是关键。爱校对软件正是这样一款专业的校对工具&#xff0c;它可以帮助我们保证公文材料的质量。接下来&#xff0c;让我们一起来看看使用爱校对软件保证…

【网络编程系列】网络编程实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

JavaScript【节流(throttle)、Navigator 对象、Screen 对象】(十七)

目录 节流(throttle) 实现 window 对象_属性 window 对象_方法

java+springboot+mysql企业产品销售管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的企业产品销售管理系统&#xff0c;系统包含管理员&#xff0c;员工&#xff08;客服&#xff09;、客户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;首页&#xff08;销售统计&#xff09;&#xff1b;系统用…

IntelliJ IDEA 常用快捷键及重构必备(2023)

一、日常必备 快捷键介绍Ctrl F在当前文件进行文本查找 &#xff08;必备&#xff09;Ctrl R在当前文件进行文本替换 &#xff08;必备&#xff09;Ctrl Z撤销 &#xff08;必备&#xff09;Ctrl Q光标所在的变量 / 类名 / 方法名等上面&#xff08;也可以在提示补充的时候…

开源项目-java内容管理系统

哈喽,大家好,今天给大家带来一个开源项目-java内容管理系统。项目基于SpringBoot+Vue3开发 内容管理系统由前,后台两部分组成。 前端主要有首页,新闻,图片,视频,下载,文库,产品等模块组成 后台主要有内容管理,互动管理,文件管理,配置管理,统计管理,用户管理,…

Python入门--需要学习哪些框架

Python是一门通用编程语言&#xff0c;支持很多不同的应用场景&#xff0c;因此&#xff0c;学习Python需要根据自己的实际需求来选择相应的框架。以下是几个常用的Python框架&#xff1a; Django&#xff1a;用于构建Web应用程序的全栈框架&#xff0c;包含了ORM、模板引擎等组…

[windows]MAT- 下载及安装

1. 下载安装包 1.1MAT下载链接&#xff1a; https://pan.baidu.com/s/1sUWPITSto8MjOrcF0BsJQg?pwd1111 提取码&#xff1a;1111 1.2MAT需要jdk17版本及以上支持&#xff0c;下载链接: https://pan.baidu.com/s/111jz90S4tie_48lQeExcZg?pwd1111 提取码&#xff1a;1…

碎片笔记|图数据与图神经网络基础介绍

前言&#xff1a;前段时间了解了一下图神经网络&#xff0c;本篇博客记录一下相关知识&#xff0c;以备不时之需。 强烈推荐这篇博客&#xff08;作者来自 Google Research&#xff09;&#xff0c;个人认为是图神经网络基础入门的不二选择&#xff01; 目录 一、图数据1.1 定义…

@RequestMapping 注解以及其它使用方式

&#x1f600;前言 本篇主要讲解RequestMapping 注解以及其它使用方式 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&#…