K8s(14) Pod创建流程与生命周期、常见工作负载控制器、调度器以及 CNI 网络插件

一、Pod 创建流程(以 kubectl apply 为例)

  1. 提交请求kubectl将 YAML 发给 kube-apiserver,apiserver 做认证/鉴权/校验。

  2. 写入 etcd :apiserver 将 Pod 对象(Phase=PendingnodeName="")写入 etcd

  3. 调度(Scheduler)kube-scheduler通过 watch 发现未调度的 Pod → 过滤 (资源、污点、亲和性等)→ 打分 ​ → 选出最优 Node → 将 nodeName写回 apiserver/etcd。

  4. Kubelet 接管 :目标节点上的 kubelet​ watch 到绑定本节点的 Pod:

    • 调用 CNI 插件创建 Pause 容器(建 Pod 网络命名空间)

    • 按顺序执行 Init Container(全部成功才继续)

    • 拉取镜像 → 启动 业务容器/Sidecar

    • 执行 PostStart Hook,激活 Readiness/Liveness Probe

  5. Running:Pod 被加入 Service Endpoints,开始接收流量。

若由 Deployment 等控制器创建,流程前还有一步:Controller Manager 根据副本数创建 ReplicaSet → 再由 ReplicaSet 创建 Pod 对象。

Pod 终止(优雅关闭) :apiserver 标记 Terminating→ 从 Service 摘除 → 执行 PreStop Hook → 发 SIGTERM(默认等待30s)→ SIGKILL → 清理网络/存储。


二、Pod 生命周期 Phase

Phase 含义
Pending 已存入 etcd,但还未调度或镜像未拉完
Running 已调度到节点,至少一容器运行中(Init 可能还在跑)
Succeeded 所有容器正常退出(如 Job 完成)
Failed 至少一容器异常退出
Unknown 节点与 apiserver 失联,状态无法获取

三、常见工作负载控制器(Workload)

控制器 用途 关键特性
Deployment 无状态应用(Web/API) 管理 ReplicaSet,支持滚动更新、回滚、扩缩容,Pod 名随机、可互换
ReplicaSet 维持 Pod 副本数 通常被 Deployment 间接管理,很少直接创建
StatefulSet 有状态应用(MySQL/ES/Kafka) 固定 Pod 名(xxx-0, xxx-1)、有序启停、独立 PVC、Headless Service
DaemonSet 每节点守护进程(日志采集/fluentd、监控、CNI) 每个匹配节点运行一个 Pod,节点增删自动调度/回收
Job 一次性批处理任务 Pod 成功退出后不重启,可设重试次数
CronJob 定时任务 按 cron 表达式周期创建 Job(备份、报表等)

四、调度器 kube-scheduler

  • 作用 :监听未调度的 Pod,选出最合适的 Node 并绑定(spec.nodeName)。

  • 两阶段算法

    • 过滤(Filter/Predicate):剔除不满足条件的节点(CPU/内存不足、污点不匹配、端口冲突等)

    • 打分(Score/Priority):对剩余节点打分(资源均衡、Pod 打散、自定义优先级),选最高分

  • 影响调度的方式nodeSelectornodeAffinity/podAffinity/podAntiAffinity、Taint/Toleration、自定义调度器。


五、CNI 网络插件(常见:Flannel & Calico)

K8s 通过 CNI(Container Network Interface)标准给 Pod 分配 IP、配置跨节点通信。

对比项 Flannel Calico
实现方式 Overlay(VXLAN)或 Host-GW 纯三层 BGP 路由 / IPIP / VXLAN
性能 中等(VXLAN 有封装开销) 较高(BGP 直路无隧道)
NetworkPolicy ❌ 不支持 ✅ 支持(K8s NetworkPolicy / 细粒度 ACL)
复杂度 低,开箱即用 较高,功能丰富
适用场景 中小集群、简单网络需求 大规模集群、需网络策略和高性能