containerd base_runtime_spec

news/2025/12/11 0:00:07/文章来源:https://www.cnblogs.com/tiantao36/p/19333626

containerd base_runtime_spec

下面给你做一次 **完整、收敛、结构化、专业级别的知识汇总**,把你这两天追问的所有内容(containerd 的 base_runtime_spec、挂载 CA、kube-proxy 启动失败 `/proc/thread-self/fd`、/etc 自动挂载机制、runc 初始化原理……)全部打通成一个体系,同时给出可直接落地的例子与根因剖析。---# 🚀 **一份文档掌握:containerd 全局挂载 CA + kube-proxy 启动失败原因 + /etc 自动挂载原理**---# 目录1. **containerd base_runtime_spec —— 作用、原理与示例**
2. **runc 初始化流程原理(重点:`/proc/thread-self/fd` 为什么必须存在)**
3. **为什么 kube-proxy 启动失败?完整链路分析**
4. **containerd 默认挂载 `/etc/hosts` `/etc/hostname` `/etc/resolv.conf` 的机制**
5. **base_runtime_spec 正确写法 + 错误写法对比**
6. **完整示例:如何全局挂载宿主机 CA**
7. **总结:一个节点上容器创建时实际发生的事情(时序图)**---# 1️⃣ containerd **base_runtime_spec** —— 作用、原理与示例## ✨ **作用**base_runtime_spec = “全局模板 OCI spec”。对所有通过 **Kubernetes / CRI(kubelet)** 创建的容器 **自动附加配置**,包括:* 默认环境变量
* bind mount
* cgroups
* seccomp
* namespace
* default capabilities✔ **这是 containerd 官方推荐的全局默认 spec 扩展方式。**---## ✨ 适用场景| 场景                 | 是否适合用 base_runtime_spec |
| ------------------ | ----------------------- |
| 全节点需要挂载 CA         | ✔ 强烈推荐                  |
| 全节点默认添加 env、ulimit | ✔                       |
| 全局 seccomp 修改      | ✔                       |
| 全局覆盖 /proc、/sys    | ❌ 高危(会导致 kube-proxy 失败) |---## ✨ containerd 1.x / 2.x 的差别(非常重要)| containerd 版本 | config version | CRI 插件路径                                 |
| ------------- | -------------- | ---------------------------------------- |
| 1.x           | version = 2    | `plugins."io.containerd.grpc.v1.cri"`    |
| 2.x           | version = 3    | `plugins."io.containerd.cri.v1.runtime"` |---# 2️⃣ **runc 初始化流程原理剖析**要理解 kube-proxy 为啥报:```
open /proc/thread-self/fd: no such file or directory
```必须理解 **runc 创建容器时到底做了什么**---## runc 创建容器流程(极精简的核心)1. **准备 OCI spec(由 containerd 传入)**
2. 创建 **namespaces(pid/net/mnt/uts/ipc/user)**
3. 处理 **mounts 列表**
4. 进入 `pivot_root`(如果需要)
5. **初始化 console/stdio → 必须操作 /proc/thread-self/fd**
6. 执行容器进程(如 /pause 或 kube-proxy)---## 为什么必须访问 `/proc/thread-self/fd`?因为 runc 要绑定:* 容器 stdio(stdin/stdout/stderr)
* console socket(terminal = true* 额外的 exec fds(containerd-shim 用)Linux 标准流程是:```
/proc/thread-self/fd/X
```对应当前 runc 线程的 fd。➡ 只要**/proc 没正确挂载**,runc 就必定直接失败。---# 3️⃣ kube-proxy 启动失败的根因分析错误:```
open /proc/thread-self/fd: no such file or directory
```最常见根因:---## ❌ **1. base_runtime_spec 覆盖了 /proc**(最常见破坏原因)如果你写了类似:```json
{"destination": "/proc","type": "bind","source": "/proc","options": ["rbind"]
}
```那么:* containerd 还未完成默认 mount
* runc 使用的 /proc thread-self 还没就绪
* 立即失败✔ 这是 containerd 官方文档明确禁止的。---## ❌ **2. DaemonSet 没有 hostPID=true**kube-proxy 使用 hostPID 访问:* 宿主机 /proc/sys/net
* conntrack
* iptables 结构如果 kube-proxy 在自己的 PID namespace* /proc 中不包含宿主机的内容
* `/proc/thread-self/fd` 不稳定
* runc 初始化容易失败---## ❌ **3. 使用老旧 runc(v1.0.0 边缘版本) + terminal=false bug**这类 runc 在 terminal=false 时,在关闭 fd 期间使用 thread-self/fd,会因为挂载时序导致找不到。---# 4️⃣ containerd 默认挂载 `/etc` 系列的原理你问:> base_runtime_spec 里没有写 /etc/hosts、/etc/resolv.conf,它们如何出现?下面是完整原理。---## 🔧 containerd(CRI)会自动追加 **三个挂载**| 文件                 | 由谁生成       | 作用                       |
| ------------------ | ---------- | ------------------------ |
| `/etc/hosts`       | kubelet    | 注入 Pod hostname / svc 域名 |
| `/etc/hostname`    | containerd | 用 Pod 名作为 hostname       |
| `/etc/resolv.conf` | kubelet    | 为 Pod 设置集群 DNS           |---## ⚠ 什么时候会被破坏?**只要你把 `/etc` 或子文件覆盖为 RO 或直接 bind mount:**错误示例:```json
{"destination": "/etc","type": "bind","source": "/etc","options": ["bind", "ro"]
}
```➡ kubelete 无法写 `/etc/hosts` → Pod DNS 坏了➡ containerd 无法写 `/etc/hostname`➡ kube-proxy/containerd 无法启动---# 5️⃣ base_runtime_spec 正确写法 vs 错误写法## ✔ 正确挂 CA(推荐)```json
{"destination": "/etc/ssl/host-certs","type": "bind","source": "/etc/ssl/certs","options": ["rbind", "ro", "rprivate"]
}
```不会影响 containerd 默认挂载。---## ❌ 错误:覆盖整个 /etc```json
{"destination": "/etc","type": "bind","source": "/mnt/etc","options": ["rbind", "ro"]
}
```➡ DNS / hostname / hosts 全坏。---## ❌ 错误:挂载 /proc(必定破坏 runc)```json
{"destination": "/proc","type": "bind","source": "/proc","options": ["rbind"]
}
```➡ runc 初始阶段无法访问 thread-self➡ kube-proxy 等关键容器启动失败---# 6️⃣ 完整示例:全局挂宿主机 CA## step1: 生成基础 spec```
ctr oci spec > /etc/containerd/cri-base.json
```---## step2: 加入 CA mount```json
{"destination": "/etc/ssl/host-certs","type": "bind","source": "/etc/ssl/certs","options": ["rbind", "ro", "rprivate"]
}
```---## step3: 在 containerd 配置中启用### containerd 1.x```
version = 2
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]base_runtime_spec = "/etc/containerd/cri-base.json"
```### containerd 2.x```
version = 3
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.runc]base_runtime_spec = "/etc/containerd/cri-base.json"
```---## step4: 重启 containerd(必须)```
systemctl restart containerd
```---# 7️⃣ 一张时序图:容器创建时到底发生什么?```
Kubelet│├─ 创建 /etc/hosts、/etc/resolv.conf│▼
Containerd(CRI)│├─ 合并 base_runtime_spec + PodSpec → 生成最终 OCI spec│├─ 追加默认挂载(/etc/hosts、/etc/hostname)│▼
runc│├─ 创建 namespace├─ mount rootfs├─ mount /proc├─ mount /sys├─ mount 你的 CA├─ 打开 /proc/thread-self/fd (初始化 stdio)│▼
容器进程启动(pause / kube-proxy / app)
```如果 **任意人破坏了 /proc 挂载流程** → 失败。---# 📌 总结(最精华部分)### ✔ containerd base_runtime_spec 最适合干的是:* 全局挂载 CA
* 全局 env
* 全局 seccomp/capabilities 轻量扩展### ❌ base_runtime_spec 绝对不能做:* 覆盖 /proc
* 覆盖 /sys
* 覆盖 /dev
* 覆盖 /etc(影响 hosts/resolv.conf)
* 绑定需要写入的路径为只读➡ 会导致 runc 初始化失败,报 `/proc/thread-self/fd` 错误。---如果你需要:✔ 我可以帮你补:* 一个“正确规范的 containerd 全局 spec 模板(可直接用)”
* kube-proxy 最推荐的 DaemonSet 配置(hostPID/hostNetwork)
* 一键检测节点是否存在危险性挂载的脚本告诉我你要哪部分,我按“可直接落地”的标准给你输出。
[root@styxtikvk8s01v es-ops]# cat /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false[root@styxtikvk8s01v es-ops]# cat /etc/containerd/cri-base.json 
{"ociVersion": "1.0.2","process": {"terminal": false,"user": {"uid": 0,"gid": 0},"args": ["sh"],"env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","SSL_CERT_DIR=/etc/ssl/host-certs","SSL_CERT_FILE=/etc/ssl/host-certs/ca-certificates.crt"]},"root": {"path": "rootfs","readonly": false},"mounts": [{"destination": "/proc","type": "proc","source": "proc","options": ["nosuid", "noexec", "nodev"]},{"destination": "/sys","type": "bind","source": "/sys","options": ["rbind", "ro", "rprivate"]},{"destination": "/dev","type": "tmpfs","source": "tmpfs","options": ["nosuid", "strictatime", "mode=755", "size=65536k"]},{"destination": "/dev/pts","type": "devpts","source": "devpts","options": ["nosuid", "noexec", "newinstance", "ptmxmode=0666", "mode=0620", "gid=5"]},{"destination": "/dev/shm","type": "tmpfs","source": "shm","options": ["nosuid", "noexec", "nodev", "mode=1777", "size=65536k"]},{"destination": "/etc/ssl/host-certs","type": "bind","source": "/etc/ssl/certs","options": ["rbind", "ro", "rprivate"]}]
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/997543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论中国人学英语与LLM

感觉大多人都是学点框架然后自己训练自己的知识库, 然后练一套自己的英语体系(llm), 所以和洋人的理解有很大的出入. 实际上语言不应该这样学, 比如日语, 都是看大量的日语句子学习地道的表达. 但是从不知道什么时候开…

Luogu P9165 「INOH」Round 1 - 意外

给定一个长度为 \(10^2\),值域为 \([0,998244353)\) 的整数数组 \(A\)。你需要构造一个长度不超过 \(750\),值域为 \([0,998244353)\) 的整数数组 \(B\),接下来对于每个下标 \(i\),交互库都有 \(\dfrac{1}{2}\) 的…

大作业笔记-2

笔记 2 容器化 今天主要配置了 docker,有一说一我之前对 docker 的一些配置方法不太了解,都是照葫芦画瓢,这次算是自己写了一遍。 才发现原来 mysql 配好环境后会自动给指定用户授权,好文明。 最难的配置应该是 ka…

xshell 备份配置

xshell 备份配置Xshell 备份配置主要涉及导出会话设置和相关文件,以确保在重新安装或迁移时能快速恢复。以下是具体方法:‌方法一:通过图形界面导出会话配置‌:打开 Xshell,点击顶部的“文件”菜单,选择“导出”…

AshPostgres 政策绕过漏洞:空原子更新操作可能触发副作用

本文详细描述了在AshPostgres库中发现的一个中等级别安全漏洞(CVE-2024-49756)。该漏洞在特定条件下允许策略被绕过,导致本不应触发的副作用(如钩子函数)得以执行。文章涵盖漏洞影响范围、受影响的版本、检测脚本…

Supabase 实战指南:从零开始搭建数据库、配置 Auth 并接入 Resend 邮件服务

在现代全栈开发和Vibe Coding实践中,Supabase 已经不仅仅是 Firebase 的最佳开源替代品了,而是一套完整的开发解决方案了。它不仅提供了一个完整的 Postgres 数据库,还附带了强大的身份验证(Auth)、即时 API 和实…

2025 最新水泥基渗透结晶型防水涂料厂家 TOP5 评测!技术创新 + 工程实证专业榜单发布,构筑混凝土长效防护屏障 - 全局中转站

随着基础设施建设对耐久性要求的不断提升,水泥基渗透结晶型防水涂料作为混凝土结构防水防腐的核心材料,市场需求持续攀升。本榜单基于材料性能、工程适配性、服务体系三大维度(艾米微晶新增“技术创新”维度),结合…

借助 AI Ping 的 Kimi-K2-Thinking 与 ClaudeCode 的加解密工具开发

​ 介绍 AI Ping 是一个大模型 API 聚合与调度平台。它的核心价值在于,将一个复杂的“模型市场”和繁琐的技术集成工作,简化成了一个稳定、统一的接口。 点击专属链接进入即可获取 30 元的算力金:https://aiping.cn…

python: 用os库判断进程是否在运行中?

一,代码: import argparse import psutil import osdef get_process_list():with os.popen(ps aux) as f:output = f.read()# print(output)if python3 grab_from_process.py in output:print("进程运行中"…

2025.12.10总结

设计模式还有不到两周就要考试了,现在需要抓紧复习,这方面知识点少。 主要就是uml建模,类图,设计原则,23种设计模式,需要记的东西多,还需要理解着去记,还需要跟代码实际结合。虽然学过一遍,但是好像掌握不了设…

Enhance European/American Repairs with OTOFIX D1 Plus 1-Year Update Subscription

Staying Ahead in Automotive Diagnostics: The OTOFIX D1 Plus 1 Year Update Service Problem: Outdated Data = Costly Delays In today’s automotive landscape, vehicle technology evolves faster than ever. E…

2025 最新玻璃钢防腐厂家 TOP5 评测!技术创新 + 工程实证权威榜单发布,赋能工业设施长效防护生态 - 全局中转站

随着工业设施对防腐耐久性要求的不断提升,玻璃钢防腐作为重要的防护手段,在化工、电力、市政等领域的应用日益广泛。本榜单基于技术研发实力、行业适配能力、服务效能表现三大维度(艾米微晶新增“工程保障”维度),…

散修带你入门鸿蒙应用开发基础第六节:变量的作用域与生命周期 - 鸿蒙

ArkTS基础第六节:变量的作用域与生命周期 炼气六重天 【学习目标】明确作用域(变量可访问范围)与生命周期(变量存活时间)的概念及关联,理解二者对代码逻辑的影响。 掌握全局、局部、块级三类作用域的边界规则,熟…

[Git] [GitHub] 如何在将本地代码推送到github

[Git] [GitHub] 如何在将本地代码推送到github$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");ChatGPT生成(2025年12月10日23:07:21)一、准备工作 1. 安装…

2025医疗器械全球法规注册咨询辅导选择评测报告 - 优质品牌商家

2025医疗器械全球法规注册咨询辅导选择评测报告引用《2025-2029年全球医疗器械市场准入咨询服务行业发展现状及前景预测报告》数据,2025年全球医疗器械市场规模达5945亿美元,年复合增长率5.6%,但63%的医疗器械及体外…

2025最新AWHFVC防腐厂家TOP5评测!混凝土防腐品牌年度榜单,技术创新+长效防护,守护工业基建安全防线 - 全局中转站

随着工业污水处理、能源化工、市政工程等领域对混凝土及金属结构防护需求的持续升级,高性能防腐解决方案已成为保障基础设施耐久性的核心要素。本榜单基于材料性能、技术创新、工程适配性、服务体系四大维度,结合国家…

嵌入式原理图设计基础:电源/复位/时钟/IO接口电路全解析

一、嵌入式原理图设计是什么?为什么是入门核心? 嵌入式原理图是用标准化电气符号,直观表达嵌入式系统硬件连接逻辑的工程图纸,是PCB设计、硬件调试的“源头”。无论单片机、ARM还是FPGA开发,核心硬件电路都绕不开…

keil5下载安装教程详细步骤(附安装包)Keil MDK v5.40下载安装详细教程

本教程将手把手教你完成 Keil5 的下载、安装与授权,步骤讲解细致,就像搭积木一样简单,助你轻松开启开发之旅。目录一、Keil5 软件介绍及下载二、Keil5 安装教程三、Keil5 授权教程四、Keil5 基础操作技巧五、Keil5 …

Yarn vs npm:现代前端包管理器的深度对比

内容来自:https://cloud.tencent.com/developer/article/2571095在现代前端开发中,包管理器是不可或缺的工具。JavaScript生态系统中两个最主要的包管理器是npm和Yarn。本文将深入探讨它们的区别、优劣势以及适用场景…

One Year AUTEL MK808S Update Service: Enhance Diagnostics Repairs for EU/American Vehicles

Staying Ahead in Diagnostics: Why the AUTEL MK808S One Year Update Service is Critical for European & American Mechanics and Car Owners As automotive technology evolves, diagnostic tools must keep …