cncf-tags/container-device-interface

GitHub: cncf-tags/container-device-interface

CDI 是一个让容器运行时以标准化方式接入和管理 GPU 等第三方硬件设备的规范与工具集。

Stars: 303 | Forks: 52

# CDI - 容器设备接口 **注意:** 先前位于 `container-device-interface/pkg` 的用于注入 CDI 设备的 API 已被移除。该 API 的用户应迁移至 `container-device-interface/pkg/cdi`,因为后者正在得到积极维护。 ## 什么是 CDI? CDI(Container Device Interface)是一个 [规范](SPEC.md),旨在让 container-runtimes 支持第三方设备。 它引入了将设备作为一种资源的抽象概念。这些设备由一个完全限定名称唯一指定,该名称由供应商 ID、设备类以及在每个“供应商 ID-设备类”配对中唯一的名称构成。 ``` vendor.com/class=unique_name ``` 供应商 ID 与设备类的组合(在上例中为 `vendor.com/class`)被称为设备种类。 CDI 本身只关注让容器具备设备感知能力。诸如资源管理之类的领域被明确排除在 CDI 之外(预计由 orchestrator 处理)。由于这种侧重点,CDI 规范实现起来非常简单,并为 runtimes 和 orchestrators 提供了极大的灵活性。 注意:CDI 模型是基于容器网络接口(CNI)模型及其 [规范](https://github.com/containernetworking/cni/blob/main/SPEC.md) 的。 ## 为什么需要 CDI? 在 Linux 上,要让容器具备设备感知能力,过去通常只需在该容器中暴露一个设备节点即可。然而,随着设备和软件变得越来越复杂,供应商希望执行更多的操作,例如: - 向容器暴露设备可能需要暴露多个设备节点、从 runtime namespace 中挂载文件,或者隐藏 procfs 条目。 - 在容器和设备之间执行兼容性检查(例如:此容器能否在此设备上运行?)。 - 执行特定于 runtime 的操作(例如:基于 VM 的 runtime 与基于 Linux 容器的 runtime)。 - 执行特定于设备的操作(例如:清除 GPU 的内存或重新配置 FPGA)。 在缺乏第三方设备标准的情况下,供应商往往不得不为不同的 runtimes 编写和维护多个插件,甚至直接向 runtime 贡献特定于供应商的代码。此外,runtimes 并没有统一地暴露插件系统(甚至根本没有暴露插件系统),从而导致功能在更高级别的抽象中(例如 [Kubernetes 设备插件](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/))出现重复。 ## CDI 是如何工作的? 要使 CDI 工作,需要完成以下几点: - 包含 JSON 或 YAML 格式的 OCI spec 更新的 CDI 文件(分别带有 `.json` 或 `.yaml` 文件扩展名)应放置在 CDI spec 目录中。默认目录是 `/etc/cdi` 和 `/var/run/cdi`,但也可能取决于您的 runtime 配置。 - 应该向 runtime 传递一个或多个完全限定的设备名称,对于 podman 或 Docker 等 CLI 工具可以使用命令行参数,或者对于 CRI-O 和 containerd 可以使用容器注解或 CRI 字段。 - 容器 runtime 应该能够根据设备名称找到 CDI 文件,并使用 CDI 文件的内容更新容器配置。 ## 如何构建和安装 CDI CLI? ### 什么是 CDI CLI? `cdi` 命令行工具是一个用于检查和与 CDI (Container Device Interface) 缓存进行交互的实用程序。 它允许开发者和系统管理员: - **列出 CDI Spec 文件**:查看已配置目录中所有可用的 CDI 规范文件 - **列出供应商**:显示 CDI 缓存中已注册的设备供应商 - **列出设备类**:显示 CDI Specs 中可用的设备类 - **列出设备**:枚举系统中所有可用的 CDI 设备 - **验证 specs**:根据 JSON schema 验证 CDI 规范文件 - **注入设备**:将 CDI 设备配置注入到 OCI runtime 规范中 - **监控缓存**:监视 CDI 缓存和 Spec 目录的更改 - **解析设备**:将完全限定的设备名称解析为其配置 该 CLI 工具对于调试 CDI 配置、验证 spec 文件以及在将其部署到生产环境之前测试设备分配非常有用。 ### 构建 CDI CLI 要从源代码构建 CDI 命令行工具: ``` # 克隆 repository(如果尚未完成) git clone https://github.com/cncf-tags/container-device-interface.git cd container-device-interface # 构建 binary make ``` 这将编译 `cdi` 二进制文件并将其与 `validate` 等其他实用程序一起放置在 `bin/` 目录中。 ### 安装 CDI CLI 构建完成后,将该二进制文件安装到您的系统中: ``` # 安装到 /usr/local/bin(需要 sudo) sudo install -m 0755 bin/cdi /usr/local/bin/cdi # 验证安装 cdi --help ``` ### 基本用法 安装后,您可以使用 `cdi` 命令与 CDI 设备进行交互: ``` # 列出所有 CDI Spec 文件 cdi specs # 列出所有可用的 CDI 设备 cdi devices # 列出所有 vendors cdi vendors # 列出所有 device classes cdi classes # 验证 CDI Spec 文件 cdi validate # 监控 CDI cache 变更 cdi monitor ``` 使用 `cdi --help` 或 `cdi --help` 获取有关每个命令及其选项的详细信息。 ## 如何配置 CDI? ### CRI-O 配置 在 CRI-O 中,CDI 支持默认已启用。它配置了默认的 `/etc/cdi, /var/run/cdi` CDI 目录位置。因此,您只需将 CDI 配置文件放入这两个目录中的任意一个即可开始使用 CDI,将静态配置放入 `/etc/cdi`,将动态更新的配置放入 `/var/run/cdi`。如果您不确定已配置的目录,可以运行以下命令来查找它们: ``` $ crio config |& grep -B1 -A5 cdi_spec_dirs ``` ### containerd 配置 要在 [containerd runtime](https://github.com/containerd/containerd) 中启用和配置 CDI 支持,应该在 containerd 配置文件(默认为 `/etc/containerd/config.toml`)的 `plugins."io.containerd.grpc.v1.cri` 部分设置 `enable_cdi` 和 `cdi_spec_dirs` 这两个配置选项: ``` [plugins."io.containerd.grpc.v1.cri"] enable_cdi = true cdi_spec_dirs = ["/etc/cdi", "/var/run/cdi"] ``` 请记住重启 containerd 以使任何配置更改生效。 ### Docker 和 Podman 配置 [Docker Daemon](https://github.com/moby/moby) 和 [podman](https://github.com/containers/podman) 均支持 CDI,并直接处理指定的 `--device` 标志。如果包含了完全限定的设备选择器(例如 `vendor.com/device=myDevice`),系统将检查默认位置(`/etc/cdi` 和 `/var/run/cdi`)的 CDI 规范以查找匹配的设备。 Podman 不需要任何特定配置即可启用 CDI 支持。 从 **28.2.0** 版本开始,Docker 默认启用了 CDI。 #### 早于 28.2.0 的 Docker Docker 自 **25.0.0** 版本开始支持 CDI。 对于 **25.0.0** 到 **28.1.1** 之间的 Docker 版本,您需要通过在守护进程配置文件(默认为 `/etc/docker/daemon.json`)中包含以下内容来启用 CDI 功能: ``` { "features": { "cdi": true } } ``` 请记住重启 Docker 守护进程以使任何配置更改生效。 #### Podman 尽管最初的支持是在 [`v3.2.0`](https://github.com/containers/podman/releases/tag/v3.2.0) 中添加的,但在 [`v4.1.0-rc.1`](https://github.com/containers/podman/releases/tag/v4.1.0-rc1) 中通过 [commit a234e4e](https://github.com/containers/podman/commit/a234e4e19662e172472877ce69523f4afea5c12e) 对标记为 `v0.3.0` 的 CDI spec 进行了更新。 ## 示例 ### 完整的 CDI 规范 ``` $ mkdir /etc/cdi $ cat > /etc/cdi/vendor.json < /etc/cdi/vendor-annotations.json <
标签:EVTX分析, Homebrew安装, 容器, 文档结构分析, 日志审计, 硬件加速, 规范接口, 设备管理, 运行时