四、kubernetes 1.29 之 Pod 生命周期

一、概述

当容器与 pause 容器共享网络(Network)、IPC(进程间通信)和 PID(进程命名空间)后,二者形成了一种紧密的 "共享命名空间" 关系,共同构成了 Kubernetes 中 "Pod 内容器" 的核心协作模式

InitC 初始化容器

        initc不能相交单线程执行, 一个失败全部重建、、容器死亡后退出码必须是0,否则重建第一个initC,来保证每一个initC容器都是连贯的

        执行危险操作、阻塞特性

MainC

          不限次数,并发   、pod所在节点的kubelet

          钩子 、启动后、关闭前

          探针、就绪探测老版本是一段时间,存活探测保证Pod在存活且能为用户提供访问,否则杀死

二、initC

1、特性

init容器与普通的容器区别:


init容器总是运行到成功完成为止
每个init容器都必须在下一个init容器启动之前成功完成

init重启规则


如果Pod的Init容器失败,Kubernetes会不断地重启该Pod,直到Init容器成功为止。
然而,如果Pod对应的restartPolicy为Never,它不会重新启动

其它

        InitC与应用容器具备不同的镜像,可以把一些危险的工具放置在initC中,进行使用
initC多个之间是线性启动的,所以可以做一些延迟性的操作
initC无法定义就绪探测,其它以外同应用容器定义无异

2、检测intiC的阻塞性

资源清单

