如何在 Anolis 8上部署 Nydus 映象加速方案?

OpenAnolis小助手發表於2022-08-12

在上一篇文章中詳細介紹 Anolis OS 是首個原生支援映象加速 Linux 核心,Nydus 映象加速服務重新最佳化了現有的 OCIv1 容器映象格式,重新定義映象的檔案系統,資料與後設資料分離,實現按需載入,本文作為使用 Nydus 的教程將詳細介紹在 Anolis OS 上部署 Nydus 的過程,以幫助使用者熟悉 Nydus 的基本使用方法。

一、部署環境

本教程中使用的是阿里雲上購買的 EC2 虛擬機器,您也可以在本地或其他雲環境中部署 Nydus。

作業系統:Anolis OS 8.4 (ANCK 64位)

核心版本:Linux 4.19

CPU:2 vCPU@3.5GHz

記憶體:8GB

軟體依賴:Nydus 當前僅支援 Containerd,因此在需要使用 containerd 作為容器引擎

龍蜥安裝使用 containerd 的方法。

dnf --enablerepo Plus install -y containerd

二、安裝 Nydus

龍蜥社群已經整合 Nydus 最新 Stable 穩定版本,推薦使用龍蜥整合的軟體包安裝 Nydus。如果需要安裝指定版本的 Nydus,可以下載上游開源版本的程式碼包安裝(以下兩種安裝方式任選一種即可)。

2.1 使用龍蜥整合的軟體包

dnf --enablerepo Plus install -y nydus-rs nydus-snapshotter

2.2 使用上游開源版本

  • 下載 Nydus 的可執行檔案。

從釋出頁面(見文末連結1)獲取最新的壓縮包,並解壓。

wget https://github.com/dragonflyoss/image-service/releases/download/v2.1.0-alpha.4/nydus-static-v2.1.0-alpha.4-linux-amd64.tgz
tar -xzvf nydus-static-v2.1.0-alpha.4-linux-amd64.tgz

  • 下載 Nydus Snapshotter 的可執行檔案。

從釋出頁面(見文末連結2)獲取最新的壓縮包,並解壓。

wget 
tar -xzvf nydus-snapshotter-v0.2.4-x86_64.tgz
mv nydus-snapshotter/containerd-nydus-grpc nydus-static/containerd-nydus-grpc

  • 選擇 Nydus 執行模式。

Nydus 加速框架支援了三種執行模式,以支援不同場景下的映象按需載入:

  • 透過 FUSE 提供給 RunC 這類容器執行時的按需載入能力,也是 Nydus 目前最常用的模式;

  • 透過 VirtioFS 承載 FUSE 協議,支援基於 VM 的容器執行時,例如 Kata 等,為 VM Guest 裡的容器提供 RootFS 按需載入能力;

  • 透過核心態的 EROFS 只讀檔案系統提供 RootFS,目前 Nydus 的 EROFS 格式支援已經進入了 Linux 5.16 主線,其核心態快取方案 erofs over fscache 也已經合入 Linux 5.19-rc1 主線,核心態方案可以減少上下文切換及記憶體複製開銷,在效能有極致要求的情況下可以用這種模式。

由於第一種模式的環境依賴最少,比較適合演示。因此在這裡我們選擇 fuse 模式,將 nydusd 二進位制檔案中的 nydusd-fusedev 重新命名為 nydusd。

cd nydus-static
mv nydusd-fusedev nydusd

  • 安裝可執行檔案。

sudo cp nydusd nydus-image /usr/bin
sudo cp nydusify containerd-nydus-grpc /usr/bin
sudo cp ctr-remote nydus-overlayfs /usr/
cd ..

三、啟動 Nydus Snapshotter

3.1 寫入配置檔案

Nydus 提供了一個容器化的遠端快照管理器 containerd-nydus-grpc 來準備容器 rootfs 與 nydus 格式的映象。要啟動它,首先將 nydusd 配置儲存到 /etc/nydusd-config.json:

sudo tee /etc/nydusd-config.json > /dev/null << EOF
{
  "device": {
    "backend": {
      "type": "registry",
      "config": {
        "scheme": "https",
        "skip_verify": false,
        "timeout": 5,
        "connect_timeout": 5,
        "retry_limit": 2
      }
    },
    "cache": {
      "type": "blobcache",
      "config": {
        "work_dir": "cache"
      }
    }
  },
  "mode": "direct",
  "digest_validate": false,
  "iostats_files": false,
  "enable_xattr": true,
  "fs_prefetch": {
    "enable": true,
    "threads_count": 4
  }
}
EOF

3.2 啟動遠端快照管理器

新開一個終端執行 containerd-nydus-grpc。

sudo /usr/bin/containerd-nydus-grpc \
    --config-path /etc/nydusd-config.json \
    --shared-daemon \
    --log-level info \
    --root /var/lib/containerd/io.containerd.snapshotter.v1.nydus \
    --cache-dir /var/lib/nydus/cache \
    --address /run/containerd/containerd-nydus-grpc.sock \
    --nydusd-path /usr/bin/nydusd \
    --nydusimg-path /usr/bin/nydus-image \
    --log-to-stdout

cache-dir參數列示本地 blob 快取根目錄,如果未設定,會預設為root+ "/cache"。它會覆蓋 nydusd-config.json 中的 device.cache.config.work_dir。

