深入剖析容器运行时:从 OCI 规范到 Kubernetes CRI 的完整技术链路
容器技术已经成为现代云计算和微服务架构的基石。当我们执行 docker run 或 kubectl apply 时,背后到底是什么在运作?容器运行时(Container Runtime)是容器生态中最核心也最复杂的组件之一。本文将深入剖析从 OCI(Open Container Initiative)开放容器规范到 Kubernetes CRI(Container Runtime Interface)的完整技术链路,揭示容器从镜像到运行的全生命周期。
一、OCI 规范:容器标准化的基石
2015年,Docker、CoreOS、Red Hat等行业巨头共同发起了 Open Container Initiative(OCI),旨在制定开放的容器格式和运行时规范。目前 OCI 发布了三个核心规范:
- image-spec:定义容器镜像的格式和文件系统布局
- runtime-spec:定义容器的运行环境和生命周期管理
- distribution-spec:定义容器镜像的分发协议
1.1 runtime-spec 核心概念
OCI runtime-spec 定义了容器的配置格式和生命周期状态机。核心配置文件是 config.json,它精确描述了容器运行所需的一切环境参数:
{ \"ociVersion\": \"1.0.2\", \"process\": { \"terminal\": false, \"user\": { \"uid\": 0, \"gid\": 0 }, \"args\": [ \"sh\" ], \"env\": [ \"PATH=/usr/local/bin:/usr/bin:/bin\" ], \"cwd\": \"/\", \"capabilities\": { \"bounding\": [\"CAP_NET_BIND_SERVICE\", \"CAP_CHOWN\", \"CAP_DAC_OVERRIDE\"], \"effective\": [\"CAP_NET_BIND_SERVICE\", \"CAP_CHOWN\", \"CAP_DAC_OVERRIDE\"] } }, \"root\": { \"path\": \"rootfs\" }, \"mounts\": [ { \"destination\": \"/proc\", \"type\": \"proc\", \"source\": \"proc\" }, { \"destination\": \"/sys\", \"type\": \"sysfs\", \"source\": \"sysfs\" } ], \"linux\": { \"namespaces\": [ { \"type\": \"pid\" }, { \"type\": \"network\" }, { \"type\": \"mount\" }, { \"type\": \"ipc\" }, { \"type\": \"uts\" }, { \"type\": \"cgroup\" } ], \"resources\": { \"memory\": { \"limit\": 536870912 }, \"cpu\": { \"shares\": 1024 } }, \"maskedPaths\": [\"/proc/kcore\"], \"readonlyPaths\": [\"/proc/sys\"] } } runtime-spec 还定义了容器的完整生命周期状态:
- creating:创建阶段,分配资源但未启动进程
- created:创建完成,容器环境就绪但进程未运行
- running:容器进程正在运行
- stopped:容器进程已停止,资源已释放
- deleted:容器已被删除
符合 OCI 规范的运行时通过以下标准命令管理生命周期:create、start、state、kill、delete。这种标准化的接口使得不同的运行时可以互换使用,而不会破坏上层编排系统的兼容性。
1.2 image-spec:镜像格式解析
OCI image-spec 定义了容器镜像的三大核心组件:
Manifest(清单)描述镜像的顶层结构,包含配置引用和层列表:
{ \"schemaVersion\": 2, \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\", \"config\": { \"mediaType\": \"application/vnd.oci.image.config.v1+json\", \"size\": 7023, \"digest\": \"sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7\" }, \"layers\": [ { \"mediaType\": \"application/vnd.oci.image.layer.v1.tar+gzip\", \"size\": 32654, \"digest\": \"sha256:9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0\" } ] } Image Index(索引)提供多架构支持,一个镜像可以同时包含 arm64、amd64、riscv64 等不同架构的变体。sha256 摘要链确保了整个镜像堆栈的完整性验证。每一层都通过内容寻址哈希标识,天然实现层共享和去重——同一个基础镜像层只存储一次,却能被数千个容器共享。
Filesystem Layer(文件系统层)采用增量叠加模型。镜像由一系列只读层(通常打包为 tar.gz)组成,容器运行时通过联合文件系统(OverlayFS、btrfs、ZFS 等)将这些层合并为一个统一的文件系统视图,并在最上层添加一个可写层(Container Layer)用于进程的写操作。
二、OCI 运行时实现:从 runc 到 crun
OCI runtime-spec 是规范而非实现。社区存在多种符合该规范的运行时实现,各有不同的设计目标和性能取舍。
2.1 runc:OCI 参考实现
runc 是 Docker 捐赠给 OCI 的参考实现,用 Go 编写,是绝大多数容器运行时的底层引擎。runc 的核心职责是根据 OCI config.json 配置,调用 Linux 原生机制创建隔离环境:
创建流程(create 阶段):
- 父进程(runc)fork 出子进程,子进程调用
unshare()系统调用进入新的命名空间 - 通过
pivot_root()切换到镜像的 rootfs - 设置 cgroups v2 资源限制
- 应用 seccomp BPF 过滤器限制系统调用
- 设置 capabilities、uid/gid mapping
- 停止进程(通过
STOP信号),等待 start 命令唤醒
关键技术细节:
- 使用
CLONE_NEWNS | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC | CLONE_NEWUTS | CLONE_NEWCGROUP创建六类命名空间 - 通过
cgroupfs管理器或直接cgroupfs写入控制文件实现资源隔离 - seccomp 使用 BPF 程序在内核中过滤系统调用,无需用户态上下文切换
- 通过
pivot_root而非chroot切换根文件系统,后者存在逃逸风险
runc 的一个关键设计是\"单进程\"模型——容器内只运行一个由 runc 指定的进程(即 config.json 中 process.args 的第一个参数)。这意味着 runc 本身是一个轻量级 shim,不包含网络管理、存储驱动等高级功能,这些由上层(containerd/CRI-O)负责。
2.2 crun:高性能 C 语言实现
crun 是 Red Hat 主导开发的 OCI 运行时,使用 C 语言编写,以极简和高性能为设计目标。相比 runc:
- 二进制体积小至 ~200KB(runc ~12MB)
- 启动速度快 30-50%,内存占用低 60% 以上
- 完整支持 cgroup v2、rootless containers、SELinux
- 作为 CRI-O 的默认运行时
crun 的性能优势主要来自:C 语言的零开销抽象、内联的 cgroup 操作(不调用外部命令)、高度优化的段错误处理和内存管理。在每秒启动数百个容器的场景下(如 serverless 冷启动),crun 的低延迟特性尤为显著。
2.3 Kata Containers 与轻量级虚拟化运行时
Kata Containers(以及其前身 runV、Intel Clear Containers)走了一条完全不同的路线:将每个容器放在独立的轻量级虚拟机中运行。其运行时 kata-runtime 符合 OCI 规范,但在底层调用 QEMU/Firecracker 等 hypervisor:
- 容器镜像被挂载到虚拟机内的 virtio-blk 或 virtiofs 共享文件系统
- 独立的内核版本、自己的 /proc、/sys 文件系统
- 硬件级隔离:即使内核漏洞被利用,攻击者也无法逃逸到宿主机
- 兼容 OCI 接口和 K8s CRI
gVisor(Google 开源)则采用另一种方案:在用户态实现一个完整的 Linux 内核(Sentry),拦截容器的所有系统调用。不需要虚拟化硬件,但隔离性介于传统容器和虚拟机之间,适合多租户 SaaS 场景。
三、containerd:工业级容器运行时架构
3.1 containerd 核心架构
containerd 是从 Docker 中拆分出来的核心容器运行时组件,负责管理容器的完整生命周期:镜像拉取与推送、存储管理、容器执行与监控、网络附件。其架构采用插件化设计,通过 gRPC API 对外提供服务:
+--------------------------------------------------+ | containerd | | | | +--------------+ +-------------+ +-----------+ | | | Content | | Snapshot | | Runtime | | | | Store | | Manager | | Plugin | | | | (镜像层存储) | | (联合文件) | | (shim管理)| | | +------+-------+ +------+------+ +-----+-----+ | | | | | | | +------+------------------+---------------+-----+ | | | gRPC API / Proxy Plugins | | | +-----------------------------------------------+ | +--------------------------------------------------+ | | +------+------+ +------+------+ | container | | imagefs | | metadata | | (overlayfs) | | (BoltDB) | | | +-------------+ +-------------+ containerd 的存储架构是三级组织模型:
- Content Store:内容寻址的不可变 Blob 存储,用 SHA256 摘要索引镜像层和配置
- Snapshot: 管理 OverlayFS、btrfs、native 等文件系统快照,使用父-子链构建分层文件系统
- Container Metadata:存储容器元数据(配置、标签、状态),基于 BoltDB 嵌入式键值库实现事务性操作
3.2 containerd-shim:进程管理的关键中间层
containerd-shim 是容器运行时架构中最精妙的设计之一。它解决了两个核心问题:
问题一:daemon 存活依赖——如果 containerd 重启或崩溃,由其 fork 出的容器 init 进程会变成孤儿。shim 作为中间层,在 containerd 退出后仍然保持运行,成为容器进程的父进程,确保容器的标准流转发、exit 信号处理和资源清理不中断。
问题二:OCI 运行时独立生命周期——runc/crun 在完成 create 后会自行退出(fork-exec 后退出)。shim 在 runc 退出后接管容器的运行时管理:监听 SIGCHLD 等待子进程退出、转发 stdin/stdout/stderr 到 containerd、处理 exec 附加进程。
v2 版 shim(containerd-shim-runc-v2)引入的重要改进:
- 使用
runtime v2协议,支持start和delete分离操作 - 支持
runsc(gVisor)、kata等多种运行时插件 - 通过
ttrpc(精简版 tRPC)与 containerd 通信,减少序列化开销 - 支持
TaskService和RuntimeService分离
3.3 CRI 插件:containerd 的 K8s 集成
containerd 从 1.1 版本开始内置 CRI 插件,无需独立的 dockershim 即可直接与 kubelet 协作。CRI 插件实现 gRPC 接口:
- RuntimeService:PodSandbox 管理(pause 容器/沙箱创建)、容器 CRUD、exec/attach/port-forward
- ImageService:镜像列表、拉取、删除、信息查询
完整创建流程如下:
- kubelet 调用 CRI 的
RunPodSandbox创建 Pod 沙箱(包含 pause 容器和网络命名空间) - kubelet 调用
CreateContainer在沙箱内创建业务容器 - kubelet 调用
StartContainer启动容器进程 - shim 监控容器 exit,通过
TaskExit事件上报 kubelet
containerd 的 CRI 插件还支持 kubectl logs、kubectl exec、kubectl attach 等流式操作,通过 shim 的 IO 转发实现。
四、CRI-O:原生为 Kubernetes 设计的运行时
CRI-O 是 Red Hat、IBM、Intel 等公司联合开发的 Kubernetes 原生容器运行时,完全遵循 CRI 标准,不继承 Docker 的历史包袱。其设计哲学是\"做减法\"——只实现 kubelet 所需的功能:
4.1 CRI-O 架构
+----------------------------------+ | kubelet | | (gRPC CRI Client) | +---------------+------------------+ | gRPC +---------------+------------------+ | CRI-O Server | | +----------------------------+ | | | conmon (每个容器一个) | | | | - 标准流IO转发 | | | | - 终端分配 | | | | - 退出码捕获 | | | +----------------------------+ | | +----------------------------+ | | | ocicni (CNI 网络插件) | | | +----------------------------+ | | +----------------------------+ | | | storage (镜像存储/快照) | | | +----------------------------+ | +----------------------------------+ | +------+------+ | OCI Runtime | | (crun/runc) | +-------------+ 关键差异点:
- conmon:每个容器一个独立的 conmon 进程,负责标准流代理和 exit 状态捕获。如果 CRI-O 重启,conmon 继续独立运行
- 无 daemon 依赖:CRI-O 本身可以直接作为 systemd service 管理,不依赖 containerd
- OCI 运行时灵活配置:支持运行时类(RuntimeClass)选择不同 OCI 实现(crun/runc/kata/gVisor)
- 只支持 CRI:不实现 Docker API、BuildKit 等非 Kubernetes 接口
4.2 RuntimeClass:多运行时混合部署
CRI 标准通过 RuntimeClass 支持在同一个集群中混合使用多种运行时:
apiVersion: node.k8s.io/v1 kind: RuntimeClass metadata: name: kata-qemu handler: kata-qemu scheduling: nodeSelector: runtime: kata --- apiVersion: v1 kind: Pod metadata: name: secure-workload spec: runtimeClassName: kata-qemu containers: - name: app image: my-secure-app:latest 这样可以实现:普通容器用 crun/runc 追求极致性能,安全敏感容器用 Kata Containers 或 gVisor 追求强隔离。
五、cgroup v2 与资源隔离
容器的资源隔离最终依赖 Linux cgroup(control group)机制。cgroup v1 存在层级结构混乱、控制器优先级冲突等问题,cgroup v2 进行了彻底重构:
5.1 cgroup v2 统一层级
cgroup v2 采用单一统一层级树,所有控制器(CPU、内存、IO、PID)共享同一棵 cgroup 树:
/sys/fs/cgroup ├── kubepods.slice │ ├── kubepods-burstable.slice │ │ ├── kubepods-burstable-podID.slice │ │ │ ├── cri-containerd-containerID.scope # Guaranteed │ │ │ ... │ ├── kubepods-besteffort.slice │ │ ├── kubepods-besteffort-podID.slice │ │ │ ... ├── system.slice ├── user.slice 核心控制文件:
- cpu.max:格式化
$MAX $PERIOD,如100000 100000表示最多 1 个 CPU 核 - memory.max:内存硬限制(硬限制触发 OOM Killer)
- memory.high:内存软限制(触发内存回收但不 OOM)
- io.max:块设备 IO 限速(rbps/wbps/riops/wiops)
- pids.max:进程数限制(防 fork bomb)
5.2 cgroup v2 在容器运行时的应用
containerd 和 CRI-O 通过以下方式使用 cgroup v2:
- 使用
systemdcgroup driver 创建 slice 而非直接写入 cgroupfs - 通过
CPUShares→cpu.weight(默认 1-10000,cgroup v2 等比换算) - 通过
MemoryLimitInBytes→memory.max - 实现了
memory.min(request 保障)与memory.max(limit 上限)的精确映射
cgroup v2 的 memory.high 提供了比 v1 更细粒度的内存压力控制。当容器内存使用超过 high 值时,内核会主动回收页面(page cache、slab),而不是等到 OOM 才 kill。这种\"软限制\"机制为 Java/Python 等运行时提供了更好的弹性——允许 burst 使用但不超出 hard limit。
5.3 eBPF 增强 cgroup 能力
eBPF 为 cgroup 带来了可编程性。通过 BPF_CGROUP_* 类型的 eBPF 程序,可以在 cgroup 挂载点注入自定义逻辑:
- BPF_CGROUP_SYSCTL:拦截并修改容器的 sysctl 写入
- BPF_CGROUP_SOCK:控制容器的 socket 创建(配合 network policy)
- BPF_CGROUP_DEVICE:替代传统 device cgroup 实现设备白名单
- BPF_CGROUP_INET4_BIND:细粒度控制端口绑定权限
Cilium 等 CNI 插件广泛利用 eBPF+cgroup 实现 L3-L7 网络策略,无需 iptables 规则遍历。
六、Rootless Container 与用户命名空间
rootless container 允许非 root 用户创建和运行容器,是容器安全的重要里程碑。其核心技术是 User Namespaces(用户命名空间)。
6.1 UID/GID 映射
User Namespace 内部的 UID/GID 可以与宿主机进行映射:
/proc/self/uid_map: 0 100000 65536 /proc/self/gid_map: 0 100000 65536 含义:容器内的 UID 0(root)映射到宿主机的 UID 100000,容器内的 UID 65535 映射到宿主机的 UID 165535。容器内 root 在宿主机上只是一个普通用户,即使逃逸出所有其他命名空间,也只是获得一个低权限用户。
6.2 Rootlesskit 与 slirp4netns
无 root 权限无法创建 veth pair 和配置网络。Rootlesskit 通过以下方案解决:
- 使用
slirp4netns:用户态 TCP/IP 协议栈,通过 tap 设备转发容器流量 - 使用
pasta(较新方案):直接复用宿主机网络栈,性能更好 - rootlesskit 还处理了:文件系统挂载(overlayfs 的 userxattr 扩展)、端口转发(通过 child subdirectory 技术)、PID 映射
containerd 的 rootless 模式和 Podman 的 rootless 实现都基于类似技术。虽然性能比 privileged 模式有 10-30% 的用户态网络栈开销,但对于 CI/CD、开发桌面环境等场景,安全收益远超性能损失。
七、容器安全纵深防御
容器运行时在安全层面的设计可分为四层防线:
7.1 命名空间隔离(Namespace Isolation)
Linux 提供了七类命名空间,容器运行时通常使用其中六种:
- PID NS:容器内进程从 1 开始编号,看不到宿主机进程
- Network NS:独立的网络栈(路由表、防火墙规则、socket)
- Mount NS:独立的文件系统挂载点视图
- IPC NS:独立的信号量、消息队列、共享内存
- UTS NS:独立的主机名和域名
- User NS:独立的 UID/GID 映射(详见 rootless 部分)
- Cgroup NS:隐藏宿主机 cgroup 视图,防止容器检测 QoS 等级
7.2 Capabilities 能力分权
Linux capabilities 将 root 权限拆分为 40+ 个独立权限单元。容器运行时默认丢弃大部分 capabilities:
默认保留的最小集合:CAP_CHOWN、CAP_DAC_OVERRIDE、CAP_FSETID、CAP_FOWNER、CAP_MKNOD、CAP_NET_RAW、CAP_SETGID、CAP_SETUID、CAP_NET_BIND_SERVICE、CAP_SYS_CHROOT、CAP_SETPCAP
用户可通过 --cap-add 或 securityContext 按需加入额外权限。遵循最小权限原则,不赋予容器不必要的特权。
7.3 Seccomp BPF 系统调用过滤
Seccomp Secure Computing Mode 使用 Berkeley Packet Filter 程序在内核中过滤系统调用。Docker/containerd 默认的 seccomp profile 阻止了约 44 个高危系统调用(如 kexec_load、open_by_handle_at、init_module 等)。
默认 profile 通过白名单模式(SCMP_ACT_ALLOW)放行了约 300+ 个常用 syscall,其余使用 SCMP_ACT_ERRNO(EPERM) 返回权限错误。
7.4 AppArmor/SELinux MAC 强制访问控制
AppArmor 和 SELinux 为容器提供了强制访问控制:
- AppArmor Profile:路径-based 访问控制,限制容器可读取/写入的文件路径。containerd 默认加载 cri-containerd.apparmor.d profile
- SELinux Label:类型 enforcement,为容器进程和文件系统分配安全上下文(
container_t类型),通过策略定义哪些类型可以互相作用 - SELinux + Multi-Category Security (MCS):使用 MCS 级别(s0:c1,c2)为每个容器生成唯一标签,防止容器间越权访问
八、CNI 与容器网络
CRI 标准规定 Pod 沙箱的创建包括网络命名空间的准备。CNI (Container Network Interface) 是容器网络的标准插件模型。
8.1 CNI 工作流程
- CRI 调用
CNI ADD命令,传递容器 ID、网络命名空间路径、配置 - CNI 插件分配 IP 地址(来自 IPAM 子插件,如 host-local 或 dhcp)
- 创建 veth pair:一端放入容器 netns,另一端留在宿主机
- 配置路由、iptables/eBPF 规则、端口映射
- 返回结果信息(IP 地址、网关、DNS)给 CRI
8.2 CNI 插件生态
- bridge:Linux 网桥,最常见的基础插件
- host-local:本地 IPAM,分配子网中的IP地址
- loopback:loopback 接口
- flannel:Overlay 网络,使用 VXLAN 或 host-gw
- Calico:BGP-based L3 路由,支持网络策略
- Cilium:eBPF-based,支持 L7 策略和身份感知
- Multus:多网卡支持,让 Pod 同时接入多个网络
CNI 配置以 JSON 格式存储在 /etc/cni/net.d/ 目录。Kubelet 通过 CRI 调用 CRI-O/containerd 的 CRI 插件,后者通过 gRPC 调用 ocicni 模块执行 CNI 插件链。每个 Pod 启动时,CNI 插件链按配置文件中的顺序依次执行。
九、容器运行时性能调优
9.1 容器启动延迟优化
容器冷启动延迟的关键瓶颈及优化手段:
- 镜像拉取:使用镜像预热(nydus/stargz 懒加载)、本地镜像缓存、P2P 镜像分发
- 镜像层解压:eStargz 格式支持按需解压,无需拉取全部层即可启动
- rootfs 快照:使用 native snapshotter 而非 overlayfs,减少联合文件系统开销
- runc vs crun:crun 启动延迟可低至 50ms(runc 约 150ms)
- 预创建 shim:containerd 实验性功能复用 shim 进程,避免 fork 开销
9.2 容器存储驱动选择
常见 snapshotter/存储驱动特点比较:
- overlayfs:性能最佳、成熟稳定,通用容器场景首选
- btrfs:原生支持 subvolume snapshot,适合需要快照回滚的开发环境
- devmapper:块设备级 thin provisioning,适合大规模数据库容器
- native/unpack:直接解压合并目录,适合只读工作负载和 Kata
- fuse-overlayfs:用户态 overlay,无需 root,适合 rootless containers
9.3 运行时参数调优
- max-container-log-size:单个镜像最大尺寸限制
- max-container-log-files:日志轮转数量
- default-runtime:默认 OCI 运行时选择
- disable_snapshot_annotations:是否跳过快照注解
- discard_unpacked_layers:容器运行后是否删除已解压的镜像层(节省磁盘)
- io.containerd.content.v1.content:内容存储配置
十、实战:命令行工具链
10.1 ctr:containerd 原生 CLI
ctr 是 containerd 的命令行工具(非 CRI 兼容,仅供调试使用):
# 拉取镜像 ctr images pull docker.io/library/nginx:latest # 运行容器 ctr run --rm --net-host docker.io/library/nginx:latest my-nginx # 列出容器 ctr containers list # 查看任务(进程) ctr tasks list # 进入容器 ctr tasks exec -t --exec-id shell my-nginx sh # 导出/导入镜像 ctr images export nginx.tar docker.io/library/nginx:latest ctr images import nginx.tar 10.2 crictl:CRI 兼容运行时调试工具
crictl 是 CRI 兼容运行时的标准调试工具:
# 连接 CRI-O crictl --runtime-endpoint unix:///var/run/crio/crio.sock ps # 连接 containerd crictl --runtime-endpoint unix:///run/containerd/containerd.sock ps # 查看 Pod 列表 crictl pods # Pod 详情 crictl inspectp pod-id # 容器日志 crictl logs container-id # exec 进入容器 crictl exec -it container-id /bin/sh # 抓取容器性能指标 crictl stats # 查看 Kubelet 使用的运行时版本 crictl version 10.3 nerdctl:Docker 兼容的 containerd CLI
nerdctl 提供了与 Docker CLI 几乎完全兼容的体验:
# 构建镜像(自动调用 buildkit) nerdctl build -t myapp:v1 . # 运行容器 nerdctl run -d --name myapp -p 8080:80 myapp:v1 # Compose 支持 nerdctl compose up -d # 查看容器 nerdctl ps -a # 容器统计信息 nerdctl stats 十一、总结与展望
容器运行时技术从 2013 年 Docker 诞生至今已经历了十多年的演进,形成了清晰的层次化架构:
OCI 层(规范)→ 低层运行时(runc/crun/Kata)→ 中层运行时(containerd/CRI-O)→ 编排层(Kubernetes CRI)→ 平台层(Serverless/ACI/ECS)
未来容器运行时的发展趋势值得关注:
- WebAssembly (Wasm):Wasm runtime(WasmEdge、Wasmtime)正在成为轻量级容器替代方案。Wasm 沙箱基于 capability-based 安全模型,启动速度为微秒级,无需 Linux 命名空间
- eBPF 深度融合:eBPF 将继续取代 iptables、tc 等传统 kernel 模块,在容器网络、安全审计、可观测性方面提供更高效的解决方案
- 机密计算容器:AMD SEV-SNP、Intel TDX、Arm CCA 等机密计算技术与容器运行时结合,实现对运行中数据的加密保护。Kata Confidential Containers 已提供生产可用方案
- 轻量级虚拟化普及:Firecracker microVM、Cloud Hypervisor 等技术降低虚拟化开销,Kata 3.0 引入全新架构,启动延迟降至 100ms 以内
- 镜像分发协议升级:Nydus(阿里开源)、eStargz(Google 开源)等懒加载镜像格式逐步从实验功能走向默认选项,在大规模集群中节省 70% 以上的拉取带宽
容器运行时是 Linux 内核特性与工程实践深度融合的典范产品。深入理解从 OCI 规范到 CRI 接口的完整技术链路,不仅能帮助我们更好地使用和调优容器,也能为构建下一代云原生基础设施打下坚实基础。

发表评论 取消回复