已关闭
[Feature]: Ascend Docker Runtime安装易用性提升 #232
weihaoran创建于 4月28日关闭于 7月24日
Atlas_zxp
4月28日 评论:
4月28日 评论:
/label add triaged


4月28日 添加了label:triaged
此处折叠了8条事件消息 查看更多
7月7日 关联了看板:MindStudio ISSUE管理
7月13日 添加了label:resolved
ascend-robot
7月20日 评论:
7月20日 评论:
您好,当前Issue标记为resolved且有一段时间未进一步更新,因此我们将其标记为'stale'(闲置)状态。若您认为这是误操作,可通过添加任意评论来去除'stale'标签。标记为stale的Issue在4天内无更新活动将自动关闭。


7月20日 添加了label:stale
7月24日 关闭了 issue
27 天前 issue状态由 TODO 改变为 DONE
提交提案之前,请先检索仓库内是否已有相同的提案,如已有请在同一提案中进行讨论。
💻 需求背景、当前现状、期望实现的功能内容、具体的设计方案、以及测试方案
需求背景
随着容器技术的发展,越来越多的用户选择使用containerd作为容器运行时。为了满足用户在containerd环境下使用Ascend Docker Runtime的需求,需要对containerd场景下的配置方式进行优化,确保Ascend Docker Runtime能够无缝集成到containerd生态系统中。
当前现状
Ascend Docker Runtime在containerd场景下存在以下问题:
当前是根据cgroup版本来指定containerd应该使用哪个shim 程序来管理容器的生命周期。
但是这种判断方式和cgroup版本是强耦合的,而且是不准确的,该配置和containerd的版本相关。
遇到的问题:例如,对于openEuler的24.03版本,虽然cgroup为v1版本,实际管理容器的shim应该参照cgroup为v2版本时的配置来选择。
期望实现的功能内容
简化配置,提升配置的准确性。
具体的设计方案
读取并继承runc运行时的配置参数,将这些参数赋值给即将添加的ascend运行时。确保ascend运行时与节点上已有的runc行为一致,避免出错。
同时,支持多版本containerd,自动适配不同版本的containerd配置格式(v1/v2/v3)。
1. 概述
1.1 简介
本提案针对 Ascend Docker Runtime 在 containerd 场景下的配置方式进行优化。核心目标是消除当前基于 cgroup 版本判断 shim 程序的强耦合问题,改为读取并继承 runc 运行时的配置参数,确保 ascend 运行时与节点上已有的 runc 行为一致,同时支持多版本 containerd 配置格式的自动适配(v1/v2/v3)。
1.2 动机
随着容器技术的发展,越来越多的用户选择使用 containerd 作为容器运行时。为了满足用户在 containerd 环境下使用 Ascend Docker Runtime 的需求,需要对 containerd 场景下的配置方式进行优化,确保 Ascend Docker Runtime 能够无缝集成到 containerd 生态系统中。
当前 Ascend Docker Runtime 在 containerd 场景下存在以下痛点:
不做此提案的影响:用户在特定操作系统(如 openEuler 24.03)上使用 containerd + Ascend Docker Runtime 时,会因 shim 配置错误导致容器无法正常启动或运行异常,严重影响用户体验和产品可用性。
1.3 目标
目标:
非目标:
2. 用例分析
用例 1:openEuler 24.03 + containerd 环境
功能点:
关键性能指标:
可靠性要求:
用例 2:多版本 containerd 自动适配
功能点:
约束:
用例 3:继承 runc 运行时配置
功能点:
可靠性要求:
3. 方案设计
3.1 总体方案
核心设计思路:放弃基于 cgroup 版本判断 shim 的方式,改为读取并继承 containerd 配置中 runc 运行时的配置参数,将这些参数赋值给 ascend 运行时。这样无论底层 cgroup 版本如何,ascend 运行时都能与节点上已有的 runc 行为保持一致,从根本上解决 cgroup 版本强耦合问题。
方案架构:
配置生成流程:
3.2 技术选型
选择理由:方案A从根本上解决了 cgroup 版本强耦合问题,通过继承 runc 配置确保行为一致性,且无需维护额外的版本映射关系,实现简洁可靠。
3.3 功能与性能设计
3.3.1 containerd 配置格式识别
containerd 存在多种配置格式版本,需要自动识别并适配:
v1 格式(containerd 1.x):
[plugins.cri.containerd.runtimes.runc] type = "io.containerd.runc.v2" engine = "" root = "" [plugins.cri.containerd.runtimes.ascend] type = "io.containerd.runc.v2" engine = "/usr/bin/ascend-docker-runtime" root = ""v2 格式(containerd 1.6+):
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] runtime_type = "io.containerd.runc.v2" runtime_engine = "" runtime_root = "" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.ascend] runtime_type = "io.containerd.runc.v2" runtime_engine = "/usr/bin/ascend-docker-runtime" runtime_root = ""v3 格式(containerd 2.x):
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] runtime_type = "io.containerd.runc.v2" runtime_path = "" options = {} [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.ascend] runtime_type = "io.containerd.runc.v2" runtime_path = "/usr/bin/ascend-docker-runtime" options = {}3.3.2 runc 配置继承逻辑
核心实现:
// RuntimeConfig 运行时配置结构 type RuntimeConfig struct { RuntimeType string // runtime_type: shim 程序标识 RuntimeEngine string // runtime_engine: 运行时引擎路径 RuntimeRoot string // runtime_root: 运行时根路径 } // ReadRuncConfig 读取 runc 运行时配置 func ReadRuncConfig(configPath string) (*RuntimeConfig, error) { // 1. 识别配置格式版本 version := detectConfigVersion(configPath) // 2. 根据版本解析 runc 配置 switch version { case "v1": return parseV1RuncConfig(configPath) case "v2": return parseV2RuncConfig(configPath) case "v3": return parseV3RuncConfig(configPath) default: return nil, fmt.Errorf("unsupported containerd config version") } } // GenerateAscendConfig 生成 ascend 运行时配置 func GenerateAscendConfig(runcConfig *RuntimeConfig) *RuntimeConfig { return &RuntimeConfig{ RuntimeType: runcConfig.RuntimeType, // 继承 runc 的 shim 类型 RuntimeEngine: "/usr/bin/ascend-docker-runtime", // 替换为 ascend 运行时 RuntimeRoot: runcConfig.RuntimeRoot, // 继承 runc 的根路径 } }关键设计点:
io.containerd.runc.v2""或/usr/bin/runc/usr/bin/ascend-docker-runtime""或自定义路径3.3.3 配置写入与生效
配置写入流程:
// WriteAscendRuntimeConfig 写入 ascend 运行时配置 func WriteAscendRuntimeConfig(configPath string, ascendConfig *RuntimeConfig) error { // 1. 备份原始配置 if err := backupConfig(configPath); err != nil { return err } // 2. 读取现有配置 config, err := readConfig(configPath) if err != nil { return err } // 3. 添加/更新 ascend 运行时配置 version := detectConfigVersion(configPath) switch version { case "v1": setV1AscendConfig(config, ascendConfig) case "v2": setV2AscendConfig(config, ascendConfig) case "v3": setV3AscendConfig(config, ascendConfig) } // 4. 写入配置文件 return writeConfig(configPath, config) }生效方式:写入配置后需要重启 containerd 服务使配置生效。
3.3.4 配置格式版本检测
// detectConfigVersion 检测 containerd 配置格式版本 func detectConfigVersion(configPath string) string { content, _ := os.ReadFile(configPath) configStr := string(content) // v3 格式特征:runtime_path 字段 if strings.Contains(configStr, "runtime_path") { return "v3" } // v2 格式特征:runtime_type 字段 if strings.Contains(configStr, "runtime_type") { return "v2" } // v1 格式特征:type 字段 if strings.Contains(configStr, "plugins.cri.containerd") { return "v1" } // 默认使用 v2 格式 return "v2" }3.4 安全隐私与DFX设计
3.4.1 兼容性
3.4.2 可维护性
3.4.3 可测试性
3.4.4 可靠性
3.4.5 安全性
/usr/bin/ascend-docker-runtime3.5 编程与调用设计
3.5.1 编程模型基本设计
运行环境:
开发约束:
/etc/containerd/config.toml可验收设计:
3.5.2 接口定义与设计
3.5.2.1 containerd 配置接口
接口描述:读取 containerd 配置中 runc 运行时参数,生成并写入 ascend 运行时配置
接口原型:
func ConfigureAscendRuntime(configPath string) error输入/输出参数:
/etc/containerd/config.toml返回参数:
异常处理:
约束说明:
调用参考代码:
// 配置 ascend 运行时 if err := ConfigureAscendRuntime("/etc/containerd/config.toml"); err != nil { log.Fatalf("failed to configure ascend runtime: %v", err) } // 重启 containerd 服务 exec.Command("systemctl", "restart", "containerd").Run()3.5.2.2 配置查询接口
接口描述:查询当前 ascend 运行时的配置信息
接口原型:
func GetAscendRuntimeConfig(configPath string) (*RuntimeConfig, error)输入/输出参数:
返回参数:
io.containerd.runc.v2/usr/bin/ascend-docker-runtime异常处理:
调用参考代码:
config, err := GetAscendRuntimeConfig("/etc/containerd/config.toml") if err != nil { log.Fatalf("failed to get ascend runtime config: %v", err) } fmt.Printf("runtime_type: %s\n", config.RuntimeType) fmt.Printf("runtime_engine: %s\n", config.RuntimeEngine) fmt.Printf("runtime_root: %s\n", config.RuntimeRoot)3.5.3 编程手册设计
本特性涉及 containerd 配置管理,相关使用说明在《Ascend Docker Runtime 安装部署指南》中更新,包含以下内容:
4. 缺点和风险
5. 现有技术
附录
参考资料链接:
术语表:
替代方案
补充说明
欢迎加入社区,感谢您对社区的贡献 🎉!