在电信、高性能或 AI 计算等必须高度可靠且满足严格性能标准的行业中,容器化应用通常需要特定的操作系统配置或硬件支持。 通常的做法是要求使用特定版本的内核、其配置、设备驱动程序或系统组件。

尽管存在开放容器倡议 (OCI) 这样一个定义容器镜像标准和规范的治理社区, 但在表达这种兼容性需求方面仍存在空白。为了解决这一问题,业界提出了多个提案,并最终在 Kubernetes 的节点特性发现 (NFD) 项目中实现了相关功能。

NFD 是一个开源的 Kubernetes 项目,能够自动检测并报告集群节点的硬件和系统特性。 这些信息帮助用户将工作负载调度到满足特定系统需求的节点上,尤其适用于具有严格硬件或操作系统依赖的应用。

镜像兼容性规范的需求

容器与主机操作系统之间的依赖关系

容器镜像是基于基础镜像构建的,基础镜像提供了最小的运行时环境,通常是一个精简的 Linux 用户态环境, 有时甚至是完全空白或无发行版的。 当应用需要来自主机操作系统的某些特性时,就会出现兼容性问题。这些依赖可能表现为以下几种形式:

  • 驱动程序: 主机上的驱动程序版本必须与容器内的库所支持的版本范围相匹配,以避免兼容性问题,例如 GPU 和网络驱动。

  • 库或软件: 容器必须包含某个库或软件的特定版本或版本范围,才能在目标环境中以最优方式运行。 高性能计算方面的示例包括 MPI、EFA 或 Infiniband。

  • 内核模块或特性: 必须存在特定的内核特性或模块,例如对写入保护巨页错误的支持,或存在对 VFIO 的支持。

  • 以及其他更多形式...

虽然在 Kubernetes 中容器是这些需求最常见的抽象单位,但兼容性的定义可以进一步扩展,包括 Singularity 等其他容器技术以及来自 spack 二进制缓存的二进制文件等 OCI 工件。

多云与混合云的挑战

容器化应用被部署在各种 Kubernetes 发行版和云平台上,而不同的主机操作系统带来了兼容性挑战。 这些操作系统通常需要在部署工作负载之前预配置,或者它们是不可变的。 例如,不同云平台会使用不同的操作系统,包括:

  • RHCOS/RHEL
  • Photon OS
  • Amazon Linux 2
  • Container-Optimized OS
  • Azure Linux OS
  • 等等...

每种操作系统都具有独特的内核版本、配置和驱动程序,对于需要特定特性的应用来说,兼容性问题并不简单。 因此必须能够快速评估某个容器镜像是否适合在某个特定环境中运行。

镜像兼容性倡议

OCI 镜像兼容性工作组正在推动引入一个镜像兼容性元数据的标准。 此规范允许容器作者声明所需的主机操作系统特性,使兼容性需求可以被发现和编程化处理。 目前已在 Kubernetes 的 Node Feature Discovery 中实现了其中一个被讨论的提案,其目标包括:

  • 在 OCI 镜像清单中定义一种结构化的兼容性表达方式。
  • 支持在镜像仓库中将兼容性规范与容器镜像一同存储。
  • 在容器调度之前实现兼容性自动验证。

这个理念目前已在 Kubernetes 的 Node Feature Discovery 项目中落地。

在 Node Feature Discovery 中的实现

这种解决方案通过 NFD 的特性机制和 NodeFeatureGroup API 将兼容性元数据集成到 Kubernetes 中。 此接口使用户可以根据硬件和软件暴露的特性将容器与节点进行匹配,从而实现智能调度与工作负载优化。

兼容性规范

兼容性规范是一个结构化的兼容性对象列表,包含 Node Feature Groups。 这些对象定义了镜像要求,并支持与主机节点进行验证。特性需求通过 NFD 项目提供的特性列表进行描述。此模式的结构如下:

  • version(字符串)— 指定 API 版本。

  • compatibilities(对象数组)— 兼容性集合列表。

    • rules(对象)— 指定 NodeFeatureGroup 来定义镜像要求。
    • weight(整数,可选)— 节点亲和性权重。
    • tag(字符串,可选)— 分类标记。
    • description(字符串,可选)— 简短描述。

示例如下:

