当前位置: 首页 > news >正文

【Kubernetes 集群核心概念:Pod】pod生命周期介绍【五】

5.1 Pod生命周期

Pod的生命周期指的是从Pod创建到终止的整个过程。它分为以下两种常见情况:

  • 长期运行Pod: 例如运行HTTP服务的Pod,它在正常情况下会一直运行,但可以手动删除或终止。
  • 短期运行Pod: 例如执行计算任务的Pod,任务完成后自动终止。

5.1.1 容器启动

  1. 初始化容器(Init Containers):在Pod中的主容器启动之前,初始化容器会先执行一些环境设置或初始化操作。
  2. 主容器启动:初始化完成后,Pod的主容器开始启动。
  3. Post-Start 操作:主容器启动后,会执行一个启动后钩子操作(PostStart Hook),用于启动后的一些任务。
  4. 健康检查:主容器启动后,Kubernetes会通过两种健康检查来确保容器的运行状态:
    • 存活状态检查(Liveness Probe):检查容器是否存活,如果失败,Kubernetes会尝试重新启动容器。
    • 准备就绪检查(Readiness Probe):检查容器是否准备好接受请求。如果失败,Pod会被从服务端点列表中移除,直到恢复健康。

5.1.2 容器终止

  1. Pre-Stop 操作:在容器终止前,可以设置一个终止前钩子(PreStop Hook),执行容器终止前的清理工作。
  2. 强制终止:如果容器未能在规定时间内终止,Kubernetes会在大约30秒后强制终止容器。
  3. 容器重启:根据容器的重启策略,Pod的容器可能会被重启。

5.1.3 容器重启策略

  • Always:容器挂掉后会一直重启,这是默认策略。
  • OnFailure:容器状态为错误时才重启,即容器正常终止时不会重启。
  • Never:容器挂掉后不会重启。

对于Always策略,容器挂掉后会立即重启,如果再次失败,会延时重启,例如第一次失败后10秒重启,第二次失败后20秒重启,以此类推。


5.2 HealthCheck 健康检查

容器可能因为服务未启动或端口不正确等问题,无法正常运行。为此,Kubernetes提供了健康检查机制来检测Pod的状态。

5.2.1 Health Check方式

  • Liveness Probe(存活状态探测):检查容器是否仍然在运行。如果失败,kubelet会杀死容器并根据重启策略决定是否重启。
  • Readiness Probe(就绪型探测):检查容器是否准备好为外部请求提供服务。如果失败,Pod将被移除出服务的端点列表。
  • Startup Probe:检查容器中的应用是否已经启动。如果启动探测失败,kubelet会杀死容器,并按重启策略重启。

5.2.2 Probe 探测方式

方式说明
Exec执行命令
HTTPGet通过HTTP请求指定URL路径
TCP通过TCP连接指定端口
gRPC使用gRPC执行远程过程调用,若返回状态为" SERVING"则认为探测成功

5.2.3 liveness-exec 示例

  1. 创建YAML文件:
apiVersion: v1
kind: Pod
metadata:name: liveness-execnamespace: default
spec:containers:- name: livenessimage: busyboximagePullPolicy: IfNotPresentargs:- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600livenessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 5periodSeconds: 5
  1. 应用YAML文件:
kubectl apply -f pod-liveness-exec.yml
  1. 查看Pod状态:
kubectl describe pod liveness-exec

通过观察日志和事件,可以看到容器因健康检查失败而被重启,且重启间隔时间逐渐增加。


5.2.4 liveness-httpget 示例

  1. 创建YAML文件:
apiVersion: v1
kind: Pod
metadata:name: liveness-httpgetnamespace: default
spec:containers:- name: livenessimage: nginx:1.15-alpineports:- name: httpcontainerPort: 80livenessProbe:httpGet:port: httppath: /index.htmlinitialDelaySeconds: 3periodSeconds: 5
  1. 应用YAML文件:
kubectl apply -f pod-liveness-httpget.yml
  1. 通过删除nginx主页文件来模拟故障,并验证容器的健康检查机制是否会触发重启。

5.2.5 readiness 示例

  1. 创建YAML文件:
apiVersion: v1
kind: Pod
metadata:name: readiness-httpgetnamespace: default
spec:containers:- name: readinessimage: nginx:1.15-alpineports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: httppath: /index.htmlinitialDelaySeconds: 3periodSeconds: 5
  1. 应用YAML文件:
kubectl apply -f pod-readiness-httpget.yml
  1. 通过删除nginx主页文件验证Readiness Probe的工作原理。

5.2.6 readiness + liveness 综合示例

  1. 创建YAML文件:
apiVersion: v1
kind: Pod
metadata:name: readiness-liveness-httpgetnamespace: default
spec:containers:- name: readiness-livenessimage: nginx:1.15-alpineports:- name: httpcontainerPort: 80livenessProbe:httpGet:port: httppath: /index.htmlinitialDelaySeconds: 1periodSeconds: 3readinessProbe:httpGet:port: httppath: /index.htmlinitialDelaySeconds: 5periodSeconds: 5
  1. 应用YAML文件:
kubectl apply -f pod-readiness-liveness.yml

5.3 Post-Start & Pre-Stop 生命周期钩子

  • Post-Start:在容器启动后立即执行的操作,常用于目录创建或其他初始化任务。
  • Pre-Stop:在容器停止前执行的操作,常用于优雅停机。

通过配置YAML文件,可以灵活控制Pod的生命周期,确保容器在启动和停止时完成必要的工作。


5.4 Pod故障排除

状态描述
PendingPod已被接收,但容器尚未启动。
RunningPod已绑定到节点,并且至少有一个容器正在运行。
Completed所有容器已成功终止,不会重新启动。
Failed容器已经退出并且终止状态非零。
CrashLoopBackOff容器因错误反复崩溃,导致Kubernetes无法正常启动。

使用kubectl describe pod <pod_name>kubectl logs <pod_name>可以帮助定位问题。


总结

本文讲解了Pod的生命周期,包括容器的启动、运行、健康检查、终止及相关的钩子操作。通过配置适当的健康检查、重启策略和生命周期事件,Kubernetes能有效地管理Pod的运行状态。掌握这些操作能够帮助你在实际部署中更好地监控和调优Kubernetes集群。

你是否曾经因为错误的健康检查配置而导致服务不可用?如何在生产环境中实现高效的Pod生命周期管理?

http://www.lryc.cn/news/492825.html

相关文章:

  • c++的虚继承说明、案例、代码
  • 小米PC电脑手机互联互通,小米妙享,小米电脑管家,老款小米笔记本怎么使用,其他品牌笔记本怎么使用,一分钟教会你
  • 介绍SSD硬盘
  • CMAKE常用命令详解
  • Vue3的通灵之术Teleport
  • ue5第三人称闯关游戏学习(一)
  • IIC 随机写+多次写 可以控制写几次
  • controller中的参数注解@Param @RequestParam和@RequestBody的不同
  • 手搓人工智能-最优化算法(1)最速梯度下降法,及推导过程
  • 多目标优化算法——多目标粒子群优化算法(MOPSO)
  • Swift——自动引用计数ARC
  • 【Quarkus】基于CDI和拦截器实现AOP功能(进阶版)
  • 【踩坑日记】【教程】如何在ubuntu服务器上配置公钥登录以及bug解决
  • insmod一个ko提供基础函数供后insmod的ko使用的方法
  • 七、传统循环神经网络(RNN)
  • LeetCode:19.删除链表倒数第N个节点
  • 【RISC-V CPU debug 专栏 2 -- Debug Module (DM), non-ISA】
  • 单片机学习笔记 11. 外部中断
  • 基于stm32的智能教室管理系统/智能家居系统
  • 基于 Qt 和 GStreamer 的环境中构建播放器
  • windows docker 入门
  • baomidou Mabatis plus引入异常
  • 深度学习中的正则化模型是什么意思?
  • 修改IDEA配置导致Spring Boot项目读取application.properties中文乱码问题
  • Flink 热存储维表 使用 Guava Cache 减轻访问压力
  • 深入探索SenseVoiceSmall:高效多语言语音识别与处理模型
  • Flink--API 之Transformation-转换算子的使用解析
  • 每日十题八股-2024年11月27日
  • OpenCV截取指定图片区域
  • Java部分新特性