【容器】Pod 生命周期

news2024/11/26 8:34:39

概述

Pod的生命周期包含从Pod创建事件的触发到Pod被停止的整个流程。了解Pod的生命周期方便日常排障,并能帮助较深入了解K8s。

在Pod生命周期中有两个重要的标识:Pod Condition 和 Pod Phase。Pod Phase提供了一个Pod当前状况的概览,可以帮助我们快速定位Pod当前在生命周期的哪个阶段,但是Pod Phase无法提供关于Pod状态更详细的信息。在Debug过程中,我们需要更多的准确反应Pod状态的指标,此时Pod Condition可以提供帮助。Pod Condition反应Pod是否已经到达了一个特定的阶段,并且为什么。不同于Pod Phase,Pod Condition有多个同时存在的标识,这些标识反映了Pod不同纬度的状态。

在这里插入图片描述

Pod Phase

Pod Phase 包含 Pending, Running, Succeeded, Failed, Unknow 5个阶段,我们重点关注从启动到运行的两个阶段: Pending & Running。

Pending指一个Pod已经被K8s确认接受,容器镜像被拉取到节点机成功,到所有Pod内容器成功启动之前的阶段。每个新启动的Pod一定会经历这个阶段,Pod处于Pending阶段是很正常的现象。但是一个或多个Pod长时间处于Pending状态,无法转换到Running状态表明系统是有问题的。几个可能导致Pod长时间处于Pending状态的原因:
1)Pod scheduler 工作异常。
2)集群内可分配资源不足。
3)镜像拉取异常。
上述三个原因可能有多个子原因,产生问题时需俱体分析。

Running指一个Pod中所有的Container都已启动,在此之后会一直维持Running。Running后Pod会被kubelet开始进行就绪探测(readiness probe)。

Pod Conditions

Pod Conditions 包含PodScheduled, Ready,Initialized,ContainersReady,DisruptionTarget,我们重点关注PodScheduled, Ready, ContainersReady这三个状态。与Pod Phase不同的是,多个Pod Conditions会同时存在,通过True & False 标识该Pod是否满足了某个Condition。
PodScheduled表示该Pod已经被成功调度,被分配了可用节点。PodScheduled为False的原因和调度相关,包含:
1)Pod scheduler 工作异常
2)集群内可分配资源不足

ContainersReady表示容器中的所有containers都已经通过了readiness probe的探测,准备好开始服务。ContainersReady为False的原因主要包含:
1)Container中1号进程启动失败
2)Container的Readiness Probe探测失败

Ready表示除ContainersReady外,Pod对于存储,网络的需求已经满足,Init Container的工作也执行完毕。当Pod处于Ready的状态时,表明该Pod已经完全准备好接收请求提供服务了。此时Pod的IP会被加入到对应Endpoint资源的Pod对象列表中,endpoint的信息会被同步到kube-proxy,此时Pod就真正要接收请求了。
值得注意的是,ContainersReady和Ready这两个状态通常会同时达到。Ready为False的原因多出了:
1)存储,网络需求未满足
2)init container未完成工作

实验

Pending + PodScheduled:False

由于没有合适的宿主节点导致Pod无法被调度

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:latest
        ports:
        - containerPort: 6379
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 10
      nodeSelector:
        disktype: ssd

Pending + PodScheduled:True&ContainersReady:False

由于镜像服务不可用导致Pod虽然被调度但是无法下载镜像

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: myprivateregistry.com/redis:latest
        ports:
        - containerPort: 6379
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 10

Running + PodScheduled:True&ContainersReady:False

Pod内容器启动,由于错误配置就绪探针导致ContainersReady一直错误。注意此处我们故意配置了错误的就绪探针,在真实场景中

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:latest
        ports:
        - containerPort: 6379
        readinessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 150
          periodSeconds: 10

Running + PodScheduled:True&ContainersReady:True&Ready:True

以下是一个能够正常启动并就绪的Pod yaml描述文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:latest
        ports:
        - containerPort: 6379
        readinessProbe:
          tcpSocket:
            port: 6379
          initialDelaySeconds: 10
          periodSeconds: 10

总结

在 Kubernetes 中,理解 Pod Phase 和 Pod Conditions 对于有效管理和监控 Pod 的生命周期至关重要。Pod Phase 描述了 Pod 的主要生命周期阶段,而 Pod Conditions 提供了更具体的健康状况信息,帮助我们诊断和解决问题。这些状态信息不仅对于日常的故障排查非常有用,例如帮助我们快速定位为什么大量 Pod 处于 Pending 状态,而且对于开发相关的 Kubernetes 操作也非常关键,如自定义的负载均衡器需要根据 Pod 的就绪状态来更新其配置。此外,理解包括那些较不常见的如 Evicted 在内的状态,可以让我们更全面地掌握和应对各种集群状况。这种知识的深入不仅能提升我们对系统的掌控,还能优化我们的应用性能和可靠性。

