avatar

甄天祥-Linux-个人小站

A text-focused Halo theme

  • 首页
  • 分类
  • 标签
  • 关于
Home Kubernetes 创建 Pod 底层原理
文章

Kubernetes 创建 Pod 底层原理

Posted 2025-05-25 Updated 2025-06- 4
By Administrator
17~22 min read

Kubelet 通过 gRPC 调用 CRI 插件(如 containerd/dockershim),插件将请求转换为 OCI 规范文件并调用 runc,runc 根据 OCI 配置通过 Linux 内核(cgroups/namespaces)创建容器。

流程简图:
kubelet → gRPC → CRI插件 → OCI规范 → runc → 内核(cgroups/namespaces)→ 容器进程

1. Kubelet 发起 gRPC 请求(CRI 接口)

  • Kubelet 通过 Container Runtime Interface (CRI) 与容器运行时(如 containerd、CRI-O)通信。

  • gRPC 请求内容:

    • CreateContainerRequest(包含 Pod 配置、镜像、命令、资源限制等)。

    • StartContainerRequest(启动容器)。

  • 默认 CRI 服务端口:containerd 默认监听 unix:///run/containerd/containerd.sock。

2. CRI 插件处理请求(以 containerd 为例)

  • containerd 架构:

    • CRI Plugin(containerd/cri):解析 Kubelet 的 CRI 请求。

    • containerd Core:管理镜像、容器生命周期。

    • Task Service:负责容器进程的创建。

  • 关键步骤:

    1. 拉取镜像(如未本地存在):

      • 调用 containerd 的 PullImage 方法,从镜像仓库下载并存储到本地(OCI 格式)。

    2. 创建 OCI 运行时规范(config.json):

      • CRI 插件根据 Kubelet 请求生成 OCI 规范文件(定义 namespaces、cgroups、rootfs、mounts、env 等)。

    3. 调用 Task Service:

      • 通过 CreateTask 请求,准备启动容器进程。

3. 调用 OCI 运行时(runc)

  • OCI 运行时(默认 runc)负责根据 OCI 规范创建容器:

    1. 输入:

      • OCI 规范文件(config.json)。

      // /var/run/containerd/io.containerd.runtime.v2.task/default/<container-id>/config.json
      {
        "ociVersion": "1.0.2",
        "process": {"args": ["nginx"], "cwd": "/"},
        "root": {"path": "rootfs"},
        "linux": {
          "namespaces": [{"type": "pid"}, {"type": "network"}, ...],
          "cgroupsPath": "/kubepods.slice/nginx-pod",
          "resources": {"memory": {"limit": 536870912}}
        }
      }
      • 容器的根文件系统(rootfs,通常来自镜像层)。

    2. runc 执行流程:

      • runc create:解析 config.json,创建容器环境。

      • runc init(父进程):

        • 创建 namespaces(PID、Network、Mount 等)。

        • 设置 cgroups(CPU/Memory 限制)。

        • 挂载 rootfs(OverlayFS)。

      • runc start:启动容器内的 ENTRYPOINT 进程(如 /bin/sh)。

      • 创建 containerd-shim:每个容器一个 shim 进程,作为容器的父进程,负责管理 runc 并收集退出状态。

4. 内核创建容器

  • Linux 内核机制:

    1. Namespaces:

      • PID Namespace:隔离进程树。

      • Network Namespace:隔离网络栈(veth pair 连接到 CNI)。

      • Mount Namespace:独立文件系统视图。

      • 其他:UTS、IPC、User 等。

    2. Cgroups v2:

      • 通过 /sys/fs/cgroup/ 写入限制参数(如 cpu.max、memory.high)。

    3. OverlayFS:

      • 联合挂载镜像层(lowerdir、upperdir、merged)作为容器 rootfs。

    4. 系统调用:

      • clone():创建隔离的进程(带 CLONE_NEW* flags)。

      • execve():执行容器入口进程。

5. 容器进程运行

  • 容器进程在隔离的 namespaces 和 cgroups 限制下运行。

  • Kubelet 监控状态:

    • 定期通过 CRI 的 ListContainers 和 ContainerStatus 检查容器健康状态。

完整流程总结

Kubelet 
  → gRPC (CRI) → containerd/cri 
    → 生成 OCI spec (config.json) 
      → containerd Task Service → runc 
        → clone() + namespaces/cgroups 
          → 容器进程启动

关键组件关系图

