k8s教程(pod篇)-生命周期、重启策略及健康检查

简介: k8s教程(pod篇)-生命周期、重启策略及健康检查

01 引言

声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记

本文主要讲解pod的生命周期、重启策略、健康检查及服务可用性检查。

02 pod生命周期

pod在整个生命周期中被系统定义为各种状态,熟悉pod的各种状态对于理解如何设置pod的调度策略、重启策略是很有必要的,pod状态如下:

状态值 描述
Pending API Server已经创建了pod,但在pod内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程
Running pod内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态
Succeeded pod内所有容器均成功执行后退出,且不会在重启
Failed pod内所有容器均已退出,但至少有一个容器为退出失败状态
Unknown 由于某种原因无法获取该Pod的状态,可能由于网络通信不畅导致的

03 pod重启策略

pod的重启策略(RestartPolicy应用于pod内的所有容器,并且仅在pod所处的 nodekubelet 进行判断和重启操作

当某个容器异常退出或者健康检查 失败时,kubelet将根据RestartPolicy的设置进行相应的操作,pod的重启策略包括AlwaysOnFailureNever(默认值为Always):

重启策略 描述
Always 当容器失效时,由kubelet自动重启该容器
OnFailure 当容器终止运行且退出码不为0时,由kubelet自动重启该容器
Never 不论容器运行状态如何,kubelet都不会重启该容器

kubelet重启失效容器的时间间隔以symc-frequency乘以2n来计算,例如1、 2、4、8倍等,最长延时5min,并且在成功重启后的10min后重置该时间。

pod的重启策略与控制方式息息相关,当前可用于管理pod的控制器包括

ReplicationController、Job、DaemonSet,还可以通过kubelet管理(静态

pod)。每种控制器对Pod的重启策略要求如下:

控制器 要求
RC和DaemonSet 必须设置为Always,需要保证该容器持续运行
Job OnFailure或Never,确保容器执行完成后不再重启
kubelet 在Pod失效时自动重启它,不论将RestartPolicy设置为什么值,也不会对Pod进行健康检查

结合pod的状态和重启策略,常见的状态转换场景如下:

04 pod健康检查和服务可用性检查

Kubernetes对Pod的健康状态可以通过三类探针来检查:LivenessProbe、
ReadinessProbe及StartupProbe
,其中最主要的探针为LivenessProbe与

ReadinessProbe,kubelet会定期执行这两类探针来诊断容器的健康状况。

探针 作用
LivenessProbe探针 用于判断容器是否存活(Running状态),如果LivenessProbe探针探测到容器不健康,则kubelet“将“杀掉”该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,那么kubelet认 为该容器的LivenessProbe探针返回的值永远是Success
ReadinessProbe探针 用于判断容器服务是否可用(Ready状态),达到Ready状态的Pod才可以接收请求。对于被Service管理的Pod、Service与PodEndpoint的关联关系也将基于Pod是否Ready进行设置。如果在运行过程中Ready 状态变为False,则系统自动将其从Service的后端Endpoint列表中隔离出去,后续再把恢复到Ready状态的Pod加回后端Endpoint列表。这样就能保证客户端在访问Service时不会被转发到服务不可用的Pod实例上。需要注意的是ReadinessProbe也是定期触发执行的,存在于Pod的整个生命周期中
StartupProbe探针 某些应用会遇到启动比较慢的情况,例如应用程序启动时需要与远程服务器建立网络连接,或者遇到网络访问较慢等情况时,会造成容器启动缓慢,此时ReadinessProbe就不适用了,因为这属于“有且仅有一次” 的超长延时,可以通过StartupProbe探针解决该问题

以上探针均可配置以下三种实现方式。

4.1 方式一:ExecAction

ExecAction在容器内部运行一个命令,如果该命令的返回码为0,则 表明容器健康。

举例:通过运行cat/tmp/health命令来判断一个容器运行是否正常。在该pod运行后,将在创建/tmp/health文件10s后删除该文件,而LivenessProbe健康检查的初始探测时间(initialDelaySeconds)为15s,探测结果是Fail,将导致kubelet “杀掉” 该容器并重启它

4.2 方式二:TCPSocketAction

TCPSocketAction通过容器的IP地址和端口号执行TCP检查,如果能够建立TCP连接,则表明容器健康。

举例:通过与容器内的localhost:80建立TCP连接进行健康检查:

4.3 方式三:HTTPGetAction

HTTPGetAction通过容器的IP地址、端口号及路径调用HTTP Get方 法,如果响应的状态码大于等于200且小于400,则认为容器健康。

举例:kubelet定时发送HTTP请求到localhost:80/_status/healthz来进行容器应用的健康检查:

4.4 其它

对于每种探测方式,都需要设置initialDelaySecondstimeoutSeconds两个参数,它们的含义分别如下。

参数 含义
initialDelaySeconds 启动容器后进行首次健康检查的等待时间,单位为s
timeoutSeconds 健康检查发送请求后等待响应的超时时间,单位为s ,当超时发生时,kubelet会认为容器已经无法提供服务,将会重启该容器

如下代码片段是StartupProbe探针的一个参考配置,可以看到,这个Pod可以有长达30×10=300s的超长启动时间:

KubernetesPod可用性探针机制可能无法满足某些复杂应用对容器内服务可 用状态的判断,所以Kubernetes从1.11版本开始,引入了Pod Ready++特性对Readiness探测机制进行扩展,在1.14版本时达到GA稳定版本,称其为Pod

Readiness Gates。

Pod Readiness Gates给予了Pod之外的组件控制某个Pod就绪的能力,通过Pod Readiness Gates机制,用户可以设置自定义的Pod可用性探测方式来告诉Kubernetes某个Pod是否可用,具体使用方式是用户提供一个外部的控 制器(Controller)来设置相应Pod的可用性状态。

举例:Pod的Readiness Gates在Pod定义中的ReadinessGate字段进行一个类型为www.example.com/feature-l的新Readiness Gate:

新增的自定义Condition的状态(status)将由用户自定义的外部控制器设置(默认值为FalseKubernetes将在判断全部readinessGates条件都为True时, 才设置Pod为服务可用状态(ReadyTrue)

05 文末

本文主要讲解pod生命周期、重启策略及健康检查,希望能帮助到大家,谢谢大家的阅读,本文完!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
11月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
446 25
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
11月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
432 12
|
11月前
|
人工智能 运维 Kubernetes
2025 超详细!Lens Kubernetes IDE 多平台下载安装与集群管理教程
Lens 是一款企业级 Kubernetes 可视化操作平台,2025版实现了三大技术革新:AI智能运维(异常检测准确率98.7%)、多云联邦管理(支持50+集群)和实时3D拓扑展示。本文介绍其安装环境、配置流程、核心功能及高阶技巧,帮助用户快速上手并解决常见问题。适用于 Windows、macOS 和 Ubuntu 系统,需满足最低配置要求并前置依赖组件如 kubectl 和 Helm。通过 Global Cluster Hub 实现多集群管理,AI辅助故障诊断提升运维效率,自定义监控看板和插件生态扩展提供更多功能。
|
Perl
|
4月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
442 1
|
4月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
306 89
|
9月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
479 9
|
9月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
11月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
1023 33

推荐镜像

更多