当前位置:首页 > 技术 > 正文内容

Kubernetes Pod生命周期深度解析

访客 技术 2026年7月5日 1

Pod从创建到销毁的完整过程被称为Pod生命周期。这个过程包含多个关键阶段:创建Pod对象、运行初始化容器、启动主容器、执行钩子函数、进行健康检查,以及最终的Pod终止。

Pod阶段状态

在整个生命周期中,Pod会经历以下五种状态:

  • Pending(挂起):Pod资源已在API Server中创建,但尚未完成调度或镜像下载
  • Running(运行中):Pod已调度到某个节点,所有容器已被kubelet创建并启动
  • Succeeded(成功):Pod内所有容器正常终止且不会被重启
  • Failed(失败):容器终止,但至少有一个容器以非零退出码失败
  • Unknown(未知):API Server无法获取Pod状态,通常由网络通信问题导致

Pod创建与终止流程

创建过程

  1. 用户通过kubectl或其他客户端向API Server提交Pod创建请求
  2. API Server生成Pod对象并将信息存储到etcd,返回确认给客户端
  3. API Server通过watch机制通知其他组件Pod变化
  4. Scheduler检测到新Pod,分配节点并更新API Server
  5. 目标节点上的kubelet发现Pod调度过来,启动容器并返回状态
  6. API Server将Pod状态写入etcd

终止过程

  1. 用户发送删除Pod请求到API Server
  2. API Server更新Pod信息,在宽限期(默认30秒)内将Pod标记为Dead
  3. Pod状态变为Terminating
  4. kubelet监控到Terminating状态,启动关闭流程
  5. 节点控制器将Pod从匹配的Service端点列表中移除
  6. 如果定义了preStop钩子,则同步执行
  7. 容器进程收到停止信号(SIGTERM)
  8. 宽限期结束后,仍在运行的进程收到SIGKILL信号
  9. kubelet将宽限期设为0,完成删除操作

初始化容器

初始化容器在主容器启动前运行,用于完成前置准备工作。它们具有两个核心特性:必须运行到成功完成,且按定义顺序串行执行。

常见应用场景包括:

  • 提供主容器镜像中不包含的工具或代码
  • 延迟主容器启动直到依赖条件满足

以下示例演示如何使用初始化容器确保MySQL和Redis服务可达后再启动Nginx:

apiVersion: v1
kind: Pod
metadata:
  name: init-container-demo
  namespace: dev
spec:
  containers:
  - name: nginx-main
    image: nginx:1.17.1
    ports:
    - containerPort: 80
  initContainers:
  - name: check-mysql
    image: busybox:1.30
    command: ['sh', '-c', 'until ping 192.168.100.10 -c 1 ; do echo waiting for mysql...; sleep 2; done;']
  - name: check-redis
    image: busybox:1.30
    command: ['sh', '-c', 'until ping 192.168.100.20 -c 1 ; do echo waiting for redis...; sleep 2; done;']
# 创建Pod
kubectl apply -f init-container-demo.yaml

# 查看状态
kubectl get pod init-container-demo -n dev -w
kubectl describe pod init-container-demo -n dev

在另一个终端中模拟添加网络接口:

ifconfig ens33:1 192.168.5.14 netmask 255.255.255.0 up
ifconfig ens33:2 192.168.5.15 netmask 255.255.255.0 up

钩子函数

Kubernetes在主容器生命周期中提供两个钩子:容器启动后(postStart)和容器终止前(preStop)。

钩子支持的动作类型

  • Exec命令:在容器内执行命令
  • TCPSocket:尝试访问容器的指定TCP端口
  • HTTPGet:向容器的指定URL发起HTTP请求

以下示例使用Exec钩子在Nginx启动时修改首页,并在容器停止前优雅关闭服务:

apiVersion: v1
kind: Pod
metadata:
  name: hook-exec-demo
  namespace: dev
spec:
  containers:
  - name: nginx-main
    image: nginx:1.17.1
    ports:
    - containerPort: 80
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo 'Pod started' > /usr/share/nginx/html/index.html"]
      preStop:
        exec:
          command: ["/usr/sbin/nginx", "-s", "quit"]

钩子函数的定义位置在spec.containers.lifecycle下,每个容器都可以独立配置自己的钩子。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。