+---------+    +------------+    +-------------+    +------+    +-------+
| Kubelet | →  | containerd |  → |   OCI spec  |  → | runc | →. | Linux |
| (CRI)   |    | (CRI插件)   |    | (config.json)|   |      |   | Kernel |
+---------+    +------------+    +-------------+    +------+    +-------+
                                     |                     |
                                     v                     v
                                cgroups/namespaces     容器进程

通过这一流程,Kubernetes 最终在节点上创建一个符合 OCI 标准的隔离容器。


关键点总结:

  • 解耦设计:CRI 是接口标准,containerd 是运行时引擎,runc 是 OCI 实现,各层职责清晰。

  • 内核依赖:最终通过 Linux 内核的 命名空间(隔离)、cgroups(资源限制)、文件系统挂载(overlayfs)实现容器化。

  • shim 的作用:作为 runc 的父进程,确保容器退出后不会僵尸化,同时转发信号(如 SIGTERM)

云原生与容器技术
Containerd Docker kubernetes
License:  CC BY 4.0
Share

Further Reading

Nov 19, 2025

Kubernetes 安装部署 Alist 并配置 Onlyoffice

Alist 是一个支持多种存储的目录列表程序,能够将网盘、对象存储和本地存储等挂载为统一目录,提供文件浏览、管理和分享功能。它支持 OneDrive、Google Drive、阿里云盘、百度网盘等多种存储方式,界面简洁美观,基于 Material Design 设计。Alist 功能强大,包括文件预览、下载、分享、搜索和权限管理等,并且开源免费。部署 Alist 服务可以通过 Docker、宝塔面板或直接运行等方式实现,文中以 K8S 部署为例,详细介绍了配置步骤及 OnlyOffice 的集成方法,用于在线预览和编辑 Office 文档。此外,还提供了如何通过 HTTPS 和自签名证书确保服务安全访问的指导。

Oct 23, 2025

KubeSphere-04-Dev-ops 流水线插件的使用

KubeSphere 基于 Jenkins 的 DevOps 系统专为 Kubernetes 中的 CI/CD 工作流设计,提供了一站式的解决方案,包括插件管理、Binary-to-Image (B2I)、Source-to-Image (S2I)等功能。该系统兼容第三方私有镜像仓库和代码库,提供了全面的可视化 CI/CD 流水线。本文档指导用户开启 KubeSphere 的 DevOps 插件,规划流水线并编写 Jenkinsfile,通过实战案例让用户掌握从理论到实践的全过程。文档详细介绍了如何解决开启 DevOps 组件时可能遇到的问题、配置步骤以及验证方法,并演示了创建和管理 DevOps 项目的过程,涵盖用户创建、企业空间与项目的建立等。此外,还提供了简化版的 DevOps 流水线设计示例,涉及从源代码检出到部署环境的整个流程,包括单元测试、编译、构建推送镜像及多环境部署策略。最后,通过一系列准备工作的说明和实际操作步骤,确保用户能够顺利实现自动化持续集成和部署。

Oct 14, 2025

KubeSphere-03-Logging 日志插件的使用

KubeSphere Logging 是 KubeSphere 平台的日志管理插件,基于 Elasticsearch 或 OpenSearch 构建,支持多租户日志收集、查询和分析。它自动采集容器、工作负载及平台审计日志,并通过 Fluent Bit 进行预处理。该插件提供直观的查询界面、灵活的日志保留策略(默认7天)、Sidecar模式增强可靠性以及外部日志系统集成等功能,帮助企业快速定位问题并满足合规要求。开启插件需编辑 ks-installer 配置文件以选择性启用 Elasticsearch 或 OpenSearch,并设置相关参数。此外,还介绍了一款基于 Go 的 OpenSearch 告警与可视化系统,支持多种通知渠道,可通过本地构建 Docker 镜像并在 Kubernetes 环境中部署使用。

OLDER

Linux 运维常用脚本和工具

NEWER

kubernetes 部署 redis-cluster

Recently Updated

  • Kubernetes 安装部署 Alist 并配置 Onlyoffice
  • KubeSphere-04-Dev-ops 流水线插件的使用
  • KubeSphere-03-Logging 日志插件的使用
  • KubeSphere-02-Service Mesh 的使用
  • KubeSphere-01-介绍与基础使用

Trending Tags

KVM Service Mesh Docker shell 路由规则 Mysql Containerd GitOps 网络设备 Prometheus

Contents

©2025 甄天祥-Linux-个人小站. Some rights reserved.

Using the Halo theme Chirpy