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

目录

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

探针

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

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

探针类型

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

LivenessProbe

存活探针。

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

配置如下:

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

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

ReadinessProbe

就绪探针。

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

readinessProbe:failureThreshold: 3 # 错误次数httpGet:path: /readyport: 8181scheme: HTTPperiodSeconds: 10 # 间隔时间successThreshold: 1timeoutSeconds: 1

StartupProbe:

启动探针。

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

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

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

配置如下:

startupProbe:httpGet:path: /api/startupport: 80

探测方式

ExecAction

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

配置如下:

livenessProbe:exec:command:- cat- /health

TCPSocketAction

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

配置如下:

livenessProbe:tcpSocket:port: 80

HTTPGetAction

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

配置如下:

livenessProbe:failureThreshold: 5httpGet:path: /healthport: 8080scheme: HTTPhttpHeaders:- name: xxxvalue: 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,值为 apptest: 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,值为 apptest: 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,值为 apptest: 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.rhkb.cn/news/92750.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch翻译官网教程-NLP FROM SCRATCH: CLASSIFYING NAMES WITH A CHARACTER-LEVEL RNN

官网链接 NLP From Scratch: Classifying Names with a Character-Level RNN — PyTorch Tutorials 2.0.1cu117 documentation 使用CHARACTER-LEVEL RNN 对名字分类 我们将建立和训练一个基本的字符级递归神经网络(RNN)来分类单词。本教程以及另外两个“from scratch”的自然…

学习笔记整理-DOM-01-基础知识

一、DOM基本概念 1. DOM基本概念 DOM是JS操控HTML和CSS的桥梁。DOM是JS操作HTML变得优雅。 DOM(Document Object Model,文档对象模型)是JavaScript操作HTML文档的接口,使文档操作变得非常优雅、简便。DOM最大的特点就是将文档表示为节点树。 节点的node…

【数据结构与算法】十大经典排序算法-选择排序

🌟个人博客:www.hellocode.top 🏰Java知识导航:Java-Navigate 🔥CSDN:HelloCode. 🌞知乎:HelloCode 🌴掘金:HelloCode ⚡如有问题,欢迎指正&#…

opencv基础55-获取轮廓的特征值及示例

轮廓自身的一些属性特征及轮廓所包围对象的特征对于描述图像具有重要意义。本节介绍几个轮廓自身的属性特征及轮廓所包围对象的特征。 宽高比 可以使用宽高比(AspectRation)来描述轮廓,例如矩形轮廓的宽高比为: 宽高比 宽度&am…

Vue3使用vue-print-nb插件调起打印功能

一、效果图 二、使用方式 安装插件 //Vue2.0版本安装方法 npm install vue-print-nb --save yarn add vue-print-nb//Vue3.0版本安装方法: npm install vue3-print-nb --save yarn add vue3-print-nb在全局引用 import Print from vue-print-nb Vue.use(Print)打…

Stable Diffusion WebUI 从零基础到入门

本文主要介绍Stable Diffusion WebUI的实际操作方法,涵盖prompt推导、lora模型、vae模型和controlNet应用等内容,并给出了可操作的文生图、图生图实战示例。适合对Stable Diffusion感兴趣,但又对Stable Diffusion WebUI使用感到困惑的同学&am…

序列模型和循环网络

Sequence Modeling and Recurrent Networks Sequence modeling tasks 在以往的模型中,各个输入之间是独立分布的 x ( i ) x^{(i)} x(i) 之间是相互独立的,同样输出 y ( i ) y^{(i)} y(i)之间也是相互独立的。 但是在序列模型中,输入输出是…

STM32基于CubeIDE和HAL库 基础入门学习笔记:功能驱动与应用

文章目录: 一:LED与按键驱动程序 main.c 1.闪灯 led.h led.c 2.按键控制LED亮灭 key.h key.c 二:蜂鸣器与继电器驱动程序 main.c 1.蜂鸣器 buzzer.h buzzer.c delay.h delay.c 2.继电器 relay.h relay.c 三&#xff1…