apiVersion: v1
kind: Pod
metadata:name: initc-1labels:app: initc
spec:containers:- name: myapp-containerimage: wangyanglinux/tools:busyboxcommand: ['sh', '-c', 'echo The app is running! && sleep 3600']initContainers:- name: init-myserviceimage: wangyanglinux/tools:busyboxcommand: ['sh', '-c', 'until nslookup myservice; do echo waiting for 
myservice; sleep 2; done;']- name: init-mydbimage: wangyanglinux/tools:busyboxcommand: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 
2; done;']#until 为假循环为真退出
$ kubectl create svc clusterip myservice --tcp=80:80
$ kubectl create svc clusterip mydb --tcp=80:80

结论

        第一,initC启动是线性的

        第二,每个initC的返回码必须是0

三、探针

1、概述

# 容器探针(kubelet 诊断)核心总结
1. **定义**:由 kubelet 对容器执行的定期诊断,需调用容器实现的 Handler(处理程序)。
2. **三种 Handler 类型**:
 - **ExecAction**:在容器内执行指定命令,命令返回码为 0 则诊断成功。
- **TCPSocketAction**:对容器 IP 地址的指定端口做 TCP 检查,端口打开则诊断成功。
- **HTTPGetAction**:对容器 IP 地址的指定端口+路径发 HTTPGet 请求,响应状态码 200-399
则诊断成功。
3. **三种探测结果**:
- 成功:容器通过诊断。
- 失败:容器未通过诊断。
- 未知:诊断本身失败,不采取任何行动。

2、分类

startupProbe 准备、

livenessProbe、就绪

readinessProbe、存活

3、readinessProbe 就绪探针

注意

如果pod内部的C不添加就绪探测,默认就绪。如果添加了就绪探测,
只有就绪通过以后,才标记修改为就绪状态。当前pod内的所有的C都就绪,才标记当前Pod就绪


成功:将当前的C标记为就绪
失败:静默
未知:静默

deployment,容器控制器

labelS,标签选择器

存活探针用于解决容器进程仍在运行但应用程序已无响应(即“活死人”)的问题。Kubernetes 通过定期探测并在失败时重启容器来恢复服务。

其核心配置参数如下:

  • initialDelaySeconds​:容器启动后,等待多少秒才开始第一次探测。

    • 默认值:0

    • 最小值:0

  • periodSeconds​:每次执行探测的间隔时间。

    • 默认值:10

    • 最小值:1

  • timeoutSeconds​:单次探测请求等待响应的超时时间。

    • 默认值:1

    • 最小值:1

  • successThreshold​:探测失败后,需要连续成功多少次才被重新认定为成功。

    • 默认值:1

    • 最小值:1

  • failureThreshold​:探测失败的重试次数,超过该次数后即认定本次探测彻底失败。

    • 默认值:3

    • 最小值:1

定义就绪探测

基于 HTTP Get 方式
apiVersion: v1
kind: Pod
metadata:name: readiness-httpget-podnamespace: defaultlabels:app: myappenv: test
spec:containers:- name: readiness-httpget-containerimage: wangyanglinux/myapp:v1.0imagePullPolicy: IfNotPresentreadinessProbe:httpGet:port: 80path: /index1.htmlinitialDelaySeconds: 1periodSeconds: 3

vi 4.pod.yaml     //编辑资源清单
kubectl create -f 4.pod.yaml   //启动pod

kubectl get pod --show-labels  //查看节点信息

启动,未就绪。因为这里没有index.html文件,负载均衡不会到pod-3(标签不匹配)和 rediness-htttpget-pod(未就绪)

查看pod事件

kubectl describe pod rediness-htttpget-pod

就绪探测失败.

进入容器恢复html文件

进入容器

kubectl exec -it rediness-htttpget-pod -- /bin/bash

cd

cd /usr/local/nginx/html/

追加内容到 index1文件中

echo "wangyang daociyiyou" >> index1.html

exit

就绪了,此时去负载均衡访问,也会出现了

基于 EXEC 方式

这里启动命令, 是在60s后删除live文件,就绪探测是检测这个live文件,所以会出现就绪----未就绪 的状态

apiVersion: v1
kind: Pod
metadata:name: readiness-exec-podnamespace: default
spec:containers:- name: readiness-exec-containerimage: wangyanglinux/tools:busyboximagePullPolicy: IfNotPresentcommand: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; 
sleep
3600"]readinessProbe:exec:command: ["test","-e","/tmp/live"]initialDelaySeconds: 1periodseconds: 3

监视,打印当前资源对象的变化情况

kubectl get pod -w

补充:基 于 T C P C h e c k 方 式

不常用,有瑕疵,这种情况多用httpget

apiVersion: v1
kind: Pod
metadata:name: readiness-tcp-pod
spec:containers:- name: readiness-exec-containerimage: wangyanglinux/myapp:v1.0readinessProbe:initialDelaySeconds: 5timeoutSeconds: 1tcpSocket:port: 80

4、livenessProbe 存活探针

存活探测

        如果pod内部不指定存活探测,可能会发生容器在运行但是无法提供访问的情况

        成功:静默

        失败:根据重启策略进行重启

        未知:静默

查看详细信息和重启策略

kubectl get pod podname -o

# K8s存活探针核心总结
1. **核心作用**:解决容器“存活但功能失效”问题,确保仅正常工作的容器运行。
2. **关键配置参数(含默认值/最小值)**:
- `initialDelaySeconds`:容器启动后延迟多久开始探测,单位秒,默认0、最小0。
- `periodSeconds`:探测执行间隔,单位秒,默认10、最小1。
- `timeoutSeconds`:探测请求等待响应的超时时间,单位秒,默认1、最小1。
- `successThreshold`:探测失败后判定为成功的最小次数,默认1、最小1(需为1才能激活启动)。
- `failureThreshold`:探测失败的重试次数,超过次数判定为失败,默认3、最小1。

基于命令的存活探测 - - Exec

根据资源清单预估pod状态

运行 --- 死了  ----  重启 --- 运行 --- 死了 ...

apiVersion: v1
kind: Pod
metadata:name: liveness-exec-podnamespace: default
spec:containers:- name: liveness-exec-containerimage: wangyanglinux/tools/busboximagePullPolicy: IfNotPresentcommand: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep 3600"]livenessProbe:exec:command: ["/test","-e","/tmp/live"]initialDelaySeconds: 1periodSeconds: 3

监视

kubectl get pod -w  

基于 HTTP Get 方式

apiVersion: v1
kind: Pod
metadata:name: liveness-httpget-podnamespace: default
spec:containers:- name: liveness-httpget-containerimage: wangyanglinux/myapp:v1.0imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80livenessProbe:httpGet:port: 80

编辑资源清单

vi 8.pod.yaml

启动

kubectl create -f 8.pod.yaml

搞破坏,干掉当前的内部容器

kubectl exec -it liveness-httpget-pod -- /bin/bash

这里被踢出了

再次进入

进入pod所在节点查查看

docker ps |grep liveness-httpget-pod

1代表重启次数(从0开始)

补充:基 于 T C P C h e c k 方 式

apiVersion: v1
kind: Pod
metadata:name: liveness-httpget-podnamespace: default
spec:containers:- name: liveness-httpget-containerimage: wangyanglinux/myapp:v1.0imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80livenessProbe:httpGet:port: 80

5、startupProbe 启动探针

在 1.16 之后新增,保障存活探针在执行的时候不会陷入死循环活着延期很长的情况

        成功:开始允许存活探针和 就绪探针开始执行

        失败:静默

apiVersion: v1
kind: Pod
metadata:name: startupprobe-1namespace: default
spec:containers:- name: myapp-containerimage: wangyanglinux/myapp:v1.0imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: 80path: /index2.htmlinitialDelaySeconds: 1periodSeconds: 3startupProbe:httpGet:path: /index1.htmlport: 80failureThreshold: 30periodSeconds: 10//应用程序将会有最多 5 分钟 failureThreshold * periodSeconds(30 * 10 = 300s)的时间来完成
其启动过程。

创建启动pod

先满足启动探测的html1,才会去执行就绪探测

四、钩子 hook

# Pod Hook(钩子)总结
1. **发起主体与运行时机**:由Kubernetes管理的kubelet发起,运行于容器生命周期内,具体为容器进程启动前或终止前。
2. **配置范围**:可同时为Pod中的所有容器配置。
3. **类型分类**:
- **exec**:执行一段命令
- **HTTP**:发送HTTP请求

--------------------------------------------------

启动前钩子在容器初始化后,有可能末端和启动命令部分重合

启动后钩子在关闭命令前执行

lifecycle

apiVersion: v1
kind: Pod
metadata:name: lifecycle-exec-pod
spec:containers:- name: lifecycle-exec-containerimage: wangyanglinux/myapp:v1lifecycle:postStart:exec:command: ["/bin/sh", "-c", "echo postStart > /usr/share/message"]preStop:exec:command: ["/bin/sh", "-c", "echo preStop > /usr/share/message"]

基于 HTTP Get 方式

# 端口01,开启一个测试 webServer,检测是否有请求

$ docker run -it --rm -p 1234:80 wangyanglinux/myapp:v1.0

端口02创建执行pod

apiVersion: v1
kind: Pod
metadata:name: lifecycle-httpget-podlabels:name: lifecycle-httpget-pod
spec:containers:- name: lifecycle-httpget-containerimage: wangyanglinux/myapp:v1.0ports:- containerPort: 80lifecycle:postStart:httpGet:host: 192.168.66.11path: index.htmlport: 1234preStop:httpGet:host: 192.168.125.101path: hostname.htmlport: 1234

01

杀死pod

 

关于关闭前钩子

# K8s Pod终止相关总结
1. **Pod优雅释放的常见问题**:部分Pod无法顺利优雅释放,常见原因包括Pod卡死、优雅退出逻辑存在BUG(如陷入死循环)、代码问题导致执行命令无效。
2. **grace period(宽限期)的作用与配置**:
- 定义:k8s Pod终止流程中“最多可容忍的时间”,用于应对上述优雅释放问题,超时后会强制kill Pod。
- 配置方式:通过`pod.spec.terminationGracePeriodSeconds`字段定义,默认30秒;执行`kubectl delete`时,可通过`--grace-period`参数指定值覆盖Pod原有配置。
3. **关键注意事项**:grace period与preStopHook、SIGTERM信号并行发生,k8s不会等待preStopHook完成;若应用在宽限期结束前完成关闭并退出,k8s会立即进入终止流程的下一步。

五、整合

删除所有pod和除kubernetes之外的 service

apiVersion: v1
kind: Pod
metadata:name: lifecycle-podlabels:app: lifecycle-pod
spec:containers:- name: busybox-containerimage: wangyanglinux/tools:busyboxcommand: ["/bin/sh", "-c", "touch /tmp/live ; sleep 600; rm -rf /tmp/live; sleep 3600"]livenessProbe:exec:command: ["test", "-e", "/tmp/live"]initialDelaySeconds: 1periodSeconds: 3lifecycle:postStart:httpGet:host: 192.168.66.11path: index.htmlport: 1234preStop:httpGet:host: 192.168.66.11path: hostname.htmlport: 1234- name: myapp-containerimage: wangyanglinux/myapp:v1.0livenessProbe:httpGet:port: 80path: /index.htmlinitialDelaySeconds: 1periodSeconds: 3timeoutSeconds: 3readinessProbe:httpGet:port: 80path: /index1.htmlinitialDelaySeconds: 1periodSeconds: 3initContainers:- name: init-myserviceimage: wangyanglinux/tools:busyboxcommand: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']- name: init-mydbimage: wangyanglinux/tools:busyboxcommand: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

编写、启动、创建

这里初始化需要 myservice 、 mydb的 service,没有,所以会卡这

创建myservice、初始化通过1

创建mydb,初始化通过

kubectl create svc clusterip mydb --tcp=80:80

启动容器提供服务,主

docker run --name test -p 1234:80 -d wangyanglinux/myapp:v1.0

现在就绪为1,因为有个就绪探测需要满足

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

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

相关文章

AI与环保:礼貌用语背后的能源挑战与解决方案

程序员的技术管理推荐阅读 窄化效应:程序员与管理者的隐形情绪陷阱 从“激励”到“保健”:80后与90后程序员,到底想要什么? 从“激励”到“保健”:80后与90后程序员,到底想要什么? 场景引入&…

OpenCV C++ 特征提取:从角点检测到对象识别

特征提取是计算机视觉的核心技术,通过识别图像中具有代表性的关键点及其描述信息,实现图像匹配、对象识别、姿态估计等高级任务。本章将系统讲解从基础的图像金字塔、角点检测,到复杂的 ORB 和 SIFT 特征提取与匹配,最终实现基于特征的对象检测完整流程。 一、图像金字塔 …

Codeforces Round 1049 (Div. 2) D题题解记录

大致题意:给定nnn个区间(li,ri)(l_i,r_i)(li​,ri​)。每次选取两个尚未被标记的区间(l1,r1)(l_1,r_1)(l1​,r1​)与(l2,r2)(l_2,r_2)(l2​,r2​),使得他们均被标记,同时可以任选x∈[l1,r1],y∈[l2,r2]x\in[l_1,r_1],y…

《WINDOWS 环境下32位汇编语言程序设计》第15章 注册表和INI文件

15.1 注册表和INI文件简介在一个操作系统中,无论是操作系统本身还是运行于其中的大部分应用程序,都需要使用某种方式保存配置信息。在DOS系统中,配置信息往往是软件的开发者根据自己的喜好用各种途径加以保存的,比如在磁盘上面写一…

JDK 17、OpenJDK 17、Oracle JDK 17 的说明

Java生态系统的核心概念:简单来说:JDK 17 是一个标准规范,定义了Java开发工具包第17个长期支持版应该包含什么功能。openjdk-17-jdk 是一个具体的实现,是遵循上述规范、由OpenJDK社区提供的开源软件包。下面我们通过一个表格和详细…

手写MyBatis第58弹:如何优雅输出可执行的SQL语句--深入理解MyBatis日志机制:

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

Spring Boot 监控实战:集成 Prometheus 与 Grafana,打造全方位监控体系

前言 在当今微服务架构盛行的时代,应用程序的监控变得尤为重要。Spring Boot 作为广泛使用的微服务框架,其监控需求也日益增加。Prometheus 和 Grafana 作为开源监控领域的佼佼者,为 Spring Boot 应用提供了强大的监控能力。本文将详细介绍如…

JS中的多线程——Web Worker

众所周知,JavaScript 是单线程运行的(至于为什么是单线程可以看一下这篇文章——事件循环机制),当浏览器主线程被大量计算任务阻塞时,页面就会出现明显的卡顿现象。Web Worker 提供了在独立线程中运行 JavaScript 的能…

【SQL注入】延时盲注

sleep(n)​​: 核心延时函数。使数据库程序暂停 n秒。​​if(condition, true_expr, false_expr)​​: 条件判断函数。如果 condition为真,执行 true_expr,否则执行 false_expr。​​用于将延时与判断条件绑定​​。​​mid(a, b, c)​​: 字符串截取函数…

IntelliJ IDEA 2025.1 Java Stream Debugger 快速使用指南

1. 功能概览 Java Stream Debugger 提供 Trace Current Stream Chain 功能,用来在调试时分析和可视化 Stream 操作链。 主要用途: 在运行时查看流操作链的每一步输出找出 map/filter 等操作的问题避免手动加 peek() 打印调试2. 使用入口 在 IDEA 2025.1 …

ARM-指令集全解析:从基础到高阶应用

一、ARM 指令集体系结构版本ARM 公司定义了多个指令集版本:ARMv1:原型机 ARM1,没有用于商业产品。ARMv2:扩展 V1,包含 32 位乘法指令和协处理器指令。ARMv3:第一个微处理器 ARM6 核心,支持 Cach…

第3讲 机器学习入门指南

近年来,随着企业和个人生成的数据量呈指数级增长,机器学习已成为日益重要的技术领域。从自动驾驶汽车到流媒体平台的个性化推荐,机器学习算法已广泛应用于各个场景。让我们深入解析机器学习的核心要义。3.1 机器学习定义机器学习是人工智能的…

深入理解跳表:多层索引加速查找的经典实现

跳表(Skip List)是一种多层有序链表结构,通过引入多级索引加速查找,其核心设计类似于“立体高速公路系统”,底层是原始链表,上面有各种高度的"高架桥"。 高层道路跨度大,连接远方节点…

Flutter 视频播放器——flick_video_player 介绍与使用

在移动端应用中,视频播放是一个常见的功能场景,例如短视频、直播、课程、广告展示等。 Flutter 本身并没有直接提供视频播放器组件,而是依赖第三方库来实现。 今天要介绍的库是 flick_video_player,它基于 video_player 封装&…

编写cmakelists文件常用语句

cmake_minimum_required (VERSION 3.10) 指定最小版本project(XXXX) 指定项目名字 ---------------set(MAIN_EXEC_NAME dwarf_parser) 定义变量${ MAIN_EXEC_NAME } 变量取值set(CMAKE_CXX_STANDARD 14) 指定c14标准,还有11、17、20等标准…

麒麟桌面系统找不到mbr启动,并重新安装grub

根据你提供的情况,“麒麟桌面系统找不到MBR启动”,这通常是由于GRUB引导损坏、MBR记录丢失或分区表异常导致的。你可以按照以下步骤重新安装GRUB并修复MBR启动: ✅ 步骤一:准备工具 使用银河麒麟LiveCD或U盘启动盘(可用Ventoy制作); 启动电脑,选择从U盘或光盘进入Live环…

【音频字幕】构建一个离线视频字幕生成系统:使用 WhisperX 和 Faster-Whisper 的 Python 实现

一、背景介绍 对于一端没有字幕外国视频、字幕,在不懂外语的情况下,怎么获取相关内容?作为技术宅,怎么自建搭建一个语音转文字的环境当前AI技术这么发达? 试试 二、系统设计 音频提取(仅仅是视频需要该逻辑、本身就是音…

Linux ALSA架构:PCM_OPEN流程 (二)

一 应用端源码路径: external\tinyalsa\pcm.c external\tinyalsa\pcm_hw.cstruct pcm *pcm_open(unsigned int card, unsigned int device,unsigned int flags, struct pcm_config *config) {...pcm->ops &hw_ops;pcm->fd pcm->ops->open(card, device,…

tp5的tbmember表闭包查询 openid=‘abc‘ 并且(wx_unionid=null或者wx_unionid=‘‘)

闭包查询 tbmember表闭包查询查询 openid‘abc并且islose0并且islogout0并且(wx_unionidnull或者wx_unionid’) Db::table(tbmember)->where([openid>abc,islose>0,islogout>0])->where(function ($query){$query->where(wx_unioni…

邪修实战系列(3)

1、第一阶段邪修实战总览(9.1-9.30) 把第一阶段(基础夯实期)的学习计划拆解成极具操作性的每日行动方案。这个计划充分利用我“在职学习”的特殊优势,强调“用输出倒逼输入”,确保每一分钟的学习都直接服务…