Appendix

Pod Phases 在K8s代码中的定义

const (
	// PodPending means the pod has been accepted by the system, but one or more of the containers
	// has not been started. This includes time before being bound to a node, as well as time spent
	// pulling images onto the host.
	PodPending PodPhase = "Pending"
	// PodRunning means the pod has been bound to a node and all of the containers have been started.
	// At least one container is still running or is in the process of being restarted.
	PodRunning PodPhase = "Running"
	// PodSucceeded means that all containers in the pod have voluntarily terminated
	// with a container exit code of 0, and the system is not going to restart any of these containers.
	PodSucceeded PodPhase = "Succeeded"
	// PodFailed means that all containers in the pod have terminated, and at least one container has
	// terminated in a failure (exited with a non-zero exit code or was stopped by the system).
	PodFailed PodPhase = "Failed"
	// PodUnknown means that for some reason the state of the pod could not be obtained, typically due
	// to an error in communicating with the host of the pod.
	// Deprecated in v1.21: It isn't being set since 2015 (74da3b14b0c0f658b3bb8d2def5094686d0e9095)
	PodUnknown PodPhase = "Unknown"
)

Pod Conditions 在K8s代码中的定义

// These are valid conditions of pod.
const (
	// PodScheduled represents status of the scheduling process for this pod.
	PodScheduled PodConditionType = "PodScheduled"
	// PodReady means the pod is able to service requests and should be added to the
	// load balancing pools of all matching services.
	PodReady PodConditionType = "Ready"
	// PodInitialized means that all init containers in the pod have started successfully.
	PodInitialized PodConditionType = "Initialized"
	// ContainersReady indicates whether all containers in the pod are ready.
	ContainersReady PodConditionType = "ContainersReady"
	// DisruptionTarget indicates the pod is about to be terminated due to a
	// disruption (such as preemption, eviction API or garbage-collection).
	DisruptionTarget PodConditionType = "DisruptionTarget"
)

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

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

相关文章

APP 在华为应用市场上架 保姆级别详细流程

1、作为一名干开发的程序员,第一次能把自己的APP 上架,对自己来说是多么有意义的一项成就 2、创建一个 华为的开发者账号 根据提示填写完注册的信息https://developer.huawei.com/consumer/cn/product/华为开发者产品 | 开发者平台 | 流量变现 | 华为开…

Three.js的几何形状

在创建物体的时候,需要传入两个参数,一个是几何形状【Geometry】,一个是材质【Material】 几何形状主要是存储一个物体的顶点信息,在Three中可以通过指定一些特征来创建几何形状,比如使用半径来创建一个球体。 立方体…

Android Studio查看xml文件的修改时间和记录

Android Studio查看xml文件的修改时间和记录 Android Studio里面如果是Java/Kotlin编写界面,可以点击函数开头上面的提交在直接,然后在编辑界面的左侧查看历史时间上的修改记录,但是xml文件里面没有直观的这样操作方式。 但xml里面可以通过快…

FileLink跨网文件交换,推动企业高效协作|半导体行业解决方案

随着信息技术的迅猛发展,全球信息产业已经迎来了前所未有的繁荣与变革。在这场科技革命中,半导体作为信息产业的基础与核心,其重要性日益凸显,半导体的应用场景和市场需求将进一步扩大。 然而,在这一繁荣的背后&#x…

微信公众号营销攻略,2024年微信引流商业最佳实践

确实,微信是中国市场上不可或缺的营销工具。下面是一些关于如何在微信上进行有效营销的最佳实践,以及如何通过微信公众号进行广告宣传,以提升品牌知名度并推动业务增长。 拥有一个微信公众号是进行微信营销的关键第一步。 通过公众号&#x…

UE5自动生成地形一:地形制作

UE5自动生成地形一:地形制作 常规地形制作地形编辑器地形管理添加植被手动修改部分地形的植被 置换贴图全局一致纹理制作地貌裸露岩石地形实例 常规地形制作 地形制作入门 地形导入部分 选择模式:地形模式。选择地形子菜单:管理->导入 …

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.13-1.14

目录 第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周:深度学习的 实践层面 (Practical aspects of Deep Learning)1.13 梯度检验&#…

蓝桥杯单片机之模块代码《AT24C02》

