Skip to content

K8s 工作负载:Pod / Deployment / StatefulSet / DaemonSet / Job ​

一、Pod —— 最小调度单元 ​

定义:一个或多个共享网络命名空间(同一 IP、端口空间)和存储卷的容器集合。K8s 调度的单位是 Pod,不是容器。

为什么需要 Pod(设计动机,必答):

  • 有些容器天然要紧密协作:如主应用 + sidecar(日志采集/代理)、初始化任务。
  • 它们需要共享网络(本地 localhost 通信)和共享存储。
  • Pod 提供这种"共置 + 共享命名空间"的边界,同时保持容器的隔离性。

Pod 内共享什么:

  • 网络:同一 IP、同一端口空间(容器间 localhost 直通)。
  • 存储:可挂载同一 Volume。
  • IPC / UTS 命名空间(可选)。
  • 不共享:文件系统(各容器根文件系统独立,除非用卷)。

生命周期阶段:Pending → Running → Succeeded/Failed(+ Unknown)。容器状态:Waiting / Running / Terminated。

多容器模式:

  • Sidecar:辅助主容器(代理、日志、监控)。
  • Init 容器:主容器启动前按序执行、跑完即退,用于初始化(等依赖、拉配置)。
  • Ambassador / Adapter:代理外部访问 / 适配输出格式。

Pod 是"短命"的:不保证长久存活;被删即重建(由控制器),一般不该手写裸 Pod(除调试)。

二、Deployment —— 无状态应用 ​

  • 管理 ReplicaSet,ReplicaSet 管 Pod,实现副本数保持 + 滚动更新 + 回滚。
  • 适合无状态服务(Web/API):副本可互换,不关心身份与顺序。
  • 更新策略:RollingUpdate(默认,maxSurge/maxUnavailable 控制节奏)或 Recreate。
  • 回滚:kubectl rollout undo(保留历史 ReplicaSet)。

层级:Deployment → ReplicaSet → Pod。改 Deployment 模板 → 生成新 ReplicaSet → 逐批替换。

三、StatefulSet —— 有状态应用 ​

适合数据库、消息队列等有状态服务,区别于无状态的三个保证:

  1. 稳定网络标识:Pod 名固定为 <statefulset>-0/1/2...,配 Headless Service 给稳定 DNS。
  2. 稳定存储:每个 Pod 绑定自己的 PVC(volumeClaimTemplates),重建后仍挂回原盘。
  3. 有序部署/扩缩/删除:默认按序号 0→N 顺序创建,逆序删除(可配 podManagementPolicy: Parallel)。

对比题:Deployment vs StatefulSet——身份(随机 vs 固定序号)、存储(共享/无 vs 独占持久)、顺序(并行无序 vs 有序)。核心动机:有状态服务需要"谁是谁"稳定可寻址。

四、DaemonSet —— 每节点一个 ​

  • 保证每个(或指定)节点上运行一个 Pod。
  • 用途:日志采集(fluentd/filebeat)、监控(node-exporter)、网络插件(CNI agent)、存储守护进程。
  • 新节点加入会自动调度;节点移除自动回收。

五、Job / CronJob —— 批处理与定时 ​

  • Job:跑完即止的任务,保证成功完成指定次数(completions/parallelism),适合批处理、迁移。
  • CronJob:按 cron 表达式周期性创建 Job,适合定时任务。
  • 关注:失败重试(backoffLimit)、并发策略、历史保留(successfulJobsHistoryLimit)。

六、其他控制器 ​

  • ReplicaSet:保证副本数(一般由 Deployment 管理,不直接用)。
  • HorizontalPodAutoscaler (HPA):按 CPU/内存/自定义指标自动扩副本。
  • PodDisruptionBudget (PDB):限制自愿驱逐(如节点维护)时的可用副本下限。
  • Operator:用 CRD + 控制器把"运维知识"编码(如 etcd/mysql operator),是 StatefulSet 复杂场景的进阶。

七、高频速答 ​

Q:Pod 和容器什么区别? A:Pod 是调度与共享边界,可含多容器;容器是实际运行单元。同 Pod 容器共享网络/存储。

Q:为什么一般不直接创建 Pod? A:裸 Pod 无自愈、无副本、无滚动更新;用 Deployment/StatefulSet 由控制器保证期望状态。

Q:滚动更新期间旧 Pod 会立刻删吗? A:不会,按 maxSurge/maxUnavailable 先起新副本就绪再删旧的,保证可用性。

Q:StatefulSet 的 Pod 重启后 IP/名字变吗? A:名字(DNS)稳定不变;IP 可能变(除非用固定网络方案),所以有状态服务应通过稳定的 DNS 名互相寻址,而非 IP。

Q:Init 容器和普通容器区别? A:Init 容器按序执行、必须成功才启动主容器,且不参与生命周期探针、独立镜像;适合初始化与依赖等待。

糌粑的面经笔记 · VitePress 版