一、Pod 创建流程(以 kubectl apply 为例)
-
提交请求 :
kubectl将 YAML 发给 kube-apiserver,apiserver 做认证/鉴权/校验。 -
写入 etcd :apiserver 将 Pod 对象(Phase=
Pending,nodeName="")写入 etcd。 -
调度(Scheduler) :
kube-scheduler通过 watch 发现未调度的 Pod → 过滤 (资源、污点、亲和性等)→ 打分 → 选出最优 Node → 将nodeName写回 apiserver/etcd。 -
Kubelet 接管 :目标节点上的 kubelet watch 到绑定本节点的 Pod:
-
调用 CNI 插件创建 Pause 容器(建 Pod 网络命名空间)
-
按顺序执行 Init Container(全部成功才继续)
-
拉取镜像 → 启动 业务容器/Sidecar
-
执行 PostStart Hook,激活 Readiness/Liveness Probe
-
-
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 打散、自定义优先级),选最高分
-
-
影响调度的方式 :
nodeSelector、nodeAffinity/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) |
| 复杂度 | 低,开箱即用 | 较高,功能丰富 |
| 适用场景 | 中小集群、简单网络需求 | 大规模集群、需网络策略和高性能 |