过往历程 历程1:秒表 历程2:按键显示时钟 历程3:列矩阵按键显示时钟 历程4:行矩阵按键显示时钟 历程5:新DS1302 历程6:小数点精确后两位ds18b20 历程7:35定时器测量频率 文章目录 过往历…

微信小程序(Taro)获取经纬度并转化为具体城市

1、获取经纬度 申请权限,想要使用微信小程序获取经纬度的方法是要申请该方面的权限。 获取经纬度的方法有很多选择其中一个使用就好。 我使用的是Taro.getFuzzyLocation() 在app.config.js中需要添加设置 requiredPrivateInfos: ["getFuzzyLocat…

安装numpy遇到的问题

安装numpy的时候提示无法安装如下: (venv) E:\works\AI\venv\Scripts>pip install numpy pandas matplotlib jupyter -i https://pypi.douban.com/simple Looking in indexes: https://pypi.douban.com/simple WARNING: Retrying (Retry(total4, connectNone, r…

怎么把图片尺寸在线修改?5种方法调整方式介绍

在日常生活和工作中,我们经常遇到需要调整图片尺寸的情况,无论是为了适应自媒体文章内容中的图片、还是上传社交媒体平台要求,调整图片尺寸是一项非常有用的技能。在本教程中,我们将介绍几个方便快捷的图片处理工具,帮…

c++编程(10)——string

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 <string>string类的接口构造、析构、与赋值重载构造函数赋值重载运算符 元素访问operator[] 容量修改器对string对象的操作迭代器 std::string是定义在c标准的一个类&#xff0c;定义在标准库<strin…

【JavaEE初阶系列】——Servlet运行原理以及Servlet API详解

目录 &#x1f6a9;Servlet运行原理 &#x1f6a9;Servlet API 详解 &#x1f393;HttpServlet核心方法 &#x1f393;HttpServletRequest核心方法 &#x1f388;核心方法的使用 &#x1f534;获取请求中的参数 &#x1f4bb;query string &#x1f4bb;直接通过form表…

如何更好地使用Kafka? - 事先预防篇

要确保Kafka在使用过程中的稳定性&#xff0c;需要从kafka在业务中的使用周期进行依次保障。主要可以分为&#xff1a;事先预防&#xff08;通过规范的使用、开发&#xff0c;预防问题产生&#xff09;、运行时监控&#xff08;保障集群稳定&#xff0c;出问题能及时发现&#…

【自动驾驶|毫米波雷达】初识毫米波雷达射频前端硬件

第一次更新&#xff1a;2024/5/4 目录 整体概述 混频器&#xff08;MIXER&#xff09; 低通滤波器&#xff08;LPF&#xff1a;Low-Pass filter&#xff09; 数模转换器&#xff08;ADC&#xff1a;Analog to Digital Converter&#xff09; 毫米波雷达功能框图 整体概述 完…

分布式与一致性协议之ZAB协议(六)

ZAB协议 成员发现 成员发现是通过跟随者和领导者交互来完成的&#xff0c;目标是确保大多数节点对领导者的关系没有异议&#xff0c;也就是确立领导者的领导地位。成员发现的实现流程如图所示。 1.领导者选举结束&#xff0c;节点进入跟随者状态或者领导者状态后&#xff0…

微软 AI 研究团队推出 SIGMA:一个开源研究平台,旨在推动混合现实与人工智能交叉领域的研究与创新

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

YzmCMS 7.0任意函数调用RCE 漏洞研究分析

YzmCMS是一款基于YZMPHP开发的一套轻量级开源内容管理系统,YzmCMS简洁、安全、开源、免费,可运行在Linux、Windows、MacOSX、Solaris等各种平台上,专注为公司企业、个人站长快速建站提供解决方案。 YzmCMS 某些接口调用了 db_pdo类的where方法 导致了远程命令执行漏洞&#xf…

PLC学习笔记

PLC学习笔记 前言一、一些基操知识二、GX works2编程2.1 位逻辑1.2 中间寄存器1.3 PLC的扫描方式 总结 前言 我这个人真的是太渴望知识了~ 一、一些基操知识 一般X表示输入&#xff0c;Y表示输出。一般八个为一组X0~X7M表示中间寄存器&#xff0c;M0~M7时间T、计数C 二、GX …

操作系统:线程相关知识

目录 1.生产消费者模型 1.1.概念引入 1.2.基于阻塞队列的生产消费模型 1.3.POSIX信号量 1.3.1.再识信号量 1.3.2.信号量接口的学习 1.4.基于环行队列的生产消费模型 1.5.深刻理解生产消费模型 2.可重入函数与线程安全 1.生产消费者模型 1.1.概念引入 生产者-消费者模型…