“MongoDB基础知识【超详细】

"探索MongoDB的无边之境:沉浸式数据库之旅" 欢迎来到MongoDB的精彩世界!在这个博客中,我们将带您进入一个充满创新和无限潜力的数据库领域。无论您是开发者、数据工程师还是技术爱好者,MongoDB都将为您带来一场令人心动…

PLY模型格式详解【3D】

本文介绍PLY 多边形文件格式,这是一种用于存储被描述为多边形集合的图形对象。 PLY文件格式的目标是提供一种简单且易于实现但通用的格式足以适用于各种模型。 PLY有两种子格式:易于入门的 ASCII 表示形式和用于紧凑存储和快速保存和加载的二进制格式。 …

搭建 Python 环境 | Python、PyCharm

计算机 计算机能完成的工作: 算术运算逻辑判断数据存储网络通信…更多的更复杂的任务 以下这些都可以称为 “计算机”: 一台计算机主要由以下这几个重要的组件构成 CPU 中央处理器:大脑,算术运算,逻辑判断 存储器&…

Redis——常见数据结构与单线程模型

Redis中的数据结构 Redis中所有的数据都是基于key,value实现的,这里的数据结构指的是value有不同的类型。 当前版本Redis支持10种数据类型,下面介绍常用的五种数据类型 底层编码 Redis在实现上述数据结构时,会在源码有特定的…

Docker数据卷容器

1.数据卷容器介绍 即使数据卷容器c3挂掉也不会影响c1和c2通信。 2.配置数据卷容器 创建启动c3数据卷容器,使用-v参数设置数据卷。volume为目录,这种方式数据卷目录就不用写了,直接写宿主机目录。 创建c1、c2容器,使用–volum…

三星霸主地位“无可撼动“,DRAM内存市场份额创近 9 年新低仍第一

三星电子在DRAM市场的竞争地位一直备受关注。据报告显示,除了市场份额下降外,三星电子在上半年的销售额也出现了下滑。这主要是由于全球消费电子产品需求下滑,导致三星电子的芯片需求减少。 存储芯片业务所在的设备解决方案部门的营收和利润也…

24届近3年上海电力大学自动化考研院校分析

今天给大家带来的是上海电力大学控制考研分析 满满干货~还不快快点赞收藏 一、上海电力大学 学校简介 上海电力大学(Shanghai University of Electric Power),位于上海市,是中央与上海市共建、以上海市管理为主的全日…

经典人体模型SMPL介绍(一)

SMPL是马普所提出的经典人体模型,目前已成为姿态估计、人体重建等领域必不可少的基础先验。SMPL基于蒙皮和BlendShape实现,从数千个三维人体扫描结果得来,后通过PCA统计学习得来。 论文:SMPL: A Skinned Multi-Person Linear Mode…

基于Python的HTTP代理爬虫开发初探

前言 随着互联网的发展,爬虫技术已经成为了信息采集、数据分析的重要手段。然而在进行爬虫开发的过程中,由于个人或机构的目的不同,也会面临一些访问限制或者防护措施。这时候,使用HTTP代理爬虫可以有效地解决这些问题&#xff0…

普华永道踩坑MOVEit漏洞,泄露银行8万名储户的信息

8月14日,波多黎各自治区最大的银行——人民银行向缅因州司法部长提交了一份客户信息泄露报告。该报告指出,由于供应商普华永道使用的MOVEit软件存在安全漏洞,导致银行82217名储户的个人信息被泄露。 目前,波多黎各人民银行已经陆续…

javaScript:数组方法(增删/提取类/截取/操作方法等)

目录 一.数组的增删方法 1.push()数组末尾添加元素 解释 代码 运行截图 2.unshift()向数组的头部添加数组 解释 代码 运行截图 3.pop()数组的尾部删除一个元素 解释 代码 运行截图 4.shift()数组的头部删除一个元素 解释 代码 运行截图 5. splice()任意位…