Skip to content

费曼学习法精讲:K8s YAML 中的 initContainers 和 containers ​

我用最通俗的比喻 + 核心逻辑 + 实战YAML,让你彻底听懂、能讲给别人听,完全吃透这两个核心配置!


核心前置比喻(刻在脑子里) ​

把 一个 Pod 想象成:一场正式的演唱会

  1. containers = 演唱会的核心主角/团队(歌手、乐队、灯光师) ✅ 负责正式演出、长期运行、核心业务
  2. initContainers = 演唱会的筹备团队(搭舞台、调设备、清场地) ✅ 只在演出开始前干活,干完立刻下班,绝不参与演出

一、先讲总规则(最关键!) ​

这是两者的铁律,所有逻辑都围绕它:

🚦 执行顺序(绝对不可逆) ​

所有 initContainers 按顺序 逐个执行完成 → 全部成功退出后 → 才会启动 containers

  • 初始化容器有一个失败 → Pod 一直重启,永远不会启动主容器
  • 初始化容器全部成功 → 销毁初始化容器 → 启动业务容器

二、详细拆解:containers(主容器/业务容器) ​

1. 它是什么? ​

Pod YAML 中 spec.containers 下的容器,就是我们天天用的业务容器 包括:主容器、Sidecar 辅助容器(日志、监控)

2. 核心特点 ​

  1. 长期运行:启动后一直干活,不会自动退出(崩溃才会重启)
  2. 并行执行:多个容器同时运行(比如 nginx + 日志收集器一起跑)
  3. 核心使命:运行业务代码(Nginx、Java、MySQL、微服务)
  4. 高可用:支持探针(存活/就绪)、重启策略、资源限制
  5. 共享环境:和 init 容器共享 Pod 的网络、存储卷

3. YAML 位置 ​

yaml
spec:
  # 👇 业务容器(主力军)
  containers:
    - name: nginx-web
      image: nginx:alpine

三、详细拆解:initContainers(初始化容器) ​

1. 它是什么? ​

Pod YAML 中 spec.initContainers 下的容器,专门做「前置准备工作」 干完就销毁,不参与业务运行

2. 核心特点 ​

  1. 一次性执行:运行完任务就退出,不常驻内存
  2. 串行执行:多个初始化容器一个接一个跑(前一个失败,后面全停)
  3. 失败必重启:只要失败,Pod 会无限重启初始化容器,直到成功
  4. 无业务逻辑:只做准备(等服务、拉配置、初始化数据)
  5. 共享环境:能和主容器用同一个存储、同一个网络

3. 最常用的场景(面试必考) ​

  • 等待依赖的服务启动(比如等 MySQL 启动,再启动微服务)
  • 初始化数据库数据、拉取配置文件
  • 挂载存储权限、网络连通性检测
  • 下载静态资源到共享目录,给主容器用

4. YAML 位置 ​

yaml
spec:
  # 👇 初始化容器(先遣队)
  initContainers:
    - name: wait-mysql
      image: busybox
      command: ["sleep", "10"] # 模拟等待MySQL启动

四、超清晰对比表(一眼看懂区别) ​

维度containers (业务容器)initContainers (初始化容器)
身份演唱会主角演唱会筹备组
执行时机最后启动最先执行
运行方式长期并行运行一次性串行执行
失败后果按策略重启容器Pod 整体重启,直到成功
核心作用运行业务,提供服务做前置准备,干完就走
支持探针支持(存活/就绪)默认不支持

五、实战完整 YAML(带注释,直接看懂) ​

这个例子:先等MySQL → 再下载网页文件 → 最后启动Nginx 完美体现两者的配合!

yaml
apiVersion: v1
kind: Pod
metadata:
  name: web-demo
spec:
  # ======================
  # 第一阶段:初始化容器(2个,串行执行)
  # ======================
  initContainers:
    # 1号初始化容器:等待MySQL启动
    - name: wait-db
      image: busybox
      command: ["sleep", "5"] # 模拟等数据库
    
    # 2号初始化容器:下载网页到共享存储
    - name: download-html
      image: busybox
      command: ["wget", "-O", "/html/index.html", "http://baidu.com"]
      volumeMounts:
        - name: shared-html
          mountPath: /html

  # ======================
  # 第二阶段:业务容器(初始化全部成功后,才启动!)
  # ======================
  containers:
    # 主容器:Nginx 读取共享存储的网页
    - name: nginx
      image: nginx:alpine
      volumeMounts:
        - name: shared-html
          mountPath: /usr/share/nginx/html

  # 共享存储:初始化容器写,主容器读
  volumes:
    - name: shared-html
      emptyDir: {}

六、Pod 完整执行流程(按这个背) ​

  1. Pod 创建 → 先运行 第一个 init 容器
  2. 第一个 init 成功退出 → 运行 第二个 init 容器
  3. 所有 init 容器全部成功 → 销毁 init 容器
  4. 启动 所有业务容器(并行运行)
  5. 业务容器正常提供服务

七、费曼终极总结(一句话讲透) ​

initContainers 是 Pod 的先遣初始化工具,串行、一次性、必须全部成功,专门干前置活; ​

containers 是 Pod 的核心业务主力,并行、长期运行,负责真正的服务提供; ​

二者严格遵守:先初始化,后业务 的铁律,共同完成 Pod 的全生命周期启动。 ​


口诀记忆(面试秒答) ​

初始化,串行跑,干完就走前置好;业务箱,并行跑,长期运行是主角;一个败,全重来,顺序绝对不能改!

用 VitePress 构建