news 2026/2/12 23:26:58

kubectl exec 的底层原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
kubectl exec 的底层原理

如果你使用 Kubernetes,那么你对kubectl exec -it <pod-name> -- sh这个命令一定不会陌生。它是我们调试容器、查看日志或排查问题的“瑞士军刀”。我们通常的理解是:“哦,它是在容器内部启动了一个 shell”。

但这个理解并不完全准确,甚至有些误导。更精确的说法是:它在宿主机上启动了一个 shell 进程,并巧妙地让这个进程‘加入’了目标容器所在的全部 Linux 命名空间(Namespace)

今天,我们就来掀开帷幕的一角,看看这个魔法是如何通过 Linux 命名空间实现的。

一、基石:理解 Pod 的共享命名空间

在深入exec之前,必须理解 Pod 的本质。Kubernetes 的一个核心设计是:一个 Pod 内的所有容器共享一组 Linux 命名空间

这意味着什么呢?这意味着同一个 Pod 里的两个容器:

  • 看到的是同样的网络设备(共享netnamespace)
  • 拥有同样的主机名(共享utsnamespace)
  • 可以通过IPC机制通信(共享ipcnamespace)
  • 甚至可以通过pid命名空间看到彼此的进程(如果配置了共享)

当我们说“进入一个容器”,本质上就是想要进入这组被共享的命名空间集合。

二、kubectl exec 的旅程:从客户端到容器运行时

当你敲下kubectl exec -it my-pod -- sh,背后发生了一系列复杂的交互:

  1. API 请求kubectl并非直接联系你的 Node 节点,而是向 Kubernetes API Server 发送一个请求:“请在my-pod中执行sh命令”。
  2. 路由与授权:API Server 进行认证和授权后,知道my-pod运行在哪个节点上,于是将这个请求转发给该节点上的kubelet(节点代理)。
  3. 调用运行时kubelet接收到请求,转而调用本地的容器运行时(如containerdCRI-O)。

至此,所有流程都是标准的 Kubernetes 控制平面通信。真正的魔法发生在容器运行时接下来做的事情上。

三、核心魔法:nsenter 与 setns()

容器运行时(或其 CRI 插件)需要完成最终的任务:在宿主机上启动一个/bin/sh进程,并让它加入到目标容器的命名空间中

它是如何做到的呢?

  1. 定位目标:运行时首先找到目标 Pod 的“暂停容器”(pause)或你指定的业务容器在宿主机上的真实进程 ID(PID)。我们称之为<target-pid>

  2. 加入命名空间:这是最关键的一步。运行时不会在容器内启动进程,而是在宿主机上,通过类似下面的操作(实际是调用setns()系统调用)来启动 shell:

    这是一个概念性类比,实际是代码调用系统调用

nsenter --target <target-pid> \ --mount \ # 加入 Mount NS:看到容器的文件系统 --net \ # 加入 Net NS:看到容器的网络栈 --pid \ # 加入 PID NS:看到容器内的进程 --ipc \ # 加入 IPC NS:可以使用IPC资源 --uts \ # 加入 UTS NS:看到容器的主机名 --cgroup \ # 加入 Cgroup NS:继承容器的资源限制 /bin/sh # 最后,在这个新上下文中执行 shell
* `nsenter`(namespace enter)是一个 Linux 命令行工具,其功能就是让进程加入已有的命名空间。 * `--target` 指定了我们要“附身”的目标进程。 * 后面的一系列 `--<namespace>` 参数指明了我们要加入哪些类型的命名空间。
  1. 建立连接-it参数要求交互式终端。运行时会建立到新sh进程的标准输入(stdin)、输出(stdout)和错误(stderr)的流连接,使得你可以像在本地一样与这个“容器内”的 shell 交互。
四、直观验证:看看宿主机上的进程树

让我们用一个具体的例子来巩固理解。假设一个简单的 Pod,其容器的主进程是/my-app,在宿主机上的 PID 是5678

当你执行kubectl exec后,在宿主机上使用pstree -p 5678查看,你可能会看到这样的结构:

containerd(1234)───my-app(5678) # 容器原本的主进程
└─sh(7788) # kubectl exec 创建的进程!

看到了吗?sh(7788)这个进程本身就运行在宿主机上,是containerd的子进程。但它通过setns()系统调用,加入了my-app(5678)进程的所有命名空间。

因此,在这个sh进程里:

  • ps aux看到的是容器内部的进程列表(因为加入了pidnamespace)。
  • ip addr看到的是容器的网络接口(因为加入了netnamespace)。
  • ls /看到的是容器的根文件系统(因为加入了mountnamespace)。
  • hostname看到的是容器的主机名(因为加入了utsnamespace)。

它完美地“扮演”了一个容器内部的进程。

结论

所以,下次当你使用kubectl exec时,可以这样理解:

你不是在启动一个“容器内的进程”,而是在启动一个“拥有容器视角的宿主机进程”。Kubernetes 和容器运行时通过 Linux 命名空间这面“镜子”,让这个外部进程看到了一个完全不同的、属于容器内部的世界。

这种基于命名空间的“附身”能力,正是容器技术轻量、高效和可调试性的完美体现。它模糊了容器内外的边界,让我们能从一个更高的维度去观察和管理这些被隔离的环境。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/2 23:39:26

Flink自定义函数终极指南:如何快速掌握三大核心函数开发

Flink自定义函数终极指南&#xff1a;如何快速掌握三大核心函数开发 【免费下载链接】flink-learning flink learning blog. http://www.54tianzhisheng.cn/ 含 Flink 入门、概念、原理、实战、性能调优、源码解析等内容。涉及 Flink Connector、Metrics、Library、DataStream …

作者头像 李华
网站建设 2026/2/5 23:59:38

Wan2.2视频生成:如何用消费级显卡实现电影级创作体验?

你是否曾经想过&#xff0c;为什么专业级视频生成总是需要昂贵的A100显卡&#xff1f;为什么开源方案在画质和流畅度上总是差强人意&#xff1f;这些问题困扰着无数创作者和开发者&#xff0c;直到Wan2.2的出现彻底改变了这一局面。 【免费下载链接】Wan2.2-TI2V-5B-Diffusers …

作者头像 李华
网站建设 2026/2/8 17:35:08

ioredis终极指南:5分钟掌握Node.js Redis客户端的完整用法

ioredis终极指南&#xff1a;5分钟掌握Node.js Redis客户端的完整用法 【免费下载链接】ioredis 项目地址: https://gitcode.com/gh_mirrors/ior/ioredis 想要在Node.js项目中快速集成Redis吗&#xff1f;ioredis作为最受欢迎的Redis客户端&#xff0c;提供了简单易用的…

作者头像 李华
网站建设 2026/2/8 0:49:36

那个让我熬夜三天的bug,原来OrcaSlicer编译还能这样玩!

那个让我熬夜三天的bug&#xff0c;原来OrcaSlicer编译还能这样玩&#xff01; 【免费下载链接】OrcaSlicer G-code generator for 3D printers (Bambu, Prusa, Voron, VzBot, RatRig, Creality, etc.) 项目地址: https://gitcode.com/GitHub_Trending/orc/OrcaSlicer 你…

作者头像 李华
网站建设 2026/2/5 0:03:10

Blender Python API实战手册:用代码重塑3D创作流程

Blender Python API实战手册&#xff1a;用代码重塑3D创作流程 【免费下载链接】blender Official mirror of Blender 项目地址: https://gitcode.com/gh_mirrors/bl/blender 还在手动重复那些繁琐的建模步骤吗&#xff1f;是否曾经幻想过让计算机帮你完成那些机械性的3…

作者头像 李华
网站建设 2026/2/12 22:33:30

Whisper.cpp语音识别:5步快速上手完整指南

Whisper.cpp语音识别&#xff1a;5步快速上手完整指南 【免费下载链接】whisper.cpp 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/whisper.cpp 还在为语音转文字发愁吗&#xff1f;Whisper.cpp作为OpenAI Whisper模型的C实现版本&#xff0c;为你提供了高…

作者头像 李华