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}\) 的…
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 …