四、配置 Containerd

4.1 將以下內容新增到 containerd 配置中(預設為/etc/containerd/config.toml):

[proxy_plugins]
  [proxy_plugins.nydus]
    type = "snapshot"
    address = "/run/containerd/containerd-nydus-grpc.sock"
[plugins."io.containerd.grpc.v1.cri".containerd]
   snapshotter = "nydus"
   disable_snapshot_annotations = false

4.2 重新啟動 Contained

配置更新後需要重啟 Contained 服務。

systemctl restart containerd

五、啟動 Nydus 映象格式的容器

這裡展示如何使用 crictl 啟動一個 Nydus 映象格式的容器。

5.1 編寫 sandbox yaml 檔案 nydus-sandbox.yaml,往 POD 中傳遞 Nydus annotation

metadata:
  attempt: 1
  name: nydus-sandbox
  namespace: default
log_directory: /tmp
linux:
  security_context:
    namespace_options:
      network: 2
annotations:
  "io.containerd.osfeature": "nydus.remoteimage.v1"

5.2 編寫容器 yaml 檔案 nydus-container.yaml,指定使用的容器映象

metadata:
  name: nydus-container
image:
  image: cloud-native-sig-registry.cn-hangzhou.cr.aliyuncs.com/openanolis/anolisos:8.6-x86_64-nydus
command:
  - /bin/sleep
args:
  - 600
log_path: container.1.log

這裡我們使用了龍蜥雲原生映象倉庫中已經整合的 Anolis 8.6 的映象作為測試映象。

5.3 拉取映象並啟動容器

date
crictl pull cloud-native-sig-registry.cn-hangzhou.cr.aliyuncs.com/openanolis/anolisos:8.6-x86_64-nydus
pod=`crictl runp nydus-sandbox.yaml`
container=`crictl create $pod nydus-container.yaml nydus-sandbox.yaml`
crictl start $container
crictl ps
date

如何在 Anolis 8上部署 Nydus 映象加速方案?

這裡可以看到,採用 Nydus 映象僅使用 2 秒便完成了容器映象的拉取和容器啟動的過程。在同等的條件下,我們建立一個 OCIv1 的映象對比一下,使用的依然是 anolis 8.6 的映象,映象的內容與上述使用的 nydus 完全一致。yaml 檔案編寫如下:

metadata:
  attempt: 1
  name: normal-sandbox
  namespace: default
log_directory: /tmp
linux:
  security_context:
    namespace_options:
      network: 2

metadata:
  name: normal-container
image:
  image: cloud-native-sig-registry.cn-hangzhou.cr.aliyuncs.com/openanolis/anolisos:8.6
command:
  - /bin/sleep
args:
  - 600
log_path: container.1.log

採用如下的命令:

date
crictl pull cloud-native-sig-registry.cn-hangzhou.cr.aliyuncs.com/openanolis/anolisos:8.6
pod=`crictl runp normal-sandbox.yaml`
container=`crictl create $pod normal-container.yaml normal-sandbox.yaml`
crictl start $container
crictl ps
date

如何在 Anolis 8上部署 Nydus 映象加速方案?

可以看到,同等環境下,使用 OCIv1 映象格式啟動 Anolis 8.6 的版本需要10 秒,是 Nydus 的 5 倍。

六、轉換並啟動 Nydus 映象

這裡展示轉換 Nydus 映象並推送到您的映象倉庫中去,為了能夠登入映象倉庫,我們採用 nerdctl 工具進行配置。

6.1 安裝 Nerdctl 和 CNI plugin

Nerdctl 是一種與 docker 相容的命令列,但是由於它能夠支援啟動 Nydus 映象,因此我們在這裡選擇使用 Nerdctl。由於容器在執行中可能需要依賴一些外掛,所以我們同時安裝 CNI plugin。

dnf update -y anolis-repos && yum install -y anolis-experimental-release && yum install -y nerdctl
dnf install -y containernetworking-plugins

使用 nerdctl login 進行登入,用於倉庫認證,當然,您可以採用 docker login 方式登入。

nerdctl login --username ${your username} --password xxx

6.2 將映象轉換為 Nydus 格式,並推送至遠端映象倉庫

nydusify convert --nydus-image /usr/bin/nydus-image --source ${your image} --target ${your registry address}/${image name}:${tag}

按照操作完成以上步驟,恭喜,您已經成功在 Anolis OS 上完成了 Nydus 映象加速方案的部署!如果後續還有疑問,請搜尋釘釘群號(44701621)入群進行交流。

參考連結:

1.Nydus軟體包釋出頁面:

https://github.com/dragonflyoss/image-service/releases/latest

2.containerd 下 nydus snapshotter 釋出頁面:

3.Nydus 的更多技術細節:

https://developer.aliyun.com/article/971522

4.Nydus 更詳細的部署說明:

https://github.com/dragonflyoss/image-service/blob/master/docs/containerd-env-setup.md


相關連結可移步龍蜥公眾號(OpenAnolis龍蜥)2022年8月11日相同推送檢視。

—— 完 ——

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004278/viewspace-2910164/,如需轉載,請註明出處,否則將追究法律責任。

相關文章