mirror of
https://github.com/kubernetes-sigs/node-feature-discovery.git
synced 2025-03-07 01:07:05 +00:00
120 lines
No EOL
36 KiB
HTML
120 lines
No EOL
36 KiB
HTML
<!DOCTYPE html> <html lang="en" dir="auto"> <head><meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, user-scalable=no"> <meta name="description" content="Image Compatibility Artifact Table of contents Image Compatibility Compatibility Specification Schema OCI Artifact Validate the host against the im..."> <meta name="revised" content=""> <meta name="author" content="Kubernetes SIGs"> <meta name="generator" content="jekyll-rtd-theme v2.0.10"><meta name="theme-color" content="#2980b9"> <title>Image Compatibility Artifact · Node Feature Discovery</title> <meta name="twitter:title" content="Image Compatibility Artifact · Node Feature Discovery"> <meta name="twitter:description" content="Image Compatibility Artifact Table of contents Image Compatibility Compatibility Specification Schema OCI Artifact Validate the host against the im..."> <meta name="twitter:card" content="summary"> <meta name="twitter:site" content="@Kubernetes SIGs"> <meta name="twitter:url" content="https://kubernetes-sigs.github.com/node-feature-discovery/master/usage/image-compatibility.html"> <meta name="twitter:creator" content="@jekyll-rtd-theme v2.0.10"> <meta property="og:title" content="Image Compatibility Artifact · Node Feature Discovery"> <meta property="og:description" content="Image Compatibility Artifact Table of contents Image Compatibility Compatibility Specification Schema OCI Artifact Validate the host against the im..."> <meta property="og:locale" content="en"> <meta property="og:url" content="https://kubernetes-sigs.github.com/node-feature-discovery/master/usage/image-compatibility.html"> <meta property="og:type" content="article"> <meta property="article:author" content="Kubernetes SIGs"> <meta property="article:published_time" content="2016-07-23T05:07:52+00:00"> <meta property="article:modified_time" content="2025-01-14T11:27:32+00:00"> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "mainEntityOfPage": { "@type": "WebPage", "@id": "https://kubernetes-sigs.github.com/node-feature-discovery/master/usage/image-compatibility.html" }, "headline": "Image Compatibility Artifact · Node Feature Discovery", "image": [], "author": { "@type": "Person", "name": "Kubernetes SIGs" }, "datePublished": "2016-07-23T05:07:52+00:00", "dateModified": "2025-01-14T11:27:32+00:00", "publisher": { "@type": "Organization", "name": "Kubernetes SIGs", "logo": { "@type": "ImageObject", "url": "https://avatars.githubusercontent.com/u/36015203?v=4" } }, "description": "Image Compatibility Artifact Table of contents Image Compatibility Compatibility Specification Schema OCI Artifact Validate the host against the im..." } </script> <link rel="dns-prefetch" href="https://cdn.jsdelivr.net"><link rel="prev" href="https://kubernetes-sigs.github.com/node-feature-discovery/master/usage/kubectl-plugin.html"><link rel="canonical" href="https://kubernetes-sigs.github.com/node-feature-discovery/master/usage/image-compatibility.html"><link rel="icon" type="image/svg+xml" href="/node-feature-discovery/master/assets/images/favicon.svg"><link rel="icon" type="image/png" href="/node-feature-discovery/master/assets/images/favicon-16x16.png" sizes="16x16"> <link rel="icon" type="image/png" href="/node-feature-discovery/master/assets/images/favicon-32x32.png" sizes="32x32"> <link rel="icon" type="image/png" href="/node-feature-discovery/master/assets/images/favicon-96x96.png" sizes="96x96"><link rel="mask-icon" href="/node-feature-discovery/master/assets/images/favicon.svg" color="#2980b9"><link rel="apple-touch-icon" href="/node-feature-discovery/master/assets/images/apple-touch-icon-300x300.jpg"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/rundocs/jekyll-rtd-theme@2.0.10/assets/css/theme.min.css"><style>@media (min-width: 1280px){.content-wrap{max-width:1200px}}</style><script> window.ui = { title: "Node Feature Discovery", baseurl: "/node-feature-discovery/master", i18n: { search_results: "Search Results", search_results_found: "Search finished, found # page(s) matching the search query.", search_results_not_found: "Your search did not match any documents, please make sure that all characters are spelled correctly!" } }; </script> </head> <body class="container"><div class="sidebar-wrap overflow-hidden"> <div class="sidebar height-full overflow-y-scroll overflow-x-hidden"> <div class="header d-flex flex-column p-3 text-center"> <div class="title pb-1"> <a class="h4 no-underline py-1 px-2 rounded-1" href="/node-feature-discovery/master/" title="Documentation of Node Feature Discovery - a Kubernetes add-on for discovering and advertising hardware features and system configuration in the cluster."> <i class="fa fa-home"></i> Node Feature Discovery </a> </div> <span class="version">master</span> <form class="search pt-2" action="/node-feature-discovery/master/search.html" method="get" autocomplete="off"> <input class="form-control input-block input-sm" type="text" name="q" placeholder="Search docs..."> </form> </div> <div class="toctree py-2" data-spy="affix" role="navigation" aria-label="main navigation"> <ul> </ul> <a class="caption d-block text-uppercase no-wrap px-2 py-0" href="/node-feature-discovery/master/get-started/"> Get started </a><ul> <li class="toc level-1 " data-sort="1" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/get-started/introduction.html">1. Introduction</a> </li> <li class="toc level-1 " data-sort="2" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/get-started/quick-start.html">2. Quick start</a> </li></ul> <a class="caption d-block text-uppercase no-wrap px-2 py-0" href="/node-feature-discovery/master/deployment/"> Deployment </a><ul> <li class="toc level-1 " data-sort="1" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/deployment/image-variants.html">1. Image variants</a> </li> <li class="toc level-1 " data-sort="2" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/deployment/kustomize.html">2. Kustomize</a> </li> <li class="toc level-1 " data-sort="3" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/deployment/helm.html">3. Helm</a> </li> <li class="toc level-1 " data-sort="4" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/deployment/operator.html">4. NFD Operator</a> </li> <li class="toc level-1 " data-sort="5" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/deployment/uninstallation.html">5. Uninstallation</a> </li> <li class="toc level-1 " data-sort="6" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/deployment/metrics.html">6. Metrics</a> </li></ul> <a class="caption d-block text-uppercase no-wrap px-2 py-0" href="/node-feature-discovery/master/usage/"> Usage </a><ul> <li class="toc level-1 " data-sort="1" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/usage/features.html">1. Feature labels</a> </li> <li class="toc level-1 " data-sort="2" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/usage/using-labels.html">2. Using node labels</a> </li> <li class="toc level-1 " data-sort="3" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/usage/nfd-master.html">3. NFD-Master</a> </li> <li class="toc level-1 " data-sort="4" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/usage/nfd-worker.html">4. NFD-Worker</a> </li> <li class="toc level-1 " data-sort="5" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/usage/nfd-topology-updater.html">5. NFD-Topology-Updater</a> </li> <li class="toc level-1 " data-sort="6" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/usage/nfd-gc.html">6. NFD-Garbage-Collector</a> </li> <li class="toc level-1 " data-sort="7" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/usage/custom-resources.html">7. CRDs</a> </li> <li class="toc level-1 " data-sort="8" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/usage/customization-guide.html">8. Customization guide</a> </li> <li class="toc level-1 " data-sort="9" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/usage/examples-and-demos.html">9. Examples and demos</a> </li> <li class="toc level-1 " data-sort="10" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/usage/kubectl-plugin.html">10. Kubectl plugin</a> </li> <li class="toc level-1 current" data-sort="11" data-level="1"> <a class="d-flex flex-items-baseline current" href="/node-feature-discovery/master/usage/image-compatibility.html">11. Image Compatibility Artifact</a> </li></ul> <a class="caption d-block text-uppercase no-wrap px-2 py-0" href="/node-feature-discovery/master/reference/"> Reference </a><ul> <li class="toc level-1 " data-sort="1" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/reference/master-commandline-reference.html">1. Master cmdline reference</a> </li> <li class="toc level-1 " data-sort="2" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/reference/worker-commandline-reference.html">2. Worker cmdline reference</a> </li> <li class="toc level-1 " data-sort="3" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/reference/master-configuration-reference.html">3. Master config reference</a> </li> <li class="toc level-1 " data-sort="4" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/reference/worker-configuration-reference.html">4. Worker config reference</a> </li> <li class="toc level-1 " data-sort="5" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/reference/topology-updater-commandline-reference.html">5. Topology Updater Cmdline Reference</a> </li> <li class="toc level-1 " data-sort="6" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/reference/topology-updater-configuration-reference.html">6. Topology-Updater config reference</a> </li> <li class="toc level-1 " data-sort="7" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/reference/gc-commandline-reference.html">7. Garbage Collector Cmdline Reference</a> </li> <li class="toc level-1 " data-sort="8" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/reference/plugin-commandline-reference.html">8. Kubectl plugin cmdline reference</a> </li> <li class="toc level-1 " data-sort="9" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/reference/node-feature-client-reference.html">9. Node Feature client cmdline reference</a> </li> <li class="toc level-1 " data-sort="10" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/reference/versions.html">10. Versions</a> </li> <li class="toc level-1 " data-sort="11" data-level="1"> <a class="d-flex flex-items-baseline " href="/node-feature-discovery/master/reference/feature-gates.html">11. Feature Gates</a> </li></ul> <a class="caption d-block text-uppercase no-wrap px-2 py-0" href="/node-feature-discovery/master/developer-guide/"> Developer guide </a><ul> </ul> <a class="caption d-block text-uppercase no-wrap px-2 py-0" href="/node-feature-discovery/master/contributing/"> Contributing </a><ul> </ul> </div> </div> </div> <div class="content-wrap"> <div class="header d-flex flex-justify-between p-2 hide-lg hide-xl" aria-label="top navigation"> <button id="toggle" aria-label="Toggle menu" class="btn-octicon p-2 m-0 text-white" type="button"> <i class="fa fa-bars"></i> </button> <div class="title flex-1 d-flex flex-justify-center"> <a class="h4 no-underline py-1 px-2 rounded-1" href="/node-feature-discovery/master/">Node Feature Discovery</a> </div> </div> <div class="content p-3 p-sm-5"> <div class="navigation-top d-flex flex-justify-between"> <ul class="breadcrumb" role="navigation" aria-label="breadcrumbs navigation"> <li class="breadcrumb-item"> <a class="no-underline" href="/node-feature-discovery/master/" title="/"> <i class="fa fa-home"></i> </a> </li><li class="breadcrumb-item" ><a href="/node-feature-discovery/master/usage/">usage</a></li><li class="breadcrumb-item" aria-current="page">image-compatibility.md</li></ul> <a class="edit" href="https://github.com/kubernetes-sigs/node-feature-discovery/edit/gh-pages/usage/image-compatibility.md" title="Edit on GitHub" rel="noreferrer" target="_blank"> <i class="fa fa-edit"></i> </a> </div> <hr> <div role="main" itemscope="itemscope" itemtype="https://schema.org/Article"> <div class="markdown-body" itemprop="articleBody"> <h1 class="no_toc" id="image-compatibility-artifact">Image Compatibility Artifact</h1> <h2 class="no_toc text-delta" id="table-of-contents">Table of contents</h2> <ol id="markdown-toc"> <li><a href="#image-compatibility" id="markdown-toc-image-compatibility">Image Compatibility</a> <ol> <li><a href="#compatibility-specification" id="markdown-toc-compatibility-specification">Compatibility Specification</a></li> <li><a href="#schema" id="markdown-toc-schema">Schema</a></li> <li><a href="#oci-artifact" id="markdown-toc-oci-artifact">OCI Artifact</a></li> <li><a href="#validate-the-host-against-the-image-compatibility-specification" id="markdown-toc-validate-the-host-against-the-image-compatibility-specification">Validate the host against the image compatibility specification</a></li> <li><a href="#validate-the-k8s-cluster-node-with-the-validate-image-job" id="markdown-toc-validate-the-k8s-cluster-node-with-the-validate-image-job">Validate the k8s cluster node with the validate-image Job</a></li> </ol> </li> </ol> <hr /> <h2 id="image-compatibility">Image Compatibility</h2> <p><strong>Image Compatibility is in the experimental <code class="language-plaintext highlighter-rouge notranslate">v1alpha1</code> version.</strong></p> <p>Image compatibility metadata enables container image authors to define their image requirements using <a href="/node-feature-discovery/master/usage/custom-resources.html#nodefeaturerule">Node Feature Rules</a>. This complementary solution allows features discovered on nodes to be matched directly from images. As a result, container requirements become discoverable and programmable, supporting various consumers and use cases where applications need a specific compatible environment.</p> <h3 id="compatibility-specification">Compatibility Specification</h3> <p>The compatibility specification is a list of compatibility objects that contain <a href="/node-feature-discovery/master/usage/custom-resources.html#nodefeaturerule">Node Feature Rules</a>, along with additional fields to control the execution of validation between the image and the host.</p> <h3 id="schema">Schema</h3> <ul> <li> <p><strong>version</strong> - <em>string</em><br /> This REQUIRED property specifies the version of the API in use.</p> </li> <li> <p><strong>compatibilities</strong> - <em>array of object</em><br /> This REQUIRED property is a list of compatibility sets.</p> <ul> <li> <p><strong>rules</strong> - <em>object</em><br /> This REQUIRED property is a reference to the spec of the <a href="/node-feature-discovery/master/usage/custom-resources.html#nodefeaturerule">NodeFeatureRule API</a>. The spec allows image requirements to be described using the features discovered from NFD sources. For more details, please refer to <a href="/node-feature-discovery/master/usage/custom-resources.html#nodefeaturerule">the documentation</a>.</p> </li> <li> <p><strong>weight</strong> - <em>int</em><br /> This OPTIONAL property specifies the <a href="https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity-weight">node affinity weight</a>.</p> </li> <li> <p><strong>tag</strong> - <em>string</em><br /> This OPTIONAL property allows for the grouping or separation of compatibility sets.</p> </li> <li> <p><strong>description</strong> - <em>string</em><br /> This OPTIONAL property provides a brief description of a compatibility set.</p> </li> </ul> </li> </ul> <h4 id="example">Example</h4> <div class="language-yaml highlighter-rouge notranslate"><div class="highlight"><pre class="highlight"><code><span class="na">version</span><span class="pi">:</span> <span class="s">v1alpha1</span>
|
|
<span class="na">compatibilities</span><span class="pi">:</span>
|
|
<span class="pi">-</span> <span class="na">description</span><span class="pi">:</span> <span class="s2">"</span><span class="s">My</span><span class="nv"> </span><span class="s">image</span><span class="nv"> </span><span class="s">requirements"</span>
|
|
<span class="na">rules</span><span class="pi">:</span>
|
|
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">kernel</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">cpu"</span>
|
|
<span class="na">matchFeatures</span><span class="pi">:</span>
|
|
<span class="pi">-</span> <span class="na">feature</span><span class="pi">:</span> <span class="s">kernel.loadedmodule</span>
|
|
<span class="na">matchExpressions</span><span class="pi">:</span>
|
|
<span class="na">vfio-pci</span><span class="pi">:</span> <span class="pi">{</span><span class="nv">op</span><span class="pi">:</span> <span class="nv">Exists</span><span class="pi">}</span>
|
|
<span class="pi">-</span> <span class="na">feature</span><span class="pi">:</span> <span class="s">cpu.model</span>
|
|
<span class="na">matchExpressions</span><span class="pi">:</span>
|
|
<span class="na">vendor_id</span><span class="pi">:</span> <span class="pi">{</span><span class="nv">op</span><span class="pi">:</span> <span class="nv">In</span><span class="pi">,</span> <span class="nv">value</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">Intel"</span><span class="pi">,</span> <span class="s2">"</span><span class="s">AMD"</span><span class="pi">]}</span>
|
|
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">one</span><span class="nv"> </span><span class="s">of</span><span class="nv"> </span><span class="s">available</span><span class="nv"> </span><span class="s">nics"</span>
|
|
<span class="na">matchAny</span><span class="pi">:</span>
|
|
<span class="pi">-</span> <span class="na">matchFeatures</span><span class="pi">:</span>
|
|
<span class="pi">-</span> <span class="na">feature</span><span class="pi">:</span> <span class="s">pci.device</span>
|
|
<span class="na">matchExpressions</span><span class="pi">:</span>
|
|
<span class="na">vendor</span><span class="pi">:</span> <span class="pi">{</span><span class="nv">op</span><span class="pi">:</span> <span class="nv">In</span><span class="pi">,</span> <span class="nv">value</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">0eee"</span><span class="pi">]}</span>
|
|
<span class="na">class</span><span class="pi">:</span> <span class="pi">{</span><span class="nv">op</span><span class="pi">:</span> <span class="nv">In</span><span class="pi">,</span> <span class="nv">value</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">0200"</span><span class="pi">]}</span>
|
|
<span class="pi">-</span> <span class="na">matchFeatures</span><span class="pi">:</span>
|
|
<span class="pi">-</span> <span class="na">feature</span><span class="pi">:</span> <span class="s">pci.device</span>
|
|
<span class="na">matchExpressions</span><span class="pi">:</span>
|
|
<span class="na">vendor</span><span class="pi">:</span> <span class="pi">{</span><span class="nv">op</span><span class="pi">:</span> <span class="nv">In</span><span class="pi">,</span> <span class="nv">value</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">0fff"</span><span class="pi">]}</span>
|
|
<span class="na">class</span><span class="pi">:</span> <span class="pi">{</span><span class="nv">op</span><span class="pi">:</span> <span class="nv">In</span><span class="pi">,</span> <span class="nv">value</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">0200"</span><span class="pi">]}</span>
|
|
</code></pre> </div></div> <h3 id="oci-artifact">OCI Artifact</h3> <p>An <a href="https://github.com/opencontainers/image-spec/blob/main/manifest.md#guidelines-for-artifact-usage">OCI artifact</a> is used to store image compatibility metadata. The artifact can be associated with a specific image through <a href="https://github.com/opencontainers/distribution-spec/blob/11b8e3fba7d2d7329513d0cff53058243c334858/spec.md#pushing-manifests-with-subject">the subject field</a> and pushed to the registry along with the image.</p> <p>Example manifest:</p> <div class="language-json highlighter-rouge notranslate"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"schemaVersion"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
|
|
</span><span class="nl">"mediaType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"application/vnd.oci.image.manifest.v1+json"</span><span class="p">,</span><span class="w">
|
|
</span><span class="nl">"artifactType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"application/vnd.nfd.image-compatibility.v1alpha1"</span><span class="p">,</span><span class="w">
|
|
</span><span class="nl">"config"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"mediaType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"application/vnd.oci.empty.v1+json"</span><span class="p">,</span><span class="w">
|
|
</span><span class="nl">"digest"</span><span class="p">:</span><span class="w"> </span><span class="s2">"sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a"</span><span class="p">,</span><span class="w">
|
|
</span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="w">
|
|
</span><span class="p">},</span><span class="w">
|
|
</span><span class="nl">"layers"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
|
|
</span><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"mediaType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"application/vnd.nfd.image-compatibility.spec.v1alpha1+yaml"</span><span class="p">,</span><span class="w">
|
|
</span><span class="nl">"digest"</span><span class="p">:</span><span class="w"> </span><span class="s2">"sha256:4a47f8ae4c713906618413cb9795824d09eeadf948729e213a1ba11a1e31d052"</span><span class="p">,</span><span class="w">
|
|
</span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="mi">1710</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span><span class="p">],</span><span class="w">
|
|
</span><span class="nl">"subject"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"mediaType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"application/vnd.oci.image.manifest.v1+json"</span><span class="p">,</span><span class="w">
|
|
</span><span class="nl">"digest"</span><span class="p">:</span><span class="w"> </span><span class="s2">"sha256:5b0bcabd1ed22e9fb1310cf6c2dec7cdef19f0ad69efa1f392e94a4333501270"</span><span class="p">,</span><span class="w">
|
|
</span><span class="nl">"size"</span><span class="p">:</span><span class="w"> </span><span class="mi">7682</span><span class="w">
|
|
</span><span class="p">},</span><span class="w">
|
|
</span><span class="nl">"annotations"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"oci.opencontainers.image.created"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2024-03-27T08:08:08Z"</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span></code></pre> </div></div> <h4 id="attach-the-artifact-to-the-image">Attach the artifact to the image</h4> <p>Create an image compatibility specification for the image, then install the <a href="https://github.com/oras-project/oras/">ORAS</a> tool and execute <code class="language-plaintext highlighter-rouge notranslate">oras attach</code> command.</p> <p>Example:</p> <div class="language-sh highlighter-rouge notranslate"><div class="highlight"><pre class="highlight"><code>oras attach <span class="nt">--artifact-type</span> application/vnd.nfd.image-compatibility.v1alpha1 <span class="se">\</span>
|
|
<image-url> <path-to-spec>.yaml:application/vnd.nfd.image-compatibility.spec.v1alpha1+yaml
|
|
</code></pre> </div></div> <p><strong>Note</strong>: The attach command is planned to be integrated into the <code class="language-plaintext highlighter-rouge notranslate">nfd</code> client tool. This will streamline the process, allowing you to perform the operation directly within the tool rather than using a separate command.</p> <h3 id="validate-the-host-against-the-image-compatibility-specification">Validate the host against the image compatibility specification</h3> <ol> <li>Build <code class="language-plaintext highlighter-rouge notranslate">nfd</code> client: <code class="language-plaintext highlighter-rouge notranslate">make build</code></li> <li>Run <code class="language-plaintext highlighter-rouge notranslate">./bin/nfd compat validate-node --image <image-url></code></li> </ol> <p>For more information about the available commands and flags, refer to <a href="/node-feature-discovery/master/reference/node-feature-client-reference.html">the client documentation</a>.</p> <h3 id="validate-the-k8s-cluster-node-with-the-validate-image-job">Validate the k8s cluster node with the validate-image Job</h3> <p><strong>Note</strong>: This does not require installation of NFD master and workers. Additionally, public registry certificates must be included in the job. In the example below, this is done using hostPath, but it can be done using any Kubernetes-supported method.</p> <div class="language-yaml highlighter-rouge notranslate"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">batch/v1</span>
|
|
<span class="na">kind</span><span class="pi">:</span> <span class="s">Job</span>
|
|
<span class="na">metadata</span><span class="pi">:</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">validate-image</span>
|
|
<span class="na">spec</span><span class="pi">:</span>
|
|
<span class="na">backoffLimit</span><span class="pi">:</span> <span class="m">1</span>
|
|
<span class="na">template</span><span class="pi">:</span>
|
|
<span class="na">spec</span><span class="pi">:</span>
|
|
<span class="na">restartPolicy</span><span class="pi">:</span> <span class="s">Never</span>
|
|
<span class="na">containers</span><span class="pi">:</span>
|
|
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">image-compatibility</span>
|
|
<span class="na">securityContext</span><span class="pi">:</span>
|
|
<span class="na">allowPrivilegeEscalation</span><span class="pi">:</span> <span class="no">false</span>
|
|
<span class="na">capabilities</span><span class="pi">:</span>
|
|
<span class="na">drop</span><span class="pi">:</span>
|
|
<span class="pi">-</span> <span class="s">ALL</span>
|
|
<span class="na">readOnlyRootFilesystem</span><span class="pi">:</span> <span class="no">true</span>
|
|
<span class="na">runAsNonRoot</span><span class="pi">:</span> <span class="no">true</span>
|
|
<span class="na">image</span><span class="pi">:</span> <span class="s"><image-with-nfd-client></span>
|
|
<span class="na">command</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">nfd"</span><span class="pi">,</span> <span class="s2">"</span><span class="s">compat"</span><span class="pi">,</span> <span class="s2">"</span><span class="s">validate-node"</span><span class="pi">,</span> <span class="s2">"</span><span class="s">--image"</span><span class="pi">,</span> <span class="s2">"</span><span class="s"><image-to-be-validated>"</span><span class="pi">]</span>
|
|
<span class="na">volumeMounts</span><span class="pi">:</span>
|
|
<span class="pi">-</span> <span class="na">mountPath</span><span class="pi">:</span> <span class="s">/host-boot</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">host-boot</span>
|
|
<span class="na">readOnly</span><span class="pi">:</span> <span class="no">true</span>
|
|
<span class="pi">-</span> <span class="na">mountPath</span><span class="pi">:</span> <span class="s">/host-etc/os-release</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">host-os-release</span>
|
|
<span class="na">readOnly</span><span class="pi">:</span> <span class="no">true</span>
|
|
<span class="pi">-</span> <span class="na">mountPath</span><span class="pi">:</span> <span class="s">/host-sys</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">host-sys</span>
|
|
<span class="na">readOnly</span><span class="pi">:</span> <span class="no">true</span>
|
|
<span class="pi">-</span> <span class="na">mountPath</span><span class="pi">:</span> <span class="s">/host-usr/lib</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">host-usr-lib</span>
|
|
<span class="na">readOnly</span><span class="pi">:</span> <span class="no">true</span>
|
|
<span class="pi">-</span> <span class="na">mountPath</span><span class="pi">:</span> <span class="s">/host-lib</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">host-lib</span>
|
|
<span class="na">readOnly</span><span class="pi">:</span> <span class="no">true</span>
|
|
<span class="pi">-</span> <span class="na">mountPath</span><span class="pi">:</span> <span class="s">/host-proc</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">host-proc</span>
|
|
<span class="na">readOnly</span><span class="pi">:</span> <span class="no">true</span>
|
|
<span class="na">volumes</span><span class="pi">:</span>
|
|
<span class="pi">-</span> <span class="na">hostPath</span><span class="pi">:</span>
|
|
<span class="na">path</span><span class="pi">:</span> <span class="s">/boot</span>
|
|
<span class="na">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">host-boot</span>
|
|
<span class="pi">-</span> <span class="na">hostPath</span><span class="pi">:</span>
|
|
<span class="na">path</span><span class="pi">:</span> <span class="s">/etc/os-release</span>
|
|
<span class="na">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">host-os-release</span>
|
|
<span class="pi">-</span> <span class="na">hostPath</span><span class="pi">:</span>
|
|
<span class="na">path</span><span class="pi">:</span> <span class="s">/sys</span>
|
|
<span class="na">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">host-sys</span>
|
|
<span class="pi">-</span> <span class="na">hostPath</span><span class="pi">:</span>
|
|
<span class="na">path</span><span class="pi">:</span> <span class="s">/usr/lib</span>
|
|
<span class="na">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">host-usr-lib</span>
|
|
<span class="pi">-</span> <span class="na">hostPath</span><span class="pi">:</span>
|
|
<span class="na">path</span><span class="pi">:</span> <span class="s">/lib</span>
|
|
<span class="na">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">host-lib</span>
|
|
<span class="pi">-</span> <span class="na">hostPath</span><span class="pi">:</span>
|
|
<span class="na">path</span><span class="pi">:</span> <span class="s">/proc</span>
|
|
<span class="na">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">host-proc</span>
|
|
<span class="pi">-</span> <span class="na">hostPath</span><span class="pi">:</span>
|
|
<span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s"><path-to-registry-public-certs>"</span>
|
|
<span class="na">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
|
|
<span class="na">name</span><span class="pi">:</span> <span class="s">certs</span>
|
|
</code></pre> </div></div> </div> </div> <div class="navigation-bottom d-flex flex-justify-between py-3" role="navigation" aria-label="footer navigation"> <div class="prev"><a href="/node-feature-discovery/master/usage/kubectl-plugin.html" class="btn" title="Kubectl plugin" accesskey="p" rel="prev"> <i class="fa fa-arrow-circle-left"></i> Previous </a></div> <div class="next"></div> </div><hr> <div class="copyright text-center text-gray" role="contentinfo"> <i class="fa fa-copyright"></i> <span class="time">2016-2025,</span> <a class="text-gray" href="https://github.com/kubernetes-sigs" rel="noreferrer" target="_blank">Kubernetes SIGs</a> Revision <a class="text-gray" href="https://github.com/kubernetes-sigs/node-feature-discovery/commit/" title="" rel="noreferrer" target="_blank"></a> <br> <div class="generator"> Built with <a href="https://pages.github.com" rel="noreferrer" target="_blank" title="github-pages v228">GitHub Pages</a> using a <a href="https://github.com/rundocs/jekyll-rtd-theme" rel="noreferrer" target="_blank" title="jekyll-rtd-theme v2.0.10">theme</a> provided by <a href="https://rundocs.io" rel="noreferrer" target="_blank">RunDocs</a>. </div> </div> </div> </div> <div class="addons-wrap d-flex flex-column overflow-y-auto"> <div class="status d-flex flex-justify-between p-2"> <div class="title p-1"> <i class="fa fa-book"></i> Node Feature Discovery </div> <div class="branch p-1"> <span class="name"> master </span> <i class="fa fa-caret-down"></i> </div> </div> <div class="addons d-flex flex-column height-full p-2 d-none"> <dl id="versions"> <dt>Versions</dt> <script src="/node-feature-discovery/versions.js"></script> <script> var dt = document.getElementById('versions'); var items = getVersionListItems(); for (var i=0; i < items.length; i++) { var dd = document.createElement('dd'); var a = dd.appendChild(document.createElement('a')); a.appendChild(document.createTextNode(items[i].name)); a.href = items[i].url; dt.appendChild(dd); } </script> </dl> <dl> <dt>GitHub</dt> <dd> <a href="https://github.com/kubernetes-sigs/node-feature-discovery" title="Stars: 826"> <i class="fa fa-github"></i> Homepage </a> </dd> <dd> <a href="https://github.com/kubernetes-sigs/node-feature-discovery/issues" title="Open issues: 44"> <i class="fa fa-question-circle-o"></i> Issues </a> </dd> <dd> <a href="https://github.com/kubernetes-sigs/node-feature-discovery/zipball/gh-pages" title="Size: 108703 Kb"> <i class="fa fa-download"></i> Download </a> </dd> </dl> <hr> <div class="license f6 pb-2"> This <a href="/node-feature-discovery/master/" title="Node Feature Discovery">Software</a> is under the terms of <a href="https://github.com/kubernetes-sigs/node-feature-discovery">Apache License 2.0</a>. </div> </div> </div> <script src="https://cdn.jsdelivr.net/gh/rundocs/jekyll-rtd-theme@2.0.10/assets/js/jquery.min.js"></script><script src="https://cdn.jsdelivr.net/gh/rundocs/jekyll-rtd-theme@2.0.10/assets/js/theme.min.js"></script> </body> </html> |