【K8s思维导图及单节点容器启动流程】

K8s思维导图

K8s 单节点容器启动全流程

核心前提

K8s 集群中每个节点都需部署容器运行时相关组件,可通过 Ansible 实现所有节点的标准化批量安装配置,避免手动操作不一致。

容器启动核心流程(分层拆解)

整个流程遵循"上层编排→标准化接口→底层执行→内核支撑"的设计,核心链路分两条(根据容器运行时不同):

  • 链路1(CRI-O 运行时):Kubelet → CRI → CRI-O → runc → Linux 内核
  • 链路2(Containerd 运行时):Kubelet → CRI → Containerd → containerd-shim → runc → Linux 内核
组件层级 组件名称 核心角色与作用
节点核心代理 Kubelet(节点代理) 1. 节点"大管家",每个节点必部署,接收控制平面(API Server)的 Pod 调度指令; 2. 不直接操作容器,通过 CRI(容器运行时接口) 调用底层运行时; 3. 额外职责:监控 Pod/容器健康状态、上报节点资源、执行探针检查。
标准化接口层 CRI(Container Runtime Interface) 1. 本质:K8s 定义的接口规范 (非具体软件); 2. 核心作用:解耦 Kubelet 与容器运行时,只要运行时实现 CRI,即可与 Kubelet 无缝对接(支持 CRI-O、containerd 等)。
容器运行时层 CRI-O/Containerd 1. 本质:符合 CRI 标准的具体容器运行时软件 (CRI-O 专为 K8s 设计,Containerd 更通用); 2. 核心职责: - 调用 /container/image 库拉取/管理容器镜像; - 调用 /container/storage 库管理容器存储卷和文件系统; - 协调容器生命周期(创建/停止/删除),最终调用 runc 执行实际操作; 3. Containerd 额外通过 containerd-shim 守护进程管理容器,避免主进程挂掉导致容器退出。
容器执行层 runc 1. 本质:符合 OCI(开放容器倡议) 标准的轻量级工具,无常驻守护进程; 2. 核心角色:"最终执行者",直接对接 Linux 内核; 3. 工作逻辑:读取镜像/配置,向内核发起系统调用,利用 Namespaces(资源隔离)和 cgroups(资源限制)创建容器进程。
底层支撑层 Linux 内核 1. 核心能力:通过 Namespaces 实现容器的 PID/网络/挂载/用户等隔离;通过 cgroups 限制容器 CPU/内存/IO 等资源; 2. 最终结果:创建隔离的容器进程,提供独立运行环境。
镜像/容器实体 Container Image/Container 1. 容器镜像:只读模板,包含应用运行所需的所有文件、依赖、配置; 2. 容器:镜像的运行实例,拥有独立文件系统、网络、进程空间。
流程简化理解(通俗版)
  1. 控制平面告诉节点的 Kubelet:"启动这个 Pod";
  2. Kubelet 按 CRI 标准喊:"CRI-O/Containerd,帮我起容器";
  3. CRI-O/Containerd 先把镜像从仓库拉下来,准备好存储环境,然后喊:"runc,你来实际创建容器";
  4. runc 向 Linux 内核申请:"给这个进程开隔离空间、设资源限制";
  5. 内核完成隔离和限制,容器进程正式启动。
关键设计特点
  1. 解耦化:CRI 解耦 Kubelet 与运行时,OCI 解耦 runc 与镜像/运行时,底层内核能力解耦 runc 与操作系统(只要内核支持 Namespaces/cgroups 即可);
  2. 轻量化:runc 无守护进程,仅负责容器创建,资源占用极低;
  3. 标准化:全流程遵循 CRI/OCI 标准,兼容不同运行时和镜像格式;
  4. 可批量部署:所有节点的 Kubelet、CRI-O/Containerd、runc 等组件,可通过 Ansible 编写 Playbook 实现一键批量安装配置,保证集群节点环境一致。

总结

  1. K8s 单节点容器启动的核心逻辑是"上层编排指令→标准化接口转发→运行时资源准备→底层工具执行→内核提供隔离环境";
  2. 核心链路为 Kubelet → CRI → 容器运行时(CRI-O/Containerd) → runc → Linux 内核
  3. 所有节点的组件可通过 Ansible 批量部署,保证集群环境统一,体现 K8s "上层编排调度+下层标准化运行时"的架构设计核心。
相关推荐
再难也得平1 小时前
[LeetCode刷题]1.两数之和(java题解)
java·算法·leetcode
yaoxin5211231 小时前
327. Java Stream API - 实现 joining() 收集器:从简单到进阶
java·开发语言
礼拜天没时间.2 小时前
企业级Docker镜像仓库Harbor部署实战
linux·运维·docker·云原生·容器·sre
再难也得平2 小时前
[LeetCode刷题]283.移动零(通俗易懂的java题解)
java·算法·leetcode
野犬寒鸦2 小时前
Java8 ConcurrentHashMap 深度解析(底层数据结构详解及方法执行流程)
java·开发语言·数据库·后端·学习·算法·哈希算法
阿寻寻2 小时前
【云原生技术】Pod 列表新增时间字段:取值口径与获取方式
docker·云原生·kubernetes
百锦再2 小时前
Java IO详解:File、FileInputStream与FileOutputStream
java·开发语言·jvm·spring boot·spring cloud·kafka·maven
追随者永远是胜利者2 小时前
(LeetCode-Hot100)647. 回文子串
java·算法·leetcode·职场和发展·go
春和景明3602 小时前
mysql复习
java