version: v1alpha1
compatibilities:
- description: "My image requirements"
rules:
- name: "kernel and cpu"
matchFeatures:
- feature: kernel.loadedmodule
matchExpressions:
vfio-pci: {op: Exists}
- feature: cpu.model
matchExpressions:
vendor_id: {op: In, value: ["Intel", "AMD"]}
- name: "one of available nics"
matchAny:
- matchFeatures:
- feature: pci.device
matchExpressions:
vendor: {op: In, value: ["0eee"]}
class: {op: In, value: ["0200"]}
- matchFeatures:
- feature: pci.device
matchExpressions:
vendor: {op: In, value: ["0fff"]}
class: {op: In, value: ["0200"]}

节点验证的客户端实现

为了简化兼容性验证, 我们实现了一个客户端工具, 可以根据镜像的兼容性工件进行节点验证。在这个流程中,镜像作者会生成一个兼容性工件, 并通过引用者(Referrs) API 将其指向镜像所在的仓库。当需要评估某个镜像是否适用于某个主机节点时, 此工具可以发现工件并在部署前验证镜像对节点的兼容性。 客户端可以验证 Kubernetes 集群内外的节点,扩大了其应用范围。 未来,镜像兼容性还可能在基于镜像要求创建特定工作负载配置文件中发挥关键作用,有助于提升调度效率。 此外,还可能实现一定程度上的节点自动配置,进一步优化资源分配并确保特种工作负载的顺利部署。

使用示例

  1. 定义镜像兼容性元数据

    一个容器镜像可以包含元数据, 基于节点所发现的特性(如内核模块或 CPU 型号)描述其需求。 上文所述的兼容性规范示例即体现了这种用法。

  1. 将工件挂接到镜像上

    镜像兼容性规范以 OCI 工件的形式存储。 你可以使用 oras 工具将元数据挂接到你的容器镜像上。 镜像仓库只需支持 OCI 工件,不必支持任意类型。 请注意,容器镜像和工件必须存储在同一个镜像仓库中。 使用以下命令将工件挂接到镜像上:

    oras attach \
    --artifact-type application/vnd.nfd.image-compatibility.v1alpha1 <image-url> \
    <path-to-spec>.yaml:application/vnd.nfd.image-compatibility.spec.v1alpha1+yaml
  1. 验证镜像兼容性

    在挂接兼容性规范之后,你可以验证某个节点是否满足镜像的运行要求。这种验证可以通过 nfd 客户端来完成:

    nfd compat validate-node --image <镜像地址>
  1. 读取客户端的输出

    你可以阅读工具生成的报告,也可以使用你自己的工具解析生成的 JSON 报告并做出决策。

总结

通过 Node Feature Discovery 将镜像兼容性引入 Kubernetes,突显了在云原生环境中解决兼容性问题的重要性。 这只是一个起点,未来仍需进一步将兼容性深度集成到 Kubernetes 内外的工作负载调度中。 然而,借助这一功能,关键任务型工作负载现在可以更高效地定义和验证其对主机操作系统的要求。 展望未来,兼容性元数据在 Kubernetes 生态系统中的广泛采用将显著提升专用容器化应用的可靠性与性能, 确保其能够满足电信、高性能计算等行业对硬件或主机系统配置的严格要求。

 
 

