长期支持版本

    社区创新版本

      iSulad支持CDI

      概述

      CDI(Container Device Interface,容器设备接口)是容器运行时的一种规范,用于支持第三方设备。

      CDI解决了如下问题:
      在Linux上,为了使容器具有设备感知能力,过去只需在该容器中暴露一个设备节点。但是,随着设备和软件变得越来越复杂,供应商希望执行更多的操作,例如:

      • 向容器公开设备可能需要公开多个设备节点、从运行时命名空间挂载文件或隐藏procfs条目。
      • 执行容器和设备之间的兼容性检查(例如:检查容器是否可以在指定设备上运行)。
      • 执行特定于运行时的操作(例如:虚拟机与基于Linux容器的运行时)。
      • 执行特定于设备的操作(例如:清理GPU的内存或重新配置FPGA)。

      在缺乏第三方设备标准的情况下,供应商通常不得不为不同的运行时编写和维护多个插件,甚至直接在运行时中贡献特定于供应商的代码。此外,运行时不统一地暴露插件系统(甚至根本不暴露插件系统),导致在更高级别的抽象(例如Kubernetes设备插件)中重复功能。

      CDI解决上述问题的方法:
      CDI描述了一种允许第三方供应商与设备交互的机制,从而不需要更改容器运行时。

      使用的机制是一个JSON文件(类似于容器网络接口(CNI)),它允许供应商描述容器运行时应该对容器的OCI规范执行的操作。

      iSulad目前已支持CDI v0.6.0规范。

      配置iSulad支持CDI

      需要对daemon.json做如下配置,然后重启iSulad:

      {
          ...
          "enable-cri-v1": true,
          "cdi-spec-dirs": ["/etc/cdi", "/var/run/cdi"],
          "enable-cdi": true
      }
      

      其中"cdi-spec-dirs"用于指定CDI specs所在目录,如果不指定则默认为"/etc/cdi", "/var/run/cdi"。

      使用示例

      CDI specification实例

      具体每个字段含义详见CDI v0.6.0

      $ mkdir /etc/cdi
      $ cat > /etc/cdi/vendor.json <<EOF
      {
        "cdiVersion": "0.6.0",
        "kind": "vendor.com/device",
        "devices": [
          {
            "name": "myDevice",
            "containerEdits": {
              "deviceNodes": [
                {"hostPath": "/vendor/dev/card1", "path": "/dev/card1", "type": "c", "major": 25, "minor": 25, "fileMode": 384, "permissions": "rw", "uid": 1000, "gid": 1000},
                {"path": "/dev/card-render1", "type": "c", "major": 25, "minor": 25, "fileMode": 384, "permissions": "rwm", "uid": 1000, "gid": 1000}
              ]
            }
          }
        ],
        "containerEdits": {
          "env": [
            "FOO=VALID_SPEC",
            "BAR=BARVALUE1"
          ],
          "deviceNodes": [
            {"path": "/dev/vendorctl", "type": "b", "major": 25, "minor": 25, "fileMode": 384, "permissions": "rw", "uid": 1000, "gid": 1000}
          ],
          "mounts": [
            {"hostPath": "/bin/vendorBin", "containerPath": "/bin/vendorBin"},
            {"hostPath": "/usr/lib/libVendor.so.0", "containerPath": "/usr/lib/libVendor.so.0"},
            {"hostPath": "tmpfs", "containerPath": "/tmp/data", "type": "tmpfs", "options": ["nosuid","strictatime","mode=755","size=65536k"]}
          ],
          "hooks": [
            {"createContainer": {"path": "/bin/vendor-hook"} },
            {"startContainer": {"path": "/usr/bin/ldconfig"} }
          ]
        }
      }
      EOF
      

      在CRI创建容器的参数中使用CDI

      假设已经生成了vendor.json规范,并且该规范在"/etc/cdi"或"/var/run/cdi"中可用(或者当iSulad的配置文件"cdi-spec-dirs"有指定目录时,在"cdi-spec-dirs"指定目录中可用),则可以通过其完全限定的设备名称来访问设备,例子中为"vendor.com/device=myDevice"。

      在容器json文件中,使用以下两种方式指定设备均可:

      1. annotations中指定设备
      {
         ... ...
         "annotations": [
             ... ...
             {"cdi.k8s.io/test": "vendor.com/device=myDevice"},
             ... ...
         ]
         ... ...
      }
      
      1. CDI_Devices中指定设备
      {
         ... ...
         "CDI_Devices": [
             ... ...
             {"Name": "vendor.com/device=myDevice"},
             ... ...
         ]
         ... ...
      }
      

      使用限制

      iSulad目前仅支持CRI方式使用CDI特性。

      文档捉虫

      “有虫”文档片段

      问题描述

      提交类型 issue

      有点复杂...

      找人问问吧。

      PR

      小问题,全程线上修改...

      一键搞定!

      问题类型
      规范和低错类

      ● 错别字或拼写错误;标点符号使用错误;

      ● 链接错误、空单元格、格式错误;

      ● 英文中包含中文字符;

      ● 界面和描述不一致,但不影响操作;

      ● 表述不通顺,但不影响理解;

      ● 版本号不匹配:如软件包名称、界面版本号;

      易用性

      ● 关键步骤错误或缺失,无法指导用户完成任务;

      ● 缺少必要的前提条件、注意事项等;

      ● 图形、表格、文字等晦涩难懂;

      ● 逻辑不清晰,该分类、分项、分步骤的没有给出;

      正确性

      ● 技术原理、功能、规格等描述和软件不一致,存在错误;

      ● 原理图、架构图等存在错误;

      ● 命令、命令参数等错误;

      ● 代码片段错误;

      ● 命令无法完成对应功能;

      ● 界面错误,无法指导操作;

      风险提示

      ● 对重要数据或系统存在风险的操作,缺少安全提示;

      内容合规

      ● 违反法律法规,涉及政治、领土主权等敏感词;

      ● 内容侵权;

      您对文档的总体满意度

      非常不满意
      非常满意
      提交
      根据您的反馈,会自动生成issue模板。您只需点击按钮,创建issue即可。
      文档捉虫
      编组 3备份