<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://d7y.io/blog</id>
    <title>Dragonfly Blog</title>
    <updated>2026-03-11T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://d7y.io/blog"/>
    <subtitle>Dragonfly Blog</subtitle>
    <icon>https://d7y.io/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Cloud-Native AI Model Management and Distribution for Inference Workloads]]></title>
        <id>https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads</id>
        <link href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Author:]]></summary>
        <content type="html"><![CDATA[<p><em>Author:</em></p>
<ul>
<li class><em>Wenbo Qi(Gaius), Dragonfly/ModelPack Maintainer</em></li>
<li class><em>Chenyu Zhang(Chlins), Harbor/ModelPack Maintainer</em></li>
<li class><em>Feynman Zhou, ORAS Maintainer, CNCF Ambassador</em></li>
</ul>
<p><em>Reviewer:</em></p>
<ul>
<li class><em>Sascha Grunert, CRI-O Maintainer</em></li>
<li class><em>Wei Fu, containerd Maintainer</em></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-weight-of-ai-models-why-infrastructure-always-arrives-slowly">The weight of AI models: Why infrastructure always arrives slowly<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#the-weight-of-ai-models-why-infrastructure-always-arrives-slowly" class="hash-link" aria-label="Direct link to The weight of AI models: Why infrastructure always arrives slowly" title="Direct link to The weight of AI models: Why infrastructure always arrives slowly" translate="no">&#x200B;</a></h2>
<p>As AI adoption accelerates across industries, organizations face a critical bottleneck that is often overlooked until it
becomes a serious obstacle: reliably managing and distributing large model weight files at scale.
A model&apos;s weights serve as the central artifact that bridges both training and inference pipelines &#x2014; yet the
infrastructure surrounding this artifact is frequently an afterthought.</p>
<p>This article addresses the operational challenges of managing AI model artifacts at enterprise scale,
and introduces a cloud-native solution that brings software delivery best practices &#x2014; versioning,
immutability, and GitOps, to the world of large model files.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-gap-nobody-talks-about--until-it-breaks-production">The gap nobody talks about &#x2014; until it breaks production<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#the-gap-nobody-talks-about--until-it-breaks-production" class="hash-link" aria-label="Direct link to The gap nobody talks about &#x2014; until it breaks production" title="Direct link to The gap nobody talks about &#x2014; until it breaks production" translate="no">&#x200B;</a></h3>
<p><em><strong>The cloud native gap</strong></em>: Most existing ML model storage approaches were not designed with
Kubernetes-native delivery in mind, leaving a critical gap between how software artifacts
are managed and how model artifacts are managed.</p>
<p>Today, enterprises operate AI infrastructure on Kubernetes yet their model artifact management lags behind.
Software containers are pulled from OCI registries with full versioning, security scanning, and rollback support.
Model weights, by contrast, are often downloaded via ad hoc scripts, copied manually between storage buckets,
or distributed through unsecured shared filesystems. This gap creates deployment fragility, security risks, and
operational overhead at scale.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-your-model-weighs-more-than-your-entire-app">When your model weighs more than your entire app<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#when-your-model-weighs-more-than-your-entire-app" class="hash-link" aria-label="Direct link to When your model weighs more than your entire app" title="Direct link to When your model weighs more than your entire app" translate="no">&#x200B;</a></h3>
<p>Modern foundation models are not small. A single model checkpoint can range from tens of gigabytes to several terabytes.
For reference, a quantized LLaMA-3 70B model weighs approximately 140 GB, while frontier multimodal models can easily
exceed 1 TB. These are not files you version-control with standard Git &#x2014; they demand dedicated storage strategies,
efficient transfer protocols, and careful access control.</p>
<p>The core challenges are: <em><strong>storage at scale, distribution speed, and reproducibility</strong></em>. Teams need to store
multiple model versions, rapidly distribute them to GPU inference nodes across regions, and guarantee that
any deployment can be traced back to an exact, immutable artifact.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="three-paths-forward--and-why-none-of-them-are-enough">Three paths forward &#x2014; and why none of them are enough<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#three-paths-forward--and-why-none-of-them-are-enough" class="hash-link" aria-label="Direct link to Three paths forward &#x2014; and why none of them are enough" title="Direct link to Three paths forward &#x2014; and why none of them are enough" translate="no">&#x200B;</a></h3>
<table><thead><tr><th style="text-align:left"></th><th style="text-align:left">Git LFS (Hugging Face Hub)</th><th style="text-align:left">Object Storage (S3, MinIO)</th><th style="text-align:left">Distributed Filesystem (NFS, CephFS)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Pros</strong></td><td style="text-align:left">Native version control (branches, tags, commits, history).</td><td style="text-align:left">Standard offering from cloud providers. Native support in engines like vLLM/SGLang.</td><td style="text-align:left">POSIX compatible. Low integration cost.</td></tr><tr><td style="text-align:left"><strong>Cons</strong></td><td style="text-align:left">Poor protocol adaptation for cloud-native environments. Inherits Git&apos;s transport inefficiencies, lacks optimizations for huge file distribution.</td><td style="text-align:left">Lacks structured metadata. Weak version management capabilities.</td><td style="text-align:left">Lacks structured metadata. Weak version management capabilities. High operational complexity for distributed filesystem.</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rethinking-the-delivery-pipeline-models-deserve-better-than-a-shell-script">Rethinking the delivery pipeline: Models deserve better than a shell script<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#rethinking-the-delivery-pipeline-models-deserve-better-than-a-shell-script" class="hash-link" aria-label="Direct link to Rethinking the delivery pipeline: Models deserve better than a shell script" title="Direct link to Rethinking the delivery pipeline: Models deserve better than a shell script" translate="no">&#x200B;</a></h2>
<p>The approach described here treats AI model weights as first-class OCI (Open Container Initiative) artifacts,
packaging them in the same container registries used for application images. This enables model delivery to
leverage the full ecosystem of container tooling: security scanning, signed provenance, GitOps-driven
deployment, and Kubernetes-native pulling.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-if-we-shipped-models-the-same-way-we-ship-code">What If we shipped models the same way we ship code?<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#what-if-we-shipped-models-the-same-way-we-ship-code" class="hash-link" aria-label="Direct link to What If we shipped models the same way we ship code?" title="Direct link to What If we shipped models the same way we ship code?" translate="no">&#x200B;</a></h3>
<p>In the cloud-native era, developers have long established a mature and efficient paradigm for software delivery.</p>
<p><img decoding="async" loading="lazy" alt="p1" src="https://d7y.io/assets/images/p1-2e4df9de66c5b4adb7b2d7493fcc937e.png" width="1600" height="740" class="img_ev3q"></p>
<p><strong>The software delivery:</strong></p>
<ol>
<li class><strong>Develop:</strong> Developers commit code to a Git repository, manage code changes through branches, and define versions
using tags at key milestones.</li>
<li class><strong>Build:</strong> CI/CD pipelines compile and test, packaging the output into an immutable Container Image.</li>
<li class><strong>Manage and deliver:</strong> Images are stored in a Container Registry. Supply chain
security (scanning/signing), RBAC, and P2P distribution ensure safe delivery.</li>
<li class><strong>Deploy:</strong> DevOps engineers use declarative Kubernetes YAML to define the desired state.
The Container&apos;s lifecycle is managed by Kubernetes.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="p2" src="https://d7y.io/assets/images/p2-2d70a893a89593202458f6d86b90be6f.png" width="1600" height="740" class="img_ev3q"></p>
<p><strong>The cloud native AI model delivery:</strong></p>
<ol>
<li class><strong>Develop:</strong> Algorithm engineers push weights and configs to the Hugging Face Hub, treating it as the Git Repository.</li>
<li class><strong>Build:</strong> CI/CD pipelines package weights, runtime configurations, and metadata into an immutable Model Artifact.</li>
<li class><strong>Manage and deliver:</strong> The Model Artifact is managed by an Artifact Registry, reusing the existing container
infrastructure and toolchain.</li>
<li class><strong>Deploy:</strong> Engineers use Kubernetes OCI Volumes or a Model CSI Driver. Models are mounted into the inference
Container as Volumes via declarative semantics, decoupling the AI model from the inference engine (vLLM, SGLang, etc.).</li>
</ol>
<p>By applying <em><strong>software delivery paradigms</strong></em> and <em><strong>supply chain</strong></em> thinking to model lifecycle management, we constructed
a granular, efficient system that resolves the challenges of managing and distributing AI models in production.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="walking-the-pipeline-a-build-story-in-four-steps">Walking the pipeline: A build story in four steps<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#walking-the-pipeline-a-build-story-in-four-steps" class="hash-link" aria-label="Direct link to Walking the pipeline: A build story in four steps" title="Direct link to Walking the pipeline: A build story in four steps" translate="no">&#x200B;</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="build">Build<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#build" class="hash-link" aria-label="Direct link to Build" title="Direct link to Build" translate="no">&#x200B;</a></h4>
<p>modctl is a CLI tool designed to package AI models into OCI artifacts. It standardizes
versioning, storage, distribution and deployment, ensuring integration with the cloud-native ecosystem.</p>
<p><img decoding="async" loading="lazy" alt="p3" src="https://d7y.io/assets/images/p3-133656a18e9e573cc38c13ea0905fc79.png" width="1600" height="434" class="img_ev3q"></p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-auto-generate-modelfile">Step 1: Auto-generate Modelfile<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#step-1-auto-generate-modelfile" class="hash-link" aria-label="Direct link to Step 1: Auto-generate Modelfile" title="Direct link to Step 1: Auto-generate Modelfile" translate="no">&#x200B;</a></h5>
<p>Run the following in the model directory to generate a definition file.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">modctl modelfile generate .</span><br></div></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-customize-modelfile">Step 2: Customize Modelfile<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#step-2-customize-modelfile" class="hash-link" aria-label="Direct link to Step 2: Customize Modelfile" title="Direct link to Step 2: Customize Modelfile" translate="no">&#x200B;</a></h5>
<p>You can also customize the content of the Modelfile.</p>
<div class="language-dockerfile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Model name (string), such as llama3-8b-instruct, gpt2-xl, qwen2-vl-72b-instruct, etc.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME qwen2.5-0.5b</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Model architecture (string), such as transformer, cnn, rnn, etc.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">ARCH transformer</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Model family (string), such as llama3, gpt2, qwen2, etc.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">FAMILY qwen2</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Model format (string), such as onnx, tensorflow, pytorch, etc.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">FORMAT safetensors</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Specify model configuration file, support glob path pattern.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">CONFIG config.json</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Specify model configuration file, support glob path pattern.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">CONFIG generation_config.json</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Model weight, support glob path pattern.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">MODEL *.safetensors</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Specify code, support glob path pattern.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">CODE *.py</span><br></div></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-login-to-artifact-registry-harbor">Step 3: Login to Artifact Registry (Harbor)<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#step-3-login-to-artifact-registry-harbor" class="hash-link" aria-label="Direct link to Step 3: Login to Artifact Registry (Harbor)" title="Direct link to Step 3: Login to Artifact Registry (Harbor)" translate="no">&#x200B;</a></h5>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">modctl login -u username -p password harbor.registry.com</span><br></div></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-build-oci-artifact">Step 4: Build OCI Artifact<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#step-4-build-oci-artifact" class="hash-link" aria-label="Direct link to Step 4: Build OCI Artifact" title="Direct link to Step 4: Build OCI Artifact" translate="no">&#x200B;</a></h5>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">modctl build -t harbor.registry.com/models/qwen2.5-0.5b:v1 -f Modelfile .</span><br></div></code></pre></div></div>
<p>A Model Manifest is generated after the build. Descriptive information such as ARCH, FAMILY, and FORMAT is
stored in a file with the media type <em>application/vnd.cncf.model.config.v1+json</em>.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;schemaVersion&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;mediaType&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;application/vnd.oci.image.manifest.v1+json&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;artifactType&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;application/vnd.cncf.model.manifest.v1+json&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;config&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;mediaType&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;application/vnd.cncf.model.config.v1+json&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;digest&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;sha256:d5815835051dd97d800a03f641ed8162877920e734d3d705b698912602b8c763&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;size&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">301</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;layers&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;mediaType&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;application/vnd.cncf.model.weight.v1.raw&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;digest&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;sha256:3f907c1a03bf20f20355fe449e18ff3f9de2e49570ffb536f1a32f20c7179808&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;size&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">4294967296</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;mediaType&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;application/vnd.cncf.model.weight.v1.raw&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;digest&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;sha256:6d923539c5c208de77146335584252c0b1b81e35c122dd696fe6e04ed03d7411&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;size&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">5018536960</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;mediaType&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;application/vnd.cncf.model.weight.config.v1.raw&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;digest&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;sha256:a5378e569c625f7643952fcab30c74f2a84ece52335c292e630f740ac4694146&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;size&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">106</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;mediaType&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;application/vnd.cncf.model.weight.code.v1.raw&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;digest&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;sha256:15da0921e8d8f25871e95b8b1fac958fc9caf453bad6f48c881b3d76785b9f9d&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;size&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">394</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;mediaType&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;application/vnd.cncf.model.doc.v1.raw&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;digest&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;sha256:5e236ec37438b02c01c83d134203a646cb354766ac294e533a308dd8caa3a11e&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;size&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">23040</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-push">Step 5: Push<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#step-5-push" class="hash-link" aria-label="Direct link to Step 5: Push" title="Direct link to Step 5: Push" translate="no">&#x200B;</a></h5>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">modctl push harbor.registry.com/models/qwen2.5-0.5b:v1</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="management">Management<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#management" class="hash-link" aria-label="Direct link to Management" title="Direct link to Management" translate="no">&#x200B;</a></h4>
<p>Current AI infrastructure workflows focus heavily on model distribution performance, often ignoring
model management standards. Manual copying works for experiments, but in large-scale production, lacking
unified versioning, metadata specs, and lifecycle management is poor practice. As the standard cloud-native
Artifact Registry, Harbor is ideally suited for model storage, treating models as inference artifacts.</p>
<p>Harbor standardizes AI model management through:</p>
<ul>
<li class><strong>Versioning:</strong> Models are OCI Artifacts with immutable Tags and Sha256 Digests.
This guarantees deterministic inference environments. Meanwhile, it visually presents the model&apos;s basic
attributes, parameter configurations, display information, and the file list, which not only reduce
the risks of unknown versions but also achieves full transparency of the model.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="p4" src="https://d7y.io/assets/images/p4-23f8031631054a31a13c86bc87e10564.png" width="1600" height="916" class="img_ev3q"></p>
<ul>
<li class><strong>RBAC:</strong> Fine-grained access control. Control who can PUSH (e.g., Algorithm Engineers), who can
only PULL (e.g., Inference Services), and who has administrative privileges.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="p5" src="https://d7y.io/assets/images/p5-8915c20a0c9b9cbaa7d3fb5d25f9fe09.png" width="1600" height="916" class="img_ev3q"></p>
<ul>
<li class><strong>Lifecycle management:</strong> Tag retention policies automatically purge non-release versions while
locking active versions, balancing storage costs with stability.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="p6" src="https://d7y.io/assets/images/p6-ea1ec5664b662f1b0c028a9ff0324776.png" width="1600" height="916" class="img_ev3q"></p>
<ul>
<li class><strong>Supply chain security:</strong> Integration with Cosign/Notation for signing. Harbor enforces signature
verification before distribution, preventing model poisoning attacks.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="p7" src="https://d7y.io/assets/images/p7-eebb2b91f6313c16fdeb7a49b61dd7e9.png" width="1600" height="916" class="img_ev3q"></p>
<ul>
<li class><strong>Replication:</strong> Automated, incremental synchronization between central and edge registries or active-standby clusters.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="p8" src="https://d7y.io/assets/images/p8-d93ab2eab8c8e609d2e5ec1c1af13340.png" width="1600" height="916" class="img_ev3q"></p>
<ul>
<li class><strong>Audit:</strong> Comprehensive logging of all artifact operations (pull/push/delete) for security compliance and traceability.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="p9" src="https://d7y.io/assets/images/p9-8f523b73a1c0adbcd9c245a5411dcaff.png" width="1600" height="916" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="delivery">Delivery<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#delivery" class="hash-link" aria-label="Direct link to Delivery" title="Direct link to Delivery" translate="no">&#x200B;</a></h4>
<p>Downloading terabyte-sized model weights directly from the origin introduces bandwidth bottlenecks. We utilize
Dragonfly for P2P-based distribution, integrated with Harbor for preheating.</p>
<p><img decoding="async" loading="lazy" alt="p10" src="https://d7y.io/assets/images/p10-abfed403aac90c5b17678b846269d1fe.png" width="1600" height="1146" class="img_ev3q"></p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-p2p-based-distribution">Dragonfly P2P-based distribution<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#dragonfly-p2p-based-distribution" class="hash-link" aria-label="Direct link to Dragonfly P2P-based distribution" title="Direct link to Dragonfly P2P-based distribution" translate="no">&#x200B;</a></h5>
<p>For large-scale distribution scenarios, Dragonfly has been deeply optimized based on P2P technology.
Taking the example of 500 nodes downloading a 1TB model, the system distributes the initial download tasks
of different layers across nodes to maximize downstream bandwidth utilization and avoid single-point congestion.
Combined with a secondary bandwidth-aware scheduling algorithm, it dynamically adjusts download paths to
eliminate network hotspots and long-tail latency. For individual model weight, Dragonfly splits individual
model weights into pieces and fetches them concurrently from the origin. This enables streaming-based
downloading, allowing users to share models without waiting for the complete file. This solution has been proven
in high-performance AI clusters, utilizing <em><strong>70%-80%</strong></em> of each node&apos;s bandwidth and improving model deployment efficiency.</p>
<p><img decoding="async" loading="lazy" alt="p11" src="https://d7y.io/assets/images/p11-469f79812b16f7eb5a18f2ce66080f3c.png" width="1600" height="1187" class="img_ev3q"></p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="preheating">Preheating<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#preheating" class="hash-link" aria-label="Direct link to Preheating" title="Direct link to Preheating" translate="no">&#x200B;</a></h5>
<p>For latency-sensitive inference services, Harbor triggers Dragonfly to distribute and cache data on target nodes
before service scaling. When the instance starts, the model loads from the local disk, achieving zero network latency.</p>
<p><img decoding="async" loading="lazy" alt="p12" src="https://d7y.io/assets/images/p12-568bb246a179a7c263aebacd5de23e3a.png" width="1600" height="916" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="deployment">Deployment<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#deployment" class="hash-link" aria-label="Direct link to Deployment" title="Direct link to Deployment" translate="no">&#x200B;</a></h4>
<p>Deployment focuses on decoupling the Model (Data) from the Inference Engine (Compute). By leveraging Kubernetes
declarative primitives, the Engine runs as a Container, while the Model is mounted as a Volume. This
native approach not only enables multiple Pods on the same node to share and reuse the model, saving disk
space, but also leverages the preheating and P2P capabilities of Harbor &amp; Dragonfly to eliminate the latency of
pulling large model weights, significantly improving startup speed.</p>
<p><img decoding="async" loading="lazy" alt="p13" src="https://d7y.io/assets/images/p13-823d8786089c86c6e4846abc829551e8.png" width="1600" height="689" class="img_ev3q"></p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="oci-volumes-kubernetes-131">OCI Volumes (Kubernetes 1.31+)<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#oci-volumes-kubernetes-131" class="hash-link" aria-label="Direct link to OCI Volumes (Kubernetes 1.31+)" title="Direct link to OCI Volumes (Kubernetes 1.31+)" translate="no">&#x200B;</a></h5>
<p>Native support for mounting OCI artifacts as volumes via CRI-O/containerd. This feature was introduced
as <strong>alpha</strong> in Kubernetes 1.31 (requires enabling the ImageVolume feature gate) and promoted
to <strong>beta</strong> in Kubernetes 1.33 (enabled by default, no feature gate configuration needed). CRI-O specifically
enhances this for LLMs by avoiding decompression overhead at mount time by storing layers uncompressed, resulting
in superior performance when mounting large model files.</p>
<h6 class="anchor anchorTargetStickyNavbar_Vzrq" id="oci-build-yaml">Step 1: Build YAML<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#oci-build-yaml" class="hash-link" aria-label="Direct link to Step 1: Build YAML" title="Direct link to Step 1: Build YAML" translate="no">&#x200B;</a></h6>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Pod</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vllm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">cpu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">inference</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vllm</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">containers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vllm</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> openeuler/vllm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">cpu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;python3&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;-m&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;vllm.entrypoints.openai.api_server&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">args</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;--model&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;/models&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;--dtype&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;float32&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;--host&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;0.0.0.0&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;--port&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;8000&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;--max-model-len&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;1024&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;--disable-log-requests&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">env</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> VLLM_CPU_KVCACHE_SPACE</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">value</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;1&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> VLLM_WORKER_MULTIPROC_METHOD</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">value</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;spawn&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">resources</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">requests</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">memory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;2Gi&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">cpu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;1&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">limits</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">memory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;16Gi&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">cpu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;8&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">volumeMounts</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> model</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">volume</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">mountPath</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> /models</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">readOnly</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">containerPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">protocol</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">livenessProbe</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">httpGet</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> /health</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">initialDelaySeconds</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">60</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">periodSeconds</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">timeoutSeconds</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">readinessProbe</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">httpGet</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> /health</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">initialDelaySeconds</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">periodSeconds</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> model</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">volume</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">reference</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ghcr.io/chlins/qwen2.5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">0.5b</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">pullPolicy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> IfNotPresent</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vllm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">service</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">selector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vllm</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">targetPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">protocol</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ClusterIP</span><br></div></code></pre></div></div>
<h6 class="anchor anchorTargetStickyNavbar_Vzrq" id="oci-deploy-inference-workload">Step 2: Deploy inference Workload<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#oci-deploy-inference-workload" class="hash-link" aria-label="Direct link to Step 2: Deploy inference Workload" title="Direct link to Step 2: Deploy inference Workload" translate="no">&#x200B;</a></h6>
<p><img decoding="async" loading="lazy" alt="p14" src="https://d7y.io/assets/images/p14-4fb88375fbfea62568093a4255fa2070.png" width="1600" height="351" class="img_ev3q"></p>
<h6 class="anchor anchorTargetStickyNavbar_Vzrq" id="oci-call-inference-workload">Step 3: Call Inference Workload<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#oci-call-inference-workload" class="hash-link" aria-label="Direct link to Step 3: Call Inference Workload" title="Direct link to Step 3: Call Inference Workload" translate="no">&#x200B;</a></h6>
<p><img decoding="async" loading="lazy" alt="p15" src="https://d7y.io/assets/images/p15-671c8c2f95eef1a4b526fba8a4f65f72.png" width="1600" height="744" class="img_ev3q"></p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="model-csi-driver">Model CSI Driver<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#model-csi-driver" class="hash-link" aria-label="Direct link to Model CSI Driver" title="Direct link to Model CSI Driver" translate="no">&#x200B;</a></h5>
<p>For compatibility with Kubernetes 1.31 and older, we offer the Model CSI Driver as an interim solution to
mount and deploy models as volumes. As OCI Volumes are slated for <strong>GA</strong> in Kubernetes 1.36, shifting to
native OCI Volumes is recommended for the long term.</p>
<h6 class="anchor anchorTargetStickyNavbar_Vzrq" id="csi-build-yaml">Step 1: Build YAML<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#csi-build-yaml" class="hash-link" aria-label="Direct link to Step 1: Build YAML" title="Direct link to Step 1: Build YAML" translate="no">&#x200B;</a></h6>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Pod</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vllm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">cpu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">inference</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vllm</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">containers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vllm</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> openeuler/vllm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">cpu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;python3&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;-m&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;vllm.entrypoints.openai.api_server&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">args</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;--model&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;/models&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;--dtype&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;float32&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;--host&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;0.0.0.0&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;--port&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;8000&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;--max-model-len&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;1024&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;--disable-log-requests&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">env</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> VLLM_CPU_KVCACHE_SPACE</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">value</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;1&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> VLLM_WORKER_MULTIPROC_METHOD</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">value</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;spawn&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">resources</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">requests</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">memory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;2Gi&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">cpu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;1&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">limits</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">memory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;16Gi&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">cpu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;8&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">volumeMounts</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> model</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">volume</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">mountPath</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> /models</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">readOnly</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">containerPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">protocol</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">livenessProbe</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">httpGet</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> /health</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">initialDelaySeconds</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">60</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">periodSeconds</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">timeoutSeconds</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">readinessProbe</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">httpGet</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> /health</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">initialDelaySeconds</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">periodSeconds</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> model</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">volume</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">csi</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">driver</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> model.csi.modelpack.org</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">volumeAttributes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">model.csi.modelpack.org/reference</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ghcr.io/chlins/qwen2.5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">0.5b</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vllm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">service</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">selector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vllm</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">targetPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">protocol</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ClusterIP</span><br></div></code></pre></div></div>
<h6 class="anchor anchorTargetStickyNavbar_Vzrq" id="csi-deploy-inference-workload">Step 2: Deploy Inference Workload<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#csi-deploy-inference-workload" class="hash-link" aria-label="Direct link to Step 2: Deploy Inference Workload" title="Direct link to Step 2: Deploy Inference Workload" translate="no">&#x200B;</a></h6>
<p><img decoding="async" loading="lazy" alt="p14" src="https://d7y.io/assets/images/p14-4fb88375fbfea62568093a4255fa2070.png" width="1600" height="351" class="img_ev3q"></p>
<h6 class="anchor anchorTargetStickyNavbar_Vzrq" id="csi-call-inference-workload">Step 3: Call Inference Workload<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#csi-call-inference-workload" class="hash-link" aria-label="Direct link to Step 3: Call Inference Workload" title="Direct link to Step 3: Call Inference Workload" translate="no">&#x200B;</a></h6>
<p><img decoding="async" loading="lazy" alt="p15" src="https://d7y.io/assets/images/p15-671c8c2f95eef1a4b526fba8a4f65f72.png" width="1600" height="744" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="future">Future<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#future" class="hash-link" aria-label="Direct link to Future" title="Direct link to Future" translate="no">&#x200B;</a></h2>
<ul>
<li class><strong>Enhanced Preheating:</strong> Allow models to be preheated to specified nodes and querying cache distribution across nodes
for model-aware pod scheduling.</li>
<li class><strong>Dragonfly RDMA Acceleration:</strong> Enable Dragonfly to utilize InfiniBand or RoCE to improve the speed of distribution.</li>
<li class><strong>Lazy Loading:</strong> Implement on-demand downloading of model weights to reduce startup latency.</li>
<li class><strong>containerd Optimization:</strong> Enhance the OCI Volumes implementation to reduce decompression overhead for large layers.</li>
<li class><strong>Model Security Scanning:</strong> Introduce deep scanning capabilities specifically designed for model weights to
detect embedded malicious payloads.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="collaborative-projects">Collaborative Projects<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#collaborative-projects" class="hash-link" aria-label="Direct link to Collaborative Projects" title="Direct link to Collaborative Projects" translate="no">&#x200B;</a></h2>
<ul>
<li class>Kubernetes: <a href="https://github.com/kubernetes/kubernetes" target="_blank" rel="noopener noreferrer" class>https://github.com/kubernetes/kubernetes</a></li>
<li class>Harbor: <a href="https://github.com/goharbor/harbor" target="_blank" rel="noopener noreferrer" class>https://github.com/goharbor/harbor</a></li>
<li class>Dragonfly: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></li>
<li class>CRI-O: <a href="https://github.com/cri-o/cri-o" target="_blank" rel="noopener noreferrer" class>https://github.com/cri-o/cri-o</a></li>
<li class>containerd: <a href="https://github.com/containerd/containerd" target="_blank" rel="noopener noreferrer" class>https://github.com/containerd/containerd</a></li>
<li class>modctl: <a href="https://github.com/modelpack/modctl" target="_blank" rel="noopener noreferrer" class>https://github.com/modelpack/modctl</a></li>
<li class>Model CSI Driver: <a href="https://github.com/modelpack/model-csi-driver" target="_blank" rel="noopener noreferrer" class>https://github.com/modelpack/model-csi-driver</a></li>
<li class>Model Spec: <a href="https://github.com/modelpack/model-spec" target="_blank" rel="noopener noreferrer" class>https://github.com/modelpack/model-spec</a></li>
<li class>ORAS: <a href="https://github.com/oras-project/oras" target="_blank" rel="noopener noreferrer" class>https://github.com/oras-project/oras</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="references">References<a href="https://d7y.io/blog/2026/03/11/cloud-native-ai-model-management-and-distribution-for-inference-workloads#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no">&#x200B;</a></h2>
<ul>
<li class>Kubernetes - Read Only Volumes Based On OCI Artifacts: <a href="https://kubernetes.io/blog/2024/08/16/kubernetes-1-31-image-volume-source/" target="_blank" rel="noopener noreferrer" class>https://kubernetes.io/blog/2024/08/16/kubernetes-1-31-image-volume-source/</a></li>
<li class>Harbor - AI Model Processor: <a href="https://github.com/goharbor/community/blob/main/proposals/new/AI-model-processor.md" target="_blank" rel="noopener noreferrer" class>https://github.com/goharbor/community/blob/main/proposals/new/AI-model-processor.md</a></li>
<li class>Dragonfly - Load-Aware Scheduling Algorithm: <a href="https://d7y.io/docs/next/operations/deployment/applications/scheduler/#bandwidth-aware-scheduling-algorithm" target="_blank" rel="noopener noreferrer" class>https://d7y.io/docs/next/operations/deployment/applications/scheduler/#bandwidth-aware-scheduling-algorithm</a></li>
<li class>CRI-O - Add OCI Volume/Image Source Support: <a href="https://github.com/cri-o/cri-o/pull/8317" target="_blank" rel="noopener noreferrer" class>https://github.com/cri-o/cri-o/pull/8317</a></li>
<li class>containerd - Add OCI/Image Volume Source support: <a href="https://github.com/containerd/containerd/pull/10579" target="_blank" rel="noopener noreferrer" class>https://github.com/containerd/containerd/pull/10579</a></li>
</ul>]]></content>
        <category label="cncf" term="cncf"/>
        <category label="ai" term="ai"/>
        <category label="model" term="model"/>
        <category label="weight" term="weight"/>
        <category label="inference" term="inference"/>
        <category label="oci" term="oci"/>
        <category label="kubernetes" term="kubernetes"/>
        <category label="dragonfly" term="dragonfly"/>
        <category label="harbor" term="harbor"/>
        <category label="cri-o" term="cri-o"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[P2P-Accelerated AI Model Downloads: How Native Hugging Face and ModelScope Protocols in Dragonfly Are Reshaping AI Infrastructure]]></title>
        <id>https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly</id>
        <link href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Author: Pavan Madduri, Senior Cloud Platform Engineer & CNCF Golden Kubestronaut]]></summary>
        <content type="html"><![CDATA[<p><em>Author: <a href="https://github.com/pmady" target="_blank" rel="noopener noreferrer" class>Pavan Madduri</a>, Senior Cloud Platform Engineer &amp; CNCF Golden Kubestronaut</em></p>
<p>Dragonfly now natively speaks <code>hf://</code> and <code>modelscope://</code> &#x2014; turning the world&apos;s two largest model hubs into P2P-accelerated sources for enterprise AI infrastructure.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-ai-model-distribution-is-broken-at-scale">The Problem: AI Model Distribution Is Broken at Scale<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#the-problem-ai-model-distribution-is-broken-at-scale" class="hash-link" aria-label="Direct link to The Problem: AI Model Distribution Is Broken at Scale" title="Direct link to The Problem: AI Model Distribution Is Broken at Scale" translate="no">&#x200B;</a></h2>
<p>The AI industry has a dirty secret: downloading models is painfully slow and absurdly wasteful.</p>
<p>Consider a typical scenario. Your ML platform team manages a Kubernetes cluster with 200 GPU nodes. A new version of a 70B parameter model drops &#x2014; say, DeepSeek-V3 at ~130 GB. Every node needs a local copy. That&apos;s <strong>26 TB of data</strong> pulled from a single model hub, all funneling through the same origin servers, the same egress bandwidth, and the same rate limits.</p>
<p>The numbers get worse:</p>
<ul>
<li class><strong>Hugging Face Hub</strong> serves over 1 million models, with individual files regularly exceeding 10 GB (safetensors, GGUF quantizations).</li>
<li class><strong>ModelScope Hub</strong> hosts over 10,000 models &#x2014; including some of the largest Chinese-origin models like Qwen, Yi, and inclusionAI&apos;s Ling series &#x2014; serving a rapidly growing global user base.</li>
<li class><strong>Git LFS</strong>, which backs large file storage on these platforms, was never designed for mass fan-out distribution.</li>
<li class><strong>Rate limits</strong> throttle unauthenticated requests; even authenticated tokens hit ceilings under burst traffic.</li>
<li class><strong>Network costs</strong> compound &#x2014; every byte crosses the internet boundary N times instead of once.</li>
</ul>
<p>Existing workarounds &#x2014; NFS mounts, pre-baked container images, manual S3 mirrors &#x2014; all introduce operational complexity, stale-model risk, or storage overhead.</p>
<p>What if the infrastructure itself could solve this? What if downloading a model to the 200th node was as fast as downloading it to the first &#x2014; regardless of which model hub it came from?</p>
<p>That&apos;s exactly what the new <strong><code>hf://</code> and <code>modelscope://</code> protocol support in Dragonfly</strong> delivers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-dragonfly">What Is Dragonfly?<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#what-is-dragonfly" class="hash-link" aria-label="Direct link to What Is Dragonfly?" title="Direct link to What Is Dragonfly?" translate="no">&#x200B;</a></h2>
<p><a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>Dragonfly</a> is a CNCF Graduated project that provides a P2P-based file distribution system. Originally built for container image distribution at Alibaba-scale (processing billions of requests daily), Dragonfly turns every downloading node into a seed for its peers.</p>
<p><strong>Core Architecture:</strong></p>
<p><img decoding="async" loading="lazy" alt="Dragonfly P2P Architecture for AI Model Distribution" src="https://d7y.io/assets/images/dragonfly-p2p-architecture-33159f62bf0e8fd6990cb2bf9eb5b46c.png" width="1024" height="559" class="img_ev3q"></p>
<p><em>Figure 1: End-to-end flow of the P2P model distribution in Dragonfly. The Seed Peer fetches the model from the origin hub once (Step 1), the Dragonfly Scheduler computes the P2P topology (Step 3), and GPU nodes share pieces via micro-task distribution (Step 5) &#x2014; reducing origin traffic from 26 TB to ~130 GB across a 200-node cluster.</em></p>
<p>The magic: Dragonfly splits files into small pieces and distributes them across the P2P mesh. The origin (Hugging Face Hub or ModelScope Hub) is hit once by the seed peer. Critically, the Seed Peer does not need to finish downloading the entire model before sharing with other peers &#x2014; as soon as any single piece is downloaded, it can be shared immediately. This <strong>piece-based streaming download</strong> means distribution begins in parallel with the initial fetch, dramatically reducing total transfer time. For a 130 GB model across 200 nodes, origin traffic drops from 26 TB to ~130 GB &#x2014; a <strong>99.5% reduction</strong>.</p>
<p>Until now, Dragonfly supported HTTP/HTTPS, S3, GCS, Azure Blob Storage, Alibaba OSS, Huawei OBS, Tencent COS, and HDFS backends. But the two largest sources of AI model artifacts &#x2014; <strong>Hugging Face</strong> and <strong>ModelScope</strong> &#x2014; required users to pre-resolve hub URLs into raw HTTPS links, losing authentication context, revision pinning, and repository structure awareness.</p>
<p><strong>Not anymore.</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introducing-native-model-hub-protocols-in-dragonfly">Introducing Native Model Hub Protocols in Dragonfly<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#introducing-native-model-hub-protocols-in-dragonfly" class="hash-link" aria-label="Direct link to Introducing Native Model Hub Protocols in Dragonfly" title="Direct link to Introducing Native Model Hub Protocols in Dragonfly" translate="no">&#x200B;</a></h2>
<p>With two new backends merged into the Dragonfly client, <code>dfget</code> (Dragonfly&apos;s download tool) now natively understands both Hugging Face and ModelScope URLs. No proxies. No URL rewriting. No wrapper scripts.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-hf-protocol--hugging-face-hub">The <code>hf://</code> Protocol &#x2014; Hugging Face Hub<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#the-hf-protocol--hugging-face-hub" class="hash-link" aria-label="Direct link to the-hf-protocol--hugging-face-hub" title="Direct link to the-hf-protocol--hugging-face-hub" translate="no">&#x200B;</a></h3>
<p>Merged via <a href="https://github.com/dragonflyoss/client/pull/1665" target="_blank" rel="noopener noreferrer" class>PR #1665</a>, this backend adds first-class support for downloading from the world&apos;s largest open-source model repository.</p>
<p><strong>URL Format:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">hf://[&lt;repository_type&gt;/]&lt;owner&gt;/&lt;repository&gt;[/&lt;path&gt;]</span><br></div></code></pre></div></div>
<p><strong>Components:</strong></p>
<table><thead><tr><th>Component</th><th>Required</th><th>Description</th><th>Default</th></tr></thead><tbody><tr><td><code>repository_type</code></td><td>No</td><td><code>models</code>, <code>datasets</code>, or <code>spaces</code></td><td><code>models</code></td></tr><tr><td><code>owner/repository</code></td><td>Yes</td><td>Repository identifier (e.g., <code>deepseek-ai/DeepSeek-R1</code>)</td><td>&#x2014;</td></tr><tr><td><code>path</code></td><td>No</td><td>File path within the repo</td><td>Entire repo</td></tr></tbody></table>
<p><strong>Usage Examples:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Download a single model file with P2P acceleration</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget hf://deepseek-ai/DeepSeek-R1/model.safetensors \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -O /models/DeepSeek-R1/model.safetensors</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Download an entire repository recursively</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget hf://deepseek-ai/DeepSeek-R1 \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -O /models/DeepSeek-R1/ -r</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Download a specific dataset</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget hf://datasets/huggingface/squad/train.json \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -O /data/squad/train.json</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Access private repositories with authentication</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget hf://owner/private-model/weights.bin \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -O /models/private/weights.bin \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --hf-token=hf_xxxxxxxxxxxxx</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Pin to a specific model version</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget hf://deepseek-ai/DeepSeek-R1/model.safetensors --hf-revision v2.0 \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -O /models/DeepSeek-R1/model.safetensors</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-modelscope-protocol--modelscope-hub">The <code>modelscope://</code> Protocol &#x2014; ModelScope Hub<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#the-modelscope-protocol--modelscope-hub" class="hash-link" aria-label="Direct link to the-modelscope-protocol--modelscope-hub" title="Direct link to the-modelscope-protocol--modelscope-hub" translate="no">&#x200B;</a></h3>
<p>Merged via <a href="https://github.com/dragonflyoss/client/pull/1673" target="_blank" rel="noopener noreferrer" class>PR #1673</a>, this backend brings the same P2P-accelerated experience to <a href="https://modelscope.cn/" target="_blank" rel="noopener noreferrer" class>ModelScope Hub</a> &#x2014; Alibaba&apos;s open model platform hosting thousands of models, with particularly strong coverage of Chinese-origin LLMs and multimodal models.</p>
<p><strong>URL Format:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">modelscope://[&lt;repo_type&gt;/]&lt;owner&gt;/&lt;repo&gt;[/&lt;path&gt;]</span><br></div></code></pre></div></div>
<p><strong>Components:</strong></p>
<table><thead><tr><th>Component</th><th>Required</th><th>Description</th><th>Default</th></tr></thead><tbody><tr><td><code>repo_type</code></td><td>No</td><td><code>models</code> or <code>datasets</code></td><td><code>models</code></td></tr><tr><td><code>owner/repo</code></td><td>Yes</td><td>Repository identifier (e.g., <code>deepseek-ai/DeepSeek-R1</code>)</td><td>&#x2014;</td></tr><tr><td><code>path</code></td><td>No</td><td>File path within the repo</td><td>Entire repo</td></tr></tbody></table>
<p><strong>Usage Examples:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Download a model repository with P2P acceleration</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget modelscope://deepseek-ai/DeepSeek-R1 \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -O /models/DeepSeek-R1/ -r</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Download a single file</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget modelscope://deepseek-ai/DeepSeek-R1/config.json \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -O /models/DeepSeek-R1/config.json</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Download with authentication for private repos</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget modelscope://deepseek-ai/DeepSeek-R1/config.json \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -O /tmp/config.json --ms-token=&lt;token&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Download a dataset</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget modelscope://datasets/damo/squad-zh/train.json \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -O /data/squad-zh/train.json</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Download from a specific revision</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget modelscope://deepseek-ai/DeepSeek-R1/config.json --ms-revision v2.0 \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -O /models/DeepSeek-R1/config.json</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="under-the-hood-technical-deep-dive">Under the Hood: Technical Deep Dive<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#under-the-hood-technical-deep-dive" class="hash-link" aria-label="Direct link to Under the Hood: Technical Deep Dive" title="Direct link to Under the Hood: Technical Deep Dive" translate="no">&#x200B;</a></h2>
<p>Both implementations live in the Dragonfly Rust client as new backend modules. Here&apos;s how they work at the systems level.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-pluggable-backend-architecture">1. Pluggable Backend Architecture<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#1-pluggable-backend-architecture" class="hash-link" aria-label="Direct link to 1. Pluggable Backend Architecture" title="Direct link to 1. Pluggable Backend Architecture" translate="no">&#x200B;</a></h3>
<p>Dragonfly uses a <strong>pluggable backend system</strong>. Each URL scheme (<code>http</code>, <code>s3</code>, <code>gs</code>, <code>hf</code>, <code>modelscope</code>, etc.) maps to a backend that implements the <code>Backend</code> trait:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token attribute attr-name" style="color:rgb(255, 203, 107)">#[tonic::async_trait]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">pub</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">trait</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(255, 203, 107)">Backend</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(130, 170, 255)">scheme</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token operator" style="color:rgb(137, 221, 255)">&amp;</span><span class="token keyword" style="font-style:italic">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">String</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(130, 170, 255)">stat</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token operator" style="color:rgb(137, 221, 255)">&amp;</span><span class="token keyword" style="font-style:italic">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">StatRequest</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Result</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token class-name" style="color:rgb(255, 203, 107)">StatResponse</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(130, 170, 255)">get</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token operator" style="color:rgb(137, 221, 255)">&amp;</span><span class="token keyword" style="font-style:italic">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">GetRequest</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Result</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token class-name" style="color:rgb(255, 203, 107)">GetResponse</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token class-name" style="color:rgb(255, 203, 107)">Body</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;&gt;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(130, 170, 255)">put</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token operator" style="color:rgb(137, 221, 255)">&amp;</span><span class="token keyword" style="font-style:italic">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">PutRequest</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Result</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token class-name" style="color:rgb(255, 203, 107)">PutResponse</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(130, 170, 255)">exists</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token operator" style="color:rgb(137, 221, 255)">&amp;</span><span class="token keyword" style="font-style:italic">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">ExistsRequest</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Result</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token keyword" style="font-style:italic">bool</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>Both <code>hf</code> and <code>modelscope</code> backends are registered as <strong>builtin backends</strong> in the <code>BackendFactory</code>, sitting alongside HTTP, object storage, and HDFS:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// Hugging Face backend</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">backends</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">insert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;hf&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">to_string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token class-name" style="color:rgb(255, 203, 107)">Box</span><span class="token punctuation" style="color:rgb(199, 146, 234)">::</span><span class="token function" style="color:rgb(130, 170, 255)">new</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token namespace" style="color:rgb(178, 204, 214)">hugging_face</span><span class="token namespace punctuation" style="color:rgb(199, 146, 234)">::</span><span class="token class-name" style="color:rgb(255, 203, 107)">HuggingFace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">::</span><span class="token function" style="color:rgb(130, 170, 255)">new</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token keyword" style="font-style:italic">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">clone</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:rgb(137, 221, 255)">?</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// ModelScope backend</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">backends</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">insert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;modelscope&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">to_string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token class-name" style="color:rgb(255, 203, 107)">Box</span><span class="token punctuation" style="color:rgb(199, 146, 234)">::</span><span class="token function" style="color:rgb(130, 170, 255)">new</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token namespace" style="color:rgb(178, 204, 214)">modelscope</span><span class="token namespace punctuation" style="color:rgb(199, 146, 234)">::</span><span class="token class-name" style="color:rgb(255, 203, 107)">ModelScope</span><span class="token punctuation" style="color:rgb(199, 146, 234)">::</span><span class="token function" style="color:rgb(130, 170, 255)">new</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:rgb(137, 221, 255)">?</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>This means both schemes are available everywhere <code>dfget</code> or the Dragonfly daemon operates &#x2014; no additional configuration needed.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-url-parsing-same-grammar-different-conventions">2. URL Parsing: Same Grammar, Different Conventions<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#2-url-parsing-same-grammar-different-conventions" class="hash-link" aria-label="Direct link to 2. URL Parsing: Same Grammar, Different Conventions" title="Direct link to 2. URL Parsing: Same Grammar, Different Conventions" translate="no">&#x200B;</a></h3>
<p>Both backends share the same URL grammar &#x2014; <code>scheme://[type/]owner/repo[/path]</code> &#x2014; but respect each platform&apos;s conventions:</p>
<table><thead><tr><th>Aspect</th><th>Hugging Face (<code>hf://</code>)</th><th>ModelScope (<code>modelscope://</code>)</th></tr></thead><tbody><tr><td>Repository types</td><td>models, datasets, <strong>spaces</strong></td><td>models, datasets</td></tr><tr><td>Download API</td><td><code>huggingface.co/&lt;repo&gt;/resolve/&lt;rev&gt;/&lt;path&gt;</code></td><td><code>modelscope.cn/models/&lt;repo&gt;/resolve/&lt;rev&gt;/&lt;path&gt;</code></td></tr><tr><td>File listing API</td><td><code>huggingface.co/api/models/&lt;repo&gt;?revision=&lt;rev&gt;</code></td><td><code>modelscope.cn/api/v1/models/&lt;repo&gt;/repo/files?Revision=&lt;rev&gt;&amp;Recursive=true</code></td></tr><tr><td>API response format</td><td>Flat JSON with <code>siblings</code> array</td><td>Structured JSON with <code>Code</code>, <code>Data</code>, <code>Message</code> envelope</td></tr><tr><td>Large file handling</td><td>Git LFS with HTTP redirects</td><td>Direct API download</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-two-download-modes-both-backends">3. Two Download Modes (Both Backends)<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#3-two-download-modes-both-backends" class="hash-link" aria-label="Direct link to 3. Two Download Modes (Both Backends)" title="Direct link to 3. Two Download Modes (Both Backends)" translate="no">&#x200B;</a></h3>
<p><strong>Single File Mode</strong> (e.g., <code>hf://owner/repo/file.bin</code> or <code>modelscope://owner/repo/file.bin</code>):</p>
<ol>
<li class>Parse URL &#x2192; extract file path</li>
<li class>Build platform-specific download URL</li>
<li class><code>stat()</code> performs a HEAD request to get content length and validate existence</li>
<li class><code>get()</code> streams the file content through Dragonfly&apos;s piece-based P2P network</li>
<li class>For HF: Git LFS redirects are handled transparently by the HTTP client</li>
</ol>
<p><strong>Repository Mode</strong> (e.g., <code>hf://owner/repo -r</code> or <code>modelscope://owner/repo -r</code>):</p>
<ol>
<li class>Parse URL &#x2192; no file path present</li>
<li class>Call platform-specific API to list repository files</li>
<li class>Deserialize the repository metadata into a file listing</li>
<li class>For each file, construct a <strong>scheme-native URL</strong> (not raw HTTPS), preserving backend semantics</li>
<li class>Dragonfly&apos;s recursive download engine processes each file through the P2P mesh</li>
</ol>
<p>This is a crucial design decision: <strong>recursive downloads emit <code>hf://</code> or <code>modelscope://</code> URLs back into the download pipeline</strong>, not raw HTTPS URLs. This preserves authentication context and ensures every file in the recursive download goes through the correct backend &#x2014; maintaining token forwarding and URL semantics.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-platform-specific-api-integration">4. Platform-Specific API Integration<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#4-platform-specific-api-integration" class="hash-link" aria-label="Direct link to 4. Platform-Specific API Integration" title="Direct link to 4. Platform-Specific API Integration" translate="no">&#x200B;</a></h3>
<p><strong>Hugging Face</strong> uses a resolve-based download pattern where the server may return the file directly or redirect to Git LFS storage for large model files. The <code>reqwest</code> HTTP client follows these redirects automatically, making LFS handling completely transparent.</p>
<p><strong>ModelScope</strong> uses a structured REST API with explicit endpoints for file listing (<code>/repo/files</code>). The API returns a JSON envelope with <code>Code</code>, <code>Data</code>, and <code>Message</code> fields. The file listing endpoint supports recursive traversal natively via the <code>Recursive=true</code> parameter, returning structured <code>RepoFile</code> objects with name, path, type, and size metadata.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-authentication">5. Authentication<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#5-authentication" class="hash-link" aria-label="Direct link to 5. Authentication" title="Direct link to 5. Authentication" translate="no">&#x200B;</a></h3>
<p>Both backends support token-based authentication via CLI flags and bearer token headers:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Hugging Face authentication</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget hf://owner/private-model/weights.bin \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --hf-token=hf_xxxxxxxxxxxxx</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># ModelScope authentication</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget modelscope://owner/private-model/config.json \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --ms-token=&lt;token&gt;</span><br></div></code></pre></div></div>
<p>Tokens propagate through all operations (<code>stat</code>, <code>get</code>, <code>exists</code>), enabling access to private repositories and gated models on both platforms.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-world-impact-where-this-matters">Real-World Impact: Where This Matters<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#real-world-impact-where-this-matters" class="hash-link" aria-label="Direct link to Real-World Impact: Where This Matters" title="Direct link to Real-World Impact: Where This Matters" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-multi-node-gpu-cluster-model-deployment">1. Multi-Node GPU Cluster Model Deployment<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#1-multi-node-gpu-cluster-model-deployment" class="hash-link" aria-label="Direct link to 1. Multi-Node GPU Cluster Model Deployment" title="Direct link to 1. Multi-Node GPU Cluster Model Deployment" translate="no">&#x200B;</a></h3>
<p>In large-scale enterprise environments &#x2014; the kind I architect and operate daily &#x2014; distributing a 130 GB model like <code>meta-llama/Llama-2-70b</code> across 50 GPU nodes creates a debilitating network bottleneck. I&apos;ve seen this pattern cripple deployment velocity firsthand.</p>
<p><strong>Before:</strong> Each of your 50 GPU nodes downloads the model independently.</p>
<ul>
<li class>Total bandwidth: <strong>6.5 TB</strong> from the model hub</li>
<li class>Time: Limited by origin server throughput and rate limits</li>
<li class>Cost: Full internet egress x 50</li>
</ul>
<p><strong>After:</strong> Seed peer fetches once, P2P distributes across the cluster.</p>
<ul>
<li class>Origin bandwidth: <strong>~130 GB</strong> (once)</li>
<li class>Time: Near-wire-speed from local peers after initial seed</li>
<li class>Cost: Minimal egress, heavy intra-cluster traffic (free)</li>
</ul>
<p>When you&apos;re managing self-healing, multi-cloud Kubernetes clusters at enterprise scale, this kind of origin traffic reduction isn&apos;t an optimization &#x2014; it&apos;s a prerequisite for operational sanity.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-multi-hub-model-sourcing">2. Multi-Hub Model Sourcing<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#2-multi-hub-model-sourcing" class="hash-link" aria-label="Direct link to 2. Multi-Hub Model Sourcing" title="Direct link to 2. Multi-Hub Model Sourcing" translate="no">&#x200B;</a></h3>
<p>Teams increasingly source models from multiple hubs. A team might use Llama from Hugging Face and Qwen from ModelScope. With both backends built in, Dragonfly becomes the <strong>unified distribution layer</strong> regardless of origin:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># From Hugging Face</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget hf://meta-llama/Llama-2-7b -O /models/llama2/ -r</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># From ModelScope</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget modelscope://qwen/Qwen-7B -O /models/qwen/ -r</span><br></div></code></pre></div></div>
<p>Same P2P mesh. Same caching layer. Same operational model. Different origins.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-cicd-for-ml-pipelines">3. CI/CD for ML Pipelines<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#3-cicd-for-ml-pipelines" class="hash-link" aria-label="Direct link to 3. CI/CD for ML Pipelines" title="Direct link to 3. CI/CD for ML Pipelines" translate="no">&#x200B;</a></h3>
<p>Model evaluation pipelines that spin up ephemeral runners to test against specific model versions benefit from revision pinning:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Deterministic model versions in CI &#x2014; from either hub</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget hf://org/model --hf-revision abc123def -O /workspace/model/ -r</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget modelscope://org/model --ms-revision v1.0 -O /workspace/model/ -r</span><br></div></code></pre></div></div>
<p>Combined with Dragonfly&apos;s caching layer, repeated CI runs across different runners pull from local P2P cache instead of remote hubs. In the enterprise CI/CD systems I&apos;ve built, this eliminates one of the last remaining sources of non-deterministic pipeline failures: flaky model downloads.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-cross-platform-model-sourcing">4. Cross-Platform Model Sourcing<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#4-cross-platform-model-sourcing" class="hash-link" aria-label="Direct link to 4. Cross-Platform Model Sourcing" title="Direct link to 4. Cross-Platform Model Sourcing" translate="no">&#x200B;</a></h3>
<p>For organizations utilizing global infrastructure, Hugging Face serves as the primary hub. Dragonfly&apos;s dual-hub support enables a <strong>single distribution platform</strong> that routes to the optimal origin:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Global clusters pull from Hugging Face</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget hf://deepseek-ai/DeepSeek-R1 -O /models/DeepSeek-R1/ -r</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-air-gapped-and-edge-deployments">5. Air-Gapped and Edge Deployments<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#5-air-gapped-and-edge-deployments" class="hash-link" aria-label="Direct link to 5. Air-Gapped and Edge Deployments" title="Direct link to 5. Air-Gapped and Edge Deployments" translate="no">&#x200B;</a></h3>
<p>For environments with limited or no internet access &#x2014; common in regulated enterprise and financial services infrastructure &#x2014; Dragonfly&apos;s seed peer can be pre-loaded from an internet-connected staging area. Once seeded, internal nodes use P2P to distribute models without any external connectivity.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-dataset-distribution-for-training">6. Dataset Distribution for Training<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#6-dataset-distribution-for-training" class="hash-link" aria-label="Direct link to 6. Dataset Distribution for Training" title="Direct link to 6. Dataset Distribution for Training" translate="no">&#x200B;</a></h3>
<p>Large-scale training jobs often need the same dataset replicated across data-parallel workers:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># From Hugging Face</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget hf://datasets/allenai/c4/en/train-00000-of-01024.json.gz \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -O /data/c4/train-00000.json.gz</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># From ModelScope</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget modelscope://datasets/damo/squad-zh/train.json \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -O /data/squad-zh/train.json</span><br></div></code></pre></div></div>
<p>P2P distribution turns O(N) origin fetches into O(1) origin + O(log N) P2P propagation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="comparison-why-not-just-use-platform-clis">Comparison: Why Not Just Use Platform CLIs?<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#comparison-why-not-just-use-platform-clis" class="hash-link" aria-label="Direct link to Comparison: Why Not Just Use Platform CLIs?" title="Direct link to Comparison: Why Not Just Use Platform CLIs?" translate="no">&#x200B;</a></h2>
<table><thead><tr><th>Capability</th><th><code>huggingface-cli</code> / <code>modelscope</code> CLI</th><th><code>dfget hf://</code> / <code>dfget modelscope://</code></th></tr></thead><tbody><tr><td>Single-source download</td><td>Yes</td><td>Yes</td></tr><tr><td>P2P acceleration</td><td>No</td><td><strong>Yes</strong></td></tr><tr><td>Piece-level parallelism</td><td>No</td><td><strong>Yes</strong></td></tr><tr><td>Cluster-wide caching</td><td>No</td><td><strong>Yes</strong></td></tr><tr><td>Bandwidth reduction (N nodes)</td><td>1x per node</td><td><strong>~1x total</strong></td></tr><tr><td>Multi-hub unified interface</td><td>No (separate CLIs)</td><td><strong>Yes (single tool)</strong></td></tr><tr><td>Private repo auth</td><td>Yes</td><td>Yes</td></tr><tr><td>Revision pinning</td><td>Yes</td><td>Yes</td></tr><tr><td>Recursive download</td><td>Yes</td><td>Yes</td></tr><tr><td>Kubernetes-native integration</td><td>No</td><td><strong>Yes (DaemonSet)</strong></td></tr><tr><td>Pluggable backend system</td><td>No</td><td><strong>Yes</strong></td></tr></tbody></table>
<p>Platform-specific CLIs are excellent for individual developer workflows. The native protocol support in Dragonfly is for <strong>infrastructure-scale</strong> model distribution.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started">Getting Started<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">&#x200B;</a></h3>
<ul>
<li class>Dragonfly cluster deployed (scheduler + seed peer + peer on nodes)</li>
<li class><code>dfget</code> CLI available on target machines</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-start">Quick Start<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start" translate="no">&#x200B;</a></h3>
<p><strong>1. Install Dragonfly</strong> (via Helm for Kubernetes):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">helm install dragonfly dragonfly/dragonfly \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --namespace dragonfly-system --create-namespace</span><br></div></code></pre></div></div>
<p><strong>2. Download models with P2P from either hub:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># From Hugging Face</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget hf://deepseek-ai/DeepSeek-R1/model.safetensors -O ./model.safetensors</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># From ModelScope</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget modelscope://deepseek-ai/DeepSeek-R1/config.json -O ./config.json</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Recursive repository download (works with both)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget hf://deepseek-ai/DeepSeek-R1 -O ./DeepSeek-R1/ -r --hf-token=$HF_TOKEN</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfget modelscope://deepseek-ai/DeepSeek-R1 -O ./DeepSeek-R1/ -r --ms-token=$MS_TOKEN</span><br></div></code></pre></div></div>
<p><strong>3. Verify P2P is working:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Check Dragonfly daemon logs for peer transfer activity</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">journalctl -u dfdaemon | grep &quot;peer task&quot;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What&apos;s Next<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#whats-next" class="hash-link" aria-label="Direct link to What&apos;s Next" title="Direct link to What&apos;s Next" translate="no">&#x200B;</a></h2>
<p>These two backends are just the beginning. The architecture is designed for extensibility &#x2014; adding support for additional model hubs follows the same pattern: implement the <code>Backend</code> trait, register the scheme, and the entire P2P mesh instantly serves the new source. Potential future enhancements include:</p>
<ul>
<li class><strong>Intelligent pre-warming</strong>: Automatically seed popular models across clusters based on usage patterns</li>
<li class><strong>Deduplication across revisions</strong>: Share common pieces between model versions (e.g., shared tokenizer files)</li>
<li class><strong>Cross-hub deduplication</strong>: When the same model exists on both Hugging Face and ModelScope, share pieces across download sources</li>
<li class><strong>Integration with Kubernetes model serving frameworks</strong>: Native support in KServe, Triton Inference Server, and vLLM for P2P model loading</li>
<li class><strong>Bandwidth-aware scheduling</strong>: Prioritize P2P transfers based on GPU node topology and network proximity</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contributing">Contributing<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#contributing" class="hash-link" aria-label="Direct link to Contributing" title="Direct link to Contributing" translate="no">&#x200B;</a></h2>
<p>The PRs that brought these features to life:</p>
<ul>
<li class><strong><a href="https://github.com/dragonflyoss/client/pull/1665" target="_blank" rel="noopener noreferrer" class>dragonflyoss/client#1665</a></strong> &#x2014; Rust implementation of the <code>hf://</code> backend (Hugging Face)</li>
<li class><strong><a href="https://github.com/dragonflyoss/client/pull/1673" target="_blank" rel="noopener noreferrer" class>dragonflyoss/client#1673</a></strong> &#x2014; Rust implementation of the <code>modelscope://</code> backend (ModelScope)</li>
<li class><strong><a href="https://github.com/dragonflyoss/d7y.io/pull/386" target="_blank" rel="noopener noreferrer" class>dragonflyoss/d7y.io#386</a></strong> &#x2014; Documentation for the <code>hf://</code> protocol in dfget</li>
<li class><strong><a href="https://github.com/dragonflyoss/d7y.io/pull/396" target="_blank" rel="noopener noreferrer" class>dragonflyoss/d7y.io#396</a></strong> &#x2014; Documentation for the <code>modelscope://</code> protocol in dfget</li>
</ul>
<p>Dragonfly is a CNCF Graduated project and welcomes contributions. If you&apos;re working on AI infrastructure and have ideas for improving model distribution, check out the <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>Dragonfly GitHub repository</a> and join the community.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">&#x200B;</a></h2>
<p>The AI industry&apos;s model distribution problem doesn&apos;t need another wrapper script or another S3 bucket. It needs infrastructure-level P2P distribution with first-class understanding of where models live &#x2014; whether that&apos;s Hugging Face, ModelScope, or the next model hub that emerges.</p>
<p>Dragonfly now speaks both <code>hf://</code> and <code>modelscope://</code> natively: authenticated, revision-aware, P2P-accelerated paths from the world&apos;s two largest model hubs to every node in your cluster. One origin fetch per hub. Peer-distributed propagation. No operational overhead.</p>
<p>The models are getting bigger. The clusters are getting larger. The hubs are multiplying. The distribution layer needs to keep up.</p>
<p><strong>Now it can.</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links">Links<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-community">Dragonfly community<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#dragonfly-community" class="hash-link" aria-label="Direct link to Dragonfly community" title="Direct link to Dragonfly community" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></li>
<li class>Github Repo: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></li>
<li class>Slack Channel: <a href="https://cloud-native.slack.com/messages/dragonfly/" target="_blank" rel="noopener noreferrer" class>#dragonfly</a> on <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class>CNCF Slack</a></li>
<li class>Discussion Group: <a href="mailto:dragonfly-discuss@googlegroups.com" target="_blank" rel="noopener noreferrer" class>dragonfly-discuss@googlegroups.com</a></li>
<li class>Twitter: <a href="https://twitter.com/dragonfly_oss" target="_blank" rel="noopener noreferrer" class>@dragonfly_oss</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hugging-face">Hugging Face<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#hugging-face" class="hash-link" aria-label="Direct link to Hugging Face" title="Direct link to Hugging Face" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://huggingface.co/" target="_blank" rel="noopener noreferrer" class>https://huggingface.co/</a></li>
<li class>Github Repo: <a href="https://github.com/huggingface/huggingface_hub" target="_blank" rel="noopener noreferrer" class>https://github.com/huggingface/huggingface_hub</a></li>
<li class>Document: <a href="https://huggingface.co/docs" target="_blank" rel="noopener noreferrer" class>https://huggingface.co/docs</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="modelscope">ModelScope<a href="https://d7y.io/blog/2026/03/11/p2p-accelerated-ai-model-downloads-native-hugging-face-and-modelscope-protocols-in-dragonfly#modelscope" class="hash-link" aria-label="Direct link to ModelScope" title="Direct link to ModelScope" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://modelscope.cn/" target="_blank" rel="noopener noreferrer" class>https://modelscope.cn/</a></li>
<li class>Github Repo: <a href="https://github.com/modelscope/modelscope" target="_blank" rel="noopener noreferrer" class>https://github.com/modelscope/modelscope</a></li>
<li class>Document: <a href="https://modelscope.cn/docs" target="_blank" rel="noopener noreferrer" class>https://modelscope.cn/docs</a></li>
</ul>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="hugging face" term="hugging face"/>
        <category label="modelscope" term="modelscope"/>
        <category label="ai" term="ai"/>
        <category label="p2p" term="p2p"/>
        <category label="model distribution" term="model distribution"/>
        <category label="kubernetes" term="kubernetes"/>
        <category label="dfget" term="dfget"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Cloud Native Computing Foundation Announces Dragonfly’s Graduation]]></title>
        <id>https://d7y.io/blog/2026/01/15/cncf-announces-dragonfly-graduation</id>
        <link href="https://d7y.io/blog/2026/01/15/cncf-announces-dragonfly-graduation"/>
        <updated>2026-01-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Dragonfly graduates after demonstrating production readiness, powering container and AI workloads at scale.]]></summary>
        <content type="html"><![CDATA[<p><em>Dragonfly graduates after demonstrating production readiness, powering container and AI workloads at scale.</em></p>
<p><strong>Key Highlights:</strong></p>
<ul>
<li class>Dragonfly graduates from CNCF after demonstrating production readiness and widespread adoption across container and AI workloads.</li>
<li class>Dragonfly is used by major organizations, including Ant Group, Alibaba, Datadog, DiDi, and Kuaishou to power large-scale container and AI model distribution.</li>
<li class>Since joining the CNCF, Dragonfly is backed by over a 3,000% growth in code contributions and a growing contributor community spanning over 130 companies.</li>
</ul>
<p><strong>SAN FRANCISCO, Calif. &#x2013; January 14, 2026 &#x2013; The Cloud Native Computing Foundation&#xAE; (CNCF&#xAE;)</strong>, which builds sustainable ecosystems for cloud
native software, today announced the graduation of <strong>Dragonfly</strong>, a cloud native open source image and file distribution system designed to
solve cloud native image distribution in Kubernetes-centered applications.</p>
<p>&#x201C;Dragonfly&#x2019;s graduation reflects the project&#x2019;s maturity, broad industry adoption and critical role in scaling cloud native infrastructure,&#x201D; said Chris Aniszczyk, CTO, CNCF. &#x201C;It&#x2019;s especially exciting to see the project&#x2019;s impact in accelerating image distribution and meeting the data demands of AI workloads. We&#x2019;re proud to support a community that continues to push forward scalable, efficient and open solutions.&#x201D;</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonflys-technical-capabilities">Dragonfly&#x2019;s Technical Capabilities<a href="https://d7y.io/blog/2026/01/15/cncf-announces-dragonfly-graduation#dragonflys-technical-capabilities" class="hash-link" aria-label="Direct link to Dragonfly&#x2019;s Technical Capabilities" title="Direct link to Dragonfly&#x2019;s Technical Capabilities" translate="no">&#x200B;</a></h3>
<p>Dragonfly delivers efficient, stable, and secure data distribution and acceleration powered by peer-to-peer (P2P) technology.
It aims to provide a best&#x2011;practice, standards&#x2011;based solution for cloud native architectures to improve large&#x2011;scale delivery
of files, container images, OCI artifacts, AI models, caches, logs, and dependencies.</p>
<p>Dragonfly runs on <strong>Kubernetes</strong> and is installed via <strong>Helm</strong>, with its official chart available on <strong>Artifact Hub</strong>. It also includes tools
like <strong>Prometheus</strong> for tracking performance, <strong>OpenTelemetry</strong> for collecting and sharing data, and <strong>gRPC</strong> for rapid communication between parts.
Enhancing <strong>Harbor</strong> capability to distribute images and OCI artifacts through the preheat feature. In the GenAI era, as model
serving becomes increasingly important, Dragonfly delivers even more value by distributing AI model artifacts defined by the <strong>ModelPack</strong> specification.</p>
<p>Dragonfly continues to advance container image distribution, supporting tens of millions of container launches per day in
production, saving storage bandwidth by up to 90%, and reducing launch time from minutes to seconds, with large-scale
adoption across different cloud native scenarios.</p>
<p>Dragonfly is also driving standards and acceleration solutions for distributing both AI model weights and optimized image layout in
AI workloads. The technology reduces data loading for large-scale AI applications and enables the distribution of model weights at
a hundred-terabyte scale to hundreds of nodes in minutes. As AI continues to integrate into operations, Dragonfly
becomes crucial to powering large-scale AI workloads.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="milestones-driving-graduation">Milestones Driving Graduation<a href="https://d7y.io/blog/2026/01/15/cncf-announces-dragonfly-graduation#milestones-driving-graduation" class="hash-link" aria-label="Direct link to Milestones Driving Graduation" title="Direct link to Milestones Driving Graduation" translate="no">&#x200B;</a></h3>
<p>Dragonfly was open-sourced by Alibaba Group in November 2017. It then joined the CNCF as a Sandbox project in October 2018.
During this stage, Dragonfly 1.0 became production-ready in November 2019 and the Dragonfly subproject, Nydus, was open-sourced
in January 2020. Dragonfly then reached Incubation phase in April 2020, with Dragonfly 2.0 later released in 2021.</p>
<p>Since then, the community has significantly matured and attracted hundreds of contributors from organizations such as
Ant Group, Alibaba Cloud, ByteDance, Kuaishou, Intel, Datadog, Zhipu AI, and more, who use Dragonfly to deliver efficient image and AI model distribution.</p>
<p>Since joining CNCF, contributors have increased by 500%, from 45 individuals across 5 companies to 271 individuals across over 130 companies.
Commit activity has grown by over 3,000%, from roughly 800 to 26,000 commits, and the number of overall participants has reached 1,890.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next-for-dragonfly">What&#x2019;s Next For Dragonfly<a href="https://d7y.io/blog/2026/01/15/cncf-announces-dragonfly-graduation#whats-next-for-dragonfly" class="hash-link" aria-label="Direct link to What&#x2019;s Next For Dragonfly" title="Direct link to What&#x2019;s Next For Dragonfly" translate="no">&#x200B;</a></h3>
<p>Dragonfly will accelerate AI model weight distribution based on RDMA, improving throughput and reducing end-to-end latency.
It will also optimize image layout to reduce data loading time for large-scale AI workloads. A load-aware two-phase scheduling
will be introduced, leveraging collaboration between the scheduler and clients to enhance overall distribution efficiency.
To provide more stable and reliable services, Dragonfly will support automatic updates and fault recovery, ensuring stable
operation of all components during traffic bursts while controlling back-to-source traffic.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonflys-graduation-process">Dragonfly&#x2019;s Graduation Process<a href="https://d7y.io/blog/2026/01/15/cncf-announces-dragonfly-graduation#dragonflys-graduation-process" class="hash-link" aria-label="Direct link to Dragonfly&#x2019;s Graduation Process" title="Direct link to Dragonfly&#x2019;s Graduation Process" translate="no">&#x200B;</a></h3>
<p>To officially graduate from Incubation status, the Dragonfly team enhanced the election policy, clarified the maintainer lifecycle,
standardized the contribution process, defined the community ladder, and added community guidelines for subprojects.
The graduation process is supported by CNCF&#x2019;s <strong>Technical Oversight Committee (TOC)</strong> sponsors for Dragonfly, Karena Angell and Kevin Wang,
who conducted a thorough technical due diligence with Dragonfly&#x2019;s project maintainers.</p>
<p>Additionally, a <strong>third-party security audit</strong> of Dragonfly was conducted. The Dragonfly team along with the guidance of
their TOC sponsors, completed both a self-assessment and a joint assessment with <strong>CNCF TAG Security</strong>, then collaborated with
the Dragonfly security team on a threat model. After this, the team improved the project&#x2019;s security policy.</p>
<p>Learn more about Dragonfly and join the community: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="supporting-quotes">Supporting Quotes<a href="https://d7y.io/blog/2026/01/15/cncf-announces-dragonfly-graduation#supporting-quotes" class="hash-link" aria-label="Direct link to Supporting Quotes" title="Direct link to Supporting Quotes" translate="no">&#x200B;</a></h3>
<p>&#x201C;I am thrilled, as the founder of Dragonfly, to announce its graduation from the CNCF. We are grateful to
each and every open source contributor in the community, whose tenacity and commitment have enabled
Dragonfly to reach its current state. Dragonfly was created to resolve Alibaba Group&#x2019;s challenges with ultra-large-scale
file distribution and was open-sourced in 2017. Looking back on this journey over the past eight years,
every step has embodied the open source spirit and the tireless efforts of the many contributors.
This graduation marks a new starting point for Dragonfly. I hope that the project will embark on a new journey, continue
to explore more possibilities in the field of data distribution, and provide greater value!&#x201D;</p>
<p><strong>&#x2014;Zuozheng Hu, founder of Dragonfly, emeritus maintainer</strong></p>
<p>&#x201C;I am delighted that Dragonfly is now a CNCF graduated project. This is a significant milestone, reflecting the maturity of
the community, the trust of end users, and the reliability of the service. In the future, with the support of CNCF,
the Dragonfly team will work together to drive the community&#x2019;s sustainable growth and attract more contributors.
Facing the challenges of large-scale model distribution and data distribution in the GenAI era, our team will continue to
explore the future of data distribution within the cloud native ecosystem.&#x201D;</p>
<p><strong>&#x2014;Wenbo Qi (Gaius), core Dragonfly maintainer</strong></p>
<p>&#x201C;Since open-sourcing in 2020, Nydus, alongside Dragonfly, has been validated at production scale. Dragonfly&#x2019;s graduation is
a key milestone for Nydus as a subproject, allowing the project to continue improving the image filesystem&#x2019;s usability
and performance. It will also allow us to further explore ecosystem standardization and AGI use cases that will advance the underlying infrastructure.&#x201D;</p>
<p><strong>&#x2014;Song Yan, core Nydus maintainer</strong></p>
<p>&#x201C;The combination of Dragonfly and Nydus substantially shortens launch times for container images and AI models, enhancing system resilience and efficiency.&#x201D;</p>
<p><strong>&#x2014;Jiang Liu, Nydus maintainer</strong></p>
<p>&#x201C;Thanks to the community&#x2019;s collective efforts, Dragonfly has evolved from a tool for accelerating container images into
a secure and stable distribution system widely adopted by many enterprises. Continuous improvements in usability and
stability enable the project to support a variety of scenarios, including CI/CD, edge computing, and AI.
New challenges are emerging for the distribution of model weights and data in the age of AI. Dragonfly is becoming
a key infrastructure in mitigating these challenges. With the support of the CNCF, Dragonfly will continue to
drive the future evolution of cloud native distribution technologies.&#x201D;</p>
<p><strong>&#x2014;Yuan Yang, Dragonfly maintainer</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="toc-sponsors">TOC Sponsors<a href="https://d7y.io/blog/2026/01/15/cncf-announces-dragonfly-graduation#toc-sponsors" class="hash-link" aria-label="Direct link to TOC Sponsors" title="Direct link to TOC Sponsors" translate="no">&#x200B;</a></h3>
<p>&#x201C;We&#x2019;re grateful to the TOC members who dedicated significant time to the technical due diligence required for
Dragonfly&#x2019;s advancement, as well as the technical leads and community members who supported governance and
technical reviews. We also thank the project maintainers for their openness and responsiveness throughout this process,
and the end users who met with TOC and TAB members to share their experiences with Dragonfly.
This level of collaboration is what helps ensure the strength and credibility of the CNCF ecosystem.&#x201D;</p>
<p><strong>&#x2014;Karena Angell, chair, TOC, CNCF</strong></p>
<p>&#x201C;Dragonfly&#x2019;s graduation is a testament to the project&#x2019;s technical maturity and the community&#x2019;s consistent focus on
performance, reliability, and tangible impact. It&#x2019;s been impressive to see Dragonfly evolve to meet the needs of
large-scale production environments and AI workloads. Congratulations to the maintainers and contributors who&#x2019;ve worked hard to reach this milestone.&#x201D;</p>
<p><strong>&#x2014;Kevin Wang, vice chair, TOC, CNCF</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="project-end-users">Project End Users<a href="https://d7y.io/blog/2026/01/15/cncf-announces-dragonfly-graduation#project-end-users" class="hash-link" aria-label="Direct link to Project End Users" title="Direct link to Project End Users" translate="no">&#x200B;</a></h3>
<p>&#x201C;Over the past few years, as part of Ant Group&#x2019;s container infrastructure, the Dragonfly project has accelerated container image
and code package delivery across several 10K-node Kubernetes clusters. It has significantly saved image transmission
bandwidth, and the Nydus subproject has additionally helped us to reduce image pull time to near zero.
The project also supports the delivery of large language models within our AI infrastructure. It is a great honor to
have contributed to Dragonfly and to have shared our practices with the community.&#x201D;</p>
<p><strong>&#x2014;Xu Wang, head of the container infra team, Ant Group, and co-launcher of Kata Containers Project</strong></p>
<p>&#x201C;Dragonfly has become a key infrastructure component of the container image and data distribution system for Alibaba&#x2019;s
large-scale distributed systems. In ultra-large-scale scenarios such as the Double 11 (Singles&#x2019; Day) shopping festival,
Dragonfly has provided stable and efficient distribution capabilities and has improved the efficiency of system scaling and delivery.
Facing the new technological challenges of the AI era, Dragonfly has played an important role in model data distribution and
cache acceleration, helping us to build a more efficient, intelligent computing platform. We are happy to see Dragonfly
graduate, which represents an enhancement in community maturity and validates its reliability in large-scale production environments.&#x201D;</p>
<p><strong>&#x2014;Li Yi, director of engineering for container service, Alibaba Cloud &amp; Tao Huang, director of engineering for cloud native transformation project, Alibaba Group</strong></p>
<p>&#x201C;Datadog recently adopted the Dragonfly subproject, Nydus, and it has helped significantly reduce time spent pulling images.
This includes AI workloads, where image pulls previously took 5 minutes, and node daemonsets, which have startup speeds directly
related to how quickly applications can be scheduled on nodes. We have seen significant improvements using Nydus,
now everything starts in a matter of seconds. We are thrilled to see Dragonfly graduate and hope to continue to contribute to this impressive ecosystem!&#x201D;</p>
<p><strong>&#x2014;Baptiste Girard-Carrabin, Datadog</strong></p>
<p>&#x201C;DiDi uses a distributed cloud platform to handle a large number of user requests and quickly adjust resources, which
requires very efficient and stable management of resource distribution and image synchronization. Dragonfly is a
core component of our technical architecture due to its strong cloud native adaptability, excellent P2P acceleration
capabilities, and proven stability in large-scale scenarios. We believe that Dragonfly&#x2019;s graduation is a strong
testament to its technical maturity and industry value. We also look forward to its continued advancement in
the field of cloud native distribution, providing more efficient solutions for large-scale
file synchronization, image distribution, and other enterprise scenarios.&#x201D;</p>
<p><strong>&#x2014;Feng Wu, head of the Elastic Cloud, DiDi &amp; Rapier Yang, head of the Elastic Cloud, DiDi</strong></p>
<p>&#x201C;At Kuaishou, Dragonfly is considered the cornerstone of our container infrastructure, and it will soon provide
stable and reliable image distribution capabilities for tens of thousands of services and hundreds of thousands of servers.
Integrated with its subproject Nydus, Dragonfly dramatically enhances application startup efficiency while significantly
alleviating disk I/O pressure&#x2014;ensuring stability for services. In the era of AI large models, Dragonfly also functions as
a critical component of our AI infrastructure, providing exceptional acceleration capabilities for large model distribution.
We are deeply honored to partner with the vibrant Dragonfly community in collectively exploring future innovations for
cloud native distribution technologies.&#x201D;</p>
<p><strong>&#x2014;Wang Yao, head of container registry service of Kuaishou</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="about-cloud-native-computing-foundation">About Cloud Native Computing Foundation<a href="https://d7y.io/blog/2026/01/15/cncf-announces-dragonfly-graduation#about-cloud-native-computing-foundation" class="hash-link" aria-label="Direct link to About Cloud Native Computing Foundation" title="Direct link to About Cloud Native Computing Foundation" translate="no">&#x200B;</a></h3>
<p>Cloud native computing empowers organizations to build and run scalable applications with an open source software stack in
public, private, and hybrid clouds. The Cloud Native Computing Foundation (CNCF) hosts critical components of
the global technology infrastructure, including Kubernetes, Prometheus, and Envoy. CNCF brings together the
industry&#x2019;s top developers, end users, and vendors and runs the largest open source developer conferences in the world.
Supported by nearly 800 members, including the world&#x2019;s largest cloud computing and software companies, as well as
over 200 innovative startups, CNCF is part of the nonprofit Linux Foundation. For more information, please visit <a href="https://www.cncf.io/" target="_blank" rel="noopener noreferrer" class>www.cncf.io</a>.</p>]]></content>
        <category label="cncf" term="cncf"/>
        <category label="graduation" term="graduation"/>
        <category label="dragonfly" term="dragonfly"/>
        <category label="dragonfly client" term="dragonfly client"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Dragonfly v2.4.0 has been released]]></title>
        <id>https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released</id>
        <link href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released"/>
        <updated>2026-01-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Dragonfly v2.4.0 is released!🎉🎉🎉 Thanks the contributors who made this release happen and welcome you to visit d7y.io website.]]></summary>
        <content type="html"><![CDATA[<p>Dragonfly v2.4.0 is released!&#x1F389;&#x1F389;&#x1F389; Thanks the <a href="https://github.com/dragonflyoss/dragonfly/graphs/contributors" target="_blank" rel="noopener noreferrer" class>contributors</a> who made this release happen and welcome you to visit <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>d7y.io</a> website.</p>
<p><img decoding="async" loading="lazy" alt="dragonfly" src="https://d7y.io/assets/images/dragonfly-linear-9408b31eae8c2b506d1503494022b2b8.png" width="2076" height="559" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-features-and-enhancements">New features and enhancements<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#new-features-and-enhancements" class="hash-link" aria-label="Direct link to New features and enhancements" title="Direct link to New features and enhancements" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="load-aware-scheduling-algorithm">load-aware scheduling algorithm<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#load-aware-scheduling-algorithm" class="hash-link" aria-label="Direct link to load-aware scheduling algorithm" title="Direct link to load-aware scheduling algorithm" translate="no">&#x200B;</a></h3>
<p>A two-stage scheduling algorithm combining central scheduling with node-level secondary scheduling to
optimize P2P download performance based on real-time load awareness.</p>
<img alt="p1">
<p>For more information, please refer to the <a href="https://d7y.io/docs/next/operations/deployment/applications/scheduler/#scheduling" target="_blank" rel="noopener noreferrer" class>Scheduling</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vortex-protocol-support-for-p2p-file-transfer">Vortex Protocol Support for P2P File Transfer<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#vortex-protocol-support-for-p2p-file-transfer" class="hash-link" aria-label="Direct link to Vortex Protocol Support for P2P File Transfer" title="Direct link to Vortex Protocol Support for P2P File Transfer" translate="no">&#x200B;</a></h3>
<p>Dragonfly provide the new Vortex transfer protocol based on TLV to improve the download performance in internal network.
Use the TLV (Tag-Length-Value) format as a lightweight protocol to replace gRPC for data transfer between peers.
TCP-based Vortex reduces large file download time by <code>50%</code> and QUIC-based Vortex by <code>40%</code> compared to gRPC, both effectively reducing peak memory usage.</p>
<p>For more information, please refer to the <a href="https://github.com/dragonflyoss/design/blob/main/systems-analysis/tcp-protocol/tcp-protocol.md" target="_blank" rel="noopener noreferrer" class>TCP Protocol Support for P2P File Transfer</a> and <a href="https://github.com/dragonflyoss/design/blob/main/systems-analysis/quic-protocol/quic-protocol.md" target="_blank" rel="noopener noreferrer" class>QUIC Protocol Support for P2P File Transfer</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="request-sdk">Request SDK<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#request-sdk" class="hash-link" aria-label="Direct link to Request SDK" title="Direct link to Request SDK" translate="no">&#x200B;</a></h3>
<p>A SDK for routing User requests to Seed Peers using consistent hashing, replacing the previous Kubernetes Service load balancing approach.</p>
<img alt="p2">
<p>For more details, please refer to <a href="https://d7y.io/docs/next/advanced-guides/request-sdk/" target="_blank" rel="noopener noreferrer" class>Request SDK</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="simple-multicluster-kubernetes-deployment-with-scheduler-cluster-id">Simple Multi&#x2011;Cluster Kubernetes Deployment with Scheduler Cluster ID<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#simple-multicluster-kubernetes-deployment-with-scheduler-cluster-id" class="hash-link" aria-label="Direct link to Simple Multi&#x2011;Cluster Kubernetes Deployment with Scheduler Cluster ID" title="Direct link to Simple Multi&#x2011;Cluster Kubernetes Deployment with Scheduler Cluster ID" translate="no">&#x200B;</a></h3>
<p>Dragonfly supports a simplified feature for deploying and managing multiple Kubernetes clusters by explicitly assigning a <code>schedulerClusterID</code> to each cluster.
This approach allows users to directly control cluster affinity without relying on location&#x2011;based scheduling metadata such as IDC, hostname, or IP.</p>
<p>Using this feature, each Peer, Seed Peer, and Scheduler determines its target scheduler cluster through a clearly defined scheduler cluster ID.
This ensures precise separation between clusters and predictable cross&#x2011;cluster behavior.</p>
<p><img decoding="async" loading="lazy" alt="p3" src="https://d7y.io/assets/images/p3-4a61fd700304542ef1ccf386fc6f652a.png" width="1742" height="472" class="img_ev3q"></p>
<p>For more information, please refer to the <a href="https://d7y.io/docs/next/getting-started/quick-start/multi-cluster-kubernetes/#create-dragonfly-cluster-simple" target="_blank" rel="noopener noreferrer" class>Create Dragonfly Cluster Simple</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-and-resource-optimization-for-manager-and-scheduler-components">Performance and Resource Optimization for Manager and Scheduler Components<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#performance-and-resource-optimization-for-manager-and-scheduler-components" class="hash-link" aria-label="Direct link to Performance and Resource Optimization for Manager and Scheduler Components" title="Direct link to Performance and Resource Optimization for Manager and Scheduler Components" translate="no">&#x200B;</a></h3>
<p>Enhanced service performance and resource utilization across Manager and Scheduler components while significantly reducing
CPU and memory overhead, delivering improved system efficiency and better resource management.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enhanced-preheating">Enhanced Preheating<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#enhanced-preheating" class="hash-link" aria-label="Direct link to Enhanced Preheating" title="Direct link to Enhanced Preheating" translate="no">&#x200B;</a></h3>
<ul>
<li class>
<p>Support for IP-based peer selection in preheating jobs with priority-based selection logic where IP specification
takes highest priority, followed by count-based and percentage-based selection</p>
</li>
<li class>
<p>Support for preheating multiple URLs in a single request.</p>
</li>
<li class>
<p>Support for preheating file and image via Scheduler gRPC interface.</p>
</li>
</ul>
<p><img decoding="async" loading="lazy" alt="p4" src="https://d7y.io/assets/images/p4-3809f525e91ad8ad027397aba790a161.png" width="4120" height="2288" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="calculate-task-id-based-on-image-blob-sha256-to-avoid-redundant-downloads">Calculate task ID based on image blob SHA256 to avoid redundant downloads<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#calculate-task-id-based-on-image-blob-sha256-to-avoid-redundant-downloads" class="hash-link" aria-label="Direct link to Calculate task ID based on image blob SHA256 to avoid redundant downloads" title="Direct link to Calculate task ID based on image blob SHA256 to avoid redundant downloads" translate="no">&#x200B;</a></h3>
<p>The Client now supports calculating task IDs directly from the SHA256 hash of image blobs instead of using the download URL.
This enhancement prevents redundant downloads and data duplication when the same blob is accessed from
different registry domains.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cache-http-307-redirects-for-split-downloads">Cache HTTP 307 redirects for split downloads<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#cache-http-307-redirects-for-split-downloads" class="hash-link" aria-label="Direct link to Cache HTTP 307 redirects for split downloads" title="Direct link to Cache HTTP 307 redirects for split downloads" translate="no">&#x200B;</a></h3>
<p>Support for caching HTTP 307 (Temporary Redirect) responses to optimize Dragonfly&apos;s multi-piece download performance.
When a download URL is split into multiple pieces, the redirect target is now cached,
eliminating redundant redirect requests and reducing latency.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="go-client-deprecated-and-replaced-by-rust-client">Go Client Deprecated and Replaced by Rust Client<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#go-client-deprecated-and-replaced-by-rust-client" class="hash-link" aria-label="Direct link to Go Client Deprecated and Replaced by Rust Client" title="Direct link to Go Client Deprecated and Replaced by Rust Client" translate="no">&#x200B;</a></h3>
<p>The Go client has been deprecated and replaced by the <a href="https://github.com/dragonflyoss/client" target="_blank" rel="noopener noreferrer" class>Rust Client</a>. All future development and maintenance will focus
exclusively on the Rust client, which offers improved performance, stability, and reliability.</p>
<p>For more information, please refer to the <a href="https://github.com/dragonflyoss/client" target="_blank" rel="noopener noreferrer" class>dragonflyoss/client</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="additional-enhancements">Additional Enhancements<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#additional-enhancements" class="hash-link" aria-label="Direct link to Additional Enhancements" title="Direct link to Additional Enhancements" translate="no">&#x200B;</a></h3>
<ul>
<li class>Enable 64K page size support for ARM64 in the Dragonfly Rust client.</li>
<li class>Fix missing git commit metadata in dfget version output.</li>
<li class>Support for <code>config_path</code> of <code>io.containerd.cri.v1.images</code> plugin for containerd V3 configuration.</li>
<li class>Replaces glibc DNS resolver with hickory-dns in reqwest to implement DNS caching and prevent excessive DNS lookups during piece downloads.</li>
<li class>Support for the --include-files flag to selectively download files from a directory.</li>
<li class>Add the <code>--no-progress flag</code> to disable the download progress bar output.</li>
<li class>Support for custom request headers in backend operations, enabling flexible header configuration for HTTP requests.</li>
<li class>Refactored log output to reduce redundant logging and improve overall logging efficiency.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="significant-bug-fixes">Significant bug fixes<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#significant-bug-fixes" class="hash-link" aria-label="Direct link to Significant bug fixes" title="Direct link to Significant bug fixes" translate="no">&#x200B;</a></h2>
<ul>
<li class>Modified the database field type from <code>text</code> to <code>longtext</code> to support storing the information of preheating job.</li>
<li class>Fixed panic on repeated seed peer service stops during Scheduler shutdown.</li>
<li class>Fixed broker authentication failure when specifying the Redis password without setting a username.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nydus">Nydus<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#nydus" class="hash-link" aria-label="Direct link to Nydus" title="Direct link to Nydus" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nydus-new-features-and-enhancements">New features and enhancements<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#nydus-new-features-and-enhancements" class="hash-link" aria-label="Direct link to New features and enhancements" title="Direct link to New features and enhancements" translate="no">&#x200B;</a></h3>
<ul>
<li class>Nydusd: Add CRC32 validation support for both RAFS V5 and V6 formats, enhancing data integrity verification.</li>
<li class>Nydusd: Support resending FUSE requests during nydusd restoration, improving daemon recovery reliability.</li>
<li class>Nydusd: Enhance VFS state saving mechanism for daemon hot upgrade and failover.</li>
<li class>Nydusify: Introduce Nydus-to-OCI reverse conversion capability, enabling seamless migration back to OCI format.</li>
<li class>Nydusify: Implement zero-disk transfer for image copy, significantly reducing local disk usage during copy operations.</li>
<li class>Snapshotter: Builtin blob.meta in bootstrap for blob fetch reliability for RAFS v6 image.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nydus-significant-bug-fixes">Significant bug fixes<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#nydus-significant-bug-fixes" class="hash-link" aria-label="Direct link to Significant bug fixes" title="Direct link to Significant bug fixes" translate="no">&#x200B;</a></h3>
<ul>
<li class>Nydusd: Fix auth token fetching for <code>access_token</code> field in registry authentication.</li>
<li class>Nydusd: Add recursive inode/dentry invalidation for umount API.</li>
<li class>Nydus Image: Fix multiple issues in optimize subcommand and add backend configuration support.</li>
<li class>Snapshotter: Implement lazy parent recovery for proxy mode to handle missing parent snapshots.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="others">Others<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#others" class="hash-link" aria-label="Direct link to Others" title="Direct link to Others" translate="no">&#x200B;</a></h2>
<p>You can see <a href="https://github.com/dragonflyoss/dragonfly/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class>CHANGELOG</a> for more details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links">Links<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links" translate="no">&#x200B;</a></h2>
<ul>
<li class>Dragonfly Website: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></li>
<li class>Dragonfly Repository: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></li>
<li class>Dragonfly Client Repository: <a href="https://github.com/dragonflyoss/client" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/client</a></li>
<li class>Dragonfly Console Repository: <a href="https://github.com/dragonflyoss/console" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/console</a></li>
<li class>Dragonfly Charts Repository: <a href="https://github.com/dragonflyoss/helm-charts" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/helm-charts</a></li>
<li class>Dragonfly Monitor Repository: <a href="https://github.com/dragonflyoss/monitoring" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/monitoring</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-github">Dragonfly GitHub<a href="https://d7y.io/blog/2026/01/12/dragonfly-v2-4-0-has-been-released#dragonfly-github" class="hash-link" aria-label="Direct link to Dragonfly GitHub" title="Direct link to Dragonfly GitHub" translate="no">&#x200B;</a></h2>
<p><img decoding="async" loading="lazy" alt="qrcode" src="data:image/webp;base64,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" width="279" height="279" class="img_ev3q"></p>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Dragonfly Project Paper Accepted by IEEE Transactions on Networking (TON)!]]></title>
        <id>https://d7y.io/blog/2025/09/05/dragonfly-project-paper-accepted-by-IEEE-Transactions-on-Networking</id>
        <link href="https://d7y.io/blog/2025/09/05/dragonfly-project-paper-accepted-by-IEEE-Transactions-on-Networking"/>
        <updated>2025-09-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We’re excited to announce that a paper on model distribution, co-authored by researchers from Dalian University of Technology and Ant Group, has been accepted for publication in the IEEE Transactions on Networking (TON), a high-impact journal recognized by IEEE for its significant influence in networking and systems research. 🎉🎉🎉]]></summary>
        <content type="html"><![CDATA[<p>We&#x2019;re excited to announce that a paper on model distribution, co-authored by researchers from Dalian University of Technology and Ant Group, has been accepted for publication in the IEEE Transactions on Networking (TON), a high-impact journal recognized by IEEE for its significant influence in networking and systems research. &#x1F389;&#x1F389;&#x1F389;</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="title">Title<a href="https://d7y.io/blog/2025/09/05/dragonfly-project-paper-accepted-by-IEEE-Transactions-on-Networking#title" class="hash-link" aria-label="Direct link to Title" title="Direct link to Title" translate="no">&#x200B;</a></h2>
<p>Empowering Dragonfly: A Lightweight and Scalable Distribution System for Large Models with High Concurrency</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="link">Link<a href="https://d7y.io/blog/2025/09/05/dragonfly-project-paper-accepted-by-IEEE-Transactions-on-Networking#link" class="hash-link" aria-label="Direct link to Link" title="Direct link to Link" translate="no">&#x200B;</a></h2>
<p><a href="https://ieeexplore.ieee.org/document/11152005" target="_blank" rel="noopener noreferrer" class>IEEE Xplore</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authors">Authors<a href="https://d7y.io/blog/2025/09/05/dragonfly-project-paper-accepted-by-IEEE-Transactions-on-Networking#authors" class="hash-link" aria-label="Direct link to Authors" title="Direct link to Authors" translate="no">&#x200B;</a></h2>
<p>Zhou Xu, Dalian University of Technology
Lizhen Zhou, Dalian University of Technology
Zichuan Xu, Dalian University of Technology
Wenbo Qi, Ant Group
Jinjing Ma, Ant Group
Song Yan, Ant Group
Yuan Yang, Alibaba Cloud
Min Huang, Dalian University of Technology
Haomiao Jiang, Dalian University of Technology
Qiufen Xia, Dalian University of Technology
Guowei Wu, Dalian University of Technology</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="background">Background<a href="https://d7y.io/blog/2025/09/05/dragonfly-project-paper-accepted-by-IEEE-Transactions-on-Networking#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background" translate="no">&#x200B;</a></h2>
<p>With the continuous evolution of Artificial Intelligence Generated Content (AIGC) technologies, the distribution of container images and large models has become a challenge. Traditional centralized registry often faces single-node bandwidth bottlenecks during peak concurrent downloads, leading to severe network congestion and excessively long download times. Conversely, while Content Delivery Networks (CDNs) or private links can mitigate some hotspot loads, they fail to fully leverage the idle bandwidth of cluster nodes and introduce additional overhead. Consequently, cloud-native applications and AI services urgently need a dynamic, efficient, scalable, and non-intrusive distribution system for large-scale images and models, compatible with mainstream formats like OCI spec.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="design">Design<a href="https://d7y.io/blog/2025/09/05/dragonfly-project-paper-accepted-by-IEEE-Transactions-on-Networking#design" class="hash-link" aria-label="Direct link to Design" title="Direct link to Design" translate="no">&#x200B;</a></h2>
<p><img decoding="async" loading="lazy" alt="github" src="https://d7y.io/assets/images/design-36ad92e0bc7136b8ea828208f9b06741.png" width="400" height="360" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-design-1-a-lightweight-network-measurement-mechanism">Key Design 1: A Lightweight Network Measurement Mechanism<a href="https://d7y.io/blog/2025/09/05/dragonfly-project-paper-accepted-by-IEEE-Transactions-on-Networking#key-design-1-a-lightweight-network-measurement-mechanism" class="hash-link" aria-label="Direct link to Key Design 1: A Lightweight Network Measurement Mechanism" title="Direct link to Key Design 1: A Lightweight Network Measurement Mechanism" translate="no">&#x200B;</a></h3>
<ul>
<li class><strong>Network Latency Probing:</strong> Each peer proactively sends probes to a designated set of targets within the cluster, as assigned by the Scheduler, to measure end-to-end latency. This approach ensures efficient probing of all peers in the cluster while operating under constrained network resources.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="github" src="https://d7y.io/assets/images/probe-b60bc63ef8210ed5a5fa499cf38b12d2.png" width="500" height="300" class="img_ev3q"></p>
<ul>
<li class><strong>Network Bandwidth Prediction:</strong> We employ non-intrusive measurements by analyzing historical loading data to estimate network bandwidth with reasonable accuracy. When a peer initiates a model loading request, it pulls pieces of the model from other peers and reports the size and loading time of these pieces to the Scheduler. The Scheduler leverages historical data from successful loading operations to predict bandwidth.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="github" src="https://d7y.io/assets/images/bandwidth-6c3000caf3a6f7fbdf4ca78bbcf22d10.png" width="500" height="300" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-design-2-a-scalable-scheduling-framework">Key Design 2: A Scalable Scheduling Framework<a href="https://d7y.io/blog/2025/09/05/dragonfly-project-paper-accepted-by-IEEE-Transactions-on-Networking#key-design-2-a-scalable-scheduling-framework" class="hash-link" aria-label="Direct link to Key Design 2: A Scalable Scheduling Framework" title="Direct link to Key Design 2: A Scalable Scheduling Framework" translate="no">&#x200B;</a></h3>
<ul>
<li class>
<p><strong>Separating Inference from Scheduling:</strong> To ensure the Scheduler has adequate resources for task scheduling, we separate inference services from scheduling operations.</p>
</li>
<li class>
<p><strong>Real-Time Data Synchronization:</strong> To maintain data consistency across multiple schedulers, we store and continuously update end-to-end latency information for the entire network, as collected by the lightweight network measurement module.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-design-3-an-asynchronous-model-training-and-inference">Key Design 3: An Asynchronous Model Training and Inference<a href="https://d7y.io/blog/2025/09/05/dragonfly-project-paper-accepted-by-IEEE-Transactions-on-Networking#key-design-3-an-asynchronous-model-training-and-inference" class="hash-link" aria-label="Direct link to Key Design 3: An Asynchronous Model Training and Inference" title="Direct link to Key Design 3: An Asynchronous Model Training and Inference" translate="no">&#x200B;</a></h3>
<ul>
<li class>
<p><strong>Asynchronous Model Training:</strong> Asynchronous training and inference are facilitated through collaboration between the Trainer and Triton. The Scheduler retrieves end-to-end latency and bandwidth predictions from Redis and sends them to the Trainer, which then initiates training and persists the updated model. Triton periodically polls for updates and loads the new model for inference in the subsequent cycle.</p>
</li>
<li class>
<p><strong>Graph Learning Algorithm:</strong> This algorithm aggregates feature parameters from peers, modeling each sample as an interaction between a peer and its parent. It also incorporates information from neighboring peers to capture similarities within the cluster, thereby improving the accuracy of bandwidth predictions.</p>
</li>
</ul>
<p><img decoding="async" loading="lazy" alt="github" src="https://d7y.io/assets/images/graph-e6a211996948d17230e153bc42342f0b.png" width="400" height="300" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://d7y.io/blog/2025/09/05/dragonfly-project-paper-accepted-by-IEEE-Transactions-on-Networking#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">&#x200B;</a></h2>
<p>This paper presents an efficient and scalable peer-to-peer (P2P) model distribution system that optimizes resource utilization and ensures data synchronization through a multi-layered architecture.</p>
<ul>
<li class>
<p>First, it introduces a lightweight network measurement mechanism that probes latency and infers bandwidth to predict real-time network conditions.</p>
</li>
<li class>
<p>Second, it proposes a scalable scheduling framework that separates inference services from scheduling, enhancing both resource efficiency and system responsiveness.</p>
</li>
<li class>
<p>Finally, it designs the Trainer module, which integrates asynchronous model training and inference with graph learning algorithms to support incremental learning for bursty tasks.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-repository">GitHub Repository<a href="https://d7y.io/blog/2025/09/05/dragonfly-project-paper-accepted-by-IEEE-Transactions-on-Networking#github-repository" class="hash-link" aria-label="Direct link to GitHub Repository" title="Direct link to GitHub Repository" translate="no">&#x200B;</a></h2>
<p><img decoding="async" loading="lazy" alt="github" src="data:image/png;base64,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" width="279" height="279" class="img_ev3q"></p>]]></content>
        <category label="dragonfly" term="dragonfly"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Dragonfly v2.3.0 has been released]]></title>
        <id>https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released</id>
        <link href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released"/>
        <updated>2025-07-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Dragonfly v2.3.0 is released! 🎉🎉🎉 Thanks the contributors who made this release happen and welcome you to visit d7y.io website.]]></summary>
        <content type="html"><![CDATA[<p>Dragonfly v2.3.0 is released! &#x1F389;&#x1F389;&#x1F389; Thanks the <a href="https://github.com/dragonflyoss/dragonfly/graphs/contributors" target="_blank" rel="noopener noreferrer" class>contributors</a> who made this release happen and welcome you to visit <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>d7y.io</a> website.</p>
<p><img decoding="async" loading="lazy" alt="dragonfly" src="https://d7y.io/assets/images/dragonfly-linear-9408b31eae8c2b506d1503494022b2b8.png" width="2076" height="559" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="persistent-cache-task">Persistent Cache Task<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#persistent-cache-task" class="hash-link" aria-label="Direct link to Persistent Cache Task" title="Direct link to Persistent Cache Task" translate="no">&#x200B;</a></h3>
<p>It designs to provide persistent caching for tasks. This tool can import file and export file in P2P network.
The solution is specifically engineered for high-speed read and write operations. This makes it particularly advantageous
for scenarios involving large files, such as machine learning model checkpoints, where rapid, reliable access and
distribution across the network are critical for training and inference workflows. By leveraging P2P distribution and
persistent caching, dfcache significantly reduces I/O bottlenecks and accelerates the lifecycle of large data assets.</p>
<p><img decoding="async" loading="lazy" alt="p1" src="https://d7y.io/assets/images/p1-1335923b71b6d0b8ab79985b83eed63f.webp" width="2639" height="1146" class="img_ev3q"></p>
<p>For documentation on how to use the dfcache command-line tool, please refer to the following link: <a href="https://d7y.io/docs/next/reference/commands/client/dfcache/" target="_blank" rel="noopener noreferrer" class>dfcache</a>.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ dfcache import /tmp/file.txt</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&#x28F7; Done: 2229733261</span><br></div></code></pre></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfcache export 2229733261 -O /tmp/file.txt</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="p2" src="https://d7y.io/assets/images/p2-3402280ce745b9211bef72483d4fc62b.webp" width="1914" height="1378" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="resource-search-tasks-and-persistent-cache-tasks">Resource Search (Tasks and Persistent Cache Tasks)<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#resource-search-tasks-and-persistent-cache-tasks" class="hash-link" aria-label="Direct link to Resource Search (Tasks and Persistent Cache Tasks)" title="Direct link to Resource Search (Tasks and Persistent Cache Tasks)" translate="no">&#x200B;</a></h3>
<p>The Resource Search feature enables seamless querying of tasks, including files, images, and persistent cache tasks. It optimizes resource access, improving task management and retrieval efficiency.</p>
<p><img decoding="async" loading="lazy" alt="p3" src="https://d7y.io/assets/images/p3-77f7c55ff5b0787bf3eb301576c498b2.webp" width="1914" height="1378" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vortex-a-p2p-file-transfer-protocol-based-on-tlv">Vortex: A P2P File Transfer Protocol Based on TLV<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#vortex-a-p2p-file-transfer-protocol-based-on-tlv" class="hash-link" aria-label="Direct link to Vortex: A P2P File Transfer Protocol Based on TLV" title="Direct link to Vortex: A P2P File Transfer Protocol Based on TLV" translate="no">&#x200B;</a></h3>
<p>Vortex protocol is a high-performance peer-to-peer (P2P) file transfer protocol implementation in Rust,
designed as part of the Dragonfly project. It utilizes the TLV (Tag-Length-Value) format for efficient and
flexible data transmission, making it ideal for large-scale file distribution scenarios.</p>
<p>Packet Format:</p>
<ul>
<li class>Packet Identifier (8 bits): Uniquely identifies each packet</li>
<li class>Tag (8 bits): Specifies data type in value field</li>
<li class>Length (32 bits): Indicates Value field length, up to 4 GiB</li>
<li class>Value (variable): Actual data content, maximum 1 GiB
Protocol Format:</li>
</ul>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">-------------------------------------------------------------------------------------------------</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">|                            |                   |                    |                         |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| Packet Identifier (8 bits) |    Tag (8 bits)   |  Length (32 bits)  |   Value (up to 4 GiB)   |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">|                            |                   |                    |                         |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">-------------------------------------------------------------------------------------------------</span><br></div></code></pre></div></div>
<p>For more information, please refer to the <a href="https://github.com/dragonflyoss/vortex/blob/main/docs/README.md" target="_blank" rel="noopener noreferrer" class>Vortex Protocol</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enhanced-large-file-distribution">Enhanced Large File Distribution<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#enhanced-large-file-distribution" class="hash-link" aria-label="Direct link to Enhanced Large File Distribution" title="Direct link to Enhanced Large File Distribution" translate="no">&#x200B;</a></h3>
<p>This release significantly enhances Dragonfly&apos;s large file distribution capabilities, delivering improved efficiency and
performance. We&apos;ve revamped our scheduling algorithms for large file scenarios to ensure smarter resource and task allocation.
Additionally, new mechanisms now more effectively balance the load across peers during large file transfers.
Optimizations to the peer-to-peer (P2P) protocol and network transport layers further boost transmission efficiency.</p>
<p>These improvements include performance optimizations for both <a href="https://github.com/dragonflyoss/client" target="_blank" rel="noopener noreferrer" class>Client</a> and <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>Scheduler</a>. You can find more details in the project&apos;s pull request.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-scopes-for-personal-access-tokens-pats">Support scopes for Personal Access Tokens (PATs)<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#support-scopes-for-personal-access-tokens-pats" class="hash-link" aria-label="Direct link to Support scopes for Personal Access Tokens (PATs)" title="Direct link to Support scopes for Personal Access Tokens (PATs)" translate="no">&#x200B;</a></h3>
<p>By enabling users to define specific access rights (scopes) for each PAT, we significantly enhance the security of
Open API interactions. Instead of granting broad permissions, PATs can now be limited to only the necessary privileges required for a particular integration or task.</p>
<p><img decoding="async" loading="lazy" alt="p4" src="https://d7y.io/assets/images/p4-50172b3cd7db0a786cfbf4506b4e7116.webp" width="1914" height="1336" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enhanced-preheating">Enhanced Preheating<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#enhanced-preheating" class="hash-link" aria-label="Direct link to Enhanced Preheating" title="Direct link to Enhanced Preheating" translate="no">&#x200B;</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="implement-distributed-rate-limiting-for-preheating-tasks">Implement Distributed Rate Limiting for Preheating Tasks<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#implement-distributed-rate-limiting-for-preheating-tasks" class="hash-link" aria-label="Direct link to Implement Distributed Rate Limiting for Preheating Tasks" title="Direct link to Implement Distributed Rate Limiting for Preheating Tasks" translate="no">&#x200B;</a></h4>
<p>By limiting the rate at which preheating requests are initiated across the distributed system, it prevents excessive preheating activities from stressing the origin. This enhancement ensures a more stable preheating.</p>
<p><img decoding="async" loading="lazy" alt="p5" src="https://d7y.io/assets/images/p5-12503b56433f8c57d422b5ca2db2e145.webp" width="3736" height="2336" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-to-set-piece-length-for-preheating">Support to set piece length for preheating<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#support-to-set-piece-length-for-preheating" class="hash-link" aria-label="Direct link to Support to set piece length for preheating" title="Direct link to Support to set piece length for preheating" translate="no">&#x200B;</a></h4>
<p>By allowing adjustment of the piece size, users can optimize data transfer efficiency, particularly in scenarios involving large files.</p>
<p><img decoding="async" loading="lazy" alt="p6" src="https://d7y.io/assets/images/p6-6397a374653fe6ea336bf72b5dbe53ed.webp" width="1914" height="1362" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="flexible-preheating-set-peer-scope-by-percentage-or-count">Flexible Preheating: Set Peer scope by Percentage or Count<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#flexible-preheating-set-peer-scope-by-percentage-or-count" class="hash-link" aria-label="Direct link to Flexible Preheating: Set Peer scope by Percentage or Count" title="Direct link to Flexible Preheating: Set Peer scope by Percentage or Count" translate="no">&#x200B;</a></h4>
<p>This feature enhances preheating capabilities by allowing users to specify the preheating scope more precisely.</p>
<p><img decoding="async" loading="lazy" alt="p7" src="https://d7y.io/assets/images/p7-4dc878da5c69ce9ff8dc35580d147b1d.webp" width="1914" height="1516" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="implement-audit-logging-for-user-operations">Implement Audit Logging for User Operations<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#implement-audit-logging-for-user-operations" class="hash-link" aria-label="Direct link to Implement Audit Logging for User Operations" title="Direct link to Implement Audit Logging for User Operations" translate="no">&#x200B;</a></h3>
<p>This feature introduces comprehensive audit logging capabilities to track user operations within the system.
Audit logs will record critical actions performed by users, such as initiating preheating tasks, deleting task caches, and other significant system interactions.</p>
<p><img decoding="async" loading="lazy" alt="p8" src="https://d7y.io/assets/images/p8-8a4d2b4938e85eb0a0370132120ada6c.webp" width="1914" height="1378" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="garbage-collection">Garbage Collection<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#garbage-collection" class="hash-link" aria-label="Direct link to Garbage Collection" title="Direct link to Garbage Collection" translate="no">&#x200B;</a></h3>
<p>Dragonfly supports Garbage Collection (GC) Audit Logs and GC Job Records to track and manage garbage collection activities.
The Manager enables automated GC retention, allowing records to be preserved for a configurable time period. Additionally, it provides the capability to manually trigger forced GC operations as needed.</p>
<p>This feature ensures efficient monitoring and management of GC processes, offering flexibility through automated retention policies and manual intervention for immediate GC execution.</p>
<p><img decoding="async" loading="lazy" alt="p9" src="https://d7y.io/assets/images/p9-67adc683dc9a948cb38c167bb3df3f17.webp" width="1914" height="1378" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimized-file-download-with-hard-link">Optimized File Download with Hard Link<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#optimized-file-download-with-hard-link" class="hash-link" aria-label="Direct link to Optimized File Download with Hard Link" title="Direct link to Optimized File Download with Hard Link" translate="no">&#x200B;</a></h3>
<p>File download needs to be done in a way that is efficient and secure. If users are downloading a large file,
it is not efficient to download the file and copy to the output path. Instead, we can create a hard link to
the file and send the link to the user. This way, we can avoid copying the file and save time and resources.
If hard link fails (e.g. due to different file systems), dfdaemon will fall back to copying the file.</p>
<p>For more information, please refer to the <a href="https://github.com/dragonflyoss/design/blob/main/systems-analysis/file-download-workflow-with-hard-link/README.md" target="_blank" rel="noopener noreferrer" class>file download workflow</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hardware-acceleration-for-piece-hash-computation">Hardware Acceleration for Piece Hash Computation<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#hardware-acceleration-for-piece-hash-computation" class="hash-link" aria-label="Direct link to Hardware Acceleration for Piece Hash Computation" title="Direct link to Hardware Acceleration for Piece Hash Computation" translate="no">&#x200B;</a></h3>
<p>This feature enables hardware-accelerated Piece hash computation, significantly boosting performance and efficiency.
By utilizing specialized hardware, the hash computation process is accelerated, allowing faster processing of large file.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-storage-management">Advanced Storage Management<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#advanced-storage-management" class="hash-link" aria-label="Direct link to Advanced Storage Management" title="Direct link to Advanced Storage Management" translate="no">&#x200B;</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="disk-space-validation-for-operations">Disk Space Validation for Operations<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#disk-space-validation-for-operations" class="hash-link" aria-label="Direct link to Disk Space Validation for Operations" title="Direct link to Disk Space Validation for Operations" translate="no">&#x200B;</a></h4>
<p>This feature enhances the client&apos;s storage functionality by implementing disk space validation.
When insufficient disk space is detected, the client will return a failure response, preventing potential data corruption or incomplete operations.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="disk-garbage-collection-management">Disk Garbage Collection Management<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#disk-garbage-collection-management" class="hash-link" aria-label="Direct link to Disk Garbage Collection Management" title="Direct link to Disk Garbage Collection Management" translate="no">&#x200B;</a></h4>
<p>This feature enhances Peer&apos;s disk management by introducing configurable garbage collection (GC) thresholds based on disk usage.
The distThreshold parameter allows users to define a specific disk capacity (e.g., 10TiB) as the base for calculating GC trigger points.
If set, the distHighThresholdPercent (e.g., 80%) and distLowThresholdPercent (e.g., 60%) are applied relative to this capacity.
If distThreshold is not provided or set to 0, these percentages are calculated based on the total actual disk space.
When disk usage exceeds the high threshold, Dragonfly triggers GC(LRU) to reclaim space. GC stops when usage falls below the low threshold.
This enables efficient management of a logical disk portion for caching, improving resource utilization and system performance.</p>
<p><img decoding="async" loading="lazy" alt="p10" src="https://d7y.io/assets/images/p10-e2bde82dadf23237d62d46e83089bed3.webp" width="1890" height="1278" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-for-opentelemetry-tracing">Support for OpenTelemetry Tracing<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#support-for-opentelemetry-tracing" class="hash-link" aria-label="Direct link to Support for OpenTelemetry Tracing" title="Direct link to Support for OpenTelemetry Tracing" translate="no">&#x200B;</a></h3>
<p>Dragonfly supports for tracing based on OpenTelemetry, covering the Manager, Scheduler, and Peers.
This enables end-to-end visibility into the download process, allowing users to query detailed information, such as overall
download latency, using a specific task ID. The integration ensures efficient monitoring and performance analysis across the entire system.</p>
<p>Add tracing configuration as follows(in Manager, Scheduler and Peer):</p>
<p><img decoding="async" loading="lazy" alt="p11" src="https://d7y.io/assets/images/p11-04e5650a0acfbc8de252d1a5ad21ff63.webp" width="1314" height="428" class="img_ev3q"></p>
<p>You can access the Jaeger UI to visualize the traces.</p>
<p><img decoding="async" loading="lazy" alt="p12" src="https://d7y.io/assets/images/p12-0f1e72863018cdbe7b81c43fc57c4ab8.webp" width="4120" height="2288" class="img_ev3q"></p>
<p>For more information, please refer to the <a href="https://d7y.io/docs/next/operations/best-practices/observability/tracing/" target="_blank" rel="noopener noreferrer" class>Tracing</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-enhancements">Security Enhancements<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#security-enhancements" class="hash-link" aria-label="Direct link to Security Enhancements" title="Direct link to Security Enhancements" translate="no">&#x200B;</a></h2>
<p>We extend our sincere gratitude to the <a href="https://tag-security.cncf.io/" target="_blank" rel="noopener noreferrer" class>CNCF TAG Security</a> for their collaboration on a joint security audit.
Their expertise and thorough review were invaluable in helping us identify areas for security improvement within Dragonfly.
For detailed information on the specific security issues addressed and the corresponding fixes, please refer to the following issue: <a href="https://github.com/dragonflyoss/dragonfly/issues/3811" target="_blank" rel="noopener noreferrer" class>#3811</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nydus">Nydus<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#nydus" class="hash-link" aria-label="Direct link to Nydus" title="Direct link to Nydus" translate="no">&#x200B;</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="significant-bug-fixes">Significant bug fixes<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#significant-bug-fixes" class="hash-link" aria-label="Direct link to Significant bug fixes" title="Direct link to Significant bug fixes" translate="no">&#x200B;</a></h2>
<ul>
<li class>Fixed memory leaks and file descriptor leaks caused by <code>sysinfo</code> library.</li>
<li class>Cleans up the Unix domain socket (UDS) to prevent dfdaemon startup crashes.</li>
<li class>Prevent client from repeatedly downloading the same piece from multiple parents.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="others">Others<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#others" class="hash-link" aria-label="Direct link to Others" title="Direct link to Others" translate="no">&#x200B;</a></h2>
<p>You can see <a href="https://github.com/dragonflyoss/dragonfly/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class>CHANGELOG</a> for more details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links">Links<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links" translate="no">&#x200B;</a></h2>
<ul>
<li class>Dragonfly Website: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></li>
<li class>Dragonfly Repository: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></li>
<li class>Dragonfly Client Repository: <a href="https://github.com/dragonflyoss/client" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/client</a></li>
<li class>Dragonfly Console Repository: <a href="https://github.com/dragonflyoss/console" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/console</a></li>
<li class>Dragonfly Charts Repository: <a href="https://github.com/dragonflyoss/helm-charts" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/helm-charts</a></li>
<li class>Dragonfly Monitor Repository: <a href="https://github.com/dragonflyoss/monitoring" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/monitoring</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-github">Dragonfly GitHub<a href="https://d7y.io/blog/2025/07/01/dragonfly-v2-3-0-has-been-released#dragonfly-github" class="hash-link" aria-label="Direct link to Dragonfly GitHub" title="Direct link to Dragonfly GitHub" translate="no">&#x200B;</a></h2>
<p><img decoding="async" loading="lazy" alt="p13" src="data:image/webp;base64,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" width="279" height="279" class="img_ev3q"></p>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Dragonfly v2.2.0 has been released]]></title>
        <id>https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released</id>
        <link href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released"/>
        <updated>2025-01-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[CNCF projects highlighted in this post, and migrated by mingcheng.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://www.cncf.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released" target="_blank" rel="noopener noreferrer" class>CNCF projects highlighted in this post</a>, and migrated by <a href="https://github.com/mingcheng" target="_blank" rel="noopener noreferrer" class>mingcheng</a>.</p>
<p>Dragonfly v2.2.0 is released! &#x1F389;&#x1F389;&#x1F389; Thanks the <a href="https://github.com/dragonflyoss/dragonfly/graphs/contributors" target="_blank" rel="noopener noreferrer" class>contributors</a> who made this release happen and welcome you to visit <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>d7y.io</a> website.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="client-written-in-rust">Client written in Rust<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#client-written-in-rust" class="hash-link" aria-label="Direct link to Client written in Rust" title="Direct link to Client written in Rust" translate="no">&#x200B;</a></h3>
<p>The client is written in Rust, offering advantages such as ensuring memory safety, improving performance, etc. The client is a submodule of Dragonfly, refer to <a href="https://github.com/dragonflyoss/client" target="_blank" rel="noopener noreferrer" class>dragonflyoss/client</a>.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/12/Screenshot-2024-12-28-at-10.51.22.png" alt="scheduler schema" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/12/Screenshot-2024-12-28-at-10.52.11.jpg" alt="second scheduler schema" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="client-supports-bandwidth-rate-limiting-for-prefetching">Client supports bandwidth rate limiting for prefetching<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#client-supports-bandwidth-rate-limiting-for-prefetching" class="hash-link" aria-label="Direct link to Client supports bandwidth rate limiting for prefetching" title="Direct link to Client supports bandwidth rate limiting for prefetching" translate="no">&#x200B;</a></h3>
<p>Client now supports rate limiting for prefetch requests, which can prevent network overload and reduce competition with other active download tasks, thereby enhancing overall system performance. Refer to the <a href="https://d7y.io/docs/next/reference/configuration/client/dfdaemon/" target="_blank" rel="noopener noreferrer" class>documentation</a> to configure the proxy.prefetchRateLimit option.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2025/01/unnamed-64.jpg" alt="code" class="img_ev3q"></p>
<p>The following diagram illustrates the usage of download rate limit, upload rate limir, and prefetch rate limit for the client.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/12/dragonfly-1.png" alt="rate limit" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="client-supports-leeching">Client supports leeching<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#client-supports-leeching" class="hash-link" aria-label="Direct link to Client supports leeching" title="Direct link to Client supports leeching" translate="no">&#x200B;</a></h3>
<p>If the user configures the client to disable sharing, it will become a leech.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2025/01/unnamed-66.jpg" alt="code" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimize-clients-performance-for-handling-a-large-number-of-small-ios-by-nydus">Optimize client&#x2019;s performance for handling a large number of small I/Os by Nydus<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#optimize-clients-performance-for-handling-a-large-number-of-small-ios-by-nydus" class="hash-link" aria-label="Direct link to Optimize client&#x2019;s performance for handling a large number of small I/Os by Nydus" title="Direct link to Optimize client&#x2019;s performance for handling a large number of small I/Os by Nydus" translate="no">&#x200B;</a></h3>
<ul>
<li class>Add the X-Dragonfly-Prefetch HTTP header. If X-Dragonfly-Prefetch is set to true and it is a range request, the client will prefetch the entire task. This feature allows Nydus to control which requests need prefetching.</li>
<li class>The client&#x2019;s HTTP proxy adds an independent cache to reduce requests to the gRPC server, thereby reducing request latency.</li>
<li class>Increase the memory cache size in RocksDB and enable prefix search for quickly searching piece metadata.</li>
<li class>Use the CRC-32-Castagnoli algorithm with hardware acceleration to reduce the hash calculation cost for piece content.</li>
<li class>Reuse the gRPC connections for downloading and optimize the download logic.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="defines-the-v2-of-the-p2p-transfer-protocol">Defines the V2 of the P2P transfer protocol<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#defines-the-v2-of-the-p2p-transfer-protocol" class="hash-link" aria-label="Direct link to Defines the V2 of the P2P transfer protocol" title="Direct link to Defines the V2 of the P2P transfer protocol" translate="no">&#x200B;</a></h3>
<p>Define the V2 of the P2P transfer protocol to make it more standard, clearer, and better performing, refer to <a href="https://github.com/dragonflyoss/api" target="_blank" rel="noopener noreferrer" class>dragonflyoss/api</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enhanced-harbor-integration-with-p2p-preheating">Enhanced Harbor Integration with P2P Preheating<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#enhanced-harbor-integration-with-p2p-preheating" class="hash-link" aria-label="Direct link to Enhanced Harbor Integration with P2P Preheating" title="Direct link to Enhanced Harbor Integration with P2P Preheating" translate="no">&#x200B;</a></h3>
<p>Dragonfly improves its integration with Harbor v2.13 for preheating images, includes the following enhancements:</p>
<ul>
<li class>Support for preheating multi architecture images.</li>
<li class>User can select the preheat scope for multi-granularity preheating. (Single Seed Peer, All Seed Peers, All Peers)</li>
<li class>User can specify the scheduler cluster ids for preheating images to the desired Dragonfly clusters.</li>
</ul>
<p>Refer to <a href="https://d7y.io/docs/next/advanced-guides/preheat/" target="_blank" rel="noopener noreferrer" class>documentation</a> for more details.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2025/01/unnamed-65.png" alt="create P2P Provider policy" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="task-manager">Task Manager<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#task-manager" class="hash-link" aria-label="Direct link to Task Manager" title="Direct link to Task Manager" translate="no">&#x200B;</a></h3>
<p>User can search all peers of cached task by task ID or download URL, and delete the cache on the selected peers, refer to the <a href="https://d7y.io/docs/next/advanced-guides/task-manager/" target="_blank" rel="noopener noreferrer" class>documentation</a>.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/12/dragonfly-2.png" alt="dragonfly dashboard" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="peer-manager">Peer Manager<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#peer-manager" class="hash-link" aria-label="Direct link to Peer Manager" title="Direct link to Peer Manager" translate="no">&#x200B;</a></h3>
<p>Manager will regularly synchronize peers&#x2019; information and also allows for manual refreshes. Additionally, it will display peers&#x2019; information on the Manager Console.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/12/dragonfly-3.png" alt="dragonfly dashboard" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-hostname-regexes-and-cidrs-to-cluster-scopes-for-matching-clients">Add hostname regexes and CIDRs to cluster scopes for matching clients<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#add-hostname-regexes-and-cidrs-to-cluster-scopes-for-matching-clients" class="hash-link" aria-label="Direct link to Add hostname regexes and CIDRs to cluster scopes for matching clients" title="Direct link to Add hostname regexes and CIDRs to cluster scopes for matching clients" translate="no">&#x200B;</a></h3>
<p>When the client starts, it reports its hostname and IP to the Manager. The Manager then returns the best matching cluster (including schedulers and seed peers) to the client based on the cluster scopes configuration.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2025/01/unnamed-67.png" alt="Creating a cluster on the Dragonfly dashboard" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="supports-distributed-rate-limiting-for-creating-jobs-across-different-clusters">Supports distributed rate limiting for creating jobs across different clusters<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#supports-distributed-rate-limiting-for-creating-jobs-across-different-clusters" class="hash-link" aria-label="Direct link to Supports distributed rate limiting for creating jobs across different clusters" title="Direct link to Supports distributed rate limiting for creating jobs across different clusters" translate="no">&#x200B;</a></h3>
<p>User can configure rate limiting for job creation across different clusters in the Manager Console.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2025/01/unnamed-68.png" alt="creating a cluster on the dragonfly dashboard" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-preheating-images-using-self-signed-certificates">Support preheating images using self-signed certificates<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#support-preheating-images-using-self-signed-certificates" class="hash-link" aria-label="Direct link to Support preheating images using self-signed certificates" title="Direct link to Support preheating images using self-signed certificates" translate="no">&#x200B;</a></h3>
<p>Preheating requires calling the container registry to parse the image manifest and construct the URL for downloading blobs. If the container registry uses a self-signed certificate, user can configure the self-signed certificate in the Manager&#x2019;s config for calling to the container registry.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2025/01/unnamed-69.jpg" alt="code" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-mtls-for-grpc-calls-between-services">Support mTLS for gRPC calls between services<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#support-mtls-for-grpc-calls-between-services" class="hash-link" aria-label="Direct link to Support mTLS for gRPC calls between services" title="Direct link to Support mTLS for gRPC calls between services" translate="no">&#x200B;</a></h3>
<p>By setting self-signed certificates in the configurations of the Manager, Scheduler, Seed Peer, and Peer, gRPC calls between services will use mTLS.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="observability">Observability<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#observability" class="hash-link" aria-label="Direct link to Observability" title="Direct link to Observability" translate="no">&#x200B;</a></h3>
<p>Dragonfly is recommending to use prometheus for monitoring. Prometheus and grafana configurations are maintained in the <a href="https://github.com/dragonflyoss/monitoring/" target="_blank" rel="noopener noreferrer" class>dragonflyoss/monitoring</a> repository.</p>
<p>Grafana dashboards are listed below:</p>
<table><thead><tr><th><strong>Name</strong></th><th><strong>ID</strong></th><th><strong>Link</strong></th><th><strong>Description</strong></th></tr></thead><tbody><tr><td>Dragonfly Manager</td><td>15945</td><td><a href="https://grafana.com/grafana/dashboards/15945" target="_blank" rel="noopener noreferrer" class>https://grafana.com/grafana/dashboards/15945</a></td><td>Grafana dashboard for dragonfly manager.</td></tr><tr><td>Dragonfly Scheduler</td><td>15944</td><td><a href="https://grafana.com/grafana/dashboards/15944" target="_blank" rel="noopener noreferrer" class>https://grafana.com/grafana/dashboards/15944</a></td><td>Grafana dashboard for dragonfly scheduler.</td></tr><tr><td>Dragonfly Client</td><td>21053</td><td><a href="https://grafana.com/grafana/dashboards/21053" target="_blank" rel="noopener noreferrer" class>https://grafana.com/grafana/dashboards/21053</a></td><td>Grafana dashboard for dragonfly client and dragonfly seed client.</td></tr><tr><td>Dragonfly Seed Client</td><td>21054</td><td><a href="https://grafana.com/grafana/dashboards/21054" target="_blank" rel="noopener noreferrer" class>https://grafana.com/grafana/dashboards/21054</a></td><td>Grafana dashboard for dragonfly seed client.</td></tr></tbody></table>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2025/01/unnamed-70.jpg" alt="dashboard" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2025/01/unnamed-71.jpg" alt="creating a cluster on the dragonfly dashboard" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nydus">Nydus<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#nydus" class="hash-link" aria-label="Direct link to Nydus" title="Direct link to Nydus" translate="no">&#x200B;</a></h2>
<p>Nydus v2.3.0 is released, refer to <a href="https://github.com/dragonflyoss/nydus/releases/tag/v2.3.0" target="_blank" rel="noopener noreferrer" class>Nydus Image Service v2.3.0</a> for more details.</p>
<ul>
<li class>builder: support &#x2013;parent-bootstrap for merge.</li>
<li class>builder/nydusd: support batch chunks mergence.</li>
<li class>nydusify/nydus-snapshotter: support OCI reference types.</li>
<li class>nydusify: support export/import for remote images.</li>
<li class>nydusify: support &#x2013;push-chunk-size for large size image.</li>
<li class>nydusd/nydus-snapshotter: support basic failover and hot upgrade.</li>
<li class>nydusd: support overlay writable mount for fusedev.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="console">Console<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#console" class="hash-link" aria-label="Direct link to Console" title="Direct link to Console" translate="no">&#x200B;</a></h2>
<p>Console v0.2.0 is released, featuring a redesigned UI and an improved interaction flow. Additionally, more functional pages have been added, such as preheating, task manager, PATs(Personal Access Tokens) manager, etc. Refer to the <a href="https://d7y.io/docs/next/advanced-guides/web-console/" target="_blank" rel="noopener noreferrer" class>documentation</a> for more details.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2025/01/unnamed-72.png" alt="cluster overview" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2025/01/unnamed-73.png" alt="deeper dive image into cluster-1 on dashboard" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="document">Document<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#document" class="hash-link" aria-label="Direct link to Document" title="Direct link to Document" translate="no">&#x200B;</a></h2>
<p>Refactor the website documentation to make Dragonfly simpler and more practical for users, refer to <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>d7y.io</a>.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2025/01/unnamed-74.png" alt="dragonfly website" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="significant-bug-fixes">Significant bug fixes<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#significant-bug-fixes" class="hash-link" aria-label="Direct link to Significant bug fixes" title="Direct link to Significant bug fixes" translate="no">&#x200B;</a></h2>
<p>The following content only highlights the significant bug fixes in this release.</p>
<ul>
<li class>Fix the thread safety issue that occurs when constructing the DAG(Directed Acyclic Graph) during scheduling.</li>
<li class>Fix the memory leak caused by the OpenTelemetry library.</li>
<li class>Avoid hot reload when dynconfig refresh data from Manager.</li>
<li class>Prevent concurrent download requests from causing failures in state machine transitions.</li>
<li class>Use context.Background() to avoid stream cancel by dfdaemon.</li>
<li class>Fix the database performance issue caused by clearing expired jobs when there are too many job records.</li>
<li class>Reuse the gRPC connection pool to prevent redundant request construction.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-infrastructure">AI Infrastructure<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#ai-infrastructure" class="hash-link" aria-label="Direct link to AI Infrastructure" title="Direct link to AI Infrastructure" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="model-spec">Model Spec<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#model-spec" class="hash-link" aria-label="Direct link to Model Spec" title="Direct link to Model Spec" translate="no">&#x200B;</a></h3>
<p>The Dragonfly community is collaboratively defining the OCI Model Specification. OCI Model Specification aims to provide a standard way to package, distribute and run AI models in a cloud native environment. The goal of this specification is to package models in an OCI artifact to take advantage of OCI distribution and ensure efficient model deployment, refer to <a href="https://github.com/CloudNativeAI/model-spec" target="_blank" rel="noopener noreferrer" class>CloudNativeAI/model-spec</a> for more details.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/12/Screenshot-2024-12-28-at-10.53.54.jpg" alt="OCI Model Specification image" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/12/Screenshot-2024-12-28-at-10.54.33.jpg" alt="node" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-accelerated-distribution-of-ai-models-in-hugging-face-hubgit-lfs">Support accelerated distribution of AI models in Hugging Face Hub(Git LFS)<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#support-accelerated-distribution-of-ai-models-in-hugging-face-hubgit-lfs" class="hash-link" aria-label="Direct link to Support accelerated distribution of AI models in Hugging Face Hub(Git LFS)" title="Direct link to Support accelerated distribution of AI models in Hugging Face Hub(Git LFS)" translate="no">&#x200B;</a></h3>
<p>Distribute large files downloaded via the Git LFS protocol through Dragonfly P2P, refer to the <a href="https://d7y.io/docs/next/operations/integrations/hugging-face/" target="_blank" rel="noopener noreferrer" class>documentation</a>.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/12/Screenshot-2024-12-28-at-10.55.27.jpg" alt="hugging face hub clusters" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="maintainers">Maintainers<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#maintainers" class="hash-link" aria-label="Direct link to Maintainers" title="Direct link to Maintainers" translate="no">&#x200B;</a></h2>
<p>The community has added four new Maintainers, hoping to help more contributors participate in the community.</p>
<ul>
<li class><a href="https://github.com/CormickKneey" target="_blank" rel="noopener noreferrer" class>Han Jiang</a>: He works for Kuaishou and will focus on the engineering work for Dragonfly.</li>
<li class><a href="https://github.com/yyzai384" target="_blank" rel="noopener noreferrer" class>Yuan Yang</a>: He works for Alibaba Group and will focus on the engineering work for Dragonfly.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other">Other<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#other" class="hash-link" aria-label="Direct link to Other" title="Direct link to Other" translate="no">&#x200B;</a></h2>
<p>You can see <a href="https://github.com/dragonflyoss/dragonfly/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class>CHANGELOG</a> for more details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links">Links<a href="https://d7y.io/blog/2025/01/07/dragonfly-v2-2-0-has-been-released#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links" translate="no">&#x200B;</a></h2>
<ul>
<li class>Dragonfly Website: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></li>
<li class>Dragonfly Repository: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></li>
<li class>Dragonfly Client Repository: <a href="https://github.com/dragonflyoss/client" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/client</a></li>
<li class>Dragonfly Console Repository: <a href="https://github.com/dragonflyoss/console" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/console</a></li>
<li class>Dragonfly Charts Repository: <a href="https://github.com/dragonflyoss/helm-charts" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/helm-charts</a></li>
<li class>Dragonfly Monitor Repository: <a href="https://github.com/dragonflyoss/monitoring" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/monitoring</a></li>
</ul>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Triton Server accelerates distribution of models based on Dragonfly]]></title>
        <id>https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly</id>
        <link href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly"/>
        <updated>2024-04-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[CNCF projects highlighted in this post, and migrated by mingcheng.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://www.cncf.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly/" target="_blank" rel="noopener noreferrer" class>CNCF projects highlighted in this post</a>, and migrated by <a href="https://github.com/mingcheng" target="_blank" rel="noopener noreferrer" class>mingcheng</a>.</p>
<p>Project post by Yufei Chen, Miao Hao, and Min Huang, Dragonfly project</p>
<p>This document will help you experience how to use dragonfly with <a href="https://github.com/pytorch/serve" target="_blank" rel="noopener noreferrer" class>TritonServe</a>. During the downloading of models, the file size is large and there are many services downloading the files at the same time. The bandwidth of the storage will reach the limit and the download will be slow.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/05/image.png" alt="Diagram flow showing nodes in Triton Server in Cluster A and Cluster B to Model Registry" class="img_ev3q"></p>
<p>Dragonfly can be used to eliminate the bandwidth limit of the storage through P2P technology, thereby accelerating file downloading.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/05/image-1.png" alt="Diagram flow showing Cluster A and Cluster B Peer to Root Peer to Model Registry" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">&#x200B;</a></h2>
<p>By integrating Dragonfly Repository Agent into Triton, download traffic through Dragonfly to pull models stored in S3, OSS, GCS, and ABS, and register models in Triton. The Dragonfly Repository Agent is in the <a href="https://github.com/dragonflyoss/dragonfly-repository-agent" target="_blank" rel="noopener noreferrer" class>dragonfly-repository-agent</a> repository.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">&#x200B;</a></h2>
<table><thead><tr><th>Name</th><th>Version</th><th>Document</th></tr></thead><tbody><tr><td>Kubernetes cluster</td><td>1.20+</td><td><a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer" class>kubernetes.io</a></td></tr><tr><td>Helm</td><td>3.8.0+</td><td><a href="https://helm.sh/" target="_blank" rel="noopener noreferrer" class>helm.sh</a></td></tr><tr><td>Triton Server</td><td>23.08-py3</td><td><a href="https://github.com/triton-inference-server/server" target="_blank" rel="noopener noreferrer" class>Triton Server</a></td></tr></tbody></table>
<p>Notice: <a href="https://kind.sigs.k8s.io/" target="_blank" rel="noopener noreferrer" class>Kind</a> is recommended if no kubernetes cluster is available for testing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-kubernetes-cluster-setup">Dragonfly Kubernetes Cluster Setup<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#dragonfly-kubernetes-cluster-setup" class="hash-link" aria-label="Direct link to Dragonfly Kubernetes Cluster Setup" title="Direct link to Dragonfly Kubernetes Cluster Setup" translate="no">&#x200B;</a></h2>
<p>For detailed installation documentation, please refer to &#xA0;<a href="https://d7y.io/zh/docs/getting-started/quick-start/kubernetes/" target="_blank" rel="noopener noreferrer" class>quick-start-kubernetes</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prepare-kubernetes-cluster">Prepare Kubernetes Cluster<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#prepare-kubernetes-cluster" class="hash-link" aria-label="Direct link to Prepare Kubernetes Cluster" title="Direct link to Prepare Kubernetes Cluster" translate="no">&#x200B;</a></h3>
<p>Create kind multi-node cluster configuration file kind-config.yaml, configuration content is as follows:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind: ClusterapiVersion: kind.x-k8s.io/v1alpha4nodes:  - role: control-plane  - role: worker  - role: worker</span><br></div></code></pre></div></div>
<p>Create a kind multi-node cluster using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind create cluster --config kind-config.yaml</span><br></div></code></pre></div></div>
<p>Switch the context of kubectl to kind cluster:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl config use-context kind-kind</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kind-loads-dragonfly-image">Kind loads dragonfly image<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#kind-loads-dragonfly-image" class="hash-link" aria-label="Direct link to Kind loads dragonfly image" title="Direct link to Kind loads dragonfly image" translate="no">&#x200B;</a></h3>
<p>Pull dragonfly latest images:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/scheduler:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/manager:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/dfdaemon:latest</span><br></div></code></pre></div></div>
<p>Kind cluster loads dragonfly latest images:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/scheduler:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/manager:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/dfdaemon:latest</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-dragonfly-cluster-based-on-helm-charts">Create dragonfly cluster based on helm charts<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#create-dragonfly-cluster-based-on-helm-charts" class="hash-link" aria-label="Direct link to Create dragonfly cluster based on helm charts" title="Direct link to Create dragonfly cluster based on helm charts" translate="no">&#x200B;</a></h3>
<p>Create helm charts configuration file charts-config.yamland set dfdaemon.config.agents.regx to match the download path of the object storage. Example: add regx:.*models.* to match download request from object storage bucket models. Configuration content is as follows:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">scheduler:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  image: dragonflyoss/scheduler</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  tag: latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  replicas: 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  metrics:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    enable: true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  config:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    verbose: true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    pprofPort: 18066</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">seedPeer:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  image: dragonflyoss/dfdaemon</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  tag: latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  replicas: 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  metrics:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    enable: true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  config:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    verbose: true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    pprofPort: 18066</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dfdaemon:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  image: dragonflyoss/dfdaemon</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  tag: latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  metrics:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    enable: true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  config:    verbose: true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    pprofPort: 18066</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    proxy:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      defaultFilter: &apos;Expires&amp;Signature&amp;ns&apos;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      security:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        insecure: true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        cacert: &apos;&apos;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        cert: &apos;&apos;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        key: &apos;&apos;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      tcpListen:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        namespace: &apos;&apos;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        port: 65001</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      registryMirror:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        url: https://index.docker.io</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        insecure: true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        certs: []</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        direct: false</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      proxies:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        - regx: blobs/sha256.*</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        # Proxy all http download requests of model bucket path.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        - regx: .*models.*manager:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  image: dragonflyoss/manager</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  tag: latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  replicas: 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  metrics:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    enable: true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  config:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    verbose: true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    pprofPort: 18066</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">jaeger:  enable: true</span><br></div></code></pre></div></div>
<p>Create a dragonfly cluster using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">helm install --wait --create-namespace --namespace dragonfly-system dragonfly dragonfly/dragonfly -f charts-config.yaml</span><br></div></code></pre></div></div>
<p>Example output:</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">LAST DEPLOYED: Wed Nov 29 21:23:48 2023</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAMESPACE: dragonfly-system</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">STATUS: deployed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">REVISION: 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">TEST SUITE: None</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NOTES:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">1. Get the scheduler address by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l &quot;app=dragonfly,release=dragonfly,component=scheduler&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $SCHEDULER_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace dragonfly-system port-forward $SCHEDULER_POD_NAME 8002:$SCHEDULER_CONTAINER_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:8002 to use your scheduler&quot;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">2. Get the dfdaemon port by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l &quot;app=dragonfly,release=dragonfly,component=dfdaemon&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $DFDAEMON_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  You can use $DFDAEMON_CONTAINER_PORT as a proxy port in Node.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">3. Configure runtime to use dragonfly:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  https://d7y.io/docs/getting-started/quick-start/kubernetes/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">4. Get Jaeger query URL by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export JAEGER_QUERY_PORT=$(kubectl --namespace dragonfly-system get services dragonfly-jaeger-query -o jsonpath=&quot;{.spec.ports[0].port}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace dragonfly-system port-forward service/dragonfly-jaeger-query 16686:$JAEGER_QUERY_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:16686/search?limit=20&amp;lookback=1h&amp;maxDuration&amp;minDuration&amp;service=dragonfly to query download events&quot;</span><br></div></code></pre></div></div>
<p>Check that dragonfly is deployed successfully:</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl get pods -n dragonfly-systemNAME                                 READY   STATUS    RESTARTS       AGEdragonfly-dfdaemon-8qcpd             1/1     Running   4 (118s ago)   2m45sdragonfly-dfdaemon-qhkn8             1/1     Running   4 (108s ago)   2m45sdragonfly-jaeger-6c44dc44b9-dfjfv    1/1     Running   0              2m45sdragonfly-manager-549cd546b9-ps5tf   1/1     Running   0              2m45sdragonfly-mysql-0                    1/1     Running   0              2m45sdragonfly-redis-master-0             1/1     Running   0              2m45sdragonfly-redis-replicas-0           1/1     Running   0              2m45sdragonfly-redis-replicas-1           1/1     Running   0              2m7sdragonfly-redis-replicas-2           1/1     Running   0              101sdragonfly-scheduler-0                1/1     Running   0              2m45sdragonfly-seed-peer-0                1/1     Running   1 (52s ago)    2m45s</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="expose-the-proxy-service-port">Expose the Proxy service port<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#expose-the-proxy-service-port" class="hash-link" aria-label="Direct link to Expose the Proxy service port" title="Direct link to Expose the Proxy service port" translate="no">&#x200B;</a></h3>
<p>Create the dfstore.yaml configuration file to expose the port on which the Dragonfly Peer&#x2019;s HTTP proxy listens. The default port is 65001 and settargetPort to 65001.</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind: ServiceapiVersion: v1metadata:  name: dfstorespec:  selector:    app: dragonfly    component: dfdaemon    release: dragonfly  ports:    - protocol: TCP      port: 65001      targetPort: 65001  type: NodePort</span><br></div></code></pre></div></div>
<p>Create service:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl --namespace dragonfly-system apply -f dfstore.yaml</span><br></div></code></pre></div></div>
<p>Forward request to Dragonfly Peer&#x2019;s HTTP proxy:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl --namespace dragonfly-system port-forward service/dfstore 65001:65001</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-dragonfly-repository-agent">Install Dragonfly Repository Agent<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#install-dragonfly-repository-agent" class="hash-link" aria-label="Direct link to Install Dragonfly Repository Agent" title="Direct link to Install Dragonfly Repository Agent" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="set-dragonfly-repository-agent-configuration">Set Dragonfly Repository Agent configuration<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#set-dragonfly-repository-agent-configuration" class="hash-link" aria-label="Direct link to Set Dragonfly Repository Agent configuration" title="Direct link to Set Dragonfly Repository Agent configuration" translate="no">&#x200B;</a></h3>
<p>Create the dragonfly_config.jsonconfiguration file, the configuration is as follows:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;proxy&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;http://127.0.0.1:65001&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;header&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;filter&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Algorithm&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Credential&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Date&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Expires&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-SignedHeaders&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Signature&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<ul>
<li class>proxy: The address of Dragonfly Peer&#x2019;s HTTP Proxy.</li>
<li class>header: Adds a request header to the request.</li>
<li class>filter: Used to generate unique tasks and filter unnecessary query parameters in the URL.</li>
</ul>
<p>In the filter of the configuration, set different values when using different object storage:</p>
<table><thead><tr><th>Type</th><th>Value</th></tr></thead><tbody><tr><td>OSS</td><td>[&quot;Expires&quot;,&quot;Signature&quot;,&quot;ns&quot;]</td></tr><tr><td>S3</td><td>[&quot;X-Amz-Algorithm&quot;, &quot;X-Amz-Credential&quot;, &quot;X-Amz-Date&quot;, &quot;X-Amz-Expires&quot;, &quot;X-Amz-SignedHeaders&quot;, &quot;X-Amz-Signature&quot;]</td></tr><tr><td>OBS</td><td>[&quot;X-Amz-Algorithm&quot;, &quot;X-Amz-Credential&quot;, &quot;X-Amz-Date&quot;, &quot;X-Obs-Date&quot;, &quot;X-Amz-Expires&quot;, &quot;X-Amz-SignedHeaders&quot;, &quot;X-Amz-Signature&quot;]</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="set-model-repository-configuration">Set Model Repository configuration<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#set-model-repository-configuration" class="hash-link" aria-label="Direct link to Set Model Repository configuration" title="Direct link to Set Model Repository configuration" translate="no">&#x200B;</a></h3>
<p>Create cloud_credential.json cloud storage credential, the configuration is as follows:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">```json</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;gs&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;PATH_TO_GOOGLE_APPLICATION_CREDENTIALS&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;gs://gcs-bucket-002&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;PATH_TO_GOOGLE_APPLICATION_CREDENTIALS_2&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;s3&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;secret_key&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;AWS_SECRET_ACCESS_KEY&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;key_id&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;AWS_ACCESS_KEY_ID&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;region&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;AWS_DEFAULT_REGION&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;session_token&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;profile&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;s3://s3-bucket-002&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;secret_key&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;AWS_SECRET_ACCESS_KEY_2&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;key_id&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;AWS_ACCESS_KEY_ID_2&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;region&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;AWS_DEFAULT_REGION_2&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;session_token&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;AWS_SESSION_TOKEN_2&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;profile&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;AWS_PROFILE_2&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;as&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;account_str&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;AZURE_STORAGE_ACCOUNT&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;account_key&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;AZURE_STORAGE_KEY&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;as://Account-002/Container&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;account_str&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;account_key&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>In order to pull the model through Dragonfly, the model configuration file needs to be added following code in config.pbtxt file:</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">model_repository_agents{&#xA0; agents [&#xA0; &#xA0; {&#xA0; &#xA0; &#xA0; name: &quot;dragonfly&quot;,&#xA0; &#xA0; }&#xA0; ]}</span><br></div></code></pre></div></div>
<p>The <a href="https://github.com/dragonflyoss/dragonfly-repository-agent/tree/main/examples/model_repository/densenet_onnx" target="_blank" rel="noopener noreferrer" class>densenet_onnx example</a> contains modified configuration and model file. Modified config.pbtxt such as:</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">name: &quot;densenet_onnx&quot;platform: &quot;onnxruntime_onnx&quot;max_batch_size : 0input [&#xA0; {&#xA0; &#xA0; name: &quot;data_0&quot;&#xA0; &#xA0; data_type: TYPE_FP32&#xA0; &#xA0; format: FORMAT_NCHW&#xA0; &#xA0; dims: [ 3, 224, 224 ]&#xA0; &#xA0; reshape { shape: [ 1, 3, 224, 224 ] }&#xA0; }]output [&#xA0; {&#xA0; &#xA0; name: &quot;fc6_1&quot;&#xA0; &#xA0; data_type: TYPE_FP32&#xA0; &#xA0; dims: [ 1000 ]&#xA0; &#xA0; reshape { shape: [ 1, 1000, 1, 1 ] }&#xA0; &#xA0; label_filename: &quot;densenet_labels.txt&quot;&#xA0; }]model_repository_agents{&#xA0; agents [&#xA0; &#xA0; {&#xA0; &#xA0; &#xA0; name: &quot;dragonfly&quot;,&#xA0; &#xA0; }&#xA0; ]}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="triton-server-integrates-dragonfly-repository-agent-plugin">Triton Server integrates Dragonfly Repository Agent plugin<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#triton-server-integrates-dragonfly-repository-agent-plugin" class="hash-link" aria-label="Direct link to Triton Server integrates Dragonfly Repository Agent plugin" title="Direct link to Triton Server integrates Dragonfly Repository Agent plugin" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-triton-server-with-docker">Install Triton Server with Docker<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#install-triton-server-with-docker" class="hash-link" aria-label="Direct link to Install Triton Server with Docker" title="Direct link to Install Triton Server with Docker" translate="no">&#x200B;</a></h3>
<p>Pull dragonflyoss/dragonfly-repository-agent image which is integrated Dragonfly Repository Agent plugin in Triton Server, refer to <a href="https://github.com/dragonflyoss/dragonfly-repository-agent/blob/main/Dockerfile" target="_blank" rel="noopener noreferrer" class>Dockerfile</a>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/dragonfly-repository-agent:latest</span><br></div></code></pre></div></div>
<p>Run the container and mount the configuration directory:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker run --network host --rm \&#xA0; -v ${path-to-config-dir}:/home/triton/ \&#xA0; dragonflyoss/dragonfly-repository-agent:latest tritonserver \&#xA0; --model-repository=${model-repository-path}</span><br></div></code></pre></div></div>
<ul>
<li class>path-to-config-dir: The files path of dragonfly_config.json&amp;cloud_credential.json.</li>
<li class>model-repository-path: The path of remote model repository.</li>
</ul>
<p>The correct output is as follows:</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">=============================== Triton Inference Server ===============================</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">successfully loaded &apos;densenet_onnx&apos;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">I1130 09:43:22.595672 1 server.cc:604]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">+------------------+------------------------------------------------------------------------+</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| Repository Agent | Path                                                                   |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">+------------------+------------------------------------------------------------------------+</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| dragonfly        | /opt/tritonserver/repoagents/dragonfly/libtritonrepoagent_dragonfly.so |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">+------------------+------------------------------------------------------------------------+</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">I1130 09:43:22.596011 1 server.cc:631]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">+-------------+-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| Backend     | Path                                                            | Config                                                                                                                                                        |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">+-------------+-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| pytorch     | /opt/tritonserver/backends/pytorch/libtriton_pytorch.so         | {}                                                                                                                                                            |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| onnxruntime | /opt/tritonserver/backends/onnxruntime/libtriton_onnxruntime.so | {&quot;cmdline&quot;:{&quot;auto-complete-config&quot;:&quot;true&quot;,&quot;backend-directory&quot;:&quot;/opt/tritonserver/backends&quot;,&quot;min-compute-capability&quot;:&quot;6.000000&quot;,&quot;default-max-batch-size&quot;:&quot;4&quot;}} |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">+-------------+-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">I1130 09:43:22.596112 1 server.cc:674]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">+---------------+---------+--------+</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| Model         | Version | Status |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">+---------------+---------+--------+</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| densenet_onnx | 1       | READY  |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">+---------------+---------+--------+</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">I1130 09:43:22.598318 1 metrics.cc:703] Collecting CPU metrics</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">I1130 09:43:22.599373 1 tritonserver.cc:2435]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| Option                           | Value                                                                                                                                                                                                           |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| server_id                        | triton                                                                                                                                                                                                          |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| server_version                   | 2.37.0                                                                                                                                                                                                          |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| server_extensions                | classification sequence model_repository model_repository(unload_dependents) schedule_policy model_configuration system_shared_memory cuda_shared_memory binary_tensor_data parameters statistics trace logging |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| model_repository_path[0]         | s3://192.168.36.128:9000/models                                                                                                                                                                                 |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| model_control_mode               | MODE_NONE                                                                                                                                                                                                       |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| strict_model_config              | 0                                                                                                                                                                                                               |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| rate_limit                       | OFF                                                                                                                                                                                                             |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| pinned_memory_pool_byte_size     | 268435456                                                                                                                                                                                                       |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| min_supported_compute_capability | 6.0                                                                                                                                                                                                             |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| strict_readiness                 | 1                                                                                                                                                                                                               |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| exit_timeout                     | 30                                                                                                                                                                                                              |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">| cache_enabled                    | 0                                                                                                                                                                                                               |</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">I1130 09:43:22.610334 1 grpc_server.cc:2451] Started GRPCInferenceService at 0.0.0.0:8001</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">I1130 09:43:22.612623 1 http_server.cc:3558] Started HTTPService at 0.0.0.0:8000</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">I1130 09:43:22.695843 1 http_server.cc:187] Started Metrics Service at 0.0.0.0:8002</span><br></div></code></pre></div></div>
<p>Execute the following command to check the Dragonfly logs:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl exec -it -n dragonfly-system dragonfly-dfdaemon-&lt;id&gt; -- tail -f /var/log/dragonfly/daemon/core.log</span><br></div></code></pre></div></div>
<p>Check downloaded successfully through Dragonfly:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;level&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;info&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;ts&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;2024-02-02 05:28:02.631&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;caller&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;peer/peertask_conductor.go:1349&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;msg&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;peer task done, cost: 352ms&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;peer&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;10.244.2.3-1-4398a429-d780-423a-a630-57d765f1ccfc&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;task&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;974aaf56d4877cc65888a4736340fb1d8fecc93eadf7507f531f9fae650f1b4d&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;component&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;PeerTask&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;trace&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;4cca9ce80dbf5a445d321cec593aee65&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify">Verify<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#verify" class="hash-link" aria-label="Direct link to Verify" title="Direct link to Verify" translate="no">&#x200B;</a></h3>
<p>Call inference API&#xFF1A;</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker run -it --rm --net=host nvcr.io/nvidia/tritonserver:23.08-py3-sdk /workspace/install/bin/image_client -m densenet_onnx -c 3 -s INCEPTION /workspace/images/mug.jpg</span><br></div></code></pre></div></div>
<p>Check the response successful:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">Request 01Image &apos;/workspace/images/mug.jpg&apos;:&#xA0; &#xA0; 15.349563 (504) = COFFEE MUG&#xA0; &#xA0; 13.227461 (968) = CUP&#xA0; &#xA0; 10.424893 (505) = COFFEEPOT</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-testing">Performance testing<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#performance-testing" class="hash-link" aria-label="Direct link to Performance testing" title="Direct link to Performance testing" translate="no">&#x200B;</a></h2>
<p>Test the performance of single-machine model download by Triton API after the integration of Dragonfly P2P. Due to the influence of the network environment of the machine itself, the actual download time is not important, but The proportion of download speed in different scenarios is more meaningful:</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/05/image-2.png" alt="Bar chart showing time to download large Triton API; Triton API &amp; Dragonfly Cold Boot; Hit Dragonfly Remote Peer Cache; Hit, Dragonfly Local Peer Cache" class="img_ev3q"></p>
<ul>
<li class>Triton API: Use signed URL provided by Object Storage to download the model directly.</li>
<li class>Triton API &amp; Dragonfly Cold Boot: Use Triton Serve API to download model via Dragonfly P2P network and no cache hits.</li>
<li class>Hit Remote Peer: Use Triton Serve API to download model via Dragonfly P2P network and hit the remote peer cache.</li>
<li class>Hit Local Peer: Use Triton Serve API to download model via Dragonfly P2P network and hit the local peer cache.</li>
</ul>
<p>Test results show Triton and Dragonfly integration. It can effectively reduce the file download time. Note that this test was a single-machine test, which means that in the case of cache hits, the performance limitation is on the disk. If Dragonfly is deployed on multiple machines for P2P download, the models download speed will be faster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-community">Dragonfly Community<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#dragonfly-community" class="hash-link" aria-label="Direct link to Dragonfly Community" title="Direct link to Dragonfly Community" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></li>
<li class>GitHub Repo: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></li>
<li class>Dragonfly Repository Agent GitHub Repo: <a href="https://github.com/dragonflyoss/dragonfly-repository-agent" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly-repository-agent</a></li>
<li class>Slack Channel: <a href="https://cloud-native.slack.com/messages/dragonfly/" target="_blank" rel="noopener noreferrer" class>#dragonfly</a> on <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class>CNCF Slack</a></li>
<li class>Discussion Group: <a href="mailto:dragonfly-discuss@googlegroups.com" target="_blank" rel="noopener noreferrer" class>dragonfly-discuss@googlegroups.com</a></li>
<li class>Twitter: <a href="https://twitter.com/dragonfly_oss" target="_blank" rel="noopener noreferrer" class>@dragonfly_oss</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nvidia-triton-inference-server">NVIDIA Triton Inference Server<a href="https://d7y.io/blog/2024/04/15/triton-server-accelerates-distribution-of-models-based-on-dragonfly#nvidia-triton-inference-server" class="hash-link" aria-label="Direct link to NVIDIA Triton Inference Server" title="Direct link to NVIDIA Triton Inference Server" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://developer.nvidia.com/triton-inference-server" target="_blank" rel="noopener noreferrer" class>https://developer.nvidia.com/triton-inference-server</a></li>
<li class>GitHub Repo: <a href="https://github.com/triton-inference-server/server" target="_blank" rel="noopener noreferrer" class>https://github.com/triton-inference-server/server</a></li>
</ul>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Dragonfly accelerates distribution of large files with Git LFS]]></title>
        <id>https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs</id>
        <link href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs"/>
        <updated>2024-01-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[CNCF projects highlighted in this post, and migrated by mingcheng.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://www.cncf.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs" target="_blank" rel="noopener noreferrer" class>CNCF projects highlighted in this post</a>, and migrated by <a href="https://github.com/mingcheng" target="_blank" rel="noopener noreferrer" class>mingcheng</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-git-lfs">What is Git LFS?<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#what-is-git-lfs" class="hash-link" aria-label="Direct link to What is Git LFS?" title="Direct link to What is Git LFS?" translate="no">&#x200B;</a></h2>
<p><a href="https://git-lfs.com/" target="_blank" rel="noopener noreferrer" class>Git LFS (Large File Storage)</a> is an open-source extension for Git that enables users to handle large files more efficiently in Git repositories. Git is a version control system designed primarily for text files such as source code and it can become less efficient when dealing with large binary files like audio, videos, datasets, graphics and other large assets. These files can significantly increase the size of a repository and make cloning and fetching operations slow.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/01/image-34.jpg" alt="Diagram flow showing Remote to Large File Storage" class="img_ev3q"></p>
<p>Git LFS addresses this issue by storing these large files on a separate server and replacing them in the Git repository with small placeholder files (pointers). When a user clones or pulls from the repository, Git LFS fetches the large files from the LFS server as needed rather than downloading all the large files with the initial clone of the repository. For specifications, please refer to the <a href="https://github.com/git-lfs/git-lfs/blob/main/docs/spec.md" target="_blank" rel="noopener noreferrer" class>Git LFS Specification</a>. The server is implemented based on the HTTP protocol, refer to <a href="https://github.com/git-lfs/git-lfs/tree/main/docs/api" target="_blank" rel="noopener noreferrer" class>Git LFS API</a>. Usually Git LFS&#x2019;s content storage uses object storage to store large files.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="git-lfs-usage">Git LFS Usage<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#git-lfs-usage" class="hash-link" aria-label="Direct link to Git LFS Usage" title="Direct link to Git LFS Usage" translate="no">&#x200B;</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="git-lfs-manages-large-files">Git LFS manages large files<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#git-lfs-manages-large-files" class="hash-link" aria-label="Direct link to Git LFS manages large files" title="Direct link to Git LFS manages large files" translate="no">&#x200B;</a></h4>
<p>GitHub and GitLab usually manage large files based on Git LFS.</p>
<ul>
<li class>GitHub uses Git LFS refer to <a href="https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-git-large-file-storage" target="_blank" rel="noopener noreferrer" class>About Git Large File Storage</a>.</li>
<li class>GitLab uses Git LFS refer to <a href="https://docs.gitlab.com/ee/topics/git/lfs/" target="_blank" rel="noopener noreferrer" class>Git Large File Storage</a>.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="git-lfs-manages-ai-models-and-ai-datasets">Git LFS manages AI models and AI datasets<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#git-lfs-manages-ai-models-and-ai-datasets" class="hash-link" aria-label="Direct link to Git LFS manages AI models and AI datasets" title="Direct link to Git LFS manages AI models and AI datasets" translate="no">&#x200B;</a></h4>
<p>Large files of models and datasets in AI are usually managed based on Git LFS. <a href="https://huggingface.co/" target="_blank" rel="noopener noreferrer" class>Hugging Face Hub</a> and <a href="https://modelscope.cn/" target="_blank" rel="noopener noreferrer" class>ModelScope Hub</a> manage models and datasets based on Git LFS.</p>
<ul>
<li class>Hugging Face Hub uses Git LFS refer to <a href="https://huggingface.co/docs/hub/repositories-getting-started" target="_blank" rel="noopener noreferrer" class>Getting Started with Repositories</a>.</li>
<li class>ModelScope Hub uses Git LFS refer to <a href="https://modelscope.cn/docs/ModelScope%20Hub%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3" target="_blank" rel="noopener noreferrer" class>Getting Started with ModelScope</a>.</li>
</ul>
<p>Hugging Face Hub&#x2019;s Python Library implements Git LFS to download models and datasets. Hugging Face Hub&#x2019;s Python Library distributes models and datasets to accelerate, refer to <a href="https://www.cncf.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly/" target="_blank" rel="noopener noreferrer" class>Hugging Face accelerates distribution of models and datasets based on Dragonfly</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-eliminates-the-bandwidth-limit-of-git-lfss-content-storage">Dragonfly eliminates the bandwidth limit of Git LFS&#x2019;s content storage<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#dragonfly-eliminates-the-bandwidth-limit-of-git-lfss-content-storage" class="hash-link" aria-label="Direct link to Dragonfly eliminates the bandwidth limit of Git LFS&#x2019;s content storage" title="Direct link to Dragonfly eliminates the bandwidth limit of Git LFS&#x2019;s content storage" translate="no">&#x200B;</a></h2>
<p>This document will help you experience how to use dragonfly with Git LFS. During the downloading of large files, the file size is large and there are many services downloading the larges files at the same time. The bandwidth of the storage will reach the limit and the download will be slow.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/01/image-34.png" alt="Diagram flow showing Cluster A and Cluster B  to Large File Storage" class="img_ev3q"></p>
<p>Dragonfly can be used to eliminate the bandwidth limit of the storage through P2P technology, thereby accelerating large files downloading.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/01/image-35.png" alt="Diagram flow showing Cluster A and Cluster B  to Large File Storage using Peer and Root Peer" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-accelerates-downloads-with-git-lfs">Dragonfly accelerates downloads with Git LFS<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#dragonfly-accelerates-downloads-with-git-lfs" class="hash-link" aria-label="Direct link to Dragonfly accelerates downloads with Git LFS" title="Direct link to Dragonfly accelerates downloads with Git LFS" translate="no">&#x200B;</a></h2>
<p>By proxying the HTTP protocol file download request of Git LFS to Dragonfly Peer Proxy, the file download traffic is forwarded to the P2P network. The following documentation is based on GitHub LFS.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-the-content-storage-address-of-git-lfs">Get the Content Storage address of Git LFS<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#get-the-content-storage-address-of-git-lfs" class="hash-link" aria-label="Direct link to Get the Content Storage address of Git LFS" title="Direct link to Get the Content Storage address of Git LFS" translate="no">&#x200B;</a></h3>
<p>Add GIT_CURL_VERBOSE=1 to print verbose logs of git clone and get the address of content storage of Git LFS.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">GIT_CURL_VERBOSE=1 git clone git@github.com:{YOUR-USERNAME}/{YOUR-REPOSITORY}.git</span><br></div></code></pre></div></div>
<p>Look for the trace git-lfs keyword in the logs and you can see the log of Git LFS download files. Pay attention to the content of actions and download in the log.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">15:31:04.848308 trace git-lfs: HTTP: {&quot;objects&quot;:[{&quot;oid&quot;:&quot;c036cbb7553a909f8b8877d4461924307f27ecb66cff928eeeafd569c3887e29&quot;,&quot;size&quot;:5242880,&quot;actions&quot;:{&quot;download&quot;:{&quot;href&quot;:&quot;https://github-cloud.githubusercontent.com/alambic/media/376919987/c0/36/c036cbb7553a909f8b8877d4461924307f27ecb66cff928eeeafd569c3887e29?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIAIMWPLRQEC4XCWWPA%2F20231221%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20231221T073104Z&amp;X-Amz-Expires=3600&amp;X-Amz-Signature=4dc757dff0ac96eac3f0cd2eb29ca887035d3a6afba41cb10200ed0aa22812fa&amp;15:31:04.848403 trace git-lfs: HTTP: X-Amz-SignedHeaders=host&amp;actor_id=15955374&amp;key_id=0&amp;repo_id=392935134&amp;token=1&quot;,&quot;expires_at&quot;:&quot;2023-12-21T08:31:04Z&quot;,&quot;expires_in&quot;:3600}}}]}</span><br></div></code></pre></div></div>
<p>The download URL can be found in actions.download.href in the objects. You can find that the content storage of GitHub LFS is actually stored at github-cloud.githubusercontent.com. And query parameters include X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-Signature and X-Amz-SignedHeaders. The query parameters are <a href="https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html" target="_blank" rel="noopener noreferrer" class>AWS Authenticating Requests parameters</a>. The keys of query parameters will be used later when configuring Dragonfly Peer Proxy.</p>
<p>Information about Git LFS :</p>
<ol>
<li class>The content storage address of Git LFS is github-cloud.githubusercontent.com.</li>
<li class>The query parameters of the download URL include X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-Signature and X-Amz-SignedHeaders.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">&#x200B;</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">&#x200B;</a></h4>
<p>Notice: <a href="https://kind.sigs.k8s.io/" target="_blank" rel="noopener noreferrer" class>Kind</a> is recommended if no kubernetes cluster is available for testing.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-dragonfly">Install dragonfly<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#install-dragonfly" class="hash-link" aria-label="Direct link to Install dragonfly" title="Direct link to Install dragonfly" translate="no">&#x200B;</a></h4>
<p>For detailed installation documentation based on kubernetes cluster, please refer to <a href="https://d7y.io/docs/next/getting-started/quick-start/kubernetes/" target="_blank" rel="noopener noreferrer" class>quick-start-kubernetes</a>.</p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup-kubernetes-cluster">Setup kubernetes cluster<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#setup-kubernetes-cluster" class="hash-link" aria-label="Direct link to Setup kubernetes cluster" title="Direct link to Setup kubernetes cluster" translate="no">&#x200B;</a></h5>
<p>Create kind multi-node cluster configuration file kind-config.yaml, configuration content is as follows:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind: ClusterapiVersion: kind.x-k8s.io/v1alpha4nodes:&#xA0; - role: control-plane&#xA0; - role: worker&#xA0; &#xA0; extraPortMappings:&#xA0; &#xA0; &#xA0; - containerPort: 30950&#xA0; &#xA0; &#xA0; &#xA0; hostPort: 65001&#xA0; - role: worker</span><br></div></code></pre></div></div>
<p>Create a kind multi-node cluster using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind create cluster --config kind-config.yaml</span><br></div></code></pre></div></div>
<p>Switch the context of kubectl to kind cluster:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl config use-context kind-kind</span><br></div></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="kind-loads-dragonfly-image">Kind loads dragonfly image<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#kind-loads-dragonfly-image" class="hash-link" aria-label="Direct link to Kind loads dragonfly image" title="Direct link to Kind loads dragonfly image" translate="no">&#x200B;</a></h5>
<p>Pull dragonfly latest images:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/scheduler:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/manager:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/dfdaemon:latest</span><br></div></code></pre></div></div>
<p>Kind cluster loads dragonfly latest images:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/scheduler:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/manager:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/dfdaemon:latest</span><br></div></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-dragonfly-cluster-based-on-helm-charts">Create dragonfly cluster based on helm charts<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#create-dragonfly-cluster-based-on-helm-charts" class="hash-link" aria-label="Direct link to Create dragonfly cluster based on helm charts" title="Direct link to Create dragonfly cluster based on helm charts" translate="no">&#x200B;</a></h5>
<p>Create helm charts configuration file charts-config.yaml. Add the github-cloud.githubusercontent.com rule to dfdaemon.config.proxy.proxies.regx to forward the HTTP file download of content storage of Git LFS to the P2P network. And dfdaemon.config.proxy.defaultFilter adds X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-Signature and X-Amz-SignedHeaders parameters to filter the query parameters. Dragonfly generates a unique task id based on the URL, so it is necessary to filter the query parameters to generate a unique task id. Configuration content is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">scheduler</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonflyoss/scheduler</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">tag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">seedPeer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonflyoss/dfdaemon</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">tag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">dfdaemon</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonflyoss/dfdaemon</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">tag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">proxy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">defaultFilter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;X-Amz-Algorithm&amp;X-Amz-Credential&amp;X-Amz-Date&amp;X-Amz-Expires&amp;X-Amz-Signature&amp;X-Amz-SignedHeaders&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">security</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">insecure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">cacert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">cert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">tcpListen</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">65001</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">registryMirror</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">//index.docker.io</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">insecure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">certs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">direct</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">proxies</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">regx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> blobs/sha256.*</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">regx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> github</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">cloud.githubusercontent.com.*</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonflyoss/manager</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">tag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">jaeger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><br></div></code></pre></div></div>
<p>Create a dragonfly cluster using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">helm install --wait --create-namespace --namespace dragonfly-system dragonfly dragonfly/dragonfly -f charts-config.yaml</span><br></div></code></pre></div></div>
<p>Output:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME: dragonfly</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">LAST DEPLOYED: Thu Dec 21 17:24:37 2023</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAMESPACE: dragonfly-system</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">STATUS: deployed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">REVISION: 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">TEST SUITE: None</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NOTES:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">1. Get the scheduler address by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l &quot;app=dragonfly,release=dragonfly,component=scheduler&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $SCHEDULER_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace dragonfly-system port-forward $SCHEDULER_POD_NAME 8002:$SCHEDULER_CONTAINER_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:8002 to use your scheduler&quot;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">2. Get the dfdaemon port by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l &quot;app=dragonfly,release=dragonfly,component=dfdaemon&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $DFDAEMON_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  You can use $DFDAEMON_CONTAINER_PORT as a proxy port in Node.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">3. Configure runtime to use dragonfly:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  https://d7y.io/docs/getting-started/quick-start/kubernetes/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">4. Get Jaeger query URL by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export JAEGER_QUERY_PORT=$(kubectl --namespace dragonfly-system get services dragonfly-jaeger-query -o jsonpath=&quot;{.spec.ports[0].port}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace dragonfly-system port-forward service/dragonfly-jaeger-query 16686:$JAEGER_QUERY_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:16686/search?limit=20&amp;lookback=1h&amp;maxDuration&amp;minDuration&amp;service=dragonfly to query download events&quot;</span><br></div></code></pre></div></div>
<p>Check that dragonfly is deployed successfully:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl get po -n dragonfly-systemNAME &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; READY &#xA0; STATUS&#xA0; &#xA0; RESTARTS &#xA0; &#xA0; &#xA0; AGEdragonfly-dfdaemon-cttxz &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 1/1 &#xA0; &#xA0; Running &#xA0; 4 (116s ago) &#xA0; 2m51sdragonfly-dfdaemon-k62vd &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 1/1 &#xA0; &#xA0; Running &#xA0; 4 (117s ago) &#xA0; 2m51sdragonfly-jaeger-84dbfd5b56-mxpfs&#xA0; &#xA0; 1/1 &#xA0; &#xA0; Running &#xA0; 0&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 2m51sdragonfly-manager-5c598d5754-fd9tf &#xA0; 1/1 &#xA0; &#xA0; Running &#xA0; 0&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 2m51sdragonfly-mysql-0&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 1/1 &#xA0; &#xA0; Running &#xA0; 0&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 2m51sdragonfly-redis-master-0 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 1/1 &#xA0; &#xA0; Running &#xA0; 0&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 2m51sdragonfly-redis-replicas-0 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 1/1 &#xA0; &#xA0; Running &#xA0; 0&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 2m51sdragonfly-redis-replicas-1 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 1/1 &#xA0; &#xA0; Running &#xA0; 0&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 106sdragonfly-redis-replicas-2 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 1/1 &#xA0; &#xA0; Running &#xA0; 0&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 78sdragonfly-scheduler-0&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 1/1 &#xA0; &#xA0; Running &#xA0; 0&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 2m51sdragonfly-seed-peer-0&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; 1/1 &#xA0; &#xA0; Running &#xA0; 1 (37s ago)&#xA0; &#xA0; 2m51s</span><br></div></code></pre></div></div>
<p>Create peer service configuration file peer-service-config.yaml, configuration content is as follows:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">apiVersion: v1kind: Servicemetadata:&#xA0; name: peer&#xA0; namespace: dragonfly-systemspec:&#xA0; type: NodePort&#xA0; ports:&#xA0; &#xA0; - name: http-65001&#xA0; &#xA0; &#xA0; nodePort: 30950&#xA0; &#xA0; &#xA0; port: 65001&#xA0; selector:&#xA0; &#xA0; app: dragonfly&#xA0; &#xA0; component: dfdaemon&#xA0; &#xA0; release: dragonfly</span><br></div></code></pre></div></div>
<p>Create a peer service using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl apply -f peer-service-config.yaml</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="git-lfs-downloads-large-files-via-dragonfly">Git LFS downloads large files via dragonfly<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#git-lfs-downloads-large-files-via-dragonfly" class="hash-link" aria-label="Direct link to Git LFS downloads large files via dragonfly" title="Direct link to Git LFS downloads large files via dragonfly" translate="no">&#x200B;</a></h3>
<p>Proxy Git LFS download requests to Dragonfly Peer Proxy(<code>http://127.0.0.1:65001</code>) through Git configuration. Set Git configuration includes http.proxy, lfs.transfer.enablehrefrewrite and url.<code>{YOUR-LFS-CONTENT-STORAGE}</code>.insteadOf properties.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">git config --global http.proxy http://127.0.0.1:65001git config --global lfs.transfer.enablehrefrewrite truegit config --global url.http://github-cloud.githubusercontent.com/.insteadOf https://github-cloud.githubusercontent.com/</span><br></div></code></pre></div></div>
<p>Forward Git LFS download requests to the P2P network via Dragonfly Peer Proxy and Git clone the large files.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">git clone git@github.com:{YOUR-USERNAME}/{YOUR-REPOSITORY}.git</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify-large-files-download-with-dragonfly">Verify large files download with Dragonfly<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#verify-large-files-download-with-dragonfly" class="hash-link" aria-label="Direct link to Verify large files download with Dragonfly" title="Direct link to Verify large files download with Dragonfly" translate="no">&#x200B;</a></h3>
<p>Execute the command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># find podskubectl -n dragonfly-system get pod -l component=dfdaemon# find logspod_name=dfdaemon-xxxxxkubectl -n dragonfly-system exec -it ${pod_name} -- grep &quot;peer task done&quot; /var/log/dragonfly/daemon/core.log</span><br></div></code></pre></div></div>
<p>Example output:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">2023-12-21T16:55:20.495+0800INFOpeer/peertask_conductor.go:1326peer task done, cost: 2238ms{&quot;peer&quot;: &quot;30.54.146.131-15874-f6729352-950e-412f-b876-0e5c8e3232b1&quot;, &quot;task&quot;: &quot;70c644474b6c986e3af27d742d3602469e88f8956956817f9f67082c6967dc1a&quot;, &quot;component&quot;: &quot;PeerTask&quot;, &quot;trace&quot;: &quot;35c801b7dac36eeb0ea43a58d1c82e77&quot;}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-testing">Performance testing<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#performance-testing" class="hash-link" aria-label="Direct link to Performance testing" title="Direct link to Performance testing" translate="no">&#x200B;</a></h2>
<p>Test the performance of single-machine large files download after the integration of Git LFS and Dragonfly P2P. Due to the influence of the network environment of the machine itself, the actual download time is not important, but the ratio of the increase in the download time in different scenarios is very important.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2024/01/image-36.png" alt="Bar chart showing time to download large files (512M and 1G) between Git LFS, Git LFS &amp; Dragonfly Cold Boot, Hit Dragonfly Remote Peer Cache and Hit Dragonfly Local Peer Cache" class="img_ev3q"></p>
<ul>
<li class>Git LFS: Use Git LFS to download large files directly.</li>
<li class>Git LFS &amp; Dragonfly Cold Boot: Use Git LFS to download large files via Dragonfly P2P network and no cache hits.</li>
<li class>Hit Dragonfly Remote Peer Cache: Use Git LFS to download large files via Dragonfly P2P network and hit the remote peer cache.</li>
<li class>Hit Dragonfly Remote Local Cache: Use Git LFS to download large files via Dragonfly P2P network and hit the local peer cache.</li>
</ul>
<p>Test results show Git LFS and Dragonfly P2P integration. It can effectively reduce the file download time. Note that this test was a single-machine test, which means that in the case of cache hits, the performance limitation is on the disk. If Dragonfly is deployed on multiple machines for P2P download, the large files download speed will be faster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links">Links<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-community">Dragonfly community<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#dragonfly-community" class="hash-link" aria-label="Direct link to Dragonfly community" title="Direct link to Dragonfly community" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></li>
<li class>GitHub Repo: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></li>
<li class>Slack Channel: <a href="https://cloud-native.slack.com/messages/dragonfly/" target="_blank" rel="noopener noreferrer" class>#dragonfly</a> on <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class>CNCF Slack</a></li>
<li class>Discussion Group: <a href="mailto:dragonfly-discuss@googlegroups.com" target="_blank" rel="noopener noreferrer" class>dragonfly-discuss@googlegroups.com</a></li>
<li class>Twitter: <a href="https://twitter.com/dragonfly_oss" target="_blank" rel="noopener noreferrer" class>@dragonfly_oss</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="git-lfs">Git LFS<a href="https://d7y.io/blog/2024/01/15/dragonfly-accelerates-distribution-of-large-files-with-git-lfs#git-lfs" class="hash-link" aria-label="Direct link to Git LFS" title="Direct link to Git LFS" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://git-lfs.com/" target="_blank" rel="noopener noreferrer" class>https://git-lfs.com/</a></li>
<li class>GitHub Repo: <a href="https://github.com/git-lfs/git-lfs" target="_blank" rel="noopener noreferrer" class>https://github.com/git-lfs/git-lfs</a></li>
<li class>Document: <a href="https://github.com/git-lfs/git-lfs/tree/main/docs" target="_blank" rel="noopener noreferrer" class>https://github.com/git-lfs/git-lfs/tree/main/docs</a></li>
</ul>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[TorchServe accelerates the distribution of models based on Dragonfly]]></title>
        <id>https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly</id>
        <link href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly"/>
        <updated>2023-12-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[CNCF projects highlighted in this post, and migrated by mingcheng.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://www.cncf.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly/" target="_blank" rel="noopener noreferrer" class>CNCF projects highlighted in this post</a>, and migrated by <a href="https://github.com/mingcheng" target="_blank" rel="noopener noreferrer" class>mingcheng</a>.</p>
<p>This document will help you experience how to use dragonfly with <a href="https://github.com/pytorch/serve" target="_blank" rel="noopener noreferrer" class>TorchServe</a>. During the downloading of models, the file size is large and there are many services downloading the files at the same time. The bandwidth of the storage will reach the limit and the download will be slow.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/12/image-5.png" alt="Diagram flow showing Model Registry flow from Cluster A and Cluster B" class="img_ev3q"></p>
<p>Dragonfly can be used to eliminate the bandwidth limit of the storage through P2P technology, thereby accelerating file downloading.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/12/image-7.png" alt="Diagram flow showing Model Registry flow from Cluster A and Cluster B" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture">Architecture<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#architecture" class="hash-link" aria-label="Direct link to Architecture" title="Direct link to Architecture" translate="no">&#x200B;</a></h2>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/12/dragonfly1.png" alt="Dragonfly Endpoint architecture" class="img_ev3q"></p>
<p><a href="https://github.com/dragonflyoss/dragonfly-endpoint" target="_blank" rel="noopener noreferrer" class>Dragonfly Endpoint</a> plugin forwards TorchServe download model requests to the Dragonfly P2P network.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/12/dragonfly2.png" alt="Dragonfly Endpoint architecture" class="img_ev3q"></p>
<p>The models download steps:</p>
<ol>
<li class>TorchServe sends a model download request and the request is forwarded to the Dragonfly Peer.</li>
<li class>The Dragonfly Peer registers tasks with the Dragonfly Scheduler.</li>
<li class>Return the candidate parents to Dragonfly Peer.</li>
<li class>Dragonfly Peer downloads model from candidate parents.</li>
<li class>After downloading the model, TorchServe will register the model.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">&#x200B;</a></h2>
<p>By integrating Dragonfly Endpoint into TorchServe, download traffic through Dragonfly to pull models stored in S3, OSS, GCS, and ABS, and register models in TorchServe. The Dragonfly Endpoint plugin is in the <a href="https://github.com/dragonflyoss/dragonfly-endpoint" target="_blank" rel="noopener noreferrer" class>dragonfly-endpoint</a> repository.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">&#x200B;</a></h2>
<table><thead><tr><th>Name</th><th>Version</th><th>Document</th></tr></thead><tbody><tr><td>Kubernetes cluster</td><td>1.20+</td><td><a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer" class>kubernetes.io</a></td></tr><tr><td>Helm</td><td>3.8.0+</td><td><a href="https://helm.sh/" target="_blank" rel="noopener noreferrer" class>helm.sh</a></td></tr><tr><td>TorchServe</td><td>0.4.0+</td><td><a href="https://pytorch.org/serve/" target="_blank" rel="noopener noreferrer" class>pytorch.org/serve/</a></td></tr></tbody></table>
<p>Notice: <a href="https://kind.sigs.k8s.io/" target="_blank" rel="noopener noreferrer" class>Kind</a> is recommended if no kubernetes cluster is available for testing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-kubernetes-cluster-setup">Dragonfly Kubernetes Cluster Setup<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#dragonfly-kubernetes-cluster-setup" class="hash-link" aria-label="Direct link to Dragonfly Kubernetes Cluster Setup" title="Direct link to Dragonfly Kubernetes Cluster Setup" translate="no">&#x200B;</a></h2>
<p>For detailed installation documentation, please refer to &#xA0;<a href="https://d7y.io/zh/docs/getting-started/quick-start/kubernetes/" target="_blank" rel="noopener noreferrer" class>quick-start-kubernetes</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prepare-kubernetes-cluster">Prepare Kubernetes Cluster<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#prepare-kubernetes-cluster" class="hash-link" aria-label="Direct link to Prepare Kubernetes Cluster" title="Direct link to Prepare Kubernetes Cluster" translate="no">&#x200B;</a></h3>
<p>Create kind multi-node cluster configuration file kind-config.yaml, configuration content is as follows:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind: ClusterapiVersion: kind.x-k8s.io/v1alpha4nodes:&#xA0; - role: control-plane&#xA0; - role: worker&#xA0; - role: worker</span><br></div></code></pre></div></div>
<p>Create a kind multi-node cluster using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind create cluster --config kind-config.yaml</span><br></div></code></pre></div></div>
<p>Switch the context of kubectl to kind cluster:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl config use-context kind-kind</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kind-loads-dragonfly-image">Kind loads dragonfly image<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#kind-loads-dragonfly-image" class="hash-link" aria-label="Direct link to Kind loads dragonfly image" title="Direct link to Kind loads dragonfly image" translate="no">&#x200B;</a></h3>
<p>Pull dragonfly latest images:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/scheduler:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/manager:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/dfdaemon:latest</span><br></div></code></pre></div></div>
<p>Kind cluster loads dragonfly latest images:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/scheduler:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/manager:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/dfdaemon:latest</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-dragonfly-cluster-based-on-helm-charts">Create dragonfly cluster based on helm charts<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#create-dragonfly-cluster-based-on-helm-charts" class="hash-link" aria-label="Direct link to Create dragonfly cluster based on helm charts" title="Direct link to Create dragonfly cluster based on helm charts" translate="no">&#x200B;</a></h3>
<p>Create helm charts configuration file charts-config.yaml and set dfdaemon.config.agents.regx to match the download path of the object storage, configuration content is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">scheduler</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">seedPeer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">dfdaemon</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">hostNetwork</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">proxy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">defaultFilter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;Expires&amp;Signature&amp;ns&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">security</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">insecure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">cacert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">cert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">tcpListen</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">65001</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">registryMirror</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">//index.docker.io</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">insecure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">certs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">direct</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">proxies</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">regx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> blobs/sha256.*</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">regx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> .</span><span class="token important">*amazonaws.*</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">jaeger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><br></div></code></pre></div></div>
<p>Create a dragonfly cluster using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ helm install --wait --create-namespace --namespace dragonfly-system dragonfly dragonfly/dragonfly -f charts-config.yaml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">LAST DEPLOYED: Mon Sep  4 10:24:55 2023</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAMESPACE: dragonfly-system</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">STATUS: deployed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">REVISION: 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">TEST SUITE: None</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NOTES:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">1. Get the scheduler address by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l &quot;app=dragonfly,release=dragonfly,component=scheduler&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $SCHEDULER_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace dragonfly-system port-forward $SCHEDULER_POD_NAME 8002:$SCHEDULER_CONTAINER_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:8002 to use your scheduler&quot;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">2. Get the dfdaemon port by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l &quot;app=dragonfly,release=dragonfly,component=dfdaemon&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $DFDAEMON_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  You can use $DFDAEMON_CONTAINER_PORT as a proxy port in Node.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">3. Configure runtime to use dragonfly:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  https://d7y.io/docs/getting-started/quick-start/kubernetes/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">4. Get Jaeger query URL by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export JAEGER_QUERY_PORT=$(kubectl --namespace dragonfly-system get services dragonfly-jaeger-query -o jsonpath=&quot;{.spec.ports[0].port}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace dragonfly-system port-forward service/dragonfly-jaeger-query 16686:$JAEGER_QUERY_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:16686/search?limit=20&amp;lookback=1h&amp;maxDuration&amp;minDuration&amp;service=dragonfly to query download events&quot;</span><br></div></code></pre></div></div>
<p>Check that dragonfly is deployed successfully:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ kubectl get po -n dragonfly-system</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME                                 READY   STATUS    RESTARTS      AGE</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-dfdaemon-7r2cn             1/1     Running   0          3m31s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-dfdaemon-fktl4             1/1     Running   0          3m31s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-jaeger-c7947b579-2xk44     1/1     Running   0          3m31s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-manager-5d4f444c6c-wq8d8   1/1     Running   0          3m31s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-mysql-0                    1/1     Running   0          3m31s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-master-0             1/1     Running   0          3m31s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-replicas-0           1/1     Running   0          3m31s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-replicas-1           1/1     Running   0          3m5s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-replicas-2           1/1     Running   0          2m44s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-scheduler-0                1/1     Running   0          3m31s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-seed-peer-0                1/1     Running   0          3m31s</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="expose-the-proxy-service-port">Expose the Proxy service port<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#expose-the-proxy-service-port" class="hash-link" aria-label="Direct link to Expose the Proxy service port" title="Direct link to Expose the Proxy service port" translate="no">&#x200B;</a></h3>
<p>Create the dfstore.yaml configuration to expose the port on which the Dragonfly Peer&#x2019;s HTTP proxy listens. The default port is 65001 and settargetPort to 65001.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dfstore</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">selector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dfdaemon</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">release</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">protocol</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">65001</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">targetPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">65001</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> NodePort</span><br></div></code></pre></div></div>
<p>Create service:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl --namespace dragonfly-system apply -f dfstore.yaml</span><br></div></code></pre></div></div>
<p>Forward request to Dragonfly Peer&#x2019;s HTTP proxy:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl --namespace dragonfly-system port-forward service/dfstore 65001:65001</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-dragonfly-endpoint-plugin">Install Dragonfly Endpoint plugin<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#install-dragonfly-endpoint-plugin" class="hash-link" aria-label="Direct link to Install Dragonfly Endpoint plugin" title="Direct link to Install Dragonfly Endpoint plugin" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="set-environment-variables-for-dragonfly-endpoint-configuration">Set environment variables for Dragonfly Endpoint configuration<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#set-environment-variables-for-dragonfly-endpoint-configuration" class="hash-link" aria-label="Direct link to Set environment variables for Dragonfly Endpoint configuration" title="Direct link to Set environment variables for Dragonfly Endpoint configuration" translate="no">&#x200B;</a></h3>
<p>Create config.json configuration&#xFF0C;and set DRAGONFLY_ENDPOINT_CONFIG environment variable for config.json file path.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">export DRAGONFLY_ENDPOINT_CONFIG=/etc/dragonfly-endpoint/config.json</span><br></div></code></pre></div></div>
<p>The default configuration path is:</p>
<ul>
<li class>linux: /etc/dragonfly-endpoint/config.json</li>
<li class>darwin: ~/.dragonfly-endpoint/config.json</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-endpoint-configuration">Dragonfly Endpoint configuration<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#dragonfly-endpoint-configuration" class="hash-link" aria-label="Direct link to Dragonfly Endpoint configuration" title="Direct link to Dragonfly Endpoint configuration" translate="no">&#x200B;</a></h3>
<p>Create the config.json configuration to configure the Dragonfly Endpoint for S3, the configuration is as follows:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;addr&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;http://127.0.0.1:65001&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;header&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;filter&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Algorithm&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Credential&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Date&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Expires&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-SignedHeaders&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Signature&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;object_storage&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;type&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;s3&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;bucket_name&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_s3_bucket_name&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;region&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_s3_region&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;access_key&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_s3_access_key&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;secret_key&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_s3_secret_key&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>In the filter of the configuration, set different values when using different object storage:</p>
<p>In the filter of the configuration, set different values when using different object storage:</p>
<table><thead><tr><th>Type</th><th>Value</th></tr></thead><tbody><tr><td>OSS</td><td>&quot;Expires&amp;Signature&amp;ns&quot;</td></tr><tr><td>S3</td><td>&quot;X-Amz-Algorithm&amp;X-Amz-Credential&amp;X-Amz-Date&amp;X-Amz-Expires&amp;X-Amz-SignedHeaders&amp;X-Amz-Signature&quot;</td></tr><tr><td>OBS</td><td>&quot;X-Amz-Algorithm&amp;X-Amz-Credential&amp;X-Amz-Date&amp;X-Obs-Date&amp;X-Amz-Expires&amp;X-Amz-SignedHeaders&amp;X-Amz-Signature&quot;</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="object-storage-configuration">Object storage configuration<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#object-storage-configuration" class="hash-link" aria-label="Direct link to Object storage configuration" title="Direct link to Object storage configuration" translate="no">&#x200B;</a></h4>
<p>In addition to S3, Dragonfly Endpoint plugin also supports OSS, GCS and ABS. Different object storage configurations are as follows:</p>
<p>OSS(Object Storage Service)</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;addr&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;http://127.0.0.1:65001&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;header&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;filter&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">&quot;Expires&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;Signature&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;object_storage&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;type&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;oss&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;bucket_name&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_oss_bucket_name&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;endpoint&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_oss_endpoint&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;access_key_id&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_oss_access_key_id&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;access_key_secret&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_oss_access_key_secret&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>GCS(Google Cloud Storage)</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;addr&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;http://127.0.0.1:65001&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;header&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;object_storage&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;type&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;gcs&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;bucket_name&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_gcs_bucket_name&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;project_id&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_gcs_project_id&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;service_account_path&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_gcs_service_account_path&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>ABS(Azure Blob Storage)</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;addr&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;http://127.0.0.1:65001&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;header&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;object_storage&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;type&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;abs&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;account_name&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_abs_account_name&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;account_key&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_abs_account_key&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;container_name&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_abs_container_name&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="torchserve-integrates-dragonfly-endpoint-plugin">TorchServe integrates Dragonfly Endpoint plugin<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#torchserve-integrates-dragonfly-endpoint-plugin" class="hash-link" aria-label="Direct link to TorchServe integrates Dragonfly Endpoint plugin" title="Direct link to TorchServe integrates Dragonfly Endpoint plugin" translate="no">&#x200B;</a></h2>
<p>For detailed installation documentation, please refer to <a href="https://pytorch.org/serve/" target="_blank" rel="noopener noreferrer" class>TorchServe document</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="binary-installation">Binary installation<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#binary-installation" class="hash-link" aria-label="Direct link to Binary installation" title="Direct link to Binary installation" translate="no">&#x200B;</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-prerequisites">The Prerequisites<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#the-prerequisites" class="hash-link" aria-label="Direct link to The Prerequisites" title="Direct link to The Prerequisites" translate="no">&#x200B;</a></h4>
<table><thead><tr><th>Name</th><th>Version</th><th>Document</th></tr></thead><tbody><tr><td>Python</td><td>3.8.0+</td><td><a href="https://www.python.org/" target="_blank" rel="noopener noreferrer" class>https://www.python.org/</a></td></tr><tr><td>TorchServe</td><td>0.4.0+</td><td><a href="https://pytorch.org/serve/" target="_blank" rel="noopener noreferrer" class>pytorch.org/serve/</a></td></tr><tr><td>Java</td><td>11</td><td><a href="https://openjdk.org/projects/jdk/11/" target="_blank" rel="noopener noreferrer" class>https://openjdk.org/projects/jdk/11/</a></td></tr></tbody></table>
<p>Install TorchServe dependencies and torch-model-archiver&#xFF1A;</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">python ./ts_scripts/install_dependencies.py</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">conda install torchserve torch-model-archiver torch-workflow-archiver -c pytorch</span><br></div></code></pre></div></div>
<p>Clone TorchServe repository&#xFF1A;</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">git clone https://github.com/pytorch/serve.gitcd serve</span><br></div></code></pre></div></div>
<p>Create <a href="https://pytorch.org/serve/getting_started.html?highlight=model+store" target="_blank" rel="noopener noreferrer" class>model-store</a> directory to store the models&#xFF1A;</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mkdir model-storechmod 777 model-store</span><br></div></code></pre></div></div>
<p>Create <a href="https://github.com/pytorch/serve/tree/master/plugins/docs" target="_blank" rel="noopener noreferrer" class>plugins-path</a> directory to store the binaries of the plugin&#xFF1A;</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mkdir plugins-path</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="package-dragonfly-endpoint-plugin">Package Dragonfly Endpoint plugin<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#package-dragonfly-endpoint-plugin" class="hash-link" aria-label="Direct link to Package Dragonfly Endpoint plugin" title="Direct link to Package Dragonfly Endpoint plugin" translate="no">&#x200B;</a></h4>
<p>Clone dragonfly-endpoint repository&#xFF1A;</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">git clone https://github.com/dragonflyoss/dragonfly-endpoint.git</span><br></div></code></pre></div></div>
<p>Build the dragonfly-endpoint project to generate file in the build/libs directory:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">cd ./dragonfly-endpointgradle shadowJar</span><br></div></code></pre></div></div>
<p>Note: Due to the limitations of TorchServe&#x2019;s JVM, the best Java version for Gradle is 11, as a higher version will cause the plugin to fail to parse.</p>
<p>Move the Jar file into the plugins-path directory:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mv build/libs/dragonfly_endpoint-1.0-all.jar&#xA0; &lt;your plugins-path&gt;</span><br></div></code></pre></div></div>
<p>Prepare the plugin configuration config.json, and use S3 as the object storage:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;addr&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;http://127.0.0.1:65001&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;header&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;filter&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Algorithm&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Credential&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Date&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Expires&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-SignedHeaders&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Signature&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;object_storage&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;type&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;s3&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;bucket_name&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_s3_bucket_name&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;region&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_s3_region&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;access_key&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_s3_access_key&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;secret_key&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_s3_secret_key&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>Set the environment variables for the configuration:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">export DRAGONFLY_ENDPOINT_CONFIG=/etc/dragonfly-endpoint/config.json</span><br></div></code></pre></div></div>
<p>&#x2013;model-storesets the previously created directory to store the models and &#x2013;plugins-path sets the previously created directory to store the plugins. Start the TorchServe with Dragonfly Endpoint plugin:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">torchserve --start --model-store &lt;path-to-model-store-file&gt; --plugins-path=&lt;path-to-plugin-jars&gt;</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify">Verify<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#verify" class="hash-link" aria-label="Direct link to Verify" title="Direct link to Verify" translate="no">&#x200B;</a></h4>
<p>Prepare the model. Download a model from <a href="https://pytorch.org/serve/model_zoo.html#" target="_blank" rel="noopener noreferrer" class>Model ZOO</a> or package the model refer to <a href="https://github.com/pytorch/serve/tree/master/model-archiver" target="_blank" rel="noopener noreferrer" class>Torch Model archiver for TorchServe</a>. Use squeezenet1_1_scripted.mar model to verify&#xFF1A;</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">wget https://torchserve.pytorch.org/mar_files/squeezenet1_1_scripted.mar</span><br></div></code></pre></div></div>
<p>Upload the model to object storage. For detailed uploading the model to S3, please refer to <a href="https://aws.amazon.com/s3/?nc1=h_ls" target="_blank" rel="noopener noreferrer" class>S3</a>&#x3002;</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Download the command line tool</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">pip install awscli</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Configure the key as prompted</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">aws configure</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Upload file</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">aws s3 cp &lt; local file path &gt; s3://&lt; bucket name &gt;/&lt; Target path &gt;</span><br></div></code></pre></div></div>
<p>TorchServe plugin is named dragonfly, please refer to <a href="https://pytorch.org/serve/management_api.html#register-a-model" target="_blank" rel="noopener noreferrer" class>TorchServe Register API</a> for details of plugin API. The url parameter are not supported and add the file_name parameter which is the model file name to download.</p>
<p>Download the model:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">curl -X POST&#xA0; &quot;http://localhost:8081/dragonfly/models?file_name=squeezenet1_1.mar&quot;</span><br></div></code></pre></div></div>
<p>Verify the model download successful:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;Status&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;Model \&quot;squeezenet1_1\&quot; Version: 1.0 registered with 0 initial workers. Use scale workers API to add workers for the model.&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>Added model worker for inference:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">curl -v -X PUT &quot;http://localhost:8081/models/squeezenet1_1?min_worker=1&quot;</span><br></div></code></pre></div></div>
<p>Check the number of worker is increased:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">* About to connect() to localhost port 8081 (#0)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">*   Trying ::1...</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">* Connected to localhost (::1) port 8081 (#0)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&gt; PUT /models/squeezenet1_1?min_worker=1 HTTP/1.1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&gt; User-Agent: curl/7.29.0</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&gt; Host: localhost:8081</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&gt; Accept: */*</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; HTTP/1.1 202 Accepted</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; content-type: application/json</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; x-request-id: 66761b5a-54a7-4626-9aa4-12041e0e4e63</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; Pragma: no-cache</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; Cache-Control: no-cache; no-store, must-revalidate, private</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; Expires: Thu, 01 Jan 1970 00:00:00 UTC</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; content-length: 47</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; connection: keep-alive</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">{  &quot;status&quot;: &quot;Processing worker updates...&quot;}</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">* Connection #0 to host localhost left intact</span><br></div></code></pre></div></div>
<p>Call inference API:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Prepare pictures that require reasoning</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">curl -O https://raw.githubusercontent.com/pytorch/serve/master/docs/images/kitten_small.jpg</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">curl -O https://raw.githubusercontent.com/pytorch/serve/master/docs/images/dogs-before.jpg</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Call inference API</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">curl http://localhost:8080/predictions/squeezenet1_1 -T kitten_small.jpg -T dogs-before.jpg</span><br></div></code></pre></div></div>
<p>Check the response successful:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;lynx&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.5455784201622009</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;tabby&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.2794168293476105</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;Egyptian_cat&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.10391931980848312</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;tiger_cat&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.062633216381073</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;leopard&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.005019133910536766</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-torchserve-with-docker">Install TorchServe with Docker<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#install-torchserve-with-docker" class="hash-link" aria-label="Direct link to Install TorchServe with Docker" title="Direct link to Install TorchServe with Docker" translate="no">&#x200B;</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-configuration">Docker configuration<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#docker-configuration" class="hash-link" aria-label="Direct link to Docker configuration" title="Direct link to Docker configuration" translate="no">&#x200B;</a></h4>
<p>Pull dragonflyoss/dragonfly-endpoint image with the plugin. The following is an example of the CPU version of TorchServe, refer to <a href="https://github.com/dragonflyoss/dragonfly-endpoint/blob/main/images/Dockerfile" target="_blank" rel="noopener noreferrer" class>Dockerfile</a>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/dragonfly-endpoint</span><br></div></code></pre></div></div>
<p>Create <a href="https://pytorch.org/serve/getting_started.html?highlight=model+store" target="_blank" rel="noopener noreferrer" class>model-store</a> directory to store the model files&#xFF1A;</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mkdir model-storechmod 777 model-store</span><br></div></code></pre></div></div>
<p>Prepare the plugin configuration config.json, and use S3 as the object storage:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;addr&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;http://127.0.0.1:65001&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;header&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;filter&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Algorithm&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Credential&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Date&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Expires&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-SignedHeaders&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Amz-Signature&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;object_storage&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;type&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;s3&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;bucket_name&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_s3_bucket_name&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;region&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_s3_region&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;access_key&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_s3_access_key&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;secret_key&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;your_s3_secret_key&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>Set the environment variables for the configuration:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">export DRAGONFLY_ENDPOINT_CONFIG=/etc/dragonfly-endpoint/config.json</span><br></div></code></pre></div></div>
<p>Mount the model-store and dragonfly-endpoint configuration directory. Run the container:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">sudo docker run --rm -it --network host \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -v $(pwd)/model-store:/home/model-server/model-store \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -v ${DRAGONFLY_ENDPOINT_CONFIG}:${DRAGONFLY_ENDPOINT_CONFIG} \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  dragonflyoss/dragonfly-endpoint:latest</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-verify">How to Verify<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#how-to-verify" class="hash-link" aria-label="Direct link to How to Verify" title="Direct link to How to Verify" translate="no">&#x200B;</a></h4>
<p>Prepare the model. Download a model from <a href="https://pytorch.org/serve/model_zoo.html#" target="_blank" rel="noopener noreferrer" class>Model ZOO</a> or package the model refer to <a href="https://github.com/pytorch/serve/tree/master/model-archiver" target="_blank" rel="noopener noreferrer" class>Torch Model archiver for TorchServe</a>. Use squeezenet1_1_scripted.mar model to verify&#xFF1A;</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">wget https://torchserve.pytorch.org/mar_files/squeezenet1_1_scripted.mar</span><br></div></code></pre></div></div>
<p>Upload the model to object storage. For detailed uploading the model to S3, please refer to <a href="https://aws.amazon.com/s3/?nc1=h_ls" target="_blank" rel="noopener noreferrer" class>S3</a>&#x3002;</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Download the command line tool</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">pip install awscli</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Configure the key as prompted</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">aws configure</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Upload file</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">aws s3 cp &lt;local file path&gt; s3://&lt;bucket name&gt;/&lt;Target path&gt;</span><br></div></code></pre></div></div>
<p>TorchServe plugin is named dragonfly, please refer to <a href="https://pytorch.org/serve/management_api.html#register-a-model" target="_blank" rel="noopener noreferrer" class>TorchServe Register API</a> for details of plugin API. The url parameter are not supported and add the file_name parameter which is the model file name to download.</p>
<p>Download a model&#xFF1A;</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">curl -X POST&#xA0; &quot;http://localhost:8081/dragonfly/models?file_name=squeezenet1_1.mar&quot;</span><br></div></code></pre></div></div>
<p>Verify the model download successful:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;Status&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;Model \&quot;squeezenet1_1\&quot; Version: 1.0 registered with 0 initial workers. Use scale workers API to add workers for the model.&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>Added model worker for inference:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">curl -v -X PUT &quot;http://localhost:8081/models/squeezenet1_1?min_worker=1&quot;</span><br></div></code></pre></div></div>
<p>Check the number of worker is increased:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">* About to connect() to localhost port 8081 (#0)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">*   Trying ::1...</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">* Connected to localhost (::1) port 8081 (#0)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&gt; PUT /models/squeezenet1_1?min_worker=1 HTTP/1.1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&gt; User-Agent: curl/7.29.0</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&gt; Host: localhost:8081</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&gt; Accept: */*</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; HTTP/1.1 202 Accepted</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; content-type: application/json</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; x-request-id: 66761b5a-54a7-4626-9aa4-12041e0e4e63</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; Pragma: no-cache</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; Cache-Control: no-cache; no-store, must-revalidate, private</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; Expires: Thu, 01 Jan 1970 00:00:00 UTC</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; content-length: 47</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; connection: keep-alive</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">{  &quot;status&quot;: &quot;Processing worker updates...&quot;}</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">* Connection #0 to host localhost left intact</span><br></div></code></pre></div></div>
<p>Call inference API:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Prepare pictures that require reasoning</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">curl -O https://raw.githubusercontent.com/pytorch/serve/master/docs/images/kitten_small.jpg</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">curl -O https://raw.githubusercontent.com/pytorch/serve/master/docs/images/dogs-before.jpg</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Call inference API</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">curl http://localhost:8080/predictions/squeezenet1_1 -T kitten_small.jpg -T dogs-before.jpg</span><br></div></code></pre></div></div>
<p>Check the response successful:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;lynx&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.5455784201622009</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;tabby&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.2794168293476105</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;Egyptian_cat&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.10391931980848312</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;tiger_cat&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.062633216381073</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;leopard&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.005019133910536766</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-testing">Performance testing<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#performance-testing" class="hash-link" aria-label="Direct link to Performance testing" title="Direct link to Performance testing" translate="no">&#x200B;</a></h2>
<p>Test the performance of single-machine model download by TorchServe API after the integration of Dragonfly P2P. Due to the influence of the network environment of the machine itself, the actual download time is not important, but the ratio of the increase in the download time in different scenarios is very important.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/12/Dragonfly3.png" alt="Bar chart showing TorchServe API, TouchServe API &amp; Dragonfly Cold Boot, Hit Dragonfly Remote Peer Cache and Hit Dragonfly Local Peer Cache performance based on time to download" class="img_ev3q"></p>
<ul>
<li class>TorchServe API: Use signed URL provided by Object Storage to download the model directly.</li>
<li class>TorchServe API &amp; Dragonfly Cold Boot: Use TorchServe API to download model via Dragonfly P2P network and no cache hits.</li>
<li class>Hit Remote Peer: Use TorchServe API to download model via Dragonfly P2P network and hit the remote peer cache.</li>
<li class>Hit Local Peer: Use TorchServe API to download model via Dragonfly P2P network and hit the local peer cache.</li>
</ul>
<p>Test results show TorchServe and Dragonfly integration. It can effectively reduce the file download time. Note that this test was a single-machine test, which means that in the case of cache hits, the performance limitation is on the disk. If Dragonfly is deployed on multiple machines for P2P download, the models download speed will be faster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links">Links<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-community">Dragonfly community<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#dragonfly-community" class="hash-link" aria-label="Direct link to Dragonfly community" title="Direct link to Dragonfly community" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></li>
<li class>GitHub Repo: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></li>
<li class>Slack Channel: <a href="https://cloud-native.slack.com/messages/dragonfly/" target="_blank" rel="noopener noreferrer" class>#dragonfly</a> on <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class>CNCF Slack</a></li>
<li class>Discussion Group: <a href="mailto:dragonfly-discuss@googlegroups.com" target="_blank" rel="noopener noreferrer" class>dragonfly-discuss@googlegroups.com</a></li>
<li class>Twitter: <a href="https://twitter.com/dragonfly_oss" target="_blank" rel="noopener noreferrer" class>@dragonfly_oss</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pytorch">Pytorch<a href="https://d7y.io/blog/2023/12/06/torchserve-accelerates-the-distribution-of-models-based-on-dragonfly#pytorch" class="hash-link" aria-label="Direct link to Pytorch" title="Direct link to Pytorch" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://pytorch.org/" target="_blank" rel="noopener noreferrer" class>https://pytorch.org/</a></li>
<li class>GitHub Repo: <a href="https://github.com/pytorch/pytorch" target="_blank" rel="noopener noreferrer" class>https://github.com/pytorch/pytorch</a></li>
<li class>TorchServe Document: <a href="https://pytorch.org/serve/" target="_blank" rel="noopener noreferrer" class>https://pytorch.org/serve/</a></li>
</ul>
<p>TorchServe GitHub Repo: <a href="https://github.com/pytorch/serve" target="_blank" rel="noopener noreferrer" class>https://github.com/pytorch/serve</a></p>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Hugging Face accelerates distribution of models and datasets based on Dragonfly]]></title>
        <id>https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly</id>
        <link href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly"/>
        <updated>2023-11-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[CNCF projects highlighted in this post, and migrated by mingcheng.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://www.cncf.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly/" target="_blank" rel="noopener noreferrer" class>CNCF projects highlighted in this post</a>, and migrated by <a href="https://github.com/mingcheng" target="_blank" rel="noopener noreferrer" class>mingcheng</a>.</p>
<p>This document will help you experience how to use dragonfly with hugging face. During the downloading of datasets or models, the file size is large and there are many services downloading the files at the same time. The bandwidth of the storage will reach the limit and the download will be slow.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/11/image-36.png" alt="Diagram flow showing Hugging Face Hub flow from Cluster A and Cluster B" class="img_ev3q"></p>
<p>Dragonfly can be used to eliminate the bandwidth limit of the storage through P2P technology, thereby accelerating file downloading.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/11/image-37.jpg" alt="Diagram flow showing Hugging Face Hub flow from Cluster A and Cluster B" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">&#x200B;</a></h2>
<p>Notice: <a href="https://kind.sigs.k8s.io/" target="_blank" rel="noopener noreferrer" class>Kind</a> is recommended if no kubernetes cluster is available for testing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-dragonfly">Install dragonfly<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#install-dragonfly" class="hash-link" aria-label="Direct link to Install dragonfly" title="Direct link to Install dragonfly" translate="no">&#x200B;</a></h2>
<p>For detailed installation documentation based on kubernetes cluster, please refer to <a href="https://d7y.io/docs/next/getting-started/quick-start/kubernetes/" target="_blank" rel="noopener noreferrer" class>quick-start-kubernetes</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup-kubernetes-cluster">Setup kubernetes cluster<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#setup-kubernetes-cluster" class="hash-link" aria-label="Direct link to Setup kubernetes cluster" title="Direct link to Setup kubernetes cluster" translate="no">&#x200B;</a></h3>
<p>Create kind multi-node cluster configuration file kind-config.yaml, configuration content is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Cluster</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> kind.x</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">k8s.io/v1alpha4</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">nodes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> control</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">plane</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> worker</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">extraPortMappings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">containerPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">30950</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">hostPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">65001</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> worker</span><br></div></code></pre></div></div>
<p>Create a kind multi-node cluster using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind create cluster --config kind-config.yaml</span><br></div></code></pre></div></div>
<p>Switch the context of kubectl to kind cluster:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl config use-context kind-kind</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kind-loads-dragonfly-image">Kind loads dragonfly image<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#kind-loads-dragonfly-image" class="hash-link" aria-label="Direct link to Kind loads dragonfly image" title="Direct link to Kind loads dragonfly image" translate="no">&#x200B;</a></h3>
<p>Pull dragonfly latest images:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/scheduler:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/manager:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/dfdaemon:latest</span><br></div></code></pre></div></div>
<p>Kind cluster loads dragonfly latest images:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/scheduler:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/manager:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/dfdaemon:latest</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-dragonfly-cluster-based-on-helm-charts">Create dragonfly cluster based on helm charts<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#create-dragonfly-cluster-based-on-helm-charts" class="hash-link" aria-label="Direct link to Create dragonfly cluster based on helm charts" title="Direct link to Create dragonfly cluster based on helm charts" translate="no">&#x200B;</a></h3>
<p>Create helm charts configuration file charts-config.yaml and set dfdaemon.config.proxy.registryMirror.url to the address of the Hugging Face Hub&#x2019;s LFS server, configuration content is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">scheduler</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">seedPeer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">dfdaemon</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">hostNetwork</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">proxy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">defaultFilter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;Expires&amp;Key-Pair-Id&amp;Policy&amp;Signature&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">security</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">insecure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">tcpListen</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">listen</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 0.0.0.0</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">65001</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">registryMirror</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># When enable, using header &quot;X-Dragonfly-Registry&quot; for remote instead of url.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">dynamic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># URL for the registry mirror.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">//cdn</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">lfs.huggingface.co</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Whether to ignore https certificate errors.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">insecure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Optional certificates if the remote server uses self-signed certificates.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">certs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Whether to request the remote registry directly.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">direct</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Whether to use proxies to decide if dragonfly should be used.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">useProxies</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">proxies</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">regx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> repos.*</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">useHTTPS</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><br></div></code></pre></div></div>
<p>Create a dragonfly cluster using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ helm install --wait --create-namespace --namespace dragonfly-system dragonfly dragonfly/dragonfly -f charts-config.yaml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME: dragonfly</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">LAST DEPLOYED: Wed Oct 19 04:23:22 2022</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAMESPACE: dragonfly-system</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">STATUS: deployed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">REVISION: 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">TEST SUITE: None</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NOTES:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">1. Get the scheduler address by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l &quot;app=dragonfly,release=dragonfly,component=scheduler&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $SCHEDULER_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace dragonfly-system port-forward $SCHEDULER_POD_NAME 8002:$SCHEDULER_CONTAINER_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:8002 to use your scheduler&quot;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">2. Get the dfdaemon port by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l &quot;app=dragonfly,release=dragonfly,component=dfdaemon&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $DFDAEMON_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  You can use $DFDAEMON_CONTAINER_PORT as a proxy port in Node.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">3. Configure runtime to use dragonfly:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  https://d7y.io/docs/getting-started/quick-start/kubernetes/</span><br></div></code></pre></div></div>
<p>Check that dragonfly is deployed successfully:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ kubectl get po -n dragonfly-system</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME                                 READY   STATUS    RESTARTS       AGE</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-dfdaemon-rhnr6             1/1     Running   4 (101s ago)   3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-dfdaemon-s6sv5             1/1     Running   5 (111s ago)   3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-manager-67f97d7986-8dgn8   1/1     Running   0              3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-mysql-0                    1/1     Running   0              3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-master-0             1/1     Running   0              3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-replicas-0           1/1     Running   1 (115s ago)   3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-replicas-1           1/1     Running   0              95s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-replicas-2           1/1     Running   0              70s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-scheduler-0                1/1     Running   0              3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-seed-peer-0                1/1     Running   2 (95s ago)    3m27s</span><br></div></code></pre></div></div>
<p>Create peer service configuration file peer-service-config.yaml, configuration content is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> peer</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">system</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> NodePort</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token number" style="color:rgb(247, 140, 108)">65001</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">nodePort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">30950</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">65001</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">selector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dfdaemon</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">release</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><br></div></code></pre></div></div>
<p>Create a peer service using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl apply -f peer-service-config.yaml</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-hub-python-library-to-download-files-and-distribute-traffic-through-dragonfly">Use Hub Python Library to download files and distribute traffic through Dragonfly<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#use-hub-python-library-to-download-files-and-distribute-traffic-through-dragonfly" class="hash-link" aria-label="Direct link to Use Hub Python Library to download files and distribute traffic through Dragonfly" title="Direct link to Use Hub Python Library to download files and distribute traffic through Dragonfly" translate="no">&#x200B;</a></h2>
<p>Any API in the <a href="https://huggingface.co/docs/huggingface_hub/index" target="_blank" rel="noopener noreferrer" class>Hub Python Library</a> that uses Requests library for downloading files can distribute the download traffic in the P2P network by setting DragonflyAdapter to the requests Session.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="download-a-single-file-with-dragonfly">Download a single file with Dragonfly<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#download-a-single-file-with-dragonfly" class="hash-link" aria-label="Direct link to Download a single file with Dragonfly" title="Direct link to Download a single file with Dragonfly" translate="no">&#x200B;</a></h3>
<p>A single file can be downloaded using the <a href="https://huggingface.co/docs/huggingface_hub/v0.17.1/en/package_reference/file_download#huggingface_hub.hf_hub_download" target="_blank" rel="noopener noreferrer" class>hf_hub_download</a>, distribute traffic through the Dragonfly peer.</p>
<p>Create hf_hub_download_dragonfly.py file. Use DragonflyAdapter to forward the file download request of the LFS protocol to Dragonfly HTTP proxy, so that it can use the P2P network to distribute file, content is as follows:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> requests</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">adapters </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> HTTPAdapter</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> urllib</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">parse </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> urlparse</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> huggingface_hub </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> hf_hub_download</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> huggingface_hub </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> configure_http_backend</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">DragonflyAdapter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">HTTPAdapter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">get_connection</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> proxies</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token boolean" style="color:rgb(255, 88, 116)">None</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Change the schema of the LFS request to download large files from https:// to http://,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># so that Dragonfly HTTP proxy can be used.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">startswith</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">&apos;https://cdn-lfs.huggingface.co&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      url </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">&apos;https://&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;http://&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">super</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">get_connection</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> proxies</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">add_headers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> kwargs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token builtin" style="color:rgb(130, 170, 255)">super</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">add_headers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> kwargs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># If there are multiple different LFS repositories, you can override the</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># default repository address by adding X-Dragonfly-Registry header.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">find</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">&apos;example.com&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">headers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Dragonfly-Registry&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;https://example.com&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Create a factory function that returns a new Session.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">backend_factory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Session</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  session </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Session</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  session</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">mount</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">&apos;http://&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> DragonflyAdapter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  session</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">mount</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">&apos;https://&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> DragonflyAdapter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  session</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">proxies </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string" style="color:rgb(195, 232, 141)">&apos;http&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;http://127.0.0.1:65001&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> session</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Set it as the default session factory</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">configure_http_backend</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">backend_factory</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">backend_factory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">hf_hub_download</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">repo_id</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">&quot;tiiuae/falcon-rw-1b&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> filename</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">&quot;pytorch_model.bin&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></div></code></pre></div></div>
<p>Download a single file of th LFS protocol with Dragonfly:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ python3 hf_hub_download_dragonfly.py</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)YkNX13a46FCg__&amp;Key-Pair-Id=KVTP0A1DKRTAX: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 2.62G/2.62G [00:52&lt;00:00, 49.8MB/s]</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify-a-single-file-download-with-dragonfly">Verify a single file download with Dragonfly<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#verify-a-single-file-download-with-dragonfly" class="hash-link" aria-label="Direct link to Verify a single file download with Dragonfly" title="Direct link to Verify a single file download with Dragonfly" translate="no">&#x200B;</a></h4>
<p>Execute the command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># find podskubectl -n dragonfly-system get pod -l component=dfdaemon# find logspod_name=dfdaemon-xxxxxkubectl -n dragonfly-system exec -it ${pod_name} -- grep &quot;peer task done&quot; /var/log/dragonfly/daemon/core.log</span><br></div></code></pre></div></div>
<p>Example output:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">peer task done, cost: 28349ms &#xA0; {&quot;peer&quot;: &quot;89.116.64.101-77008-a95a6918-a52b-47f5-9b18-cec6ada03daf&quot;, &quot;task&quot;: &quot;2fe93348699e07ab67823170925f6be579a3fbc803ff3d33bf9278a60b08d901&quot;, &quot;component&quot;: &quot;PeerTask&quot;, &quot;trace&quot;: &quot;b34ed802b7afc0f4acd94b2cedf3fa2a&quot;}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="download-a-snapshot-of-the-repo-with-dragonfly">Download a snapshot of the repo with Dragonfly<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#download-a-snapshot-of-the-repo-with-dragonfly" class="hash-link" aria-label="Direct link to Download a snapshot of the repo with Dragonfly" title="Direct link to Download a snapshot of the repo with Dragonfly" translate="no">&#x200B;</a></h3>
<p>A snapshot of the repo can be downloaded using the <a href="https://huggingface.co/docs/huggingface_hub/v0.17.1/en/package_reference/file_download#huggingface_hub.snapshot_download" target="_blank" rel="noopener noreferrer" class>snapshot_download</a>, distribute traffic through the Dragonfly peer.</p>
<p>Create snapshot_download_dragonfly.py file. Use DragonflyAdapter to forward the file download request of the LFS protocol to Dragonfly HTTP proxy, so that it can use the P2P network to distribute file. Only the files of the LFS protocol will be distributed through the Dragonfly P2P network. content is as follows:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> requests</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">adapters </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> HTTPAdapter</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> urllib</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">parse </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> urlparse</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> huggingface_hub </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> snapshot_download</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> huggingface_hub </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> configure_http_backend</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">DragonflyAdapter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">HTTPAdapter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">get_connection</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> proxies</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token boolean" style="color:rgb(255, 88, 116)">None</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Change the schema of the LFS request to download large files from https:// to http://,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># so that Dragonfly HTTP proxy can be used.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">startswith</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">&apos;https://cdn-lfs.huggingface.co&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      url </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">&apos;https://&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;http://&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">super</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">get_connection</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> proxies</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">add_headers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> kwargs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token builtin" style="color:rgb(130, 170, 255)">super</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">add_headers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> kwargs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># If there are multiple different LFS repositories, you can override the</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># default repository address by adding X-Dragonfly-Registry header.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">find</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">&apos;example.com&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">headers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">&quot;X-Dragonfly-Registry&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;https://example.com&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Create a factory function that returns a new Session.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">backend_factory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Session</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  session </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Session</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  session</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">mount</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">&apos;http://&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> DragonflyAdapter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  session</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">mount</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">&apos;https://&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> DragonflyAdapter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  session</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">proxies </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string" style="color:rgb(195, 232, 141)">&apos;http&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;http://127.0.0.1:65001&apos;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> session</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Set it as the default session factory</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">configure_http_backend</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">backend_factory</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">backend_factory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">snapshot_download</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">repo_id</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">&quot;tiiuae/falcon-rw-1b&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></div></code></pre></div></div>
<p>Download a snapshot of the repo with Dragonfly:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ python3 snapshot_download_dragonfly.py</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)03165eb22f0a867d4e6a64d34fce19/README.md: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 7.60k/7.60k [00:00&lt;00:00, 374kB/s]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)7d4e6a64d34fce19/configuration_falcon.py: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 6.70k/6.70k [00:00&lt;00:00, 762kB/s]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)f0a867d4e6a64d34fce19/modeling_falcon.py: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 56.9k/56.9k [00:00&lt;00:00, 5.35MB/s]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)3165eb22f0a867d4e6a64d34fce19/merges.txt: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 456k/456k [00:00&lt;00:00, 9.07MB/s]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)867d4e6a64d34fce19/tokenizer_config.json: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 234/234 [00:00&lt;00:00, 106kB/s]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)eb22f0a867d4e6a64d34fce19/tokenizer.json: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 2.11M/2.11M [00:00&lt;00:00, 27.7MB/s]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)3165eb22f0a867d4e6a64d34fce19/vocab.json: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 798k/798k [00:00&lt;00:00, 19.7MB/s]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)7d4e6a64d34fce19/special_tokens_map.json: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 99.0/99.0 [00:00&lt;00:00, 45.3kB/s]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)67d4e6a64d34fce19/generation_config.json: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 115/115 [00:00&lt;00:00, 5.02kB/s]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)165eb22f0a867d4e6a64d34fce19/config.json: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 1.05k/1.05k [00:00&lt;00:00, 75.9kB/s]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)eb22f0a867d4e6a64d34fce19/.gitattributes: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 1.48k/1.48k [00:00&lt;00:00, 171kB/s]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(&#x2026;)t-oSSW23tawg__&amp;Key-Pair-Id=KVTP0A1DKRTAX: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 2.62G/2.62G [00:50&lt;00:00, 52.1MB/s]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Fetching 12 files: 100%|&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;| 12/12 [00:50&lt;00:00,  4.23s/it]</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify-a-snapshot-of-the-repo-download-with-dragonfly">Verify a snapshot of the repo download with Dragonfly<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#verify-a-snapshot-of-the-repo-download-with-dragonfly" class="hash-link" aria-label="Direct link to Verify a snapshot of the repo download with Dragonfly" title="Direct link to Verify a snapshot of the repo download with Dragonfly" translate="no">&#x200B;</a></h4>
<p>Execute the command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># find podskubectl -n dragonfly-system get pod -l component=dfdaemon# find logspod_name=dfdaemon-xxxxxkubectl -n dragonfly-system exec -it ${pod_name} -- grep &quot;peer task done&quot; /var/log/dragonfly/daemon/core.log</span><br></div></code></pre></div></div>
<p>Example output:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">peer task done, cost: 28349ms &#xA0; {&quot;peer&quot;: &quot;89.116.64.101-77008-a95a6918-a52b-47f5-9b18-cec6ada03daf&quot;, &quot;task&quot;: &quot;2fe93348699e07ab67823170925f6be579a3fbc803ff3d33bf9278a60b08d901&quot;, &quot;component&quot;: &quot;PeerTask&quot;, &quot;trace&quot;: &quot;b34ed802b7afc0f4acd94b2cedf3fa2a&quot;}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-testing">Performance testing<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#performance-testing" class="hash-link" aria-label="Direct link to Performance testing" title="Direct link to Performance testing" translate="no">&#x200B;</a></h2>
<p>Test the performance of single-machine file download by hf_hub_download API after the integration of Hugging Face Python Library and Dragonfly P2P. Due to the influence of the network environment of the machine itself, the actual download time is not important, but the ratio of the increase in the download time in different scenarios is very important.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/11/image-37.png" alt="Bar chart showing performance testing result" class="img_ev3q"></p>
<ul>
<li class>Hugging Face Python Library: Use hf_hub_download API to download models directly.</li>
<li class>Hugging Face Python Library &amp; Dragonfly Cold Boot: Use hf_hub_download API to download models via Dragonfly P2P network and no cache hits.</li>
<li class>Hit Dragonfly Remote Peer Cache: Use hf_hub_download API to download models via Dragonfly P2P network and hit the remote peer cache.</li>
<li class>Hit Dragonfly Local Peer Cache: Use hf_hub_download API to download models via Dragonfly P2P network and hit the local peer cache.</li>
<li class>Hit Hugging Face Cache: Use hf_hub_download API to download models via Dragonfly P2P network and hit the Hugging Face local cache.</li>
</ul>
<p>Test results show Hugging Face Python Library and Dragonfly P2P integration. It can effectively reduce the file download time. Note that this test was a single-machine test, which means that in the case of cache hits, the performance limitation is on the disk. If Dragonfly is deployed on multiple machines for P2P download, the models download speed will be faster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links">Links<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-community">Dragonfly community<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#dragonfly-community" class="hash-link" aria-label="Direct link to Dragonfly community" title="Direct link to Dragonfly community" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></li>
<li class>GitHub Repo: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></li>
<li class>Slack Channel: <a href="https://cloud-native.slack.com/messages/dragonfly/" target="_blank" rel="noopener noreferrer" class>#dragonfly</a> on <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class>CNCF Slack</a></li>
<li class>Discussion Group: <a href="mailto:dragonfly-discuss@googlegroups.com" target="_blank" rel="noopener noreferrer" class>dragonfly-discuss@googlegroups.com</a></li>
<li class>Twitter: <a href="https://twitter.com/dragonfly_oss" target="_blank" rel="noopener noreferrer" class>@dragonfly_oss</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hugging-face">Hugging Face<a href="https://d7y.io/blog/2023/11/16/hugging-face-accelerates-distribution-of-models-and-datasets-based-on-dragonfly#hugging-face" class="hash-link" aria-label="Direct link to Hugging Face" title="Direct link to Hugging Face" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://huggingface.co/" target="_blank" rel="noopener noreferrer" class>https://huggingface.co/</a></li>
<li class>GitHub Repo: <a href="https://github.com/huggingface/huggingface_hub" target="_blank" rel="noopener noreferrer" class>https://github.com/huggingface/huggingface_hub</a></li>
<li class>Document: <a href="https://huggingface.co/docs" target="_blank" rel="noopener noreferrer" class>https://huggingface.co/docs</a></li>
<li class>Hub Python Library: <a href="https://huggingface.co/docs/huggingface_hub/index" target="_blank" rel="noopener noreferrer" class>https://huggingface.co/docs/huggingface_hub/index</a></li>
</ul>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Dragonfly completes security audit!]]></title>
        <id>https://d7y.io/blog/2023/09/15/security-audit</id>
        <link href="https://d7y.io/blog/2023/09/15/security-audit"/>
        <updated>2023-09-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This summer, over four engineer weeks, Trail of Bits and]]></summary>
        <content type="html"><![CDATA[<p>This summer, over four engineer weeks, <a href="https://www.trailofbits.com/" target="_blank" rel="noopener noreferrer" class>Trail of Bits</a> and
OSTIF collaborated on a security audit of dragonfly.
A <a href="https://www.cncf.io/" target="_blank" rel="noopener noreferrer" class>CNCF</a> Incubating Project, <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>dragonfly</a> functions as
file distribution for peer-to-peer technologies.
Included in the scope was the sub-project <a href="https://nydus.dev/" target="_blank" rel="noopener noreferrer" class>Nydus</a>&#x2019;s repository that works in image distribution.
The engagement was outlined and framed around several goals relevant to the security and longevity of
the project as it moves towards graduation.</p>
<p>The Trail of Bits audit team approached the audit by using static and manual testing with automated and manual processes.
By introducing semgrep and CodeQL tooling, performing a manual review of client, scheduler, and manager code,
and fuzz testing on the gRPC handlers, the audit team was able to identify a variety of findings for the project to
improve their security. In focusing efforts on high-level business logic and externally accessible endpoints,
the Trail of Bits audit team was able to direct their focus during the audit and
provide guidance and recommendations for dragonfly&#x2019;s future work.</p>
<p>Recorded in the audit report are 19 findings. Five of the findings were ranked as high, one as medium, four low,
five informational, and four were considered undetermined. Nine of the findings were categorized as
Data Validation, three of which were high severity. Ranked and reviewed as well was dragonfly&#x2019;s Codebase Maturity,
comprising eleven aspects of project code which are analyzed individually in the report.</p>
<p>This is a large project and could not be reviewed in total due to time constraints and scope.
multiple specialized features were outside the scope of this audit for those reasons.
this project is a great opportunity for continued audit work to improve and elevate code and
harden security before graduation. Ongoing efforts for security is critical, as security is a moving target.</p>
<p>We would like to thank the Trail of Bits team, particularly Dan Guido, Jeff Braswell, Pawe&#x142; P&#x142;atek,
and Sam Alws for their work on this project. Thank you to the dragonfly maintainers and contributors,
specifically Wenbo Qi, for their ongoing work and contributions to this engagement.
Finally, we are grateful to the CNCF for funding this audit and supporting open source security efforts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links">Links<a href="https://d7y.io/blog/2023/09/15/security-audit#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ostif--trail-of-bits">OSTIF &amp; Trail of Bits<a href="https://d7y.io/blog/2023/09/15/security-audit#ostif--trail-of-bits" class="hash-link" aria-label="Direct link to OSTIF &amp; Trail of Bits" title="Direct link to OSTIF &amp; Trail of Bits" translate="no">&#x200B;</a></h3>
<ul>
<li class>OSTIF: <a href="https://ostif.org/" target="_blank" rel="noopener noreferrer" class>https://ostif.org/</a></li>
<li class>Trail of Bits: <a href="https://www.trailofbits.com/" target="_blank" rel="noopener noreferrer" class>https://www.trailofbits.com/</a></li>
<li class>Security Audit of Dragonfly: <a href="https://ostif.org/dragonfly-audit/" target="_blank" rel="noopener noreferrer" class>https://ostif.org/dragonfly-audit/</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-community">Dragonfly community<a href="https://d7y.io/blog/2023/09/15/security-audit#dragonfly-community" class="hash-link" aria-label="Direct link to Dragonfly community" title="Direct link to Dragonfly community" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></li>
<li class>GitHub Repo: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></li>
<li class>Slack Channel: <a href="https://cloud-native.slack.com/messages/dragonfly/" target="_blank" rel="noopener noreferrer" class>#dragonfly</a> on <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class>CNCF Slack</a></li>
<li class>Discussion Group: <a href="mailto:dragonfly-discuss@googlegroups.com" target="_blank" rel="noopener noreferrer" class>dragonfly-discuss@googlegroups.com</a></li>
<li class>Twitter: <a href="https://twitter.com/dragonfly_oss" target="_blank" rel="noopener noreferrer" class>@dragonfly_oss</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nydus-community">Nydus community<a href="https://d7y.io/blog/2023/09/15/security-audit#nydus-community" class="hash-link" aria-label="Direct link to Nydus community" title="Direct link to Nydus community" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://nydus.dev/" target="_blank" rel="noopener noreferrer" class>https://nydus.dev/</a></li>
<li class>GitHub Repo: <a href="https://github.com/dragonflyoss/image-service" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/image-service</a></li>
<li class>Slack Channel: <a href="https://join.slack.com/t/nydusimageservice/shared_invite/zt-pz4qvl4y-WIh4itPNILGhPS8JqdFm_w" target="_blank" rel="noopener noreferrer" class>#nydus</a></li>
</ul>]]></content>
        <category label="security" term="security"/>
        <category label="audit" term="audit"/>
        <category label="OSTIF" term="OSTIF"/>
        <category label="Trail of Bits" term="Trail of Bits"/>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Using dragonfly to distribute images and files for multi-cluster kubernetes]]></title>
        <id>https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes</id>
        <link href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes"/>
        <updated>2023-09-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Posted on September 1, 2023]]></summary>
        <content type="html"><![CDATA[<p>Posted on September 1, 2023</p>
<p><a href="https://www.cncf.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kuberenetes/" target="_blank" rel="noopener noreferrer" class>CNCF projects highlighted in this post</a>, and migrated by <a href="https://github.com/mingcheng" target="_blank" rel="noopener noreferrer" class>mingcheng</a>.</p>
<p>Dragonfly provides efficient, stable, securefile distribution and image acceleration based on p2p technology to be the best practice and standard solution in cloud native architectures. It is hosted by the Cloud Native Computing Foundation(CNCF) as an Incubating Level Project.</p>
<p>This article introduces the deployment of dragonfly for multi-cluster kubernetes. A dragonfly cluster manages cluster within a network. If you have two clusters with disconnected networks, you can use two dragonfly clusters to manage their own clusters.</p>
<p>The recommended deployment for multi-cluster kubernetes is to use a dragonfly cluster to manage a kubernetes cluster, and use a centralized manager service to manage multiple dragonfly clusters. Because peer can only transmit data in its own dragonfly cluster, if a kubernetes cluster deploys a dragonfly cluster, then a kubernetes cluster forms a p2p network, and internal peers can only schedule and transmit data in a kubernetes cluster.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image16-5.png" alt="Screenshot showing diagram flow between Network A / Kubernetes Cluster A and Network B / Kubernetes Cluster B towards Manager" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup-kubernetes-cluster">Setup kubernetes cluster<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#setup-kubernetes-cluster" class="hash-link" aria-label="Direct link to Setup kubernetes cluster" title="Direct link to Setup kubernetes cluster" translate="no">&#x200B;</a></h2>
<p><a href="https://kind.sigs.k8s.io/" target="_blank" rel="noopener noreferrer" class>Kind</a> is recommended if no Kubernetes cluster is available for testing.</p>
<p>Create kind cluster configuration file kind-config.yaml, configuration content is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Cluster</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> kind.x</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">k8s.io/v1alpha4</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">nodes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> control</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">plane</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> worker</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">extraPortMappings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">containerPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">30950</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">hostPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> a</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> worker</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> a</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> worker</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> b</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> worker</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> b</span><br></div></code></pre></div></div>
<p>Create cluster using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind create cluster --config kind-config.yaml</span><br></div></code></pre></div></div>
<p>Switch the context of kubectl to kind cluster A:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl config use-context kind-kind</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kind-loads-dragonfly-image">Kind loads dragonfly image<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#kind-loads-dragonfly-image" class="hash-link" aria-label="Direct link to Kind loads dragonfly image" title="Direct link to Kind loads dragonfly image" translate="no">&#x200B;</a></h2>
<p>Pull dragonfly latest images:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/scheduler:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/manager:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/dfdaemon:latest</span><br></div></code></pre></div></div>
<p>Kind cluster loads dragonfly latest images:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/scheduler:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/manager:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/dfdaemon:latest</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-dragonfly-cluster-a">Create dragonfly cluster A<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#create-dragonfly-cluster-a" class="hash-link" aria-label="Direct link to Create dragonfly cluster A" title="Direct link to Create dragonfly cluster A" translate="no">&#x200B;</a></h2>
<p>Create dragonfly cluster A, the schedulers, seed peers, peers and centralized manager included in the cluster should be installed using helm.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-dragonfly-cluster-a-based-on-helm-charts">Create dragonfly cluster A based on helm charts<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#create-dragonfly-cluster-a-based-on-helm-charts" class="hash-link" aria-label="Direct link to Create dragonfly cluster A based on helm charts" title="Direct link to Create dragonfly cluster A based on helm charts" translate="no">&#x200B;</a></h3>
<p>Create dragonfly cluster A charts configuration file charts-config-cluster-a.yaml, configuration content is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">containerRuntime</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">containerd</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">injectConfigPath</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">registries</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;https://ghcr.io&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">scheduler</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonflyoss/scheduler</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">tag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">nodeSelector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> a</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">seedPeer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonflyoss/dfdaemon</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">tag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">nodeSelector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> a</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">dfdaemon</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonflyoss/dfdaemon</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">tag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">nodeSelector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> a</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonflyoss/manager</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">tag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">nodeSelector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> a</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">jaeger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><br></div></code></pre></div></div>
<p>Create dragonfly cluster A using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ helm install --wait --create-namespace --namespace cluster-a dragonfly dragonfly/dragonfly -f charts-config-cluster-a.yaml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME: dragonfly</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">LAST DEPLOYED: Mon Aug  7 22:07:02 2023</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAMESPACE: cluster-a</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">STATUS: deployed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">REVISION: 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">TEST SUITE: None</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NOTES:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">1. Get the scheduler address by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_POD_NAME=$(kubectl get pods --namespace cluster-a -l &quot;app=dragonfly,release=dragonfly,component=scheduler&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_CONTAINER_PORT=$(kubectl get pod --namespace cluster-a $SCHEDULER_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace cluster-a port-forward $SCHEDULER_POD_NAME 8002:$SCHEDULER_CONTAINER_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:8002 to use your scheduler&quot;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">2. Get the dfdaemon port by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_POD_NAME=$(kubectl get pods --namespace cluster-a -l &quot;app=dragonfly,release=dragonfly,component=dfdaemon&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_CONTAINER_PORT=$(kubectl get pod --namespace cluster-a $DFDAEMON_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  You can use $DFDAEMON_CONTAINER_PORT as a proxy port in Node.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">3. Configure runtime to use dragonfly:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  https://d7y.io/docs/getting-started/quick-start/kubernetes/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">4. Get Jaeger query URL by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export JAEGER_QUERY_PORT=$(kubectl --namespace cluster-a get services dragonfly-jaeger-query -o jsonpath=&quot;{.spec.ports[0].port}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace cluster-a port-forward service/dragonfly-jaeger-query 16686:$JAEGER_QUERY_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:16686/search?limit=20&amp;lookback=1h&amp;maxDuration&amp;minDuration&amp;service=dragonfly to query download events&quot;</span><br></div></code></pre></div></div>
<p>Check that dragonfly cluster A is deployed successfully:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ kubectl get po -n cluster-a</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME                                 READY   STATUS    RESTARTS      AGE</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-dfdaemon-7t6wc             1/1     Running   0             3m18s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-dfdaemon-r45bk             1/1     Running   0             3m18s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-jaeger-84dbfd5b56-fmhh6    1/1     Running   0             3m18s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-manager-75f4c54d6d-tr88v   1/1     Running   0             3m18s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-mysql-0                    1/1     Running   0             3m18s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-master-0             1/1     Running   0             3m18s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-replicas-0           1/1     Running   1 (2m ago)    3m18s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-replicas-1           1/1     Running   0             96s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-replicas-2           1/1     Running   0             45s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-scheduler-0                1/1     Running   0             3m18s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-seed-peer-0                1/1     Running   1 (37s ago)   3m18s</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-nodeport-service-of-the-manager-rest-service">Create NodePort service of the manager REST service<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#create-nodeport-service-of-the-manager-rest-service" class="hash-link" aria-label="Direct link to Create NodePort service of the manager REST service" title="Direct link to Create NodePort service of the manager REST service" translate="no">&#x200B;</a></h3>
<p>Create the manager REST service configuration file manager-rest-svc.yaml, configuration content is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">rest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">a</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> NodePort</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">nodePort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">30950</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">selector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> manager</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">release</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><br></div></code></pre></div></div>
<p>Create manager REST service using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl apply -f manager-rest-svc.yaml -n cluster-a</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="visit-manager-console">Visit manager console<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#visit-manager-console" class="hash-link" aria-label="Direct link to Visit manager console" title="Direct link to Visit manager console" translate="no">&#x200B;</a></h3>
<p>Visit address localhost:8080 to see the manager console. Sign in the console with the default root user, the username is root and password is dragonfly.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image10-8.png" alt="Screenshot showing Dragonfly welcome back page" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image11-7.png" alt="Screenshot showing Dragonfly cluster page" class="img_ev3q"></p>
<p>By default, Dragonfly will automatically create dragonfly cluster A record in manager when it is installed for the first time. You can click dragonfly cluster A to view the details.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/08/Screen-Shot-2023-08-30-at-10.03.31-AM.png" alt="Screenshot showing Cluster-1 page on Dragonfly" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-dragonfly-cluster-b">Create dragonfly cluster B<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#create-dragonfly-cluster-b" class="hash-link" aria-label="Direct link to Create dragonfly cluster B" title="Direct link to Create dragonfly cluster B" translate="no">&#x200B;</a></h2>
<p>Create dragonfly cluster B, you need to create a dragonfly cluster record in the manager console first, and the schedulers, seed peers and peers included in the dragonfly cluster should be installed using helm.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-dragonfly-cluster-b-in-the-manager-console">Create dragonfly cluster B in the manager console<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#create-dragonfly-cluster-b-in-the-manager-console" class="hash-link" aria-label="Direct link to Create dragonfly cluster B in the manager console" title="Direct link to Create dragonfly cluster B in the manager console" translate="no">&#x200B;</a></h3>
<p>Visit manager console and click the ADD CLUSTER button to add dragonfly cluster B record. Note that the IDC is set to cluster-2 to match the peer whose IDC is cluster-2.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image8-18.png" alt="Screenshot showing Create Cluster page on Dragonfly" class="img_ev3q"></p>
<p>Create dragonfly cluster B record successfully.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image5-28.png" alt="Screenshot showing Cluster page on Dragonfly" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-scopes-to-distinguish-different-dragonfly-clusters">Use scopes to distinguish different dragonfly clusters<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#use-scopes-to-distinguish-different-dragonfly-clusters" class="hash-link" aria-label="Direct link to Use scopes to distinguish different dragonfly clusters" title="Direct link to Use scopes to distinguish different dragonfly clusters" translate="no">&#x200B;</a></h3>
<p>The dragonfly cluster needs to serve the scope. It will provide scheduler services and seed peer services to peers in the scope. The scopes of the dragonfly cluster are configured when the console is created and updated. The scopes of the peer are configured in peer YAML config, the fields are host.idc, host.location and host.advertiseIP, refer to <a href="https://d7y.io/docs/next/reference/configuration/dfdaemon" target="_blank" rel="noopener noreferrer" class>dfdaemon config</a>.</p>
<p>If the peer scopes match the dragonfly cluster scopes, then the peer will use the dragonfly cluster&#x2019;s scheduler and seed peer first, and if there is no matching dragonfly cluster then use the default dragonfly cluster.</p>
<p>Location: The dragonfly cluster needs to serve all peers in the location. When the location in the peer configuration matches the location in the dragonfly cluster, the peer will preferentially use the scheduler and the seed peer of the dragonfly cluster. It separated by &#x201C;|&#x201D;, for example &#x201C;area|country|province|city&#x201D;.</p>
<p>IDC: The dragonfly cluster needs to serve all peers in the IDC. When the IDC in the peer configuration matches the IDC in the dragonfly cluster, the peer will preferentially use the scheduler and the seed peer of the dragonfly cluster. IDC has higher priority than location in the scopes.</p>
<p>CIDRs: The dragonfly cluster needs to serve all peers in the CIDRs. The advertise IP will be reported in the peer configuration when the peer is started, and if the advertise IP is empty in the peer configuration, peer will automatically get expose IP as advertise IP. When advertise IP of the peer matches the CIDRs in dragonfly cluster, the peer will preferentially use the scheduler and the seed peer of the dragonfly cluster. CIDRs has higher priority than IDC in the scopes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-dragonfly-cluster-b-based-on-helm-charts">Create dragonfly cluster B based on helm charts<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#create-dragonfly-cluster-b-based-on-helm-charts" class="hash-link" aria-label="Direct link to Create dragonfly cluster B based on helm charts" title="Direct link to Create dragonfly cluster B based on helm charts" translate="no">&#x200B;</a></h3>
<p>Create charts configuration with cluster information in the manager console.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image14-3.png" alt="Screenshot showing Cluster-2 page on Dragonfly" class="img_ev3q"></p>
<ul>
<li class>Scheduler.config.manager.schedulerClusterID using the Scheduler cluster ID from cluster-2 information in the manager console.</li>
<li class>Scheduler.config.manager.addr is address of the manager GRPC server.</li>
<li class>seedPeer.config.scheduler.manager.seedPeer.clusterID using the Seed peer cluster ID from cluster-2 information in the manager console.</li>
<li class>seedPeer.config.scheduler.manager.netAddrs[0].addr is address of the manager GRPC server.</li>
<li class>dfdaemon.config.host.idc using the IDC from cluster-2 information in the manager console.</li>
<li class>dfdaemon.config.scheduler.manager.netAddrs[0].addr is address of the manager GRPC server.</li>
<li class>externalManager.host is host of the manager GRPC server.</li>
<li class>externalRedis.addrs[0] is address of the redis.</li>
</ul>
<p>Create dragonfly cluster B charts configuration file charts-config-cluster-b.yaml, configuration content is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">containerRuntime</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">containerd</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">injectConfigPath</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">registries</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;https://ghcr.io&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">scheduler</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonflyoss/scheduler</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">tag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">nodeSelector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> b</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">addr</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">manager.cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">a.svc.cluster.local</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token number" style="color:rgb(247, 140, 108)">65003</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">schedulerClusterID</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">seedPeer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonflyoss/dfdaemon</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">tag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">nodeSelector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> b</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">scheduler</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">netAddrs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> tcp</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token key atrule">addr</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">manager.cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">a.svc.cluster.local</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token number" style="color:rgb(247, 140, 108)">65003</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">seedPeer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">clusterID</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">dfdaemon</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonflyoss/dfdaemon</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">tag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">nodeSelector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> b</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">host</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">idc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">scheduler</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">netAddrs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> tcp</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token key atrule">addr</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">manager.cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">a.svc.cluster.local</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token number" style="color:rgb(247, 140, 108)">65003</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">externalManager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">host</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">manager.cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">a.svc.cluster.local</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">restPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">grpcPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">65003</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">redis</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">externalRedis</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">addrs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> dragonfly</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">redis</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">master.cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">a.svc.cluster.local</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token number" style="color:rgb(247, 140, 108)">6379</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">mysql</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">jaeger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><br></div></code></pre></div></div>
<p>Create dragonfly cluster B using the configuration file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ helm install --wait --create-namespace --namespace cluster-b dragonfly dragonfly/dragonfly -f charts-config-cluster-b.yaml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME: dragonfly</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">LAST DEPLOYED: Mon Aug  7 22:13:51 2023</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAMESPACE: cluster-b</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">STATUS: deployed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">REVISION: 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">TEST SUITE: None</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NOTES:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">1. Get the scheduler address by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_POD_NAME=$(kubectl get pods --namespace cluster-b -l &quot;app=dragonfly,release=dragonfly,component=scheduler&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_CONTAINER_PORT=$(kubectl get pod --namespace cluster-b $SCHEDULER_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace cluster-b port-forward $SCHEDULER_POD_NAME 8002:$SCHEDULER_CONTAINER_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:8002 to use your scheduler&quot;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">2. Get the dfdaemon port by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_POD_NAME=$(kubectl get pods --namespace cluster-b -l &quot;app=dragonfly,release=dragonfly,component=dfdaemon&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_CONTAINER_PORT=$(kubectl get pod --namespace cluster-b $DFDAEMON_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  You can use $DFDAEMON_CONTAINER_PORT as a proxy port in Node.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">3. Configure runtime to use dragonfly:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  https://d7y.io/docs/getting-started/quick-start/kubernetes/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">4. Get Jaeger query URL by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export JAEGER_QUERY_PORT=$(kubectl --namespace cluster-b get services dragonfly-jaeger-query -o jsonpath=&quot;{.spec.ports[0].port}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace cluster-b port-forward service/dragonfly-jaeger-query 16686:$JAEGER_QUERY_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:16686/search?limit=20&amp;lookback=1h&amp;maxDuration&amp;minDuration&amp;service=dragonfly to query download events&quot;</span><br></div></code></pre></div></div>
<p>Check that dragonfly cluster B is deployed successfully:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ kubectl get po -n cluster-b</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME                                READY   STATUS    RESTARTS   AGE</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-dfdaemon-q8bsg            1/1     Running   0          67s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-dfdaemon-tsqls            1/1     Running   0          67s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-jaeger-84dbfd5b56-rg5dv   1/1     Running   0          67s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-scheduler-0               1/1     Running   0          67s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-seed-peer-0               1/1     Running   0          67s</span><br></div></code></pre></div></div>
<p>Create dragonfly cluster B successfully.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image13-5.png" alt="Screenshot showing Cluster-2 page on Dragonfly" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-dragonfly-to-distribute-images-for-multi-cluster-kubernetes">Using dragonfly to distribute images for multi-cluster kubernetes<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#using-dragonfly-to-distribute-images-for-multi-cluster-kubernetes" class="hash-link" aria-label="Direct link to Using dragonfly to distribute images for multi-cluster kubernetes" title="Direct link to Using dragonfly to distribute images for multi-cluster kubernetes" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="containerd-pull-image-back-to-source-for-the-first-time-through-dragonfly-in-cluster-a">Containerd pull image back-to-source for the first time through dragonfly in cluster A<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#containerd-pull-image-back-to-source-for-the-first-time-through-dragonfly-in-cluster-a" class="hash-link" aria-label="Direct link to Containerd pull image back-to-source for the first time through dragonfly in cluster A" title="Direct link to Containerd pull image back-to-source for the first time through dragonfly in cluster A" translate="no">&#x200B;</a></h3>
<p>Pull ghcr.io/dragonflyoss/dragonfly2/scheduler<!-- -->:v2<!-- -->.0.5 image in kind-worker node:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker exec -i kind-worker /usr/local/bin/crictl pull ghcr.io/dragonflyoss/dragonfly2/scheduler:v2.0.5</span><br></div></code></pre></div></div>
<p>Expose jaeger&#x2019;s port 16686:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl --namespace cluster-a port-forward service/dragonfly-jaeger-query 16686:16686</span><br></div></code></pre></div></div>
<p>Visit the Jaeger page in <code>http://127.0.0.1:16686/search</code>, Search for tracing with Tags <code>http.url=&quot;/v2/dragonflyoss/dragonfly2/scheduler/blobs/sha256:82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399?ns=ghcr.io&quot;</code>:</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image1-58.png" alt="Screenshot showing Jaeger page (dragonfly-dfget)" class="img_ev3q"></p>
<p>Tracing details:</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image7-18.png" alt="Screenshot showing dragonfly-dfget tracing details on Jaeger UI" class="img_ev3q"></p>
<p>When pull image back-to-source for the first time through dragonfly, peer uses cluster-a&#x2019;s scheduler and seed peer. It takes 1.47s to download the 82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399 layer.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="containerd-pull-image-hits-the-cache-of-remote-peer-in-cluster-a">Containerd pull image hits the cache of remote peer in cluster A<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#containerd-pull-image-hits-the-cache-of-remote-peer-in-cluster-a" class="hash-link" aria-label="Direct link to Containerd pull image hits the cache of remote peer in cluster A" title="Direct link to Containerd pull image hits the cache of remote peer in cluster A" translate="no">&#x200B;</a></h3>
<p>Pull ghcr.io/dragonflyoss/dragonfly2/scheduler<!-- -->:v2<!-- -->.0.5 image in kind-worker2 node:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker exec -i kind-worker2 /usr/local/bin/crictl pull ghcr.io/dragonflyoss/dragonfly2/scheduler:v2.0.5</span><br></div></code></pre></div></div>
<p>Expose jaeger&#x2019;s port 16686:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl --namespace cluster-a port-forward service/dragonfly-jaeger-query 16686:16686</span><br></div></code></pre></div></div>
<p>Visit the Jaeger page in <a href="http://127.0.0.1:16686/search" target="_blank" rel="noopener noreferrer" class>http://127.0.0.1:16686/search</a>, Search for tracing with Tags <code>http.url=&quot;/v2/dragonflyoss/dragonfly2/scheduler/blobs/sha256:82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399?ns=ghcr.io&quot;</code>:</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image2-55.png" alt="Screenshot showing dragonfly-dfget on Jaeger UI" class="img_ev3q"></p>
<p>Tracing details:</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image9-15.png" alt="Screenshot showing dragonfly-dfget Tracing Details on Jaeger UI" class="img_ev3q"></p>
<p>When pull image hits cache of remote peer, peer uses cluster-a&#x2019;s scheduler and seed peer. It takes 37.48ms to download the 82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399 layer.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="containerd-pull-image-back-to-source-for-the-first-time-through-dragonfly-in-cluster-b">Containerd pull image back-to-source for the first time through dragonfly in cluster B<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#containerd-pull-image-back-to-source-for-the-first-time-through-dragonfly-in-cluster-b" class="hash-link" aria-label="Direct link to Containerd pull image back-to-source for the first time through dragonfly in cluster B" title="Direct link to Containerd pull image back-to-source for the first time through dragonfly in cluster B" translate="no">&#x200B;</a></h3>
<p>Pull ghcr.io/dragonflyoss/dragonfly2/scheduler<!-- -->:v2<!-- -->.0.5 image in kind-worker3 node:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker exec -i kind-worker3 /usr/local/bin/crictl pull ghcr.io/dragonflyoss/dragonfly2/scheduler:v2.0.5</span><br></div></code></pre></div></div>
<p>Expose jaeger&#x2019;s port 16686:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl --namespace cluster-b port-forward service/dragonfly-jaeger-query 16686:16686</span><br></div></code></pre></div></div>
<p>Visit the Jaeger page in <a href="http://127.0.0.1:16686/search" target="_blank" rel="noopener noreferrer" class>http://127.0.0.1:16686/search</a>, Search for tracing with Tags http.url=&#x201D;/v2/dragonflyoss/dragonfly2/scheduler/blobs/sha256:82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399?ns=ghcr.io&#x201D;:</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image3-42.png" alt="Screenshot showing dragonfly-dfget on Jaeger UI" class="img_ev3q"></p>
<p>Tracing details:</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image12-6.png" alt="Screenshot showing dragonfly-dfget Tracing Details on Jaeger UI" class="img_ev3q"></p>
<p>When pull image back-to-source for the first time through dragonfly, peer uses cluster-b&#x2019;s scheduler and seed peer. It takes 4.97s to download the <code>82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399</code> layer.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="containerd-pull-image-hits-the-cache-of-remote-peer-in-cluster-b">Containerd pull image hits the cache of remote peer in cluster B<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#containerd-pull-image-hits-the-cache-of-remote-peer-in-cluster-b" class="hash-link" aria-label="Direct link to Containerd pull image hits the cache of remote peer in cluster B" title="Direct link to Containerd pull image hits the cache of remote peer in cluster B" translate="no">&#x200B;</a></h3>
<p>Pull ghcr.io/dragonflyoss/dragonfly2/scheduler<!-- -->:v2<!-- -->.0.5 image in kind-worker4 node:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker exec -i kind-worker4 /usr/local/bin/crictl pull ghcr.io/dragonflyoss/dragonfly2/scheduler:v2.0.5</span><br></div></code></pre></div></div>
<p>Expose jaeger&#x2019;s port 16686:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl --namespace cluster-b port-forward service/dragonfly-jaeger-query 16686:16686</span><br></div></code></pre></div></div>
<p>Visit the Jaeger page in <a href="http://127.0.0.1:16686/search" target="_blank" rel="noopener noreferrer" class>http://127.0.0.1:16686/search</a>, Search for tracing with Tags <code>http.url=&quot;/v2/dragonflyoss/dragonfly2/scheduler/blobs/sha256:82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399?ns=ghcr.io&quot;</code>:</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image6-19.png" alt="Screenshot showing dragonfly-dfget on Jaeger UI" class="img_ev3q"></p>
<p>Tracing details:</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/09/image15-6.png" alt="Screenshot showing dragonfly-dfget Tracing Details on Jaeger UI" class="img_ev3q"></p>
<p>When pull image hits cache of remote peer, peer uses cluster-b&#x2019;s scheduler and seed peer. It takes 14.53ms to download the <code>82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399</code> layer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links">Links<a href="https://d7y.io/blog/2023/09/01/using-dragonfly-to-distribute-images-and-files-for-multi-cluster-kubernetes#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links" translate="no">&#x200B;</a></h2>
<p>Dragonfly Website: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></p>
<p>Dragonfly GitHub Repo: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></p>
<p>Dragonfly Slack Channel: <a href="https://cloud-native.slack.com/messages/dragonfly/" target="_blank" rel="noopener noreferrer" class>#dragonfly</a> on <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class>CNCF Slack</a></p>
<p>Dragonfly Discussion Group: <a href="mailto:dragonfly-discuss@googlegroups.com" target="_blank" rel="noopener noreferrer" class>dragonfly-discuss@googlegroups.com</a></p>
<p>Dragonfly Twitter: <a href="https://twitter.com/dragonfly_oss" target="_blank" rel="noopener noreferrer" class>@dragonfly_oss</a></p>
<p>Nydus Website: <a href="https://nydus.dev/" target="_blank" rel="noopener noreferrer" class>https://nydus.dev/</a></p>
<p>Nydus GitHub Repo: <a href="https://github.com/dragonflyoss/image-service" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/image-service</a></p>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Dragonfly v2.1.0 is released!]]></title>
        <id>https://d7y.io/blog/2023/08/07/dragonfly-v2-1-0-is-released</id>
        <link href="https://d7y.io/blog/2023/08/07/dragonfly-v2-1-0-is-released"/>
        <updated>2023-08-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[CNCF projects highlighted in this post, and migrated by mingcheng.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/" target="_blank" rel="noopener noreferrer" class>CNCF projects highlighted in this post</a>, and migrated by <a href="https://github.com/mingcheng" target="_blank" rel="noopener noreferrer" class>mingcheng</a>.</p>
<p>Dragonfly v2.1.0 is released! &#x1F389;&#x1F389;&#x1F389; Thanks to the Xinxin Zhao<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn1" target="_blank" rel="noopener noreferrer" class>[1]</a> for helping to refactor the console<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn2" target="_blank" rel="noopener noreferrer" class>[2]</a> and the manager provides a new console for users to operate Dragonfly. Welcome to visit d7y.io<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn3" target="_blank" rel="noopener noreferrer" class>[3]</a> website.</p>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/08/image-14.png" alt="Announcement screenshot from GitHub mentioning &quot;Dragonfly v2.1.0 is released!&quot;" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features-features"><a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#features" target="_blank" rel="noopener noreferrer" class>#features</a> Features<a href="https://d7y.io/blog/2023/08/07/dragonfly-v2-1-0-is-released#features-features" class="hash-link" aria-label="Direct link to features-features" title="Direct link to features-features" translate="no">&#x200B;</a></h2>
<ul>
<li class>Console v1.0.0<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn4" target="_blank" rel="noopener noreferrer" class>[4]</a> is released and it provides a new console for users to operate Dragonfly.</li>
<li class>Add network topology feature and it can probe the network latency between peers, providing better scheduling capabilities.</li>
<li class>Provides the ability to control the features of the scheduler in the manager. If the scheduler preheat feature is not in feature flags, then it will stop providing the preheating in the scheduler.</li>
<li class>dfstore adds GetObjectMetadatas and CopyObject to supports using Dragonfly as the JuiceFS backend.</li>
<li class>Add personal access tokens feature in the manager and personal access token contains your security credentials for the restful open api.</li>
<li class>Add TLS config to manager rest server.</li>
<li class>Fix dfdaemon fails to start when there is no available scheduler address.</li>
<li class>Add cluster in the manager and the cluster contains a scheduler cluster and a seed peer cluster.</li>
<li class>Fix object downloads failed by dfstore when dfdaemon enabled concurrent.</li>
<li class>Scheduler adds database field in config and moves the redis config to database field.</li>
<li class>Replace net.Dial with grpc health check in dfdaemon.</li>
<li class>Fix filtering and evaluation in scheduling. Since the final length of the filter is the candidateParentLimit used, the parents after the filter is wrong.</li>
<li class>Fix storage cannot write records to file when bufferSize is zero.</li>
<li class>Hiding sensitive information in logs, such as the token in the header.</li>
<li class>Use unscoped delete when destroying the manager&#x2019;s resources.</li>
<li class>Add uk_scheduler index and uk_seed_peer index in the table of the database.</li>
<li class>Remove security domain feature and security feature in the manager.</li>
<li class>Add advertise port config to manager and scheduler.</li>
<li class>Fix fsm changes state failed when register task.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="break-change-break-change"><a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#break-change" target="_blank" rel="noopener noreferrer" class>#break-change</a> Break Change<a href="https://d7y.io/blog/2023/08/07/dragonfly-v2-1-0-is-released#break-change-break-change" class="hash-link" aria-label="Direct link to break-change-break-change" title="Direct link to break-change-break-change" translate="no">&#x200B;</a></h2>
<ul>
<li class>The M<!-- -->:N<!-- --> relationship model between the scheduler cluster and the seed peer cluster is no longer supported. In the future, a P2P cluster will be a cluster in the manager, and a cluster will only include a scheduler cluster and a seed peer cluster.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="console-console"><a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#console" target="_blank" rel="noopener noreferrer" class>#console</a> Console<a href="https://d7y.io/blog/2023/08/07/dragonfly-v2-1-0-is-released#console-console" class="hash-link" aria-label="Direct link to console-console" title="Direct link to console-console" translate="no">&#x200B;</a></h2>
<p><img decoding="async" loading="lazy" src="https://www.cncf.io/wp-content/uploads/2023/08/image-13.png" alt="Screenshot showing Dragonfly Console welcome back page" class="img_ev3q"></p>
<p>You can see Manager Console<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn5" target="_blank" rel="noopener noreferrer" class>[5]</a> for more details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-infrastructure-ai-infrastructure"><a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#ai-infrastructure" target="_blank" rel="noopener noreferrer" class>#ai-infrastructure</a> AI Infrastructure<a href="https://d7y.io/blog/2023/08/07/dragonfly-v2-1-0-is-released#ai-infrastructure-ai-infrastructure" class="hash-link" aria-label="Direct link to ai-infrastructure-ai-infrastructure" title="Direct link to ai-infrastructure-ai-infrastructure" translate="no">&#x200B;</a></h2>
<ul>
<li class>Triton Inference Server<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn6" target="_blank" rel="noopener noreferrer" class>[6]</a> uses Dragonfly to distribute model files, refer to #2185<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn7" target="_blank" rel="noopener noreferrer" class>[7]</a>. If there are developers who are interested in the dragonfly repository agent<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn8" target="_blank" rel="noopener noreferrer" class>[8]</a> project, please contact <a href="mailto:gaius.qi@gmail.com" target="_blank" rel="noopener noreferrer" class>gaius.qi@gmail.com</a>.</li>
<li class>TorchServer<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn9" target="_blank" rel="noopener noreferrer" class>[9]</a> uses Dragonfly to distribute model files. Developers have already participated in the dragonfly endpoint<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn10" target="_blank" rel="noopener noreferrer" class>[10]</a> project, and the feature will be released in v2.1.1.</li>
<li class>Fluid<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn11" target="_blank" rel="noopener noreferrer" class>[11]</a> downloads data through Dragonfly when running based on JuiceFS<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn12" target="_blank" rel="noopener noreferrer" class>[12]</a>, the feature will be released in v2.1.1.</li>
<li class>Dragonfly helps Volcano Engine AIGC inference to accelerate image through p2p technology<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn13" target="_blank" rel="noopener noreferrer" class>[13]</a>.</li>
<li class>There have been many cases in the community, using Dragonfly to distribute data in AI scenarios based on P2P technology. In the inference stage, the concurrent download model of the inference service can effectively relieve the bandwidth pressure of the model registry through Dragonfly, and improving the download speed. Community will share topic &#x300A;Dragonfly: Intro, Updates and AI Model Distribution in the Practice of Kuaishou &#x2013; Wenbo Qi, Ant Group &amp; Zekun Liu, Kuaishou Technology&#x300B;<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn14" target="_blank" rel="noopener noreferrer" class>[14]</a> with Kuaishou<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn15" target="_blank" rel="noopener noreferrer" class>[15]</a> in KubeCon + CloudNativeCon + Open Source Summit China 2023<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn16" target="_blank" rel="noopener noreferrer" class>[16]</a>, please follow if interested.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="maintainers-maintainers"><a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#maintainers" target="_blank" rel="noopener noreferrer" class>#maintainers</a> Maintainers<a href="https://d7y.io/blog/2023/08/07/dragonfly-v2-1-0-is-released#maintainers-maintainers" class="hash-link" aria-label="Direct link to maintainers-maintainers" title="Direct link to maintainers-maintainers" translate="no">&#x200B;</a></h2>
<p>The community has added four new Maintainers, hoping to help more contributors participate in community.</p>
<ul>
<li class>Yiyang Huang<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn17" target="_blank" rel="noopener noreferrer" class>[17]</a>: He works for Volcano Engine and will focus on the engineering work for Dragonfly.</li>
<li class>Manxiang Wen<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn18" target="_blank" rel="noopener noreferrer" class>[18]</a>: He works for Baidu and will focus on the engineering work for Dragonfly.</li>
<li class>Mohammed Farooq<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn19" target="_blank" rel="noopener noreferrer" class>[19]</a> He works for Intel and will focus on the engineering work for Dragonfly.</li>
<li class>Zhou Xu<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn20" target="_blank" rel="noopener noreferrer" class>[20]</a>: He is a PhD student at Dalian University of Technology and will focus on the intelligent scheduling algorithms.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="others-others"><a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#others" target="_blank" rel="noopener noreferrer" class>#others</a> Others<a href="https://d7y.io/blog/2023/08/07/dragonfly-v2-1-0-is-released#others-others" class="hash-link" aria-label="Direct link to others-others" title="Direct link to others-others" translate="no">&#x200B;</a></h2>
<p>You can see CHANGELOG<a href="https://www.cncf.io/blog/2023/08/07/dragonfly-v2-1-0-is-released/#fn21" target="_blank" rel="noopener noreferrer" class>[21]</a> for more details.</p>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Ant Group security technology’s Nydus and Dragonfly image acceleration practices]]></title>
        <id>https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices</id>
        <link href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices"/>
        <updated>2023-05-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[CNCF projects highlighted in this post, and migrated by mingcheng.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://www.cncf.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices/" target="_blank" rel="noopener noreferrer" class>CNCF projects highlighted in this post</a>, and migrated by <a href="https://github.com/mingcheng" target="_blank" rel="noopener noreferrer" class>mingcheng</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">&#x200B;</a></h2>
<p><a href="https://www.zoloz.com/" target="_blank" rel="noopener noreferrer" class>ZOLOZ</a> is a global security and risk management platform under Ant Group. Through biometric, big data analysis, and artificial intelligence technologies, ZOLOZ provides safe and convenient security and risk management solutions for users and institutions. ZOLOZ has provided security and risk management technology support for more than 70 partners in 14 countries and regions, including China, Indonesia, Malaysia, and the Philippines. It has already covered areas such as finance, insurance, securities, credit, telecommunications, and public services, and has served over 1.2 billion users.</p>
<p>With the explosion of Kubernetes and cloud-native, ZOLOZ applications have begun to be deployed on a large scale on public clouds using containerization. The images of ZOLOZ applications have been maintained and updated for a long time, and both the number of layers and the overall size have reached a large scale (hundreds of MBs or several GBs). In particular, the basic image size of ZOLOZ&#x2019;s AI algorithm inference application is much larger than that of general application images (PyTorch/PyTorch:1.13.1-CUDA 11.6-cuDNN 8-Runtime on Docker Hub is 4.92GB, compared to CentOS<!-- -->:latest<!-- --> with only about 234MB).</p>
<p>For container cold start, i.e., when there is no image locally, the image needs to be downloaded from the registry before creating the container. In the production environment, container cold start often takes several minutes, and as the scale increases, the registry may be unable to download images quickly due to network congestion within the cluster. Such large images have brought many challenges to application updates and scaling. With the continuous promotion of containerization on public clouds, ZOLOZ applications mainly face three challenges:</p>
<ol>
<li class>The algorithm image is large, and pushing it to the cloud image repository takes a long time. During the development process, when testing in the testing environment, developers often hope to iterate quickly and verify quickly. However, every time a branch is modified and released for verification, it takes several tens of minutes, which is very inefficient.</li>
<li class>Pulling the algorithm image takes a long time, and pulling many image files during cluster expansion can easily cause the cluster network card to be flooded and affect the normal operation of the business.</li>
<li class>The cluster machine takes a long time to start up, making it difficult to meet the needs of sudden traffic increases and elastic automatic scaling.</li>
</ol>
<p>Although various compromise solutions have been attempted, these solutions all have their shortcomings. Now, in collaboration with multiple technical teams such as Ant Group, Alibaba Cloud, and ByteDance, a more universal solution on public clouds has been developed, which has low transformation costs and good performance, and currently appears to be an ideal solution.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="terminology">Terminology<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#terminology" class="hash-link" aria-label="Direct link to Terminology" title="Direct link to Terminology" translate="no">&#x200B;</a></h2>
<p>OCI: Open Container Initiative, a Linux Foundation project initiated by Docker in June 2015, aimed at designing open standards for operating system-level virtualization, most importantly Linux containers.</p>
<p>OCI Manifest: The product follows the OCI Image Spec.</p>
<p>BuildKit: A new generation Docker build tool produced by Docker that is more efficient, Dockerfile-independent, and more suitable for cloud-native applications.</p>
<p>Image: In this article, the image refers to OCI Manifest, including Helm Chart and other OCI Manifests.</p>
<p>Image Repository: A product repository implemented in accordance with OCI Distribution Spec.</p>
<p>ECS: A resource collection consisting of CPUs, memory, and cloud disks, with each type of resource logically corresponding to a computing hardware entity in a data center.</p>
<p>ACR: Alibaba Cloud&#x2019;s image repository service.</p>
<p>ACK: Alibaba Cloud Container Service Kubernetes version provides high-performance and scalable container application management capabilities and supports full lifecycle management of enterprise-level containerized applications.</p>
<p>ACI: Ant Continuous Integration, is a CI/CD efficiency product under the Ant Group&#x2019;s research and development efficiency umbrella, which is centered around pipelines. With intelligent automated construction, testing, and deployment, it provides a lightweight continuous delivery solution based on code flow to improve the work efficiency of team development.</p>
<p>Private Zone: A private DNS service based on the Virtual Private Cloud (VPC) environment. This service allows private domain names to be mapped to IP addresses in one or more custom VPCs.</p>
<p>P2P: Peer-to-peer technology, when a Peer in a P2P network downloads data from the server, it can also act as a server for other Peers to download after downloading the data. When a large number of nodes are downloading simultaneously, subsequent data downloads can be obtained without downloading from the server. This can reduce the pressure on the server.</p>
<p>Dragonfly: Dragonfly is a file distribution and image acceleration system based on P2P technology and is the standard solution and best practice in the field of image acceleration in cloud-native architecture. It is now hosted by the Cloud Native Computing Foundation (CNCF) as an incubation-level project.</p>
<p>Nydus: Nydus is a sub-project of Dragonfly&#x2019;s image acceleration framework that provides on-demand loading of container images and supports millions of accelerated image container creations in production environments every day. It has significant advantages over OCIv1 in terms of startup performance, image space optimization, end-to-end data consistency, kernel-level support, etc.</p>
<p>LifseaOS: A lightweight, fast, secure, and image-atomic management container optimization operating system launched by Alibaba Cloud for container scenarios. Compared with traditional operating systems, the number of software packages is reduced by 60%, and the image size is reduced by 70%. The first-time startup time is reduced from over 1 minute to around 2 seconds. It supports image read-only and OSTree technology, versioning management of OS images, and updating software packages or fixed configurations on the operating system on an image-level basis.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution">Solution<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#solution" class="hash-link" aria-label="Direct link to Solution" title="Direct link to Solution" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-large-image-size">1: Large image size<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#1-large-image-size" class="hash-link" aria-label="Direct link to 1: Large image size" title="Direct link to 1: Large image size" translate="no">&#x200B;</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="reduce-the-size-of-the-base-image">Reduce the size of the base image<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#reduce-the-size-of-the-base-image" class="hash-link" aria-label="Direct link to Reduce the size of the base image" title="Direct link to Reduce the size of the base image" translate="no">&#x200B;</a></h4>
<p>The basic OS is changed from CentOS 7 to AnolisOS 8, and the installation of maintenance tools is streamlined. Only a list of essential tools (basic maintenance tools, runtime dependencies, log cleaning, security baselines, etc.) is installed by default, and the configuration of security hardening is simplified. The base image is reduced from 1.63GB to 300MB.</p>
<p>AnolisOS Repository: <a href="https://hub.docker.com/r/openanolis/anolisos/tags" target="_blank" rel="noopener noreferrer" class>https://hub.docker.com/r/openanolis/anolisos/tags</a></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="dockerfile-optimization">Dockerfile optimization<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#dockerfile-optimization" class="hash-link" aria-label="Direct link to Dockerfile optimization" title="Direct link to Dockerfile optimization" translate="no">&#x200B;</a></h4>
<p>Reduce unnecessary build resources and time through Dockerfile writing constraints, image inspection, and other means.</p>
<p>Dockerfile Best Practices: <a href="https://docs.docker.com/develop/develop-images/dockerfile_best-practices/" target="_blank" rel="noopener noreferrer" class>https://docs.docker.com/develop/develop-images/dockerfile_best-practices/</a></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="parallel-building-and-build-caching">Parallel building and build caching<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#parallel-building-and-build-caching" class="hash-link" aria-label="Direct link to Parallel building and build caching" title="Direct link to Parallel building and build caching" translate="no">&#x200B;</a></h4>
<p>AntGroup&#x2019;s Build Center uses the Nydus community-optimized version of <a href="https://github.com/moby/buildkit/blob/master/docs/nydus.md" target="_blank" rel="noopener noreferrer" class>BuildKit</a>, which supports layer-level caching. The previous artifacts are accurately referenced and cached, and for Multistage type Dockerfiles, BuildKit can achieve parallel execution between different stages.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-slow-pushing-image">2: Slow pushing image<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#2-slow-pushing-image" class="hash-link" aria-label="Direct link to 2: Slow pushing image" title="Direct link to 2: Slow pushing image" translate="no">&#x200B;</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-nydus-images-for-block-level-data-deduplication">Use Nydus images for block-level data deduplication<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#use-nydus-images-for-block-level-data-deduplication" class="hash-link" aria-label="Direct link to Use Nydus images for block-level data deduplication" title="Direct link to Use Nydus images for block-level data deduplication" translate="no">&#x200B;</a></h4>
<p>In traditional OCI images, the smallest unit that can be shared between different images is the layer in the image, and the efficiency of deduplication is very low. There may be a lot of duplicate data between layers, even if there are slight differences, they will be treated as different layers. According to the design of deletion files and hard links in OCI Image Spec, there may be files that have been deleted in the upper layer but still exist in the lower layer and are included in the image. In addition, OCI Image uses the tar+gzip format to express the layers in the image, and the tar format does not distinguish between tar archive entries order, which brings a problem that if users build the same image on different machines, they may get different images because of using different file systems, but the substantial content of several different images is completely identical, which leads to a sharp increase in the amount of uploaded and downloaded data.</p>
<p>Issues with OCIv1 and OCIv2 proposals: <a href="https://hackmd.io/@cyphar/ociv2-brainstorm" target="_blank" rel="noopener noreferrer" class>https://hackmd.io/@cyphar/ociv2-brainstorm</a></p>
<p>Nydus image files are divided into file chunks, and the metadata layer is flattened (removing intermediate layers). Each chunk is only saved once in the image, and a base image can be specified as a chunk dictionary for other Nydus images. Based on chunk-level deduplication, it provides low-cost data deduplication capabilities between different images, greatly reducing the amount of uploaded and downloaded data for the images.</p>
<p><img decoding="async" loading="lazy" alt="nydus-image-files" src="https://d7y.io/assets/images/nydus-image-files-78fefbf002e1a0d896075f2a5d1c5342.png" width="1000" height="451" class="img_ev3q"></p>
<p>As shown in the figure above, Nydus image 1 and image 2 have the same data blocks B2, C, E1, and F. Image 2 adds E2, G1, H1, and H2. If image 1 already exists in the image repository, image 2 can be built based on image 1. Only E2, G1, H1, and H2 need to be built in one layer, and only this layer needs to be uploaded to the image repository during upload. This achieves the effect of uploading and pulling only file differences, shortens the development cycle.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="directly-building-nydus-images">Directly building Nydus images<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#directly-building-nydus-images" class="hash-link" aria-label="Direct link to Directly building Nydus images" title="Direct link to Directly building Nydus images" translate="no">&#x200B;</a></h4>
<p>Currently, in most landing scenarios for acceleration images, the production of acceleration images is based on image conversion. The following two Nydus conversion schemes are currently in place:</p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="i-repository-conversion">i. Repository conversion<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#i-repository-conversion" class="hash-link" aria-label="Direct link to i. Repository conversion" title="Direct link to i. Repository conversion" translate="no">&#x200B;</a></h5>
<p>After a traditional image is built and pushed to the image repository, the conversion action of the image repository is triggered to complete the image conversion. The disadvantage of this approach is that the build and conversion are often done on different machines. After the image is built and pushed, it needs to be pulled to the conversion machine and the output needs to be pushed to the image repository, which adds a complete image circulation process and causes high latency. Also, it occupies the network resources of the image repository. Before the acceleration image conversion is complete, application deployment cannot enjoy the acceleration effect and still needs to pull the entire image.</p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="ii-double-version-building">ii. Double version building<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#ii-double-version-building" class="hash-link" aria-label="Direct link to ii. Double version building" title="Direct link to ii. Double version building" translate="no">&#x200B;</a></h5>
<p>After the traditional image is built, it is converted directly on the local build machine. To improve efficiency, the conversion of each layer can be started immediately after the construction of that layer, which can significantly reduce the delay in generating acceleration images. With this approach, conversion can begin without waiting for traditional image upload, and because it is local conversion, compared to approach 1, the cost of transfer between the conversion machine and the image repository can be saved. If the accelerated image corresponding to the base image does not exist, it will be converted; if it exists, pulling can be ignored, but inevitably, pushing always requires twice the data.</p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="iii-direct-building">iii. Direct building<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#iii-direct-building" class="hash-link" aria-label="Direct link to iii. Direct building" title="Direct link to iii. Direct building" translate="no">&#x200B;</a></h5>
<p>Compared with the two conversion-based schemes mentioned above, directly building Nydus acceleration images has obvious production delays. First, OCI-based image construction is significantly slower than Nydus image construction. Second, conversion is an after-the-fact behavior and there is more or less delay. Third, there is additional data transmission in both schemes. Direct building, on the other hand, has fewer steps, is faster, and saves resources.</p>
<p>It can be seen that the steps and data transmission volume for building acceleration images are significantly reduced. After the construction is completed, the ability of the acceleration image can be directly enjoyed and the speed of application deployment can be greatly improved.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-slow-container-startup">3: Slow container startup<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#3-slow-container-startup" class="hash-link" aria-label="Direct link to 3: Slow container startup" title="Direct link to 3: Slow container startup" translate="no">&#x200B;</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="nydus-images-load-on-demand">Nydus images load on demand<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#nydus-images-load-on-demand" class="hash-link" aria-label="Direct link to Nydus images load on demand" title="Direct link to Nydus images load on demand" translate="no">&#x200B;</a></h4>
<p>The actual usage rate of the image data is very low. For example, <a href="https://indico.cern.ch/event/567550/papers/2627182/files/6153-paper.pdf" target="_blank" rel="noopener noreferrer" class>Cern&#x2019;s paper</a> mentions that only 6% of the content of a general image is actually used. The purpose of on-demand loading is to allow the container runtime to selectively download and extract files from the image layers in the Blob, but the <a href="https://github.com/opencontainers/image-spec/" target="_blank" rel="noopener noreferrer" class>OCI</a>/<a href="https://github.com/moby/moby/blob/master/image/spec/v1.2.md" target="_blank" rel="noopener noreferrer" class>Docker</a> image specifications package all image layers into a tar or tar.gz archive. This means that even if you want to extract a single file, you still have to scan the entire Blob. If the image is compressed using gzip, it is even more difficult to extract specific files.</p>
<p><img decoding="async" loading="lazy" alt="nydus-images-load-on-demand" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjsAAAEzCAMAAADgszKZAAAAXVBMVEUAAAA9PDg7Ozfa7/2r2vo+PTmk1pH///+hy+hISkdnw/lUWFaotr6Bh4lzipeIp7uWvNScp63tu2ZUselZanLE2OVobGzC4vhqf1+RuoBRhKFZoszLy8m+mlp5Z0jdW9UFAAAAA3RSTlMA3UXIVsqTAAAlTElEQVR42uyaQY7DIAxFJyAvLOMFi+/7H3UUoGqmok0y6iJq/1u0BIirkic7IvnZktKyCCFzliWlnzmJ3pA9lkRzyPvsoTnkKMtcHQ2vhMzw0Jk8Q52oyIQ8AyWGPI/qWMmEvKbYX3mSrARzDtkH3uXZquOZkCN0edK9YkUm5BgxEs9IO8qCRY4C64lnpJ2aCTlKGYknsWKRs0RPPIlph5ylNnd6yeLdDjkDWtFq7mgm5Aza3eHtDjlNNHe4L0j+uT9IdwjdIc+hO+Qy0B1yJXeAAmyOMBp5j6/fYcKLhcDllu797iBURHWEK6aqVteWaplML1HzAKrf/eZZVW2LEeqTMXvhh7fRPa7uDkxE7Ravioj2gyJSp9N983Ttu93x8S6DycQdUbw6Uz/AHRNxZEQLCBEtKCFSp+5U180Pg+6I+HF3sO8OZn1XdQci0b5VDNlEMTrvWQURa8PD287kQ94p4QgLwK1Xs2pm3s50M0es4eFm8XmetYuB7o6Ht4oeaP+2Nju8Lcn4NDNH7txGS5gD0RcHtyk9Qh0R175LuvPLzhnsvA2EQPiwmgMCDhyG93/UChbH7l+l7aGVXKcrxbJ3N8hMvgBeOwmAL28OkJaZnXGHgDdcsUjKl7gTO+NpYxU7jqMR7J4s+5TafV5x5OV2bnYSaJ91sR3X0kBqlL3N1kl5YUehLVFthbt62FP0ZSGm747sOOQVRIadaQc7W5BlM1G+xB0HkllkhCB7fANmQFoAKCmUzOfdvXXoErDYmTCtiBWAm+PFzpIZHkkv7CCsgDLHfl8wRtOxQCBpgrwnO3qCYGP1SyXMcjTn/H+MO5jQtKeEdZzJSekO1Gg8srJ2aLnZ7PSGJzB67tbWCgfSvo872bJw68ew1excLPToCsg92cGZvPiFnZhdRRCIN3FHmp0YDukpAHJgI0ADRFWet5zp0BZH4X3QrxHRr+z4TtuStn5g5/zumWvNsosFB7SluyM7r2iQ13rH06/sJLRcfBN3LuxkaSQZemWnLGlWe9qTjj7JXOFbSUEc7MSXeme5AEC8ZycA8bJCOdipV1a7Zc6iQIcDLUhgDdRk6BOwhK/fiTst2dJrziK3JT5uGXon/GNxTJDtMhqVfNHRKFgYGYJ8z05Cufh9ztpykreslctgmoVArN2UsFAIz7gz8vDXcWeIYbHWwIWftbI/7zdBmx3iyDGbGp+aV1hqGB2tC4zMn7OTZB61chy1spMKvSU7KwEIBpTAbnbWO9Ot67fiDgEREeScapY0JsADy51hZ/l2jbIVo27HhY1Vez66APaeHa8pCtj1Gt23AbsnOytSRd2GB1fdB/Tp2/sHR9/3cpn7MTfc21pauLOPgxBuq4+rdsotv6qjAPexauyxyHTrYbpe1kdboOn3Q1VPde7OcDeHzNpg2i3XBv9eo1mJ9LxVnbctkX+ISWOjeEh303sSf6+ZIN0/55n8SIB/7EN2TyA+lZ19USof8y8v+Ycfi4H4+lh2Fi3sU8jpRHNz6f4ldv63b+zSIQEAAADDoP6tH+F2AjLQ4g7ucLhDhju4w+EOGe7gDoc7ZLiDOxzukOEOY+9Mt9uEgSj8A02sOaONVkjQkL7/Y9ZSIICEAS/1dvic0Gs0lhu4jITYdu/srLB7Z+dp2L2zs3tnZ4Xn8E4lKu+FEN5X4v9IP5HiOvmGV5A+Bed7x3uDoBhDIMY0XCtNJ3FV8k5SkHxeYpAWIEobpWEMUHtf7DzYOyVpxq3SjKkwMUqZRcm3Sd1J3ct8rpqXfCzZEMBGAdYeJ/Ld7rjycM70TtzyXxINoIudh3mnYkwZ9ppwbRkrHoCXUjMmnWPeOGd8lCxI5ru5QapOjmK1TyU7LWMN3Heym6s8G83N5BDAo9Rz0ovqBt4R+KrG6VFVcV+EZwww9MEQOdOI+jKpcmkWpLpO2slcC85f6x2BoNlLo+9825XKhRZem5D2GI/TsYzTe0m+UeYfU6QYq67zDlcv2tUZsGiK++E50YtvbRHOGSdXneWdagLnpnvx2fpN/pqP5fOxMXR78KVLwRf3woTt9k3gBOoM7whHiDD8dBNARGvYFGMxlOavPNZYQpiPtZqxC4O3w4s7IfEdck4PV4xt9U4lAcjJORwBKD6u14bYeo4Qa8exCgHrbaGMh+DFes9HY1nchQrp1fcsMvtUm7xTEVB7OEVLQKMVZwGbj1M0OIrlFrA+HRrHhge2B2/HABV3gek3sw5TIDd5x4E8LOFAjVax+1iiBjt8PTXLocTZ9mDLzkdpX9yaqpQpKjBjH64GDMvgWvVoljMq5SzDqB/4YtXKLNatNJuDI/kN3inBHRYphv11DfSxSEN9rEkSVM7IkwbxY5lQ7wXc2jslwSmyXpnGcaliCZpgIGuTuYWBfA9OLVeNMCIrNgTJV+cYzjZ4x0F7WKYF+5N2mtQsdfIekEVUElrnPkMa0lk9BDbDB+pRvcAf7x0HQGU7i6RkLWmAuumpMV2FHIF+SilLqwT45/ObPxaAZ9aJpbEYQKdtNfz96vmLad08FvfQyYy+7p0KqM8vR1F0Ooii6N8R8v5bs8YkNVMfS/iReicLBf6zHJPAaMpmbDgH5oK9TVlch5TT4T+3sJ0JGvyRbWdN2mNTUGfpekCD/T3wB2ziO/wcSj+BUt99/RqBYJJv/jsuPpHRuZWr3hE/vR0BpXTUSlce3XIUzmG3pCTwztAu8042o/ufIk2TTNNQTUno0L7RaG4IbI7/NK6mJPhMOLirE40cLz+3nJ8nqwEwaaE1G4OJtWyyfv/8HoGUJBY7LrWQOuvXmL/JN1uYFH/NJx6OsOqdEspDBx5aSUIe37fuQO2BjmriHQ2pVZqT3gFK8lMTJkmo6pfFqHE6EgLdB00+0IC6YE9T36CRGjI0FGuNOyXeOe39JIVn3vlc9M6fRe/8TcyReWfCiUbLUrUt70SwQOGEFIe2dS0J6dpV79TNxrxDR5vVdbOWd2KgC5H1hztGJMFn44dbQVZCjGS1TRIAuKpffOUhY+omB+Ym3snzDj/DO3C9dyJ+W38n4krnXCnbVh6ko5LItWv9HerFSn+nqWMuaZI0zvu/FoeWPwTW9Xc0Xekd7oeHBzoA0T2mUs7KMshiKgkgzIgQ/nRsnGtbF6QLy8g5J7sSUG+Td1a8EyFsDxmuxHbDflbeZDWAc6F1cEVdT8Pn9rOaJga67gPjYUd+wcCyiN5xVBaFdK46Sifj3fZFmDuVIshiKqN3sIhQv5GV8vjThnfyqGLz3heBvVneebR3jBUbxnfkIaMtR4aiZHxniTPGd+rx+A59rAefjQVx/ZOYAUXqHZIkoneoDb1Eks713qEnyDu3abM0lOvjyrQyrixHlRPUZ4wrf2weV7brg9DsfBQVV0LROnneEfjtHRG9E00UaN8o72jc4J2KloYtWjdex5yWVnJDyfGsxVA0kz+IVoIfMqyMQFU2iFqGRNOilG1JpZMHkpKKbjPT/ynv8Pv3d7jfchzdATopy5mXJACbjpVTPU9yvJsrAFwINdN6cSX4bLhhxbUgiR8twPUNeinCpGwPbRjREEEFCkT+BHnnVvtZG8/fITgF6TSXbY81Fk6BmiWYxXovgKAsrqWsJoM95WERCerC8Z3m6dosY83m8wbFBN1hzFy1RufMx/KF0O3BnF2AAeeLmyIQy2XrjJsWmrbYCCZxdrOwK6An7vhMj0mAnTgLzxxX/poWKzaDgvLC85U9My9/SoquihsjEFxbHGZpkxOdmILxqHh2EokGapq+NDvaxXFknk8ElR5k//P5U2rTqhXQ18gbad0acFT8lRRnw8q5d9ao4LUvlFCcFbcnjjPjiVeaHAhicPzFvLNvIRIL84WtYYzKDzaNID5XNYZXFGmxGhefXM/+8mv7SnzlKyW664xuj5COUhAAyarUHFxZIqTvX8VZirb0XYhkzUx/oy8kqznL6h4+q/LSUHWPyuseF1uzfvpO7p31C0PNS14Zyjlj9q6P/KO3OtX9iEHyF3sn4m3ItFyb2D/mYWJ4LvlWae4iFRFj/r7X9b3iJraEAnntPVQq6WLraBiLba7tpN0g1UTq66TOJZ2SCp0v7g0z6m2uz2KccXmTezd5IR33rL+YPsqSeTVIPZHmtFSelWtSdFKuSTWR5ifA++IRWED2HnCrmN/vGXdHKmnZG4xr8Hh0yO/3G7wv3jMC291Nyiilt0r+/6TaJnknlSXGjNzvVfkAJH13CmP/60JpO2kWpNoqqZN8JLGTfE4i3+9z+iiqwldCxEnliyj9ZbKalf4WUkTpi1xW1X6P3J0J+/2Vd7aze2fnadi9s7N7Z2eF5/DOHZ4JcLncnwlwiifwjjfwbM8EsL3EIO1ExiNoen8kQOCx3hHOME72mmcCqEwOAbqbm8vNzwTIJbd0nMhHJR8hjPellN5zKatB8lkpOllJaQYpFiVP54rbSB/lrcZ3+As/EwBFcXcq7/sMCTwe2T8l7aJUW6U5T9qJVLPSkryFdxizL3toTxNjxZ0pMaz/kFiNOSpuNL9ImkRurcEk8syPMW2OkoKBrvWOoJc+H4XHU93vCcdXzdL/2LvWxkZtIPgBba3tolcrCUho///PrIWxeQgDNo8El8nFNzltAOuGRVhotoMgVysWacd9QE0A2lE8jn2O16lGkEu0w+3hTyILq415Pj1L96AtZy9px3VQm/Hr4S6pWuLvBaEjwa9GP5r1bjUBHH7aw+7MZHO14wQhDAHjxSFcTsZOh6LU7IXtavZWNE/2AbOfJh0FZqZ2BAKQHwJF9r0SAJCGgCG2WxPgaWi0Em48GC1nLxyFrYM2uVN3EXQAZzG4foCNNQ+n99mtS/b85MqiAd0s7Xggk1yGURoC2/PuL55ZneTYNsKQY6G13cq84JygKx47Gb1yTYA4QU9nXW3brSp+przZEknWh2xaMbbPVtQ0D5V1wTEjCC7bzXJQPVLPWhfqJ6xfqV0TYMKQqRUrJ4y/fNDk3OC+gOmPOdFWJuvCBBX4QVB/2bAGwEcjAaio0hBSTjndsruMlwWTrYFAPFpxjE0r6HjT/94R75n1miUbxgztpFM1AcrGwkEDjRvBFY9YHQyE5+qMIxYzvOhmHwWB3sLXXQCa5Gk3ia4xjIV8zLhMgm8dcP//X7fdt78tyL44vp47dzML/3YsVID3vbnbXgYIw5c1aTavCVD0fgaKfcsD8nywJkAcfHfSbcU3vujxURRFHV7kRXQUPFs369BoV6WdzIPYFf+oh0oBcsx/B6inLNtupUUeKv8MJx4OOKMmAF5q0CVCzyMXF9QEyAdyCWex967Pi9pCNe77+CiCZpq/m2gM0Xp5TQCTNKCpsywF+zHeTYzAvVITIDXelyLYoPlAPNUJ2td60EDv1wQIVdSKWTUBfEg9RRH+7gbH0SGcqvA8p6J/FBwX1wRAERnCjgCBf4zPKefZSzUBTPB1F7eaAOlFiDVrAlT/wXNqAlwVU/g/fEhpUU2A6Chu/u90jbyySDtWLq8JIBr+GNkYcylNoEaY5FI5D1YwIH+Br/sO3txxTYALliIVaV1PwvjLmjUB8lppkzUBgsjoGoo5UdEJjpVWa4b+wD9i7TRv31Uvb1AfOivyyPWlqL25ryx0VUmPkeEvyDvraIcr91pNACFuNQG8IEPel91rFgdcUhMg/IllFtcEyK/ht+gi0k4T3ZSfuIYX+Yh2HGLwdUd0gYoONR2aJkmHel/1VqSd61fbm9uIxpv7Y3xOFZj3agKIsvrXfo9QXBOgj6c1AfKcfDcUKb5zKsKVjW5Zinxr8wCcxUdRaYaoqH4tqkygKK20QxS0Q+RqamoqejSE36mrqB+sCeBT4TvaMVR+XN5RYFauCeAnawLIp+UDiuc1AYCGAos4uDmKOLwTPT6V7ho2GhC0g+mdN9csQyWVZSJ8Ul+zyvt45xfknZWuWdpNascRmLk1AfgLNQEs5K/UBMiL6eD5R0Er1QTwQTr9k6wUQpThJb0IL8rLlZnHfdYv8HXf0ZvbIYjk8gyJ7xhlIvgR734PqKPyAcPIux+lzg+erkyQA671sTK15wTx//T5Dlfj2mkyD3phhiA8dqchdTUNMwxCIN2e7JsMfTOY6VnRK9QEoPZUfPpznyvbnna2/lx52ps7nh2enh7mciyWdaDGN7sgmMvpaIt6zZoA0/NZ+OJ8VvEz81lq1nyWRbe0JgBnMfjeNQHYO9EKKImw5zw6HmEe/d9n8+hcJf/jmgAyTSLs+/xOK/T153do5vM7SHqD53fYc2/uj38EV/GtnlZ2EVKEJwl64uG+lZ4qXLJn/czrdIk3tzj0ciMLNkt2Q3rkrhruPr9oXWjKj2o4zRmzlCY7ImP80Fm6D+2XehncvNmrZSvV6x6ULaaKLGMu2ReZBMs+BEoxttxDxYnKYx81Y4iSMTtAmwA7QtUyql6gEihLdkdKxNghs3QfFnAlb+4sMz6qCSA71HSoXkQb93+WqYbq2TTL+M+4N7nqSqkY0+G85UrxQao3pmwJVZVXt09Pz7jdkRG+Y8itW3QXb26sKI+pBeTZ6Tf4M3AuOCGZYIpkgsOSETUN//oiNSJQI0aoiWm2iKanN/eJNk6f0xOv4NTOiV+DUzsnTu2cmMCpnRO/Bqd2TuyrHefCd3gJr1n1MkyziM4JSIZo9i5NXPKjCAfS7a2sTbPfTVeuCUD4q2sCEECLasaQ0iz5IWScMDLknqC/y5tbinQd7TivGQcKu7eWMWWtqqleg8qa8jalG+Vdagcoq6jsUY5BS+YH5ON8pVzZvEFdUV6/bTlGaYraSSqXUV5RBMuyhdpp3Kb5wSaHw/Eq2OPxnbi3jj+TrlVQY7pCTYBjPvpVraLgO2cexuRRe6sPjZAu0o47vNu0TvaD+5gHvwIU6GyBdhwdviYAepeshM/vrS40Y26+dlLhPbW+EIACrBxeADD4FTA3dGnwNGi/mgCcPu1hdw3pTO2kBM8RLf9RlggHvsgqHoXakdAFwSPYvyZAdrgbikkooHnaEQiiLJMhlKnoGbsrAsBhAJCaHRq2+mbwfCSrwwhPRNj5RkIkK1U0Yrd3+Q+WNZDNqWJV1KparTLOC/LRSpKzeM+tZj227XrXEayc5c1tAMtxe2XVMePPi+KpDQbItnaBRi3gGesFF2PBr0OtXhPA1QKnzjdVBHre87xzMgBq1oVtNcfrflWnVfbFge1W4mObjvcsATDadYwZ2nFBOmMoAflM//UCm7epJkIJbKerJrf7MhT4ZCFS1/kJwZfJk14qoyoHbafNvK9+1TpXigKQ98XRuBV8R++e4Ou75XRg+9qgllnBv/1tK8C2l0HdHEGn09oRkF7G0SwR1YBTvu6oH+9+0nxdzfd1R9BsBuLEuwyCXFs6aEb7qSOe3lvCUQ+VvKcO1fFQ+e57qCB13Hmwr7tXPFT+bXbd28e0dhAvNfzlCZD441ya8HXPwXZD48DYrygER4FFLxjZG1iqHQ/oWj+kkyfZx3g3MYQZPqd3yaSYlkJcjEmDb7C4ctHz5mYIxZRJLtaxFrstA3ZhBIzF282LQa0R6B/RDmA6VXijAeDneHMrNcObWzwGxRdxs/C8lFRiWQp6nE9Pfd1pyl+5cTrNg037tK+7vzvkFnnk6/4ieF01VYTZ4VQI9yo1Xa/KelyYlOWVVT8EFl6Se0ep/603Nwl/9+b2aYnler7uRVHQsDd37LaNIZCCdTJFrmrz0dQEcACieveuoWmPXgNNoEmXDnvkkqCbv3JKV34hIT7Qm5vxbP4160IGhTciLUN3oEEvGm/uZ9opXqkJEDCsHd8WWV6JMvy1OO/IJKBas+bC64MmDR0L6Hhzx77u3lxKavm6X8D+Ao/cda5ZGs0LY+WyTMpLmYR0nJZUXlE33A9dz/B1z4EPXbNudu1Tvu6NUfvNp52ivt95vDNcE4A8dXzdvff11eyD8s4cb24xZK8svIhuH+b6uvPY1z0EFpRT97cR4xvWcJkKgZURvKdWMPCf0Y5wNSe8a0dcSrzlHVHlnSspq5b0g7y5tUyXfzaYAnH25B594Dokn1nAx2nHNhr3cWC4ekXBL0EtthwkEPFJZsj7tCTvTemv7OIfeceD/n95c6fj4jEQ9j33Az9o5ZJ8IhQ0GwvOc8ofwYjDaWfj8vq+MzKEZKrAIbGPyTt8lje3QfCmHIagznyIxlFF5ACqHVqMhGIIHQ0uouBJxB7By9DzGPbj0qH2UeK4djDy5n5FOzbSzive3H/N8OZWKOc9g+ERngGt7k13Y14MI0fAth7GQqmaG58frNg74Mmq8ODLUelI1sD2xIG8p448mp+J1THsvs0Rv9szFsQ6oPakQ2y+LbvXNAI1nLPnenM7I7oV9W0NxaP7XniGaCZZjoVGs7vj230LycrwAGSeJmiQvZnwvH1ayWgqnFonh439s7++b/iyADzqq9BawUYz4Rquzu13/Itgoz2H5hr4bKjs33vm1I1OAGglh6GiX+IjoQu2Ow+SdLI2DCHEGK5xrzqhMrbXhgZ29BQlzUZOtJDAX9qzpvgkjpG9p53EfcDjtxrQJevDGREBwA4JnMsG7db4xFIsRquVD91BP8BHNj25Z6nYEKR635s7O/5SIy7TZCeYwy8qidIauvfX2HCiQxeUWLkmwPSpduje6kORW7K2zx/abFqCzJIdkaljl99oQ2vG3LJ1oYYd2OjeYprsCgPEPgMSiS1ej55lEohH3v370fd+WUnLmHbJzkgVY1Kq1vEckCoVtGPW8FBJCdmtqAS7uXHU1I5QVVO5JlUxpWdUAvLkJ5AxBBtZb79Gf96bm2VuJf8dl2WKiDNGJBkTRDqm8j2qaipGqHpOfYfqB8146pIfgkvTLPRMfTxDVL5GZU1FTflr1A9Q36OqocGg+/SMO3HD6Td44sdxaufEqZ0TEzi1c+LX4NTOiVM7JyZwaufEr8Gpnc3hjOh/9ukrqpZRvR7ljHeoDJQ40+R5dmrnh+Cyem4Eq3kBnKQ4QBUMUoQBqgFbVAZKXYoQUc74LQC7VAMELaWndvaH86gYV5r3SrazKcp/C9Ws0n52amdnZBrosI+sNNCWMe5O7ewJztgHKOexrO3Uzn7w+EFPLEuw2amdvWDgo552l5qd2tkJGfuUOiQPaHdqZw84tge4ktLaaqXj9tAgTu3sAWF3yDoKAQAhYIfdcUB3amd7uB0GO5wA7HXx+d/X5ekIKNnWUIqd2tke2iq2MTSB/f7zji8EyTbHqZ0dwLaHBftnC9+4Q70unZ7a2RoZ2xwySKcjHkDOtgUHPLWzNcTmC/c54OOCVZOv7RMPoTu1szE8bK0dBV936fxN98RDbGNonp3a2Rhy81tmCU3auasIgbOtcWpnCMcaKttGO48EZDfPdlyf16w+Dq0deyfbD3g0mFM7G8NaFmEr7XzvmHcUiFM7GwOAxdhovGMD2Wm8w2V6aqeH42lHAX1Hlyw8x8rHh9ZsO3Alg3buN+l/N5cs0Iz3PExP7RwNbEtUttxcAtWaadKOqk2fNoOmc6wc4Sh5J6QcLVU9n/V3Zz4LdZWUSG/3mLQ+x8oDOMZ4xwI9OLdhyFPj7yrr3KGBthGvxjPv9HEU7UhSrC0ewK+vuroE6k5LK+4c7xwK/7F3RrutwjAYvmgsbFySVHhcJLz/c57RBs7pCHAKTAqSP03TJrJpUr8lTn9irDWngxZ/NtZ3QvCCrH+/Ysax6s7FMOeDDC675xKx2b2V8CSPZhIXwpwPkuRdEF6qjZI8WitfChFzOt7kYTJ5rDNn4zTPylF0rYyCZgm74imahGYSlwHgZHXA7quRkldaK18H7891hwV31tde3bkY5mxW1HF25dpULmsmcRXOnXfWfxmT2UL3WRfi1HrHkTvgjkNjjGYS1+FMd5DAr15fvWrBGqP1zoU4M5NAa4+Zh+rOlTAn4N2Ax42Q4DVoeZR1OA7STOIKmMM4JhggtrgyJdE4yi07OAamJF7PSZTP0UzCC5CEASFY9MLRNApAcEEvAA5PGMiinpMoHYBj6sA/7VEEIC+PBQp1IjKQz78jTdNvCgSimUTpHHPHE4Tt7ig2WZEIs9h8fmNqyyBaK5fG1zve4ROzC0nqjMTcnIKU1BkRkIxfnNSZ5HHqTkncO4IcRNbvO3pVvxMyb9LwKNgEg58PausfGrJmEuVw7wCIs9CuHpIE8WVMrBPt/NSeHwWTEBcNcyCvMX8NEnCaSZTCnaDpqzyDV+zNJnkruK1ju/SK2zTtRJHQtqNhs2knjg164jTxiGYShXAHuFcrNB8f9PWTFbV8k15xu3AePURhoZBdtJAodTtoWSjZQ6T1TiF0SZ0Veey+jl4h1qFuKU0pstAHQ+rwPYqzsxMSpwY9EqZ2GUyo7hTBA7jagGCnO98fItTWA1l3Ji9qafPuSPJLhsGTO5pJFEEHY63T36q+r/rE8NU08bhda5bUUdqa1tesEIaPOs07+TUrhlriNO8Qo2YSRcA8qgOPivhGTfPoG2geN+imK/Lh6yPJisgh0EuRpVqZ21okhJcXQJjbog/iSJCYVj/WTKIM/nGn6xu+Ud/fqoqq6sE8Tjyf7mzg+Yq3ryK3jU8rAPOGxe+BbYj5LVQSbLiaxgwWWs0kyuCvO9Td7895p3+60927R9qof+qOA5m9Nygb7w3mN/JI1M4beOs+qwyYJnearhrmneo171DXpUXrvvWfvqlFzN056InaTcEsyE+/rGYShdDAY3Sn58EdABjcaZrh8xMG/3mMHv8nC03yrHWMY5B3dVjPSZTCF8GtemP6dk+pnHAAIW4+oUaAwmhPlIV7MBgkThIyMOo5iWJooKvW6Hcl146BJA6sPRnLAlB4DpLF5AwFQNIgAGCv5yTKgYH7FXVo52lgC9/Q+hP5kGAcRUyAix4m2MnRUlmfJ3EqDVD3yNN0QHbv6iB2wKFZxjnv7IBHg37p9Ch6Ow4y1uu9XyVxZ4IZR28vR+8/Pmfs2ZkFtHdTqXzdH++4BJrfw7Gf371hNvGimUTRWDEH8Wg2yDw9wv6HFxasZhIlA3BUHdiyD5n3PvDvwJ+lmcSM4txxIJsSYL5nxhZe798pmsM9VPY+I9vC/Oe0l8GlML+Ot7i91uXxTjOJgvHe/DIO7N7mpgKomUS5HK93LG4tTrv1tOA0kyiXw+4IbaiBfv/k4VAziXIROewOmn3YWVSutfKlMEdBxK3r+1ckRM0kysX8Nm7KWHeEWpa8ZhJ/2DvD1kZCIAx/aF5wRk4tTinM/P//eV13j15c1xJzATl8oGnLin7IQ6LOOE7LcyUCY/gips6EJQjkatayhdT7HQQcIfoVk5gQYNycgAOf2uYICpdVvCJhR9odOMFBcCsmMR3j7pSMQTWQbn80v3DgVfdcQZ86iYJbB6GtFpUOlEBxzZVnY3hvMAAlB9mMWT3EtZKUeScLKDXUEevViAsgzX9dMrrcmYzx3WJYt5SX3B2OUCCdGgh/488lee4qzRkQV0xiLgY/dxKRVSXeQvdQlkJqNST3TnYlkNVn/VZMYiqA5wsNFohcXYzpjuoUhkPVwCq5Qj2CIqyYxFSMuZNA3K00mCDV8wzfP45MVLnFFeRXTGIqHo1J1KUHjslyqS1ZF04xtf15wZM79ZB3rfL2W5BObukxQEHg1lx5Jm5DCKy8s6rGmlW395ngKnfUyvPDIUG6kEul9IZ4em6mWobRqsHPpOVOzSTuUGbOms00i3791G4IcnGHZXPLZPsPqbZPTUTZzNvxpXfqQLKxmuW9g7BiEjMRwrA7aqYqZmrcdCeb2eaPieomCuLJnawspqzccIeLO5zZLJcBDGHFJGYCGHeHVVXKV1LDHWPJJia6+eP54nNHWa/cMTZjb6KbnVQaxBWTmAlgeL6Ty4Rkf23Nd2x7kvfX5nxHLYsWubg53/kiHx3I3mDNlWdizJ0I5QqDVMuoCjqts2xzg/Ox3PJwF2v4LKpFvrVGn4oYbwM0dl8EsSr53r0fIkH62zeEzHdk8o/YvWISLSZYZ51LvBmR6248VzEH52HdbeMAfaaIXFjrrJfzOZaJ7jyUe9XiHJF17z1KoNwLVzmC3rvlH5Lbr5zTV/NO4R/cumb0Qxhc4F2nCmFxrzuCAukxu9+WOy/mAzKahww55DAlBNdK8PnTQBrJX+47P8cUFLojCB7NXP5c7rwcibcxnAdIv/C4TPuDqF6XGAwAlQZoZ3Ylf9w+Sw+XH5Sw3Hk9n09kugsKPlzdPOyxQVd+JqF+B9GjII9mu5P/WO68nltM4/r8dBV++qGmmEsxDHXQJ8mvt+XO63mH3P4/frdnbysOwlAUhnPakJCYA5jk/d90bCOlTs2ozNShsj56sZBe/iTSSrRzhkJRXUr0qqKdU+SLpaNHchLtnETpoK4jmiLRzlmqJa8uIk6fjHbOk+1F3pe1N7FKiXZOlKvS1mv16QJZJ3vtcCIqEv5cdfe/lHyISoUwLR1+MWNv6o3Zvhva00MzjjYonbJcUYiI39sxEt4gD1FpugU0EmkVetP/OOOxOS6mPzr181Pjq1xnHu1QlvAeNSVdq0up1tyb7l9m3Zy5m0WmezuCJkkC7JdoIpggvPDAQaW10y4tJwH2cu3KYu3gMXjjgb2ybcfOhOPWgiOGduzcCMLvg3AwHRLsOR5cW7AtP9JpON1YvDDDFmdpvrGW8VBxOHugL7tilum0eGZ2SA7gVRoKzThb4ASwD2ffCNQDe3DBXgkC2CLYOiE4Th/o4VwsyvkChuskPyTBSVsAAAAASUVORK5CYII=" width="571" height="307" class="img_ev3q"></p>
<p>The <a class href="https://d7y.io/blog/2022/06/06/evolution-of-nydus">RAFS image format</a> is an archive compression format proposed by Nydus. It separates the data (Blobs) and metadata (Bootstrap) of the container image file system, so that the original image layers only store the data part of the files. Furthermore, the files are divided into chunks according to a certain granularity, and the corresponding chunk data is stored in each layer of Blob. Using chunk granularity refines the deduplication granularity, and allows easier sharing of data between layers and images, and easier on-demand loading. The original image layers only store the data part of the files (i.e. the Blob layer in the figure).</p>
<p>The Blob layer stores the chunk files, which are chunks of file data. For example, a 10MB file can be sliced into 10 1MB blocks, and the offset of each chunk can be recorded in an index. When requesting part of the data from a file, the container runtime can selectively obtain the file from the image repository by combining with the HTTP Range Request supported by the OCI/Docker image repository specification, thus saving unnecessary network overhead. For more details about the Nydus image format, please refer to the <a href="https://github.com/dragonflyoss/image-service" target="_blank" rel="noopener noreferrer" class>Nydus Image Service project</a>.</p>
<p>The metadata and chunk indexes are combined to form the Meta layer in the figure above, which is the entire filesystem structure that the container can see after all image layers are stacked. It includes the directory tree structure, file metadata, chunk information (block size and offset, as well as metadata such as file name, file type, owner, etc. for each file). With Meta, the required files can be extracted without scanning the entire archive file. In addition, the Meta layer contains a hash tree and the hash of each chunk data block, which ensures that the entire file tree can be verified at runtime, and the signature of the entire Meta layer can be checked to ensure that the runtime data can be detected even if it is tampered with.</p>
<p><img decoding="async" loading="lazy" alt="nydus-meta-layer" src="https://d7y.io/assets/images/nydus-meta-layer-a94632f53a5da4b96d867b97a2c8f272.png" width="1000" height="399" class="img_ev3q"></p>
<p>Nydus uses the user-mode file system implementation <a href="https://www.kernel.org/doc/html/latest/filesystems/fuse.html" target="_blank" rel="noopener noreferrer" class>FUSE</a> to implement on-demand loading by default. The user-mode Nydus daemon process mounts the Nydus image mount point as the container RootFS directory. When the container generates a file system IO such as read(fd, count), the kernel-mode FUSE driver adds the request to the processing queue. The user-mode Nydus daemon reads and processes the request through the FUSE Device, pulls the corresponding number of Chunk data blocks from the remote Registry, and finally replies to the container through the kernel-mode FUSE. Nydus also implements a layer of local cache, where chunks that have been pulled from the remote are uncompressed and cached locally. The cache can be shared between images on a layer-by-layer basis, or at a chunk level.</p>
<p><img decoding="async" loading="lazy" alt="nydus-uses-the-user-mode-file-system" src="data:image/png;base64,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" width="598" height="422" class="img_ev3q"></p>
<p>After using Nydus for image acceleration, the startup time of different applications has made a qualitative leap, enabling applications to be launched in a very short time, meeting the requirements of rapid scaling in the cloud.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="read-only-file-system-erofs">Read-only file system EROFS<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#read-only-file-system-erofs" class="hash-link" aria-label="Direct link to Read-only file system EROFS" title="Direct link to Read-only file system EROFS" translate="no">&#x200B;</a></h4>
<p>When there are many files in the container image, frequent file operations generate a large number of FUSE requests, which causes frequent context switching between kernel-space and user-space, resulting in performance bottlenecks. Based on the kernel-space EROFS file system (originating from Linux 4.19), Nydus has made a series of improvements and enhancements to expand its capabilities in the image scenario. The final result is a kernel-space container image format, Nydus RAFS (Registry Acceleration File System) v6. Compared with the previous format, it has the advantages of block data alignment, more concise metadata, high scalability, and high performance. When all image data is downloaded locally, the FUSE user-space solution can cause the process that accesses the file to frequently trap to user-space, and involves memory copies between kernel-space and user-space.</p>
<p>Furthermore, Nydus supports the EROFS over FS-Cache scheme (Linux 5.19-rc1), where the user-space Nydusd directly writes downloaded chunks into the FS-Cache cache. When the container accesses the data, it can directly read the data through the kernel-space FS-Cache without trapping to user-space. In the container image scenario, this achieves almost lossless performance and stability, outperforming the FUSE user-space solution, and comparable to native file systems (without on-demand loading).</p>
<table><thead><tr><th></th><th>OCI</th><th>Fuse + rafsv5</th><th>Fuse + rafsv6</th><th>Fscache + rafsv6</th><th>Fscache + rafsv6 + opt patch</th></tr></thead><tbody><tr><td>e2e startup wordpress</td><td>11.704s, 11.651s, 11.330s</td><td>5.237s, 5.489s, 5.337s</td><td>5.094s, 5.382s, 5.314s</td><td>10.167s, 9.999s, 9.884s</td><td>4.659s, 4.541s, 4.658s</td></tr><tr><td>e2e startup Hello bench java</td><td>9.2186s, 8.9132s, 8.8412s</td><td>2.8325s, 2.7671s, 2.7671s</td><td>2.7543s, 2.8104, 2.8692s</td><td>4.6904s, 4.7012s, 4.6654s</td><td>2.9691s, 3.0485s, 3.0294s</td></tr></tbody></table>
<p>Currently Nydus has supported this scheme in building, running, and kernel-space (Linux 5.19-rc1). For detailed usage, please refer to the <a href="https://github.com/dragonflyoss/image-service/blob/master/docs/nydus-fscache.md" target="_blank" rel="noopener noreferrer" class>Nydus EROFS FS-Cache user guide</a>. If you want to learn more about the implementation details of Nydus in kernel-space, you can refer to <a class href="https://d7y.io/blog/2022/06/06/evolution-of-nydus">Nydus Image Acceleration: The Evolutionary Road of the Kernel</a>.</p>
<p><img decoding="async" loading="lazy" alt="the-evolution-of-the-nydus-kernel" src="https://d7y.io/assets/images/the-evolution-of-the-nydus-kernel-beecd10dab49da6820d808791763cbed.png" width="1000" height="304" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-p2p-accelerates-image-downloading">Dragonfly P2P Accelerates Image Downloading<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#dragonfly-p2p-accelerates-image-downloading" class="hash-link" aria-label="Direct link to Dragonfly P2P Accelerates Image Downloading" title="Direct link to Dragonfly P2P Accelerates Image Downloading" translate="no">&#x200B;</a></h4>
<p>Both the image repository service and the underlying storage have bandwidth and QPS limitations. If we rely solely on the bandwidth and QPS provided by the server, it is easy to fail to meet the demand. Therefore, P2P needs to be introduced to relieve server pressure, thereby meeting the demand for large-scale concurrent image pulling. In scenarios where large-scale image pulling is required, using Dragonfly&amp;Nydus can save more than 90% of container startup time compared to using OCIv1.</p>
<p><img decoding="async" loading="lazy" alt="dragonfly-p2p-accelerates-image-downloading" src="https://d7y.io/assets/images/dragonfly-p2p-accelerates-image-downloading-a94632f53a5da4b96d867b97a2c8f272.png" width="1000" height="399" class="img_ev3q"></p>
<p>The shorter startup time after using Nydus is due to the lazy loading feature of the image, where only a small portion of metadata needs to be pulled for the Pod to start. In large-scale scenarios, the number of images pulled back by Dragonfly is very small. In the OCIv1 scenario, all image pulling requires a return to the source, so the peak return to the source and return to the source traffic using Dragonfly are much less than in the OCIv1 scenario. Furthermore, after using Dragonfly, as the concurrency increases, the peak return to the source and traffic do not increase significantly.</p>
<table><thead><tr><th>1GB random file for TEST</th><th></th><th></th><th></th></tr></thead><tbody><tr><td>Concurrency</td><td>Completion time for OCI image</td><td>Completion time for Nydus+Dragonfly image</td><td>Performance improvement ratio</td></tr><tr><td>1</td><td>63s</td><td>41s</td><td>53%</td></tr><tr><td>5</td><td>63s</td><td>51s</td><td>23%</td></tr><tr><td>50</td><td>145s</td><td>65s</td><td>123%</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-slow-cluster-scaling">4: Slow Cluster scaling<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#4-slow-cluster-scaling" class="hash-link" aria-label="Direct link to 4: Slow Cluster scaling" title="Direct link to 4: Slow Cluster scaling" translate="no">&#x200B;</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="acr-image-repository-global-synchronization">ACR Image Repository Global Synchronization<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#acr-image-repository-global-synchronization" class="hash-link" aria-label="Direct link to ACR Image Repository Global Synchronization" title="Direct link to ACR Image Repository Global Synchronization" translate="no">&#x200B;</a></h4>
<p>To meet customer demand for a high-quality experience and data compliance requirements, ZOLOZ deploys in multiple global sites in the cloud. With the help of ACR image repository for cross-border synchronization acceleration, multiple regions around the world are synchronized to improve the efficiency of container image distribution. Image uploading and downloading are performed within the local data center, so even in countries with poor network conditions, deployments can be made like in local data centers, truly achieving one-click deployment of applications around the world.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-containeros-for-high-speed-startup">Use ContainerOS for High-Speed Startup<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#use-containeros-for-high-speed-startup" class="hash-link" aria-label="Direct link to Use ContainerOS for High-Speed Startup" title="Direct link to Use ContainerOS for High-Speed Startup" translate="no">&#x200B;</a></h4>
<p>With cloud-native, customers can rapidly expand resource scaling, and use elasticity to reduce costs. On the cloud, virtual machines need to be scaled quickly and added to the cluster. ContainerOS simplifies the OS startup process and pre-installs necessary container images for cluster management components, reducing the time spent during node startup due to image pulling, greatly improving OS startup speed, and reducing node scaling time in the ACK link. ContainerOS is optimized in the following ways:</p>
<ul>
<li class>ContainerOS simplifies the OS startup process to effectively reduce OS startup time. The positioning of ContainerOS is an operating system running on a cloud-based virtual machine, which does not involve too many hardware drivers. Therefore, ContainerOS modifies the necessary kernel driver modules to built-in mode. In addition, ContainerOS removes initramfs, and udev rules are greatly simplified, which significantly improves OS startup speed. For example, in the ecs.g7.large ECS instance, the first startup time of LifseaOS is about 2 seconds, while Alinux3 requires more than 1 minute.</li>
<li class>ContainerOS pre-installs necessary container images for cluster management components to reduce the time spent during node startup due to image pulling. After the ECS node startup is completed, some component container images need to be pulled, which are responsible for performing some basic work in the ACK scenario. For example, the Terway component is responsible for the network, and the node must be in the ready state only when the Terway component container is ready. Therefore, since the long-tail effect of network pulling will cause great time consumption, pre-installing this component in the OS in advance can directly obtain it from the local directory, avoiding the time consumption of pulling images from the network.</li>
<li class>ContainerOS also improves node elasticity performance by combining ACK control link optimization.</li>
</ul>
<p>Finally, the end-to-end P90 time consumption from an empty ACK node pool expansion was statistically calculated, starting from the issuance of the expansion request and ending the timing when 90% of the nodes were ready, and compared with CentOS and <a href="https://www.alibabacloud.com/help/en/container-service-for-kubernetes/latest/containeros-overview" target="_blank" rel="noopener noreferrer" class>Alinux2 Optimized-OS</a> solutions. ContainerOS has significant performance advantages.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-overall-solution">The overall solution<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#the-overall-solution" class="hash-link" aria-label="Direct link to The overall solution" title="Direct link to The overall solution" translate="no">&#x200B;</a></h2>
<p><img decoding="async" loading="lazy" alt="the-overall-solution" src="https://d7y.io/assets/images/the-overall-solution-cb17bc9f1c584e09774d1349e96ba11c.png" width="1000" height="518" class="img_ev3q"></p>
<ol>
<li class>By using a streamlined base image and following Dockerfile conventions, we can reduce the size of our images.</li>
<li class>We can utilize the buildkit provided by Ant Group for multistage and parallel image building, and use caching to speed up repeated builds. When directly building Nydus accelerated images, we can deduplicate by analyzing the repetition between images and only upload the different blocks to remote image repositories.</li>
<li class>By utilizing ACR&#x2019;s global acceleration synchronization capability, we can distribute our images to different repositories around the world for faster pulling.</li>
<li class>We can use the Dragonfly P2P network to accelerate the on-demand pulling of Nydus image blocks.</li>
<li class>We can use the ContainerOS operating system on our nodes to improve both OS and image startup speed.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="mprove-the-startup-speed-of-the-image" src="data:image/avif;base64,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" width="1080" height="233" class="img_ev3q"></p>
<table><thead><tr><th>Time (3GB image as an example)</th><th>Build Image</th><th>Push Image</th><th>Schedule Node</th><th>Pull Image</th></tr></thead><tbody><tr><td>Before</td><td>180s</td><td>60s</td><td>506s</td><td>4m15s</td></tr><tr><td>After</td><td>130s</td><td>1s</td><td>56s</td><td>560ms</td></tr></tbody></table>
<p>*Schedule Node: This refers to the time from creating an ECS instance on Alibaba Cloud to the node joining the K8s cluster and becoming Ready. Thanks to the optimization of ContainerOS, this time is reduced significantly.</p>
<p>Through extreme optimization of various stages in the entire R&amp;D process, it is found that after optimization, both R&amp;D efficiency and online stability have been qualitatively improved. Currently, the entire solution has been deployed on both Alibaba Cloud and AWS and has been running stably for three months. In the future, standard deployment environments will be provided by cloud vendors to meet the needs of more types of business scenarios.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage-guide">Usage Guide<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#usage-guide" class="hash-link" aria-label="Direct link to Usage Guide" title="Direct link to Usage Guide" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-installation">Dragonfly installation<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#dragonfly-installation" class="hash-link" aria-label="Direct link to Dragonfly installation" title="Direct link to Dragonfly installation" translate="no">&#x200B;</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ helm install --wait --timeout 10m --dependency-update --create-namespace --namespace dragonfly-system dragonfly dragonfly/dragonfly --set dfdaemon.config.download.prefetch=true,seedPeer.config.download.prefetch=true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME: dragonfly</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">LAST DEPLOYED: Fri Apr  7 10:35:12 2023</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAMESPACE: dragonfly-system</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">STATUS: deployed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">REVISION: 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">TEST SUITE: None</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NOTES:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">1. Get the scheduler address by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l &quot;app=dragonfly,release=dragonfly,component=scheduler&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $SCHEDULER_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace dragonfly-system port-forward $SCHEDULER_POD_NAME 8002:$SCHEDULER_CONTAINER_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:8002 to use your scheduler&quot;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">2. Get the dfdaemon port by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l &quot;app=dragonfly,release=dragonfly,component=dfdaemon&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $DFDAEMON_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  You can use $DFDAEMON_CONTAINER_PORT as a proxy port in Node.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">3. Configure runtime to use dragonfly:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  https://d7y.io/docs/getting-started/quick-start/kubernetes/</span><br></div></code></pre></div></div>
<p>For more details, please refer to: <a class href="https://d7y.io/docs/next/operations/integrations/container-runtime/nydus/">nydus</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nydus-installation">Nydus installation<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#nydus-installation" class="hash-link" aria-label="Direct link to Nydus installation" title="Direct link to Nydus installation" translate="no">&#x200B;</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ curl -fsSL -o config-nydus.yaml https://raw.githubusercontent.com/dragonflyoss/Dragonfly2/main/test/testdata/charts/config-nydus.yaml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ helm install --wait --timeout 10m --dependency-update --create-namespace --namespace nydus-snapshotter nydus-snapshotter dragonfly/nydus-snapshotter -f config-nydus.yaml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME: nydus-snapshotter</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">LAST DEPLOYED: Fri Apr  7 10:40:50 2023</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAMESPACE: nydus-snapshotter</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">STATUS: deployed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">REVISION: 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">TEST SUITE: None</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NOTES:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Thank you for installing nydus-snapshotter.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Your release is named nydus-snapshotter.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">To learn more about the release, try:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  $ helm status nydus-snapshotter</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  $ helm get all nydus-snapshotter</span><br></div></code></pre></div></div>
<p>For more details, please refer to: <a href="https://github.com/dragonflyoss/helm-charts/blob/main/INSTALL.md" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/helm-charts/blob/main/INSTALL.md</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="containeros">ContainerOS<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#containeros" class="hash-link" aria-label="Direct link to ContainerOS" title="Direct link to ContainerOS" translate="no">&#x200B;</a></h3>
<p>ContainerOS has implemented high-speed scaling for elastic expansion scenarios in ACK cluster node pools through the following optimizations:</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="os-startup-speed-improvement">OS Startup Speed Improvement<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#os-startup-speed-improvement" class="hash-link" aria-label="Direct link to OS Startup Speed Improvement" title="Direct link to OS Startup Speed Improvement" translate="no">&#x200B;</a></h4>
<p>LifseaOS significantly improves OS startup speed by:</p>
<ul>
<li class>Removing unnecessary hardware drivers for cloud scenarios</li>
<li class>Modifying essential kernel driver modules to built-in mode</li>
<li class>Removing initramfs</li>
<li class>Simplifying udev rules</li>
</ul>
<p>These optimizations reduce first boot time from over 1 minute (traditional OS) to approximately 2 seconds.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="ack-specific-optimizations">ACK-Specific Optimizations<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#ack-specific-optimizations" class="hash-link" aria-label="Direct link to ACK-Specific Optimizations" title="Direct link to ACK-Specific Optimizations" translate="no">&#x200B;</a></h4>
<p>ContainerOS is customized for ACK environments:</p>
<ul>
<li class>Pre-installed container images for cluster management components eliminate network pull time</li>
<li class>ACK control link optimizations:<!-- -->
<ul>
<li class>Adjusted detection frequency for critical logic</li>
<li class>Modified system bottleneck thresholds under high load</li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-use-containeros">How to Use ContainerOS<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#how-to-use-containeros" class="hash-link" aria-label="Direct link to How to Use ContainerOS" title="Direct link to How to Use ContainerOS" translate="no">&#x200B;</a></h4>
<p>When creating a managed node pool for an ACK cluster in the Alibaba Cloud console:</p>
<ol>
<li class>Go to the ECS instance OS configuration menu</li>
<li class>Select ContainerOS from the dropdown menu</li>
<li class>Note: The version number (e.g., &quot;1.24.6&quot;) in the OS image name corresponds to your cluster&apos;s Kubernetes version</li>
</ol>
<p>For optimal node scaling performance, refer to ContainerOS documentation on high-speed node scaling.</p>
<p>Nydus Project: <a href="https://nydus.dev/" target="_blank" rel="noopener noreferrer" class>https://nydus.dev/</a></p>
<p>Dragonfly Project: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reference">Reference<a href="https://d7y.io/blog/2023/05/01/ant-group-security-technologys-nydus-and-dragonfly-image-acceleration-practices#reference" class="hash-link" aria-label="Direct link to Reference" title="Direct link to Reference" translate="no">&#x200B;</a></h2>
<p>[1]ZOLOZ: <a href="https://www.zoloz.com/" target="_blank" rel="noopener noreferrer" class>https://www.zoloz.com/</a></p>
<p>[2]BuildKit: <a href="https://github.com/moby/buildkit/blob/master/docs/nydus.md" target="_blank" rel="noopener noreferrer" class>https://github.com/moby/buildkit/blob/master/docs/nydus.md</a></p>
<p>[3]Paper by Cern: <a href="https://indico.cern.ch/event/567550/papers/2627182/files/6153-paper.pdf" target="_blank" rel="noopener noreferrer" class>https://indico.cern.ch/event/567550/papers/2627182/files/6153-paper.pdf</a></p>
<p>[4]OCI: <a href="https://github.com/opencontainers/image-spec/" target="_blank" rel="noopener noreferrer" class>https://github.com/opencontainers/image-spec/</a></p>
<p>[5]Docker: <a href="https://github.com/moby/moby/blob/master/image/spec/v1.2.md" target="_blank" rel="noopener noreferrer" class>https://github.com/moby/moby/blob/master/image/spec/v1.2.md</a></p>
<p>[6]RAFS image format: <a class href="https://d7y.io/blog/2022/06/06/evolution-of-nydus">https://d7y.io/blog/2022/06/06/evolution-of-nydus/</a></p>
<p>[7]Nydus Image Service project: <a href="https://github.com/dragonflyoss/image-service" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/image-service</a></p>
<p>[8]FUSE: <a href="https://www.kernel.org/doc/html/latest/filesystems/fuse.html" target="_blank" rel="noopener noreferrer" class>https://www.kernel.org/doc/html/latest/filesystems/fuse.html</a></p>
<p>[9]Nydus EROFS fscache user guide: <a href="https://github.com/dragonflyoss/image-service/blob/master/docs/nydus-fscache.md" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/image-service/blob/master/docs/nydus-fscache.md</a></p>
<p>[10]The path of kernel evolution for Nydus image acceleration: <a class href="https://d7y.io/blog/2022/06/06/evolution-of-nydus">https://d7y.io/blog/2022/06/06/evolution-of-nydus/</a>[11]Alinux2 Optimized-OS: <a href="https://www.alibabacloud.com/help/en/container-service-for-kubernetes/latest/containeros-overview" target="_blank" rel="noopener noreferrer" class>https://www.alibabacloud.com/help/en/container-service-for-kubernetes/latest/containeros-overview</a></p>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Volcano Engine, distributed image acceleration practice based on Dragonfly]]></title>
        <id>https://d7y.io/blog/2023/04/13/volcano-engine-distributed-image-acceleration-practice-based-on-dragonfly</id>
        <link href="https://d7y.io/blog/2023/04/13/volcano-engine-distributed-image-acceleration-practice-based-on-dragonfly"/>
        <updated>2023-04-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[CNCF projects highlighted in this post, and migrated by mingcheng.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://www.cncf.io/blog/2023/04/13/volcano-engine-distributed-image-acceleration-practice-based-on-dragonfly/" target="_blank" rel="noopener noreferrer" class>CNCF projects highlighted in this post</a>, and migrated by <a href="https://github.com/mingcheng" target="_blank" rel="noopener noreferrer" class>mingcheng</a>.</p>
<p>Terms and definitions</p>
<table><thead><tr><th>Term</th><th>Definition</th></tr></thead><tbody><tr><td>OCI</td><td>The Open Container Initiative is a Linux Foundation project launched by Docker in June 2015 to design open standards for operating system-level virtualization (and most importantly Linux containers).</td></tr><tr><td>OCI Artifact</td><td>Products that follow the OCI image spec.</td></tr><tr><td>Image</td><td>The image in this article refers to OCI Artifact</td></tr><tr><td>Image Distribution</td><td>A product distribution implemented according to the OCI distribution spec.</td></tr><tr><td>ECS</td><td>It is a collection of resources composed of CPU, memory, and Cloud Drive, each of which logically corresponds to the computing hardware entity of the Data center infrastructure.</td></tr><tr><td>CR</td><td>Volcano Engine image distribution service.</td></tr><tr><td>VKE</td><td>Volcano Engine deeply integrates the new generation of Cloud Native technology to provide high-performance Kubernetes container cluster management services with containers as the core, helping users to quickly build containerized applications.</td></tr><tr><td>VCI</td><td>Volcano is a serverless and containerized computing service. The current VCI seamlessly integrates with the Container Service VKE to provide Kubernetes orchestration capabilities. With VCI, you can focus on building the app itself, without having to buy and manage infrastructure such as the underlying Cloud as a Service, and pay only for the resources that the container actually consumes to run. VCI also supports second startup, high concurrent creation, sandbox Container Security isolation, and more.</td></tr><tr><td>TOS</td><td>Volcano Engine provides massive, secure, low-cost, easy-to-use, highly reliable and highly available distributed cloud storage services.</td></tr><tr><td>Private Zone</td><td>Private DNS service based on a proprietary network VPC (Virtual Private Cloud) environment. This service allows private domain names to be mapped to IP addresses in one or more custom VPCs.</td></tr><tr><td>P2P</td><td>Peer-to-peer technology, when a peer in a P2P network downloads data from the server, it can also be used as a server level for other peers to download after downloading the data. When a large number of nodes download at the same time, it can ensure that the subsequent downloaded data does not need to be downloaded from the server side. Thereby reducing the pressure on the server side.</td></tr><tr><td>Dragonfly</td><td>Dragonfly is a file distribution and image acceleration system based on P2P technology, and is the standard solution and best practice in the field of image acceleration in Cloud Native architecture. Now hosted as an incubation project by the Cloud Native Computing Foundation (CNCF).</td></tr><tr><td>Nydus</td><td>Nydus Acceleration Framework implements a content-addressable filesystem that can accelerate container image startup by lazy loading. It has supported the creation of millions of accelerated image containers daily, and deeply integrated with the linux kernel&apos;s erofs and fscache, enabling in-kernel support for image acceleration.</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="background">Background<a href="https://d7y.io/blog/2023/04/13/volcano-engine-distributed-image-acceleration-practice-based-on-dragonfly#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background" translate="no">&#x200B;</a></h2>
<p>Volcano Engine image repository CR uses TOS to store container images. Currently, it can meet the demand of large-scale concurrent image pulling to a certain extent. However, the final concurrency of pulling is limited by the bandwidth and QPS of TOS.</p>
<p>Here is a brief introduction of the two scenarios that are currently encountered for large-scale image pulling:</p>
<ol>
<li class>The number of clients is increasing, and the images are getting larger. The bandwidth of TOS will eventually be insufficient.</li>
<li class>If the client uses Nydus to convert the image format, the request volume to TOS will increase by an order of magnitude. The QPS limit of TOS API makes it unable to meet the demand.</li>
</ol>
<p>Whether it is the image repository service itself or the underlying storage, there will be bandwidth and QPS limitations in the end. If you rely solely on the bandwidth and QPS provided by the server, it is easy to be unable to meet the demand. Therefore, P2P needs to be introduced to reduce server pressure and meet the demand for large-scale concurrent image pulling.</p>
<p>Investigation of image distribution system based on P2P technology</p>
<p>There are several P2P projects in the open source community. Here is a brief introduction to these projects.</p>
<p><a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>Dragonfly</a></p>
<p>Architecture</p>
<p><img decoding="async" loading="lazy" alt="Diagram flow showing Dragonfly architecture" src="https://d7y.io/assets/images/arch-ebf36c1d2b55520e8dc2b5ca34b39bb9.png" width="997" height="622" class="img_ev3q"></p>
<p>Manager</p>
<ul>
<li class>Stores dynamic configuration for consumption by seed peer cluster, scheduler cluster and dfdaemon.</li>
<li class>Maintain the relationship between seed peer cluster and scheduler cluster.</li>
<li class>Provide async task management features for image preheat combined with harbor.</li>
<li class>Keepalive with scheduler instance and seed peer instance.</li>
<li class>Filter the optimal scheduler cluster for dfdaemon.</li>
<li class>Provides a visual console, which is helpful for users to manage the P2P cluster.</li>
</ul>
<p>Scheduler</p>
<ul>
<li class>Based on the multi-feature intelligent scheduling system selects the optimal parent peer.</li>
<li class>Build a scheduling directed acyclic graph for the P2P cluster.</li>
<li class>Remove abnormal peer based on peer multi-feature evaluation results.</li>
<li class>In the case of scheduling failure, notice peer back-to-source download.</li>
</ul>
<p>Dfdaemon</p>
<ul>
<li class>Serve gRPC for dfget with downloading feature, and provide adaptation to different source protocols.</li>
<li class>It can be used as seed peer. Turning on the Seed Peer mode can be used as a back-to-source download peer in a P2P cluster, which is the root peer for download in the entire cluster.</li>
<li class>Serve proxy for container registry mirror and any other http backend.</li>
<li class>Download object like via http, https and other custom protocol.</li>
</ul>
<p><a href="https://github.com/uber/kraken" target="_blank" rel="noopener noreferrer" class>Kraken</a></p>
<p>Architecture</p>
<p><img decoding="async" loading="lazy" alt="Diagram flow showing Kraken architecture" src="https://d7y.io/assets/images/diagram-flow-showing-kraken-architecture-d43afd1c1f3eefdb3cc53bb01df44e9e.jpg" width="1600" height="941" class="img_ev3q"></p>
<p>Agent</p>
<ul>
<li class>Is a peer node in a P2P network and needs to be deployed on each node</li>
<li class>Implemented the docker registry interface</li>
<li class>Notify the tracker of the data they own</li>
<li class>Download the data of other agents (the tracker will tell the agent which agent to download this data from)</li>
</ul>
<p>Origin</p>
<ul>
<li class>Responsible for reading data from storage for seeding</li>
<li class>Support for different storage</li>
<li class>High availability in the form of a hash ring</li>
</ul>
<p>Tracker</p>
<ul>
<li class>A coordinator in a P2P network, tracking who is a peer and who is a seeder</li>
<li class>Track data owned by peers</li>
<li class>Provide ordered peer nodes for peers to download data</li>
<li class>High availability in the form of a hash ring</li>
</ul>
<p>Proxy</p>
<ul>
<li class>Implemented the docker registry interface</li>
<li class>Pass the image layer to the Origin component</li>
<li class>Pass the tag to the build-index component</li>
</ul>
<p>Build-Index</p>
<ul>
<li class>Tag and digest mapping, when the agent downloads the corresponding tag data, it obtains the corresponding digest value from Build-Index</li>
<li class>image replication between clusters</li>
<li class>Save tag data in storage</li>
<li class>High availability in the form of a hash ring</li>
</ul>
<p>Dragonfly vs Kraken</p>
<table><thead><tr><th></th><th>Dragonfly</th><th>Kraken</th></tr></thead><tbody><tr><td>High availability</td><td>Scheduler consistent hash ring supports high availability</td><td>Tracker consistent hash ring, multiple replicas ensure high availability</td></tr><tr><td>Containerd support</td><td>Support</td><td>Support</td></tr><tr><td>HTTPS image repository</td><td>Support</td><td>Support</td></tr><tr><td>Community active level</td><td>Active</td><td>Inactive</td></tr><tr><td>Number of users</td><td>More</td><td>Less</td></tr><tr><td>Maturity</td><td>High</td><td>High</td></tr><tr><td>Is it optimized for Nydus</td><td>Yes</td><td>No</td></tr><tr><td>Architecture complexity</td><td>Middle</td><td>Middle</td></tr></tbody></table>
<p>Summary</p>
<p>Based on the overall maturity of the project, community active level, number of users, architecture complexity, whether it is optimized for Nydus , future development trends and other factors, Dragonfly is the best choice in P2P projects.</p>
<p>Proposal</p>
<p>For Volcano Engine, the main consideration is that VKE and VCI pull images through CR.</p>
<ul>
<li class>The product feature of VKE is K8s deployed based on ECS, so it is very suitable to deploy dfdaemon on each node, fully utilize the bandwidth of each node, and then fully utilize the capability of P2P.</li>
<li class>The product feature of VCI is that there are some virtual nodes with abundant resources at the bottom layer. The upper layer service is based on POD as the carrier, so it is impossible to deploy dfdaemon on each node like VKE, so the deployment form deploys several dfdaemon as cache, using the cache capability.</li>
<li class>VKE or VCI client pulls images that have been converted by Nydus format. In this scenario, dfdaemon needs to be used as a cache, and not too many nodes should be used to avoid putting too much scheduling pressure on the Scheduler.</li>
</ul>
<p>Based on Volcano Engine&#x2019;s demand for the above products, and combined with Dragonfly&#x2019;s characteristics, a deployment scheme compatible with many factors needs to be designed. The scheme for deploying Dragonfly is designed as follows.</p>
<p>Architecture</p>
<p><img decoding="async" loading="lazy" alt="Diagram flow showing Volcano Engine architecture combined with Dragonfly&amp;#39;s characteristics" src="https://d7y.io/assets/images/diagram-flow-showing-volcano-engine-architecture-combined-with-Dragonfly&apos;s-characteristics-86c3690dcee6f3d622f8c0cd2de0d80a.png" width="1600" height="829" class="img_ev3q"></p>
<ul>
<li class>Volcano Engine resources belong to the main account, P2P control components divided by the main account level isolation, each master account under a set of P2P control components. server level implementation of P2PManager controller, through the controller to control the control plane of all P2P cgroup parts</li>
<li class>P2P control components are deployed in CR data plane VPC , through LB exposed to user cluster</li>
<li class>On a VKE cluster, Dfdaemons are deployed as DaemonSets, with one Dfdaemon deployed on each node.</li>
<li class>On VCI , Dfdaemon is deployed as Deployment</li>
<li class>Containerd on ECS accesses Dfdaemon on this node via 127.0.0.1:65001</li>
<li class>Through a controller component in the user Clustered Deployment , based on the PrivateZone function, generate <code>&lt;clusterid&gt;</code>.p2p.volces.com domain name in the user cluster, the controller will select the Dfdaemon&#xA0; pod of a specific node (including VKE , VCI ) according to certain rules, and resolve to the above domain name in the form of A record.</li>
<li class>ECS on Nydusd by <code>&lt;clusterid&gt;</code>.p2p.volces.com domain name access Dfdaemon</li>
<li class>The image service Client and Nydusd on VCI access Dfdaemon via <code>&lt;clusterid&gt;</code>.p2p.volces.com domain name</li>
</ul>
<p>Benchmark</p>
<p>Environment</p>
<p>Container Repository : Bandwidth 10Gbit/s</p>
<p>Dragonfly Scheduler: 2 Replicas&#xFF0C;Request 1C2G&#xFF0C;Limit 4C8G, Bandwidth 6Gbit/s</p>
<p>Dragonfly Manager: 2 Replicas&#xFF0C;Request 1C2G&#xFF0C;Limit 4C8G, Bandwidth 6Gbit/s</p>
<p>Dragonfly Peer : Limit 2C6G, Bandwidth 6Gbit/s, SSD</p>
<p>Image</p>
<p>Nginx(500M)</p>
<p>TensorFlow(3G)</p>
<p>Component Version</p>
<p>Dragonfly v2.0.8</p>
<p>POD Creation to Container Start</p>
<p>Nginx&#xA0; pods concurrently consume time from creation to startup for all pods of 50, 100, 200, and 500</p>
<p><img decoding="async" loading="lazy" alt="Bar chart showing NGinx Pod Creation to Container Start divided by 50 Pods, 100 Pods, 200 Pods and 500 Pods in OCI v1. Dragonfly, Dragonfly &amp;amp; Nydus" src="https://d7y.io/assets/images/nginx-bar-chart-e5c5f1f40e2d5cbd7518338f2d1e0cb8.png" width="1576" height="899" class="img_ev3q"></p>
<p>TensorFlow&#xA0; pods concurrently consume time from creation to startup for all pods of 50, 100, 200, 500, respectively</p>
<p><img decoding="async" loading="lazy" alt="Bar chart showing TensorFlow Pod Creation to Container Start divided by 50 Pods, 100 Pods, 200 Pods and 500 Pods in OCI v1, Dragonfly ad Dragonfly &amp;amp; Nydus" src="https://d7y.io/assets/images/tensor-flow-bar-chart-4609b2877e1499f8285cec1bc374e8e0.png" width="1576" height="1425" class="img_ev3q"></p>
<p>In large-scale image scenarios, using Dragonfly and Dragonfly &amp; Nydus scenarios can save more than 90% of container startup time compared to OCIv1 scenarios. The shorter startup time after using Nydus is due to the lazyload feature, which only needs to pull a small part of the metadata&#xA0; Pod to start.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="back-to-source-peak-bandwidth-on-container-registry">Back-to-source Peak Bandwidth on Container Registry<a href="https://d7y.io/blog/2023/04/13/volcano-engine-distributed-image-acceleration-practice-based-on-dragonfly#back-to-source-peak-bandwidth-on-container-registry" class="hash-link" aria-label="Direct link to Back-to-source Peak Bandwidth on Container Registry" title="Direct link to Back-to-source Peak Bandwidth on Container Registry" translate="no">&#x200B;</a></h3>
<p>Nginx&#xA0;Pod concurrent storage peak traffic of 50, 100, 200, and 500, respectively</p>
<p><img decoding="async" loading="lazy" alt="Bar Chart showing impact of Nginx on Container Registry divided in 50 Pods, 100 Pods, 200 Pods and 500 Pods in OCI v1, Dragonfly" src="https://d7y.io/assets/images/back-to-source-peak-bandwidth-on-container-registry-nginx-bar-chart-d16ff0c66d2366c4266ab904c46a3783.png" width="1104" height="911" class="img_ev3q"></p>
<p>TensorFlow&#xA0; Pod concurrent storage peak traffic of 50, 100, 200, 500, respectively</p>
<p><img decoding="async" loading="lazy" alt="Bar Chart showing impact of TensorFlow on Container Registry divided in 50 Pods, 100 Pods, 200 Pods and 500 Pods in OCI v1, Dragonfly" src="https://d7y.io/assets/images/back-to-source-peak-bandwidth-on-container-registry-tensor-flow-bar-chart-274d61d0fe37ba0a5ed9fc27f7bf86ea.png" width="1104" height="1208" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="back-to-source-traffic-on-container-registry">Back-to-source Traffic on Container Registry<a href="https://d7y.io/blog/2023/04/13/volcano-engine-distributed-image-acceleration-practice-based-on-dragonfly#back-to-source-traffic-on-container-registry" class="hash-link" aria-label="Direct link to Back-to-source Traffic on Container Registry" title="Direct link to Back-to-source Traffic on Container Registry" translate="no">&#x200B;</a></h3>
<p>Nginx&#xA0;Pod concurrent 50, 100, 200, 500 back to the source traffic respectively</p>
<p><img decoding="async" loading="lazy" alt="Bar Chart showing impact of Nginx on Container Registry divided in 50 Pods, 100 Pods, 200 Pods and 500 Pods in OCI v1, Dragonfly" src="https://d7y.io/assets/images/back-to-source-traffic-on-container-registry-nginx-bar-chart-b418fac61557ff1e81362dfe385f3e9a.png" width="1104" height="1456" class="img_ev3q"></p>
<p>TensorFlow&#xA0; Pod concurrent 50, 100, 200, 500 back to the source traffic respectively</p>
<p><img decoding="async" loading="lazy" alt="Bar Chart showing impact of TensorFlow on Container Registry divided in 50 Pods, 100 Pods, 200 Pods and 500 Pods in OCI v1, Dragonfly" src="https://d7y.io/assets/images/back-to-source-traffic-on-container-registry-tensor-flow-bar-chart-a80f87deadc9ac96748addc905b32420.png" width="925" height="1600" class="img_ev3q"></p>
<p>In large-scale scenarios, using Dragonfly back to the source pulls a small number of images, and all images in OCIv1 scenarios have to be back to the source, so using Dragonfly back to the source peak and back to the source traffic is much less than OCIv1. And after using Dragonfly, as the number of concurrency increases, the peak and traffic back to the source will not increase significantly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reference">Reference<a href="https://d7y.io/blog/2023/04/13/volcano-engine-distributed-image-acceleration-practice-based-on-dragonfly#reference" class="hash-link" aria-label="Direct link to Reference" title="Direct link to Reference" translate="no">&#x200B;</a></h2>
<p>Volcano Engine <a href="https://www.volcengine.com/" target="_blank" rel="noopener noreferrer" class>https://www.volcengine.com/</a></p>
<p>Volcano Engine VKE <a href="https://www.volcengine.com/product/vke" target="_blank" rel="noopener noreferrer" class>https://www.volcengine.com/product/vke</a></p>
<p>Volcano Engine CR <a href="https://www.volcengine.com/product/cr" target="_blank" rel="noopener noreferrer" class>https://www.volcengine.com/product/cr</a></p>
<p>Dragonfly <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></p>
<p>Dragonfly GitHub Repo <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></p>
<p>Nydus <a href="https://nydus.dev/" target="_blank" rel="noopener noreferrer" class>https://nydus.dev/</a></p>
<p>Nydus GitHub Repo <a href="https://github.com/dragonflyoss/image-service" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/image-service</a></p>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Dragonfly v2.0.9 is released]]></title>
        <id>https://d7y.io/blog/2023/03/20/dragonfly-v2-0-9-is-released</id>
        <link href="https://d7y.io/blog/2023/03/20/dragonfly-v2-0-9-is-released"/>
        <updated>2023-03-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[CNCF projects highlighted in this post, and migrated by mingcheng.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://www.cncf.io/blog/2023/03/20/dragonfly-v2-0-9-is-released/" target="_blank" rel="noopener noreferrer" class>CNCF projects highlighted in this post</a>, and migrated by <a href="https://github.com/mingcheng" target="_blank" rel="noopener noreferrer" class>mingcheng</a>.</p>
<p><em>Project post originally published on <a href="https://github.com/dragonflyoss/dragonfly/releases/tag/v2.0.9" target="_blank" rel="noopener noreferrer" class>GitHub</a> by Dragonfly maintainers</em></p>
<p><img decoding="async" loading="lazy" alt="Dragonfly provide efficient, stable, secure file distribution and image acceleration based on p2p technology to be the best practice and standard solution in cloud native architectures. It is hosted by the Cloud Native Computing Foundation (CNCF) as an Incubating Level Project" src="https://d7y.io/assets/images/dragonfly-e1f1304b58ccc3777a076d4fdbdb1c20.avif" width="1794" height="846" class="img_ev3q"></p>
<p>Dragonfly v2.0.9 is released! &#x1F389;&#x1F389;&#x1F389; Thanks to the <a href="https://cloud.google.com/" target="_blank" rel="noopener noreferrer" class>Google Cloud Platform</a> (GCP) Team, <a href="https://www.volcengine.com/" target="_blank" rel="noopener noreferrer" class>Volcano Engine</a> Team, and <a href="https://intl.cloud.baidu.com/" target="_blank" rel="noopener noreferrer" class>Baidu AI Cloud</a> Team for helping Dragonfly integrate with their public clouds. Welcome to visit <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>d7y.io</a> website.</p>
<p><img decoding="async" loading="lazy" alt="GitHub snippit" src="data:image/avif;base64,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" width="1000" height="185" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features"><strong>Features</strong><a href="https://d7y.io/blog/2023/03/20/dragonfly-v2-0-9-is-released#features" class="hash-link" aria-label="Direct link to features" title="Direct link to features" translate="no">&#x200B;</a></h2>
<ul>
<li class>Download tasks based on priority. Priority can be passed as parameter during the download task, or can be associated with priority in the application of the Manager console, refer to priority <a href="https://github.com/dragonflyoss/api/blob/main/pkg/apis/common/v2/common.proto#L74" target="_blank" rel="noopener noreferrer" class>protoc definition</a>.</li>
<li class>Scheduler adds PieceDownloadTimeout parameter, which indicates that if the piece download times out, the scheduler will change the task state to TaskStateFailed.</li>
<li class>Add health service to each GRPC service.</li>
<li class>Add reflection to each GRPC service.</li>
<li class>Manager supports redis sentinel model.</li>
<li class>Refactor dynconfig package to remove json.Unmarshal, improving its runtime efficiency.</li>
<li class>Fix panic caused by hashring not being built.</li>
<li class>Previously, most of the pieces were downloaded from the same parent. Now, different pieces are downloaded from different parents to improve download efficiency and distribute bandwidth among multiple parents.</li>
<li class>If Manager&#x2019;s searcher cannot found candidate scheduler clusters, It will return all the clusters for peers to check health. If check health is successful, the scheduler cluster can be used.</li>
<li class>Support <a href="https://github.com/oras-project/oras" target="_blank" rel="noopener noreferrer" class>ORAS</a> source client to pull image.</li>
<li class>Add UDP ping package and GRPC protoc definition for building virtual network topology.</li>
<li class>The <a href="https://github.com/dragonflyoss/api/tree/main/proto" target="_blank" rel="noopener noreferrer" class>V2 P2P protocol</a> has been added, and both Scheduler and Manager have implemented the API of the V2 P2P protocol, in preparation for the future Rust version of Dfdaemon.</li>
<li class>OSS source client supports STS access, user can set security token in header.</li>
<li class>Dynconfig supports to resolve addresses with health service.</li>
<li class>Add hostTTL and hostGCInterval in Scheduler to prevent information of abnormally exited Dfdaemon from becoming dirty data in the Scheduler.</li>
<li class>Add <a href="https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing" target="_blank" rel="noopener noreferrer" class>CIDR</a> to searcher to provide more precise scheduler cluster selection for Dfdaemon.</li>
<li class>Refactor the metric definitions for the V1 P2P protocol and add the metric definitions for the V2 P2P protocol. Additionally, reorganize the <a href="https://grafana.com/grafana/dashboards/?search=dragonfly" target="_blank" rel="noopener noreferrer" class>Dragonfly Grafana Dashboards</a>, refer to <a href="https://d7y.io/docs/concepts/observability/monitoring" target="_blank" rel="noopener noreferrer" class>monitoring</a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="break-change"><strong>Break Change</strong><a href="https://d7y.io/blog/2023/03/20/dragonfly-v2-0-9-is-released#break-change" class="hash-link" aria-label="Direct link to break-change" title="Direct link to break-change" translate="no">&#x200B;</a></h2>
<ul>
<li class>Using the default value for the key used to generate JWT tokens in Manager can lead to security issues. Therefore, Manager has added <a href="https://github.com/dragonflyoss/dragonfly/pull/2161" target="_blank" rel="noopener noreferrer" class>JWT Key</a> in the configuration, and upgrading Manager requires generating a new JWT Key and setting it in the <a href="https://github.com/dragonflyoss/d7y.io/blob/main/docs/reference/configuration/manager.md?plain=1#L56" target="_blank" rel="noopener noreferrer" class>Manager configuration</a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="public-cloud-providers"><strong>Public Cloud Providers</strong><a href="https://d7y.io/blog/2023/03/20/dragonfly-v2-0-9-is-released#public-cloud-providers" class="hash-link" aria-label="Direct link to public-cloud-providers" title="Direct link to public-cloud-providers" translate="no">&#x200B;</a></h2>
<ul>
<li class><strong><em>Google Cloud Platform(GCP)</em></strong> &#x2013; GCP provides click to deploy Dragonfly in <a href="https://cloud.google.com/kubernetes-engine" target="_blank" rel="noopener noreferrer" class>Google Kubernetes Engine</a> (GKE) through <a href="https://console.cloud.google.com/marketplace/product/google/dragonfly" target="_blank" rel="noopener noreferrer" class>Marketplace</a>, refer to <a href="https://console.cloud.google.com/marketplace/product/google/dragonfly" target="_blank" rel="noopener noreferrer" class>Click to Deploy Dragonfly</a>.</li>
<li class><strong><em>Alibaba Cloud(Aliyun)</em></strong> &#x2013; Aliyun provides install Dragonfly 1.x in <a href="https://console.cloud.google.com/marketplace/product/google/dragonfly" target="_blank" rel="noopener noreferrer" class>Container Registry</a>, refer to Use P2P Acceleration in <a href="https://www.alibabacloud.com/help/en/container-registry/latest/use-the-p2p-acceleration-feature-in-ask-and-ack-clusters" target="_blank" rel="noopener noreferrer" class>ASK</a>. <strong>Recommend to deploy the more efficient and stable <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>Dragonfly 2.0</a></strong>, refer to Setup <a class href="https://d7y.io/docs/v2.0.9/getting-started/quick-start/kubernetes/">Dragonfly in Kubernetes</a>.</li>
<li class><strong><em>Volcano Engine</em></strong> &#x2013; Volcano Engine provides Dragonfly integration in Volcano Engine Kubernetes Engine(VKE) and Container Registry(CR), visit <a href="https://www.volcengine.com/product/vke" target="_blank" rel="noopener noreferrer" class>VKE</a> &amp; <a href="https://www.volcengine.com/product/cr" target="_blank" rel="noopener noreferrer" class>CR</a> to Learn more.</li>
<li class><strong><em>Baidu AI Cloud</em></strong> &#x2013; Baidu AI Cloud provides click to P2P Acceleration in <a href="https://intl.cloud.baidu.com/product/cce.html" target="_blank" rel="noopener noreferrer" class>Cloud Container Engine</a> (CCE), power by Dragonfly.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="others"><strong>Others</strong><a href="https://d7y.io/blog/2023/03/20/dragonfly-v2-0-9-is-released#others" class="hash-link" aria-label="Direct link to others" title="Direct link to others" translate="no">&#x200B;</a></h2>
<p>You can see <a href="https://github.com/dragonflyoss/dragonfly/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class>CHANGELOG</a> for more details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links"><strong>Links</strong><a href="https://d7y.io/blog/2023/03/20/dragonfly-v2-0-9-is-released#links" class="hash-link" aria-label="Direct link to links" title="Direct link to links" translate="no">&#x200B;</a></h2>
<ul>
<li class>Dragonfly Website: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></li>
<li class>Dragonfly GitHub: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></li>
<li class>Dragonfly Charts GitHub: <a href="https://github.com/dragonflyoss/helm-charts" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/helm-charts</a></li>
<li class>Dragonfly Monitor GitHub: <a href="https://github.com/dragonflyoss/monitoring" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/monitoring</a></li>
<li class>Google Kubernetes Engine(GKE): <a href="https://cloud.google.com/kubernetes-engine" target="_blank" rel="noopener noreferrer" class>https://cloud.google.com/kubernetes-engine</a></li>
<li class>Google Cloud Platform(GCP) Dragonfly Marketplace: <a href="https://console.cloud.google.com/marketplace/product/google/dragonfly" target="_blank" rel="noopener noreferrer" class>https://console.cloud.google.com/marketplace/product/google/dragonfly</a></li>
<li class>Alibaba Cloud Container Registry: <a href="https://www.alibabacloud.com/product/container-registry" target="_blank" rel="noopener noreferrer" class>https://www.alibabacloud.com/product/container-registry</a></li>
<li class>Alibaba Cloud Container Service for Kubernetes (ACK): <a href="https://www.alibabacloud.com/product/kubernetes" target="_blank" rel="noopener noreferrer" class>https://www.alibabacloud.com/product/kubernetes</a></li>
<li class>Volcano Engine Kubernetes Engine(VKE): <a href="https://www.volcengine.com/product/vke" target="_blank" rel="noopener noreferrer" class>https://www.volcengine.com/product/vke</a></li>
<li class>Volcano Engine Container Registry(CR): <a href="https://www.volcengine.com/product/cr" target="_blank" rel="noopener noreferrer" class>https://www.volcengine.com/product/cr</a></li>
<li class>Baidu AI Cloud Container Engine(CCE): <a href="https://intl.cloud.baidu.com/product/cce.html" target="_blank" rel="noopener noreferrer" class>https://intl.cloud.baidu.com/product/cce.html</a></li>
</ul>]]></content>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Dragonfly integrates nydus for image acceleration practive]]></title>
        <id>https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice</id>
        <link href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice"/>
        <updated>2022-11-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Introduce how dragonfly integrates nydus to improve image download speed.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduce-definition">Introduce definition<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#introduce-definition" class="hash-link" aria-label="Direct link to Introduce definition" title="Direct link to Introduce definition" translate="no">&#x200B;</a></h2>
<p><a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>Dragonfly</a> has been selected and put into production use by
many Internet companies since its open source in 2017,
and entered CNCF in October 2018, becoming the third project in China to enter the CNCF Sandbox. In April 2020,
CNCF TOC voted to accept Dragonfly as an CNCF Incubating project.
Dragonfly has developed the next version through production practice,
which has absorbed the advantages of Dragonfly1.x and made a lot of optimizations for known problems.</p>
<p><a href="https://nydus.dev/" target="_blank" rel="noopener noreferrer" class>Nydus</a> optimized the OCIv1 image format, and designed a brand new image-based filesystem,
so that the container can download the image on demand, and the container no longer needs to
download the complete image to start the container. In the latest version,
dragonfly has completed the integration with the nydus, allowing the container to
start downloading images on demand, reducing the amount of downloads. The dragonfly P2P transmission method can
also be used during the transmission process to reduce the back-to-source traffic and increase the speed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-start">Quick start<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#quick-start" class="hash-link" aria-label="Direct link to Quick start" title="Direct link to Quick start" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">&#x200B;</a></h3>
<table><thead><tr><th>Name</th><th>Version</th><th>Document</th></tr></thead><tbody><tr><td>Kubernetes cluster</td><td>1.20+</td><td><a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer" class>kubernetes.io</a></td></tr><tr><td>Helm</td><td>3.8.0+</td><td><a href="https://helm.sh/" target="_blank" rel="noopener noreferrer" class>helm.sh</a></td></tr><tr><td>Containerd</td><td>v1.4.3+</td><td><a href="https://containerd.io/" target="_blank" rel="noopener noreferrer" class>containerd.io</a></td></tr><tr><td>Nerdctl</td><td>0.22+</td><td><a href="https://github.com/containerd/nerdctl" target="_blank" rel="noopener noreferrer" class>containerd/nerdctl</a></td></tr></tbody></table>
<p><strong>Notice:</strong> <a href="https://kind.sigs.k8s.io/" target="_blank" rel="noopener noreferrer" class>Kind</a> is recommended if no kubernetes cluster is available for testing.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-dragonfly">Install dragonfly<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#install-dragonfly" class="hash-link" aria-label="Direct link to Install dragonfly" title="Direct link to Install dragonfly" translate="no">&#x200B;</a></h3>
<p>For detailed installation documentation based on kubernetes cluster, please refer to <a class href="https://d7y.io/docs/next/getting-started/quick-start/kubernetes">quick-start-kubernetes</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup-kubernetes-cluster">Setup kubernetes cluster<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#setup-kubernetes-cluster" class="hash-link" aria-label="Direct link to Setup kubernetes cluster" title="Direct link to Setup kubernetes cluster" translate="no">&#x200B;</a></h3>
<p>Create kind multi-node cluster configuration file <code>kind-config.yaml</code>, configuration content is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Cluster</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> kind.x</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">k8s.io/v1alpha4</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">nodes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> control</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">plane</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> worker</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">extraPortMappings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">containerPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">30950</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">hostPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">65001</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">containerPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">30951</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">hostPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">40901</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> worker</span><br></div></code></pre></div></div>
<p>Create a kind multi-node cluster using the configuration file:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind create cluster --config kind-config.yaml</span><br></div></code></pre></div></div>
<p>Switch the context of kubectl to kind cluster:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl config use-context kind-kind</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kind-loads-dragonfly-image">Kind loads dragonfly image<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#kind-loads-dragonfly-image" class="hash-link" aria-label="Direct link to Kind loads dragonfly image" title="Direct link to Kind loads dragonfly image" translate="no">&#x200B;</a></h3>
<p>Pull dragonfly latest images:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/scheduler:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/manager:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker pull dragonflyoss/dfdaemon:latest</span><br></div></code></pre></div></div>
<p>Kind cluster loads dragonfly latest images:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/scheduler:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/manager:latest</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind load docker-image dragonflyoss/dfdaemon:latest</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-dragonfly-cluster-based-on-helm-charts">Create dragonfly cluster based on helm charts<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#create-dragonfly-cluster-based-on-helm-charts" class="hash-link" aria-label="Direct link to Create dragonfly cluster based on helm charts" title="Direct link to Create dragonfly cluster based on helm charts" translate="no">&#x200B;</a></h3>
<p>Create helm charts configuration file <code>charts-config.yaml</code> and enable prefetching, configuration content is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">scheduler</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">seedPeer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">download</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">prefetch</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">dfdaemon</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">hostNetwork</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">download</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">prefetch</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">proxy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">defaultFilter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&apos;Expires&amp;Signature&amp;ns&apos;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">security</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">insecure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">tcpListen</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">listen</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 0.0.0.0</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">65001</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">registryMirror</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">dynamic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">//index.docker.io</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">proxies</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">regx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> blobs/sha256.*</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">metrics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">enable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbose</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">pprofPort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18066</span><br></div></code></pre></div></div>
<p>Create a dragonfly cluster using the configuration file:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ helm install --wait --create-namespace --namespace dragonfly-system dragonfly dragonfly/dragonfly -f charts-config.yaml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME: dragonfly</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">LAST DEPLOYED: Wed Oct 19 04:23:22 2022</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAMESPACE: dragonfly-system</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">STATUS: deployed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">REVISION: 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">TEST SUITE: None</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NOTES:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">1. Get the scheduler address by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l &quot;app=dragonfly,release=dragonfly,component=scheduler&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export SCHEDULER_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $SCHEDULER_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kubectl --namespace dragonfly-system port-forward $SCHEDULER_POD_NAME 8002:$SCHEDULER_CONTAINER_PORT</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  echo &quot;Visit http://127.0.0.1:8002 to use your scheduler&quot;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">2. Get the dfdaemon port by running these commands:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l &quot;app=dragonfly,release=dragonfly,component=dfdaemon&quot; -o jsonpath={.items[0].metadata.name})</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  export DFDAEMON_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $DFDAEMON_POD_NAME -o jsonpath=&quot;{.spec.containers[0].ports[0].containerPort}&quot;)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  You can use $DFDAEMON_CONTAINER_PORT as a proxy port in Node.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">3. Configure runtime to use dragonfly:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  https://d7y.io/docs/getting-started/quick-start/kubernetes/</span><br></div></code></pre></div></div>
<p>Check that dragonfly is deployed successfully:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ kubectl get po -n dragonfly-system</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">NAME                                 READY   STATUS    RESTARTS       AGE</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-dfdaemon-rhnr6             1/1     Running   4 (101s ago)   3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-dfdaemon-s6sv5             1/1     Running   5 (111s ago)   3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-manager-67f97d7986-8dgn8   1/1     Running   0              3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-mysql-0                    1/1     Running   0              3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-master-0             1/1     Running   0              3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-replicas-0           1/1     Running   1 (115s ago)   3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-replicas-1           1/1     Running   0              95s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-redis-replicas-2           1/1     Running   0              70s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-scheduler-0                1/1     Running   0              3m27s</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dragonfly-seed-peer-0                1/1     Running   2 (95s ago)    3m27s</span><br></div></code></pre></div></div>
<p>Create peer service configuration file <code>peer-service-config.yaml</code>, configuration content is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> peer</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">system</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> NodePort</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token number" style="color:rgb(247, 140, 108)">65001</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">nodePort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">30950</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">65001</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token number" style="color:rgb(247, 140, 108)">40901</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">nodePort</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">30951</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">40901</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">selector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dfdaemon</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">release</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dragonfly</span><br></div></code></pre></div></div>
<p>Create a peer service using the configuration file:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl apply -f peer-service-config.yaml</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-nydus-for-containerd">Install nydus for containerd<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#install-nydus-for-containerd" class="hash-link" aria-label="Direct link to Install nydus for containerd" title="Direct link to Install nydus for containerd" translate="no">&#x200B;</a></h3>
<p>For detailed nydus installation documentation based on containerd environment, please refer to
<a href="https://github.com/dragonflyoss/image-service/blob/master/docs/containerd-env-setup.md#nydus-setup-for-containerd-environment" target="_blank" rel="noopener noreferrer" class>nydus-setup-for-containerd-environment</a>.
The example uses Systemd to manage the <code>nydus-snapshotter</code> service.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-nydus-tools">Install nydus tools<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#install-nydus-tools" class="hash-link" aria-label="Direct link to Install nydus tools" title="Direct link to Install nydus tools" translate="no">&#x200B;</a></h4>
<p>Download <code>containerd-nydus-grpc</code> binary, please refer to <a href="https://github.com/containerd/nydus-snapshotter/releases/latest" target="_blank" rel="noopener noreferrer" class>nydus-snapshotter/releases</a>:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">NYDUS_SNAPSHOTTER_VERSION=0.3.3</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">wget https://github.com/containerd/nydus-snapshotter/releases/download/v$NYDUS_SNAPSHOTTER_VERSION/nydus-snapshotter-v$NYDUS_SNAPSHOTTER_VERSION-x86_64.tgz</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">tar zxvf nydus-snapshotter-v$NYDUS_SNAPSHOTTER_VERSION-x86_64.tgz</span><br></div></code></pre></div></div>
<p>Install <code>containerd-nydus-grpc</code> tool:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">sudo cp nydus-snapshotter/containerd-nydus-grpc /usr/local/bin/</span><br></div></code></pre></div></div>
<p>Download <code>nydus-image</code>, <code>nydusd</code> and <code>nydusify</code> binaries, please refer to <a href="https://github.com/dragonflyoss/image-service/releases/latest" target="_blank" rel="noopener noreferrer" class>dragonflyoss/image-service</a>:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">NYDUS_VERSION=2.1.1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">wget https://github.com/dragonflyoss/image-service/releases/download/v$NYDUS_VERSION/nydus-static-v$NYDUS_VERSION-linux-amd64.tgz</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">tar zxvf nydus-static-v$NYDUS_VERSION-linux-amd64.tgz</span><br></div></code></pre></div></div>
<p>Install <code>nydus-image</code>, <code>nydusd</code> and <code>nydusify</code> tools:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">sudo cp nydus-static/nydus-image nydus-static/nydusd nydus-static/nydusify /usr/local/bin/</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-nydus-snapshotter-plugin-for-containerd">Install nydus snapshotter plugin for containerd<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#install-nydus-snapshotter-plugin-for-containerd" class="hash-link" aria-label="Direct link to Install nydus snapshotter plugin for containerd" title="Direct link to Install nydus snapshotter plugin for containerd" translate="no">&#x200B;</a></h4>
<p>Configure containerd to use the <code>nydus-snapshotter</code> plugin, please refer to
<a href="https://github.com/dragonflyoss/image-service/blob/master/docs/containerd-env-setup.md#configure-and-start-containerd" target="_blank" rel="noopener noreferrer" class>configure-and-start-containerd</a>.</p>
<p><code>127.0.0.1:65001</code> is the proxy address of dragonfly peer,
and the <code>X-Dragonfly-Registry</code> header is the address of origin registry,
which is provided for dragonfly to download the images.</p>
<p>Change configuration of containerd in <code>/etc/containerd/config.toml</code>:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">[proxy_plugins]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  [proxy_plugins.nydus]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    type = &quot;snapshot&quot;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    address = &quot;/run/containerd-nydus/containerd-nydus-grpc.sock&quot;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[plugins.cri]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  [plugins.cri.containerd]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    snapshotter = &quot;nydus&quot;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    disable_snapshot_annotations = false</span><br></div></code></pre></div></div>
<p>Restart containerd service:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">sudo systemctl restart containerd</span><br></div></code></pre></div></div>
<p>Check that containerd uses the <code>nydus-snapshotter</code> plugin:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ ctr -a /run/containerd/containerd.sock plugin ls | grep nydus</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">io.containerd.snapshotter.v1          nydus                    -              ok</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="systemd-starts-snapshotter-service">Systemd starts nydus snapshotter service<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#systemd-starts-snapshotter-service" class="hash-link" aria-label="Direct link to Systemd starts nydus snapshotter service" title="Direct link to Systemd starts nydus snapshotter service" translate="no">&#x200B;</a></h4>
<p>For detailed configuration documentation based on nydus mirror mode, please refer to
<a href="https://github.com/dragonflyoss/image-service/blob/master/docs/nydusd.md#enable-mirrors-for-storage-backend" target="_blank" rel="noopener noreferrer" class>enable-mirrors-for-storage-backend</a>.</p>
<p>Create nydusd configuration file <code>nydusd-config.json</code>, configuration content is as follows:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;device&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;backend&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;type&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;registry&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;config&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token property">&quot;mirrors&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token property">&quot;host&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;http://127.0.0.1:65001&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token property">&quot;auth_through&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">false</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token property">&quot;headers&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">              </span><span class="token property">&quot;X-Dragonfly-Registry&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;https://index.docker.io&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token property">&quot;ping_url&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;http://127.0.0.1:40901/server/ping&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token property">&quot;scheme&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;https&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token property">&quot;skip_verify&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">false</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token property">&quot;timeout&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token property">&quot;connect_timeout&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token property">&quot;retry_limit&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;cache&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;type&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;blobcache&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token property">&quot;config&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token property">&quot;work_dir&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;/var/lib/nydus/cache/&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;mode&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;direct&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;digest_validate&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">false</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;iostats_files&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">false</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;enable_xattr&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;fs_prefetch&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;enable&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;threads_count&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;merging_size&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">131072</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;bandwidth_rate&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1048576</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>Copy configuration file to <code>/etc/nydus/config.json</code>:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">sudo mkdir /etc/nydus &amp;&amp; cp nydusd-config.json /etc/nydus/config.json</span><br></div></code></pre></div></div>
<p>Create systemd configuration file <code>nydus-snapshotter.service</code> of nydus snapshotter, configuration content is as follows:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">[Unit]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Description=nydus snapshotter</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">After=network.target</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Before=containerd.service</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[Service]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Type=simple</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Environment=HOME=/root</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">ExecStart=/usr/local/bin/containerd-nydus-grpc --config-path /etc/nydus/config.json</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Restart=always</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RestartSec=1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">KillMode=process</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">OOMScoreAdjust=-999</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">StandardOutput=journal</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">StandardError=journal</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[Install]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">WantedBy=multi-user.target</span><br></div></code></pre></div></div>
<p>Copy configuration file to <code>/etc/systemd/system/</code>:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">sudo cp nydus-snapshotter.service /etc/systemd/system/</span><br></div></code></pre></div></div>
<p>Systemd starts nydus snapshotter service:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ sudo systemctl enable nydus-snapshotter</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ sudo systemctl start nydus-snapshotter</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ sudo systemctl status nydus-snapshotter</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&#x25CF; nydus-snapshotter.service - nydus snapshotter</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     Loaded: loaded (/etc/systemd/system/nydus-snapshotter.service; enabled; vendor preset: enabled)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     Active: active (running) since Wed 2022-10-19 08:01:00 UTC; 2s ago</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">   Main PID: 2853636 (containerd-nydu)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      Tasks: 9 (limit: 37574)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     Memory: 4.6M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        CPU: 20ms</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     CGroup: /system.slice/nydus-snapshotter.service</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">             &#x2514;&#x2500;2853636 /usr/local/bin/containerd-nydus-grpc --config-path /etc/nydus/config.json</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Oct 19 08:01:00 kvm-gaius-0 systemd[1]: Started nydus snapshotter.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Oct 19 08:01:00 kvm-gaius-0 containerd-nydus-grpc[2853636]: time=&quot;2022-10-19T08:01:00.493700269Z&quot; level=info msg=&quot;gc goroutine start...&quot;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Oct 19 08:01:00 kvm-gaius-0 containerd-nydus-grpc[2853636]: time=&quot;2022-10-19T08:01:00.493947264Z&quot; level=info msg=&quot;found 0 daemons running&quot;</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="convert-an-image-to-nydus-format">Convert an image to nydus format<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#convert-an-image-to-nydus-format" class="hash-link" aria-label="Direct link to Convert an image to nydus format" title="Direct link to Convert an image to nydus format" translate="no">&#x200B;</a></h4>
<p>Convert <code>python:3.9.15</code> image to nydus format, you can use
the converted <code>dragonflyoss/python:3.9.15-nydus</code> image and skip this step.
Conversion tool can use <a href="https://github.com/dragonflyoss/image-service/blob/master/docs/nydusify.md" target="_blank" rel="noopener noreferrer" class>nydusify</a> and <a href="https://github.com/goharbor/acceleration-service" target="_blank" rel="noopener noreferrer" class>acceld</a>.</p>
<p>Login to Dockerhub:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker login</span><br></div></code></pre></div></div>
<p>Convert <code>python:3.9.15</code> image to nydus format, and <code>DOCKERHUB_REPO_NAME</code> environment variable
needs to be set to the user&apos;s image repository:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">DOCKERHUB_REPO_NAME=dragonflyoss</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">sudo nydusify convert --nydus-image /usr/local/bin/nydus-image --source python:3.9.15 --target $DOCKERHUB_REPO_NAME/python:3.9.15-nydus</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-nydus-with-nerdctl">Try nydus with nerdctl<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#try-nydus-with-nerdctl" class="hash-link" aria-label="Direct link to Try nydus with nerdctl" title="Direct link to Try nydus with nerdctl" translate="no">&#x200B;</a></h4>
<p>Running <code>python:3.9.15-nydus</code> with nerdctl:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">sudo nerdctl --snapshotter nydus run --rm -it $DOCKERHUB_REPO_NAME/python:3.9.15-nydus</span><br></div></code></pre></div></div>
<p>Check that nydus is downloaded via dragonfly based on mirror mode:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">$ grep mirrors /var/lib/containerd-nydus/logs/**/*log</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[2022-10-19 10:16:13.276548 +00:00] INFO [storage/src/backend/connection.rs:271] backend config: ConnectionConfig { proxy: ProxyConfig { url: &quot;&quot;, ping_url: &quot;&quot;, fallback: false, check_interval: 5, use_http: false }, mirrors: [MirrorConfig { host: &quot;http://127.0.0.1:65001&quot;, headers: {&quot;X-Dragonfly-Registry&quot;: &quot;https://index.docker.io&quot;}, auth_through: false }], skip_verify: false, timeout: 10, connect_timeout: 10, retry_limit: 2 }</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-testing">Performance testing<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#performance-testing" class="hash-link" aria-label="Direct link to Performance testing" title="Direct link to Performance testing" translate="no">&#x200B;</a></h2>
<p>Test the performance of single-machine image download after the integration of
<code>nydus mirror</code> mode and <code>dragonfly P2P</code>.
Test running version commands using images in different languages.
For example, the startup command used to run a <code>python</code> image is <code>python -V</code>.
The tests were performed on the same machine.
Due to the influence of the network environment of the machine itself,
the actual download time is not important, but the ratio of the increase in
the download time in different scenarios is very important.</p>
<p><img decoding="async" loading="lazy" alt="nydus-mirror-dragonfly" src="https://d7y.io/assets/images/nydus-mirror-dragonfly-6bd0e7168b0853e6f9b28667962499fe.png" width="1992" height="1180" class="img_ev3q"></p>
<ul>
<li class>OCIv1: Use containerd to pull image directly.</li>
<li class>Nydus Cold Boot: Use containerd to pull image via nydus-snapshotter and doesn&apos;t hit any cache.</li>
<li class>Nydus &amp; Dragonfly Cold Boot: Use containerd to pull image via nydus-snapshotter.
Transfer the traffic to dragonfly P2P based on nydus mirror mode and no cache hits.</li>
<li class>Hit Dragonfly Remote Peer Cache: Use containerd to pull image via nydus-snapshotter.
Transfer the traffic to dragonfly P2P based on nydus mirror mode and hit the remote peer cache.</li>
<li class>Hit Dragonfly Local Peer Cache: Use containerd to pull image via nydus-snapshotter.
Transfer the traffic to dragonfly P2P based on nydus mirror mode and hit the local peer cache.</li>
<li class>Hit Nydus Cache: Use containerd to pull image via nydus-snapshotter.
Transfer the traffic to dragonfly P2P based on nydus mirror mode and hit the nydus local cache.</li>
</ul>
<p>Test results show <code>nydus mirror</code> mode and <code>dragonfly P2P</code> integration.
Use the <code>nydus</code> download image to compare the <code>OCIv1</code> mode,
It can effectively reduce the image download time.
The cold boot of <code>nydus</code> and <code>nydus &amp; dragonfly</code> are basically close.
All hits to <code>dragonfly</code> cache are better than <code>nydus</code> only.
The most important thing is that if a very large <code>kubernetes</code> cluster uses <code>nydus</code> to pull images.
The download of each image layer will be generate as many range requests as needed.
The <code>QPS</code> of the source of the registry is too high.
Causes the <code>QPS</code> of the registry to be relatively high.
Dragonfly can effectively reduce the number of requests and
download traffic for back-to-source registry.
In the best case, <code>dragonfly</code> can make the same task back-to-source download only once.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links">Links<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links" translate="no">&#x200B;</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dragonfly-community">Dragonfly community<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#dragonfly-community" class="hash-link" aria-label="Direct link to Dragonfly community" title="Direct link to Dragonfly community" translate="no">&#x200B;</a></h3>
<ul>
<li class>
<p>Website: <a href="https://d7y.io/" target="_blank" rel="noopener noreferrer" class>https://d7y.io/</a></p>
</li>
<li class>
<p>GitHub Repo: <a href="https://github.com/dragonflyoss/dragonfly" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/dragonfly</a></p>
</li>
<li class>
<p>Slack Channel: <a href="https://cloud-native.slack.com/messages/dragonfly/" target="_blank" rel="noopener noreferrer" class>#dragonfly</a> on <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class>CNCF Slack</a></p>
</li>
<li class>
<p>Discussion Group: <a href="mailto:dragonfly-discuss@googlegroups.com" target="_blank" rel="noopener noreferrer" class>dragonfly-discuss@googlegroups.com</a></p>
</li>
<li class>
<p>Twitter: <a href="https://twitter.com/dragonfly_oss" target="_blank" rel="noopener noreferrer" class>@dragonfly_oss</a></p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nydus-community">Nydus community<a href="https://d7y.io/blog/2022/11/03/dragonfly-integrates-nydus-for-image-acceleration-practice#nydus-community" class="hash-link" aria-label="Direct link to Nydus community" title="Direct link to Nydus community" translate="no">&#x200B;</a></h3>
<ul>
<li class>Website: <a href="https://nydus.dev/" target="_blank" rel="noopener noreferrer" class>https://nydus.dev/</a></li>
<li class>GitHub Repo: <a href="https://github.com/dragonflyoss/image-service" target="_blank" rel="noopener noreferrer" class>https://github.com/dragonflyoss/image-service</a></li>
<li class>Slack Channel: <a href="https://join.slack.com/t/nydusimageservice/shared_invite/zt-pz4qvl4y-WIh4itPNILGhPS8JqdFm_w" target="_blank" rel="noopener noreferrer" class>#nydus</a></li>
</ul>]]></content>
        <author>
            <name>Gaius</name>
            <uri>https://github.com/gaius-qi</uri>
        </author>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="containerd" term="containerd"/>
        <category label="cncf" term="cncf"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The Evolution of the Nydus Image Acceleration]]></title>
        <id>https://d7y.io/blog/2022/06/06/evolution-of-nydus</id>
        <link href="https://d7y.io/blog/2022/06/06/evolution-of-nydus"/>
        <updated>2022-06-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The first native Linux mainline kernel supported solution for container image distribution]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-evolution-of-the-nydus-image-acceleration">The Evolution of the Nydus Image Acceleration<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#the-evolution-of-the-nydus-image-acceleration" class="hash-link" aria-label="Direct link to The Evolution of the Nydus Image Acceleration" title="Direct link to The Evolution of the Nydus Image Acceleration" translate="no">&#x200B;</a></h2>
<p>Optimized container images together with technologies such as P2P networks can effectively speed up the process of
container deployment and startup. In order to achieve this, we developed the Nydus image acceleration service (also
a sub-project of CNCF Dragonfly).</p>
<p>In addition to startup speed, core features such as image layering, lazy pulling etc. are also particularly
important in the field of container images. But since there is no native filesystem supporting that, most opt for the
userspace solution, and Nydus initially did the same. However user-mode solutions are encountering more and more
challenges nowadays, such as a huge gap in performance compared with native filesystems, and noticable resource
overhead in high-density employed scenarios.</p>
<p>Therefore, we designed and implemented the RAFS v6 format which is compatible with the in-kernel EROFS filesystem,
hoping to form a content-addressable in-kernel filesystem for container images.
After the lazy-pulling technology of &quot;EROFS over Fscache&quot; was merged into <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=65965d9530b0c320759cd18a9a5975fb2e098462" target="_blank" rel="noopener noreferrer" class>5.19 kernel</a>,
the next-generation architecture of Nydus is gradually becoming clear.
This is <strong>the first</strong> native <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/" target="_blank" rel="noopener noreferrer" class>in-kernel solution</a>
for container images, promoting a high-density, high-performance and high-availability solution for container images.</p>
<p>This article will introduce the evolution of Nydus from three perspectives: Nydus architecture outline, RAFS v6
image format and &quot;EROFS over Fscache&quot; on-demand loading technology.</p>
<p>Please refer to <a href="https://github.com/dragonflyoss/image-service" target="_blank" rel="noopener noreferrer" class>Nydus</a> for more details of this project.
Now you can experience all these new features with this <a href="https://github.com/dragonflyoss/image-service/blob/master/docs/nydus-fscache.md" target="_blank" rel="noopener noreferrer" class>user guide</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nydus-architecture-outline">Nydus Architecture Outline<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#nydus-architecture-outline" class="hash-link" aria-label="Direct link to Nydus Architecture Outline" title="Direct link to Nydus Architecture Outline" translate="no">&#x200B;</a></h3>
<p>In brief, Nydus is a <em>filesystem-based</em> image acceleration service that designs the RAFS (Registry Acceleration
File System) disk format, optimizing the startup performance of OCIv1 container images.</p>
<p>The fundamental idea of the container image is to provide the root directory (rootfs) of the container, which can
be carried by the filesystem or the archive format. Besides, it can also be implemented together with a custom block
format, but anyway it needs to present as a <em>directory tree</em>, providing the file interface to containers.</p>
<p>Let&apos;s take a look at the OCIv1 standard image format first. The OCIv1 format is an image format specification based on
the <em>Docker Image Manifest Version 2 Schema 2</em>. It consists of a manifest, an image index (optional), a series of
container image layers and configuration files. Essentially, OCIv1 is a layer-based image format, with each layer
storing file-level diff data in tgz archive format.
<img decoding="async" loading="lazy" alt="ociv1" src="https://d7y.io/assets/images/ociv1-9c62813856b3b7c86d4026020467413b.png" width="293" height="366" class="img_ev3q"></p>
<p>Due to the limitation of tgz, OCIv1 has some inherent issues, such as inability to load on demand, coarser level
deduplication granularity, unstable hash digest for each layer, etc.</p>
<p>As for the custom block format, it also has some flaws by design.</p>
<ul>
<li class>Since the container image should be eventually presented as a directory tree, a filesystem (such as ext4) is needed
upon that. In this case the dependency chain is &quot;custom block format + userspace block device + filesystem&quot;, which is
obviously more complex compared to the native filesystem solution;</li>
<li class>Since the block format is not aware of the upper filesystem, it would be impossible to distinguish the metadata and
data of the filesystem and process them separately (such as compression);</li>
<li class>Similarly, it is unable to implement file-based image analysis features such as security scanning, hotspot analysis,
and runtime interception, etc.;</li>
<li class>Unable to directly merge multiple existing images into one large image without modifying the blob image,
which is the natural ability of the filesystem solution.</li>
</ul>
<p>Therefore, Nydus is a filesystem-based container image acceleration solution. It introduces a RAFS image format, in
which data (blobs) and metadata (bootstrap) of the image are separated, whilst the image layer only stores the data part.
Files within the image are divided into chunks for deduplication, with each image layer storing the corresponding chunk
data. Since then, the chunk-level deduplication is allowed between layers and images. Besides it also helps implement
on-demand loading. Since the metadata is separated from data and then combined into one place, the access to the
metadata does not need to pull the corresponding data, which speeds up the file access quite a lot.</p>
<p>The Nydus RAFS image format is shown below:
<img decoding="async" loading="lazy" alt="nydus_rafs" src="https://d7y.io/assets/images/nydus_rafs-6a351fe3511ab138576e16cdea901c24.png" width="571" height="307" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rafs-v6-image-format">RAFS v6 image format<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#rafs-v6-image-format" class="hash-link" aria-label="Direct link to RAFS v6 image format" title="Direct link to RAFS v6 image format" translate="no">&#x200B;</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="evolution-of-rafs-image-format">Evolution of RAFS image format<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#evolution-of-rafs-image-format" class="hash-link" aria-label="Direct link to Evolution of RAFS image format" title="Direct link to Evolution of RAFS image format" translate="no">&#x200B;</a></h4>
<p>Prior to the introduction of RAFS v6 format, Nydus used to handle a fully userspace implemented image format, working via
FUSE or virtiofs. However, the userspace filesystem has the following defects:</p>
<ul>
<li class>The overhead of large amounts of system call cannot be ignored, especially in the case of random small I/Os with depth
1;</li>
<li class>Frequent file operations will generate a large number of FUSE requests, resulting in frequent switching of kernel/user
mode context, which becomes the performance bottleneck then;</li>
<li class>In non-FSDAX scenarios, the buffer copy from user to kernel mode will consume CPUs;</li>
<li class>In the FSDAX (via virtiofs) scenario, a large number of small files will occupy considerable DAX window resources,
resulting in potential performance jitter; frequent switching between small files will also generate noticeable DAX
mapping setup overhead.</li>
</ul>
<p>Essentially these problems are caused by the natural limitations of the <strong>userspace</strong> filesystem solution, and if the
container filesystem is an in-kernel filesystem, the problems above can be resolved in practice. Therefore, we
introduced RAFS v6 image format, a container image format implemented in kernel based on EROFS filesystem.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-to-erofs-filesystem">Introduction to EROFS filesystem<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#introduction-to-erofs-filesystem" class="hash-link" aria-label="Direct link to Introduction to EROFS filesystem" title="Direct link to Introduction to EROFS filesystem" translate="no">&#x200B;</a></h4>
<p>EROFS filesystem has been in the Linux mainline since the Linux 4.19. In the past, it was mainly used for mobile
devices. It exists in the current major distributions (such as Fedora, Ubuntu, Archlinux, Debian, Gentoo, etc.).
The userspace tools erofs-utils also already exists in these distributions and the <a href="https://openinventionnetwork.com/linux-system/table-11/" target="_blank" rel="noopener noreferrer" class>OIN Linux system definition</a>
list, and the community is quite active.</p>
<p>EROFS filesystem has the following characteristics:</p>
<ul>
<li class>Native local read-only block-based filesystem suitable for various scenarios, the disk format has the minimum I/O
unit definition;</li>
<li class>Page-sized block-aligned uncompressed metadata;</li>
<li class>Effective space saving through Tail-packing inline technology while keeping high performance;</li>
<li class>Data is addressed in blocks (mmap I/O friendly, no post I/O processing required);</li>
<li class>Disk directory format friendly for random access;</li>
<li class>Simple on-disk format, easy to increase the payload, better scalability;</li>
<li class>Support DIRECT I/O access; support block devices, FSDAX and other backends;</li>
<li class>A boot sector is reserved, which can help bootstrap and other requirements.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-to-rafs-v6-image-format">Introduction to RAFS v6 image format<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#introduction-to-rafs-v6-image-format" class="hash-link" aria-label="Direct link to Introduction to RAFS v6 image format" title="Direct link to Introduction to RAFS v6 image format" translate="no">&#x200B;</a></h4>
<p>Over the past year, the Alibaba Cloud kernel team has made several improvements and enhancements to EROFS filesystem,
adapting it to the container image storage scenarios, and finally presenting it as a container image format implemented
on the kernel side, RAFS v6. In addition, RAFS v6 also carries out a series of optimizations on the image format, such
as block alignment, more compact metadata, and more.</p>
<p>The new RAFS v6 image format is as follows:
<img decoding="async" loading="lazy" alt="rafsv6" src="https://d7y.io/assets/images/rafsv6-bdbeb521e3a79072220ca662776896b9.png" width="2402" height="558" class="img_ev3q"></p>
<p>The improved Nydus image service architecture is illustrated as below, adding support for the (EROFS-based) RAFS
v6 image format:
<img decoding="async" loading="lazy" alt="rafsv6_arch" src="https://d7y.io/assets/images/rafsv6_arch-5c46d43a9419754865b6bd573847b689.png" width="1432" height="535" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="erofs-over-fscache">EROFS over Fscache<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#erofs-over-fscache" class="hash-link" aria-label="Direct link to EROFS over Fscache" title="Direct link to EROFS over Fscache" translate="no">&#x200B;</a></h3>
<p>erofs over fscache is the next-generation container image <strong>on-demand loading</strong> technology developed by the Alibaba
Cloud kernel team for Nydus. It is also the <strong>native</strong> image on-demand loading feature of the Linux kernel.
It was integrated into the <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=65965d9530b0c320759cd18a9a5975fb2e098462" target="_blank" rel="noopener noreferrer" class>Linux kernel mainline 5.19</a>.
<img decoding="async" loading="lazy" alt="erofs_over_fscache_merge" src="https://d7y.io/assets/images/erofs_over_fscache_merge-623d9f0bd0962982babc6ff7596a5470.png" width="950" height="357" class="img_ev3q"></p>
<p>And on LWN.net as a <a href="https://lwn.net/SubscriberLink/896140/3d7b8c63b70776d4/" target="_blank" rel="noopener noreferrer" class>highlighting feature</a> of the 5.19 merge window:
<img decoding="async" loading="lazy" alt="erofs_over_fscache_lwn" src="https://d7y.io/assets/images/erofs_over_fscache_lwn-d49d8690d141d3b3c883a0837861f81c.png" width="2394" height="274" class="img_ev3q"></p>
<p>Prior to this, almost all lazy pulling solutions available were in the user mode. The userspace solution involves
frequent kernel/user mode context switching and memory copying between kernel/user mode, resulting in performance
bottlenecks. This problem is especially prominent when all the container images have been downloaded locally, in which
case the file access will still switch to userspace.</p>
<p>In order to avoid the unnecessary overhead, we can decouple the two operations of 1) cache management of image data
and 2) fetching data through various sources (such as network) on cache miss. Cache management can be all in the kernel
mode, so that it can avoid kernel/user mode context switching when the image is locally ready.
This is exactly the main benefit of erofs over fscache technology.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="brief-introduction">Brief Introduction<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#brief-introduction" class="hash-link" aria-label="Direct link to Brief Introduction" title="Direct link to Brief Introduction" translate="no">&#x200B;</a></h4>
<p>fscache/cachefiles (hereinafter collectively referred to as fscache) is a relatively mature file caching solution in
Linux systems, and is widely used in network filesystems (such as NFS, Ceph, etc.).
Our attempt is to make it work with the on-demand loading for local filesystems such as EROFS.</p>
<p>In this case, when the container accesses the container image, fscache will check whether the requested data has been
cached. On cache hit, the data will be read directly from the cache file. It is processed directly in kernel, and will
not switch to userspace.
<img decoding="async" loading="lazy" alt="erofs_over_fscache_cache_hit" src="https://d7y.io/assets/images/erofs_over_fscache_cache_hit-ab92c318dc75c5c6a6153acd4396964f.png" width="3544" height="1061" class="img_ev3q"></p>
<p>Otherwise (cache miss), the userspace service Nydusd will be notified to process this request, while the container
process will sleep on this then; Nydusd will fetch data from remote, write it to the cache file through fscache, and
awake the original asleep process. Once awaken, the process is able to read the data from the cache file.
<img decoding="async" loading="lazy" alt="erofs_over_fscache_cache_miss" src="https://d7y.io/assets/images/erofs_over_fscache_cache_miss-8d56a06985504e5b64cad579ef8961cf.png" width="3544" height="1077" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="advantages-of-the-solution">Advantages of the Solution<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#advantages-of-the-solution" class="hash-link" aria-label="Direct link to Advantages of the Solution" title="Direct link to Advantages of the Solution" translate="no">&#x200B;</a></h4>
<p>As described above, when the image has been downloaded locally, userspace solutions still need to switch to userspace
when accessing, while the memory copying overhead between kernel/user modes is also involved. As for erofs over fscache,
it will no longer switch to userspace, so that on-demand loading is truly &quot;on-demand&quot;. IOWs, it has <strong>native performance
and stability</strong> when images has been locally ready. In brief, it implements a real one-stop and lossless solution in the
following two scenarios of 1) on-demand loading and 2) downloading container images in advance.</p>
<p>Specifically, erofs over fscache has the following advantages over userspace solutions.</p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-asynchronous-prefetch">1. Asynchronous prefetch<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#1-asynchronous-prefetch" class="hash-link" aria-label="Direct link to 1. Asynchronous prefetch" title="Direct link to 1. Asynchronous prefetch" translate="no">&#x200B;</a></h5>
<p>After the container is created, Nydusd can start to download images even without the on-demand loading (cache miss)
triggered. Nydusd will download data and write it to the cache file. Then when the specific file range is accessed,
EROFS will directly read from the cache file, without <strong>switching to the userspace</strong>, whilst the other userspace
solutions have to go the round trip.
<img decoding="async" loading="lazy" alt="erofs_over_fscache_prefetch" src="https://d7y.io/assets/images/erofs_over_fscache_prefetch-7d3957bf10e0a004b87319bd120b87a8.png" width="3708" height="1230" class="img_ev3q"></p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-network-io-optimization">2. Network IO optimization<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#2-network-io-optimization" class="hash-link" aria-label="Direct link to 2. Network IO optimization" title="Direct link to 2. Network IO optimization" translate="no">&#x200B;</a></h5>
<p>When on-demand loading (cache miss) is triggered, Nydusd can download more data at one time than requested.
For example, when 4KB I/O is requested, Nydusd can actually download 1MB of data at a time to reduce the network
transmission delay per unit file size. Then, when the container accesses the remaining data within this 1MB,
it won&apos;t switch to userspace anymore. The userspace solutions cannot work like this since it still needs to
switch to the userspace on data access within the prefetched range.
<img decoding="async" loading="lazy" alt="erofs_over_fscache_readahead" src="https://d7y.io/assets/images/erofs_over_fscache_readahead-92db56220db4440526a56f079549551b.png" width="3544" height="1077" class="img_ev3q"></p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-better-performance">3. Better performance<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#3-better-performance" class="hash-link" aria-label="Direct link to 3. Better performance" title="Direct link to 3. Better performance" translate="no">&#x200B;</a></h5>
<p>When images have been downloaded locally (the impact of on-demand loading is not considered in this case),
erofs over fscache performs significantly better than userspace solutions, while achieving similar performance
compared to the native filesystem.
Here is the performance statistics under several workloads as below[1].</p>
<h6 class="anchor anchorTargetStickyNavbar_Vzrq" id="readrandread-io">read/randread IO<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#readrandread-io" class="hash-link" aria-label="Direct link to read/randread IO" title="Direct link to read/randread IO" translate="no">&#x200B;</a></h6>
<p>The following is the performance statistics of file read/randread buffered IO [2]</p>
<table><thead><tr><th>read</th><th>IOPS</th><th>BW</th><th>performance</th></tr></thead><tbody><tr><td>native ext4</td><td>267K</td><td>1093MB/s</td><td>1</td></tr><tr><td>loop</td><td>240K</td><td>982MB/s</td><td>0.90</td></tr><tr><td>fscache</td><td>227K</td><td>931MB/s</td><td>0.85</td></tr><tr><td>fuse</td><td>191K</td><td>764MB/s</td><td>0.70</td></tr></tbody></table>
<table><thead><tr><th>randread</th><th>IOPS</th><th>BW</th><th>Performance</th></tr></thead><tbody><tr><td>native ext4</td><td>10.1K</td><td>41.2MB/s</td><td>1</td></tr><tr><td>loop</td><td>8.7K</td><td>34.8MB/s</td><td>0.84</td></tr><tr><td>fscache</td><td>9.5K</td><td>38.2MB/s</td><td>0.93</td></tr><tr><td>fuse</td><td>7.6K</td><td>31.2MB/s</td><td>0.76</td></tr></tbody></table>
<blockquote>
<ul>
<li class>&quot;native&quot; means that the test file is directly on the local ext4 filesystem</li>
<li class>&quot;loop&quot; means that the test file is inside an erofs image, while the erofs image is mounted through the DIRECT IO
mode of the loop device</li>
<li class>&quot;fscache&quot; means that the test file is inside an erofs image, while the erofs image is mounted through the erofs over
fscache scheme</li>
<li class>&quot;fuse&quot; means that the test file is in the fuse filesystem [3]</li>
<li class>The &quot;Performance&quot; column normalizes the performance statistics of each mode, based on the performance of the native
ext4 filesystem</li>
</ul>
</blockquote>
<p>It can be seen that the read/randread performance in fscache mode is basically the same as that in loop mode, and is
better than that in fuse mode; however, there is still a certain gap with the performance of the native ext4 file
system. We are further analyzing and optimizing it. In theory, it can achieve basically lossless performance with that
of native filesystem.</p>
<h6 class="anchor anchorTargetStickyNavbar_Vzrq" id="file-metadata-manipulation">File metadata manipulation<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#file-metadata-manipulation" class="hash-link" aria-label="Direct link to File metadata manipulation" title="Direct link to File metadata manipulation" translate="no">&#x200B;</a></h6>
<p>Test the performance of file metadata operations by performing a tar operation [4] on a large number of small files.</p>
<table><thead><tr><th></th><th>Time</th><th>Performance</th></tr></thead><tbody><tr><td>native ext4</td><td>1.04s</td><td>1</td></tr><tr><td>loop</td><td>0.550s</td><td>1.89</td></tr><tr><td>fscache</td><td>0.570s</td><td>1.82</td></tr><tr><td>fuse</td><td>3.2s</td><td>0.33</td></tr></tbody></table>
<p>It can be seen that the erofs format is even better than that of the native ext4 filesystem,
which is caused by the optimized filesystem format of erofs.
Since erofs is a read-only filesystem, all its metadata can be closely arranged, while ext4 is a writable filesystem,
and its metadata is scattered among multiple BGs (block group) .</p>
<h6 class="anchor anchorTargetStickyNavbar_Vzrq" id="typical-workload">Typical workload<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#typical-workload" class="hash-link" aria-label="Direct link to Typical workload" title="Direct link to Typical workload" translate="no">&#x200B;</a></h6>
<p>Test the performance of linux source code compilation [5] as the typical workload.</p>
<table><thead><tr><th>Linux Compiling</th><th>Time</th><th>Performance</th></tr></thead><tbody><tr><td>native ext4</td><td>156s</td><td>1</td></tr><tr><td>loop</td><td>154s</td><td>1.0</td></tr><tr><td>fscache</td><td>156s</td><td>1.0</td></tr><tr><td>fuse</td><td>200s</td><td>0.78</td></tr></tbody></table>
<p>It can be seen that fscache mode is basically the same as that of loop mode and native ext4 filesystem,
and is better than fuse mode.</p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-high-density-deployment">4. High-density deployment<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#4-high-density-deployment" class="hash-link" aria-label="Direct link to 4. High-density deployment" title="Direct link to 4. High-density deployment" translate="no">&#x200B;</a></h5>
<p>Since the erofs over fscache technology is implemented based on files, i.e. each container image is represented as a
cache file under fscache, it naturally supports high-density deployment scenarios.
For example, a typical node.js container image corresponds to ~20 cache files under this scheme,
then in a machine with hundreds of containers deployed, only thousands of cache files need to be maintained.</p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-failover-and-hot-upgrade">5. Failover and Hot Upgrade<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#5-failover-and-hot-upgrade" class="hash-link" aria-label="Direct link to 5. Failover and Hot Upgrade" title="Direct link to 5. Failover and Hot Upgrade" translate="no">&#x200B;</a></h5>
<p>When all the image files have been downloaded locally, the file access will no longer require the intervention of the
user-mode service process, in which case the user-mode service process has a more abundant time window to realize the
functions of <strong>failure recovery and hot upgrade</strong>.
The user-mode processes are even no longer required in this scenario, which promotes the stability of the solution.</p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-an-one-stop-solution-for-container-image">6. An one-stop solution for container image<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#6-an-one-stop-solution-for-container-image" class="hash-link" aria-label="Direct link to 6. An one-stop solution for container image" title="Direct link to 6. An one-stop solution for container image" translate="no">&#x200B;</a></h5>
<p>With RAFS v6 image format and erofs over fscache on-demand loading technology,
Nydus is suitable for both runc and Kata as a one-stop solution for container image distribution in these two scenarios.</p>
<p>More importantly, erofs over fscache is truly a <strong>one-stop</strong> and <strong>lossless</strong> solution in the following two scenarios
of 1) on-demand loading and 2) downloading container images in advance.
On the one hand, with the on-demand loading feature implemented, it can significantly speed up the container startup,
as it does not need to download the complete container images to the local. On the other hand, it is compatible with the
scenario where the container image has been downloaded locally. It will no longer switch to userspace in this case,
so as to achieve almost lossless performance and stability with the native filesystem.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-future">The Future<a href="https://d7y.io/blog/2022/06/06/evolution-of-nydus#the-future" class="hash-link" aria-label="Direct link to The Future" title="Direct link to The Future" translate="no">&#x200B;</a></h3>
<p>After that, we will keep improving the erofs over fscache technology, such as more fine-grained image deduplication
among containers, stargz support, FSDAX support, and performance optimization.</p>
<p>Last but not least, I would like to thank all the individuals and teams who have supported and helped us during the
development of the project, and specially thanks to ByteDance and Kuaishou folks for their solid support.
Let us work together to build a better container image ecosystem :)</p>
<ol>
<li class>Test environment: ecs.i2ne.4xlarge (16 vCPU, 128 GiB Mem, local NVMe disk)</li>
<li class>Test command &quot;fio -ioengine=psync -bs=4k -direct=0 -rw=[read|randread] -numjobs=1&quot;</li>
<li class>Use <a href="https://github.com/libfuse/libfuse/blob/master/example/passthrough_hp.cc" target="_blank" rel="noopener noreferrer" class>passthrough_hp</a> as fuse daemon</li>
<li class>Test the execution time of &quot;tar -cf /dev/null linux_src_dir&quot; command</li>
<li class>Test the execution time of the &quot;time make -j16&quot; command</li>
</ol>]]></content>
        <author>
            <name>Jingbo Xu</name>
        </author>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
        <category label="erofs" term="erofs"/>
        <category label="fscache" term="fscache"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Containerd Accepted Nydus-snapshotter]]></title>
        <id>https://d7y.io/blog/2022/01/17/containerd-accepted-nydus-snapshotter</id>
        <link href="https://d7y.io/blog/2022/01/17/containerd-accepted-nydus-snapshotter"/>
        <updated>2022-01-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Announcing Containerd accepted nydus-snapshotter as a sub-project]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="containerd-accepted-nydus-snapshotter">Containerd Accepted Nydus-snapshotter<a href="https://d7y.io/blog/2022/01/17/containerd-accepted-nydus-snapshotter#containerd-accepted-nydus-snapshotter" class="hash-link" aria-label="Direct link to Containerd Accepted Nydus-snapshotter" title="Direct link to Containerd Accepted Nydus-snapshotter" translate="no">&#x200B;</a></h2>
<p>Early January, Containerd community has taken in nydus-snapshotter as a sub-project. Check out the code,
particular introductions and tutorial from its <a href="https://github.com/containerd/nydus-snapshotter" target="_blank" rel="noopener noreferrer" class>new repository</a>.
We believe that the donation to containerd will attract more users and developers
for nydus itself and bring much value to the community users.</p>
<p>Nydus-snapshotter is a containerd&apos;s remote snapshotter, it works as a standalone process out of containerd,
which only pulls nydus image&apos;s bootstrap from remote registry and forks another process called <strong>nydusd</strong>.
Nydusd has a unified architecture, which means it works in form of a FUSE user-space filesystem daemon,
a virtio-fs daemon or a fscache user-space daemon. Nydusd is responsible for fetching data blocks
from remote storage like object storage or standard image registry, thus to fulfill containers&apos;
requests to read its rootfs.</p>
<p>Nydus is an excellent container image acceleration solution which significantly reduces time cost by starting container.
It is originally developed by a virtual team from Alibaba Cloud and Ant Group and deployed in very large scale.
Millions of containers are created based on nydus image each day in Alibaba Cloud and Ant Group.
The underlying technique is a newly designed, container optimized and oriented read-only filesystem named <strong>Rafs</strong>.
Several approaches are provided to create rafs format container image.
The image can be pushed and stored in standard registry since it is compatible with OCI image
and distribution specifications. A nydus image can be converted from an OCI source image where metadata and files
data are split into a &quot;bootstrap&quot; and one or more &quot;blobs&quot; together with necessary manifest.json and config.json.
Development of integration with Buildkit is in progress.</p>
<p><img decoding="async" loading="lazy" alt="rafs disk layout" src="https://d7y.io/assets/images/rafs_disk_layout-19e8011b046c7aebbd23831236acaa17.png" width="925" height="465" class="img_ev3q"></p>
<p>Nydus provides following key features:</p>
<ul>
<li class>Chunk level data de-duplication among layers in a single repository to reduce storage, transport and memory cost</li>
<li class>Deleted(whiteout) files in certain layer aren&apos;t packed into nydus image, therefore, image size may be reduced</li>
<li class>E2E image data integrity check. So security issues like &quot;Supply Chain Attack&quot; can be avoided and detected at runtime</li>
<li class>Integrated with CNCF incubating project Dragonfly to distribute container images in P2P fashion and mitigate
the pressure on container registries</li>
<li class>Different container image storage backends are supported. For example, Registry, NAS, Aliyun/OSS and applying other
remote storage backend like AWS S3 is also possible.</li>
<li class>Record files access pattern during runtime gathering access trace/log, by which user&apos;s abnormal behaviors
are easily caught. So we can ensure the image can be trusted</li>
</ul>
<p>Beyond above essential features, nydus can be flexibly configured as a FUSE-base user-space filesystem or
in-kernel EROFS with an on-demand loader user-space daemon and integrating nydus with VM-based container
runtime is much easier.</p>
<ul>
<li class>Lightweight integration with VM-based containers runtime like KataContainers. In fact, KataContainers
is considering supporting nydus as a <strong>native</strong> image acceleration solution.</li>
<li class>Nydus closely cooperates with Linux <strong>in-kernel</strong> disk filesystem Containers&apos; rootfs can directly be set up
by EROFS with lazy pulling capability. The corresponding changes had been merged into Linux kernel since v5.16</li>
</ul>
<p>To run with runc, nydusd works as FUSE user-space daemon:</p>
<p><img decoding="async" loading="lazy" alt="runc nydus" src="https://d7y.io/assets/images/nydus_runc-6f007929f111e721fcd4e4b3ced80054.png" width="893" height="627" class="img_ev3q"></p>
<p>To work with KataContainers, it works as a virtio-fs daemon:</p>
<p><img decoding="async" loading="lazy" alt="kata nydus" src="https://d7y.io/assets/images/nydus_kata-05227ebe2d865a2563d37a9dffc77cd9.png" width="1014" height="554" class="img_ev3q"></p>
<p>Nydus community is working together with Linux Kernel to develop erofs+fscache based user-space on-demand read.</p>
<p><img decoding="async" loading="lazy" alt="runc erofs nydus" src="https://d7y.io/assets/images/nydus_runc_erofs-a634a7caa41c43e1ea1a4041c032de53.svg" width="958" height="519" class="img_ev3q"></p>
<p>Nydus and eStargz developers are working together on a new project named <a href="https://github.com/goharbor/acceleration-service" target="_blank" rel="noopener noreferrer" class>acceld</a>
in <strong>Harbor</strong> community to provide a general service to support the conversion from OCI v1 image to kinds of acceleration
image formats for various accelerator providers, so that keep a smooth upgrade from OCI v1 image. In addition to
the conversion service acceld and the conversion tool nydusify, nydus is also supporting buildkit to enable
exporting nydus image directly from Dockerfile as a compression type.</p>
<p>In the future, nydus community will work closely with the containerd community on fast and efficient methods and
solution of distributing container images, container image security, container image content storage efficiency, etc.</p>]]></content>
        <author>
            <name>Changwei Ge</name>
        </author>
        <category label="dragonfly" term="dragonfly"/>
        <category label="container image" term="container image"/>
        <category label="OCI" term="OCI"/>
        <category label="nydus" term="nydus"/>
        <category label="nydus-snapshotter" term="nydus-snapshotter"/>
        <category label="containerd" term="containerd"/>
    </entry>
</feed>