云原生环境中的镜像兼容性(NFD项目)的更多相关文章

  1. 分布式注册服务中心etcd在云原生引擎中的实践

    作者:王雷 etcd是什么 etcd是云原生架构中重要的基础组件,由CNCF孵化托管.ETCD是用于共享配置和服务发现的分布式,一致性的KV存储系统,是CoreOS公司发起的一个开源项目,授权协议为A ...

  2. 初探云原生应用管理之:聊聊 Tekton 项目

    [编者的话]“人间四月芳菲尽,山寺桃花始盛开.” 越来越多专门给 Kubernetes 做应用发布的工具开始缤纷呈现,帮助大家管理和发布不断增多的 Kubernetes 应用.在做技术选型的时候,我们 ...

  3. 8.云原生之Docker容器镜像构建最佳实践浅析

    转载自:https://www.bilibili.com/read/cv15220861/?from=readlist 本章目录 0x02 Docker 镜像构建最佳实践浅析 1.Dockerfile ...

  4. OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 4.镜像服务(glance)

    节点配置信息说明: 控制节点:controller: IP:192.168.164.128 hostname&hosts:likeadmin 计算加点:Nova: IP:192.168.164 ...

  5. [转]在64位的环境中使用VS建立Web项目进行Oracle连接需要注意WebDev是32位的

    本文转自:http://www.cnblogs.com/studyzy/archive/2010/10/28/1863056.html 我们平时使用的都是32位的机器进行开发,装的都是32位的软件,但 ...

  6. 快速上手 Rook,入门云原生存储编排

    Rook 是一个开源 cloud-native storage orchestrator(云原生存储编排器),为各种存储解决方案提供平台.框架和支持,以与云原生环境进行原生集成. Rook 将存储软件 ...

  7. Fluid + GooseFS 助力云原生数据编排与加速快速落地

    前言 Fluid 作为基于 Kubernetes 开发的面向云原生存算分离场景下的数据调度和编排加速框架,已于近期完成了 v0.6.0 版本的正式发布.腾讯云容器 TKE 团队一直致力于参与 Flui ...

  8. 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发

    <ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...

  9. 5大最新云原生镜像构建工具全解析,3个来自Google,你了解几个?

    1云原生大背景下的镜像构建在分享开始,我想先跟大家简单聊一下云原生,可能不会详细展开,而是带领大家了解一下云原生对镜像构建方面的影响.第一,在接触云原生相关的技术时,无论是要解决开发.测试环境的问题, ...

  10. 专访 KubeVela 核心团队:如何简化云原生复杂环境下的应用交付和管理

    作者 | Infoq Tina 背景 12 月 9 日,在 2021 年 KubeCon 云原生技术峰会上,CNCF 开源项目 KubeVela 宣布推出了 1.2 版本. KubeVela 是一个简 ...

随机推荐

  1. Intel指令集及SIMD数据加速

    查看CPU相关信息 执行结果举例: 查看电脑CPU支持的指令集: cat /proc/cpuinfo | grep "processor" | wc -l 支持的指令集: 向量指令 ...

  2. Ubuntu 安装最新版本 node.js

    第一步,去官网看看当前最新的版本是多少,比如当前最新是v18.12.0 curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash - ...

  3. K8s新手系列之指定Pod调度到指定节点上

    概述 在 Kubernetes 中,Pod的调度是通过kube-schedule来实现的,Pod的调度会经过一系列算法来进行完成. 在实际生产过程中,我们想让Pod调度到我们想要的节点上,往往通过ku ...

  4. .NET周刊【5月第4期 2025-05-25】

    国内文章 .NET 的全新低延时高吞吐自适应 GC - Satori GC https://www.cnblogs.com/hez2010/p/18889954/the-new-satori-gc-f ...

  5. Springboot笔记<6>Rest的使用和请求参数注解@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody

    Rest的使用和原理 Rest风格支持(使用HTTP请求方式动词来表示对资源的操作) • 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveU ...

  6. 如何给 GitHub Copilot "洗脑”,让 AI 精准遵循指令产出高质量代码

    引子 最近在项目中使用 GitHub Copilot 的过程中,我发现了一个很有趣的现象. 当我让 Copilot 帮我写代码时,它总是热情满满地给出一大段实现.但当我仔细审视这些代码时,却经常会发现 ...

  7. 技术干货|如何利用 ChunJun 实现数据离线同步?

    ChunJun 是⼀款稳定.易⽤.⾼效.批流⼀体的数据集成框架,基于计算引擎 Flink 实现多种异构数据源之间的数据同步与计算.ChunJun 可以把不同来源.格式.特点性质的数据在逻辑上或物理上有 ...

  8. [CF1672G]Cross Xor

    G - Cross Xor 对于\((n\&1)\&\&(m\&1)\)的情况,所有行.列的异或和的必须相等(异或和指当前行/列中所有元素的异或和) 每次修改的点\(( ...

  9. 我们开源的AI产品pandawiki 火了……

    大家好,经过一个月的内测,我们刚刚开源了一款 AI 驱动的 Wiki 项目,叫做 PandaWiki. GitHub 链接:https://github.com/chaitin/PandaWiki 项 ...

  10. 花了不少时间,修复了一个SharpIco生成图标的bug

    前言 上个月我用 dotnet9 AOT 开发了一个 ico 图标生成工具 SharpIco 这个实用小工具一经发布就受到不少朋友的关注 最近还被做成了网站,有图形化界面来一键生成 ico 图标,更方 ...