保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

OpenAnolis小助手發表於2023-04-18

文/雲原生 SIG

01 背景

映象是容器技術的基礎之一,在雲原生場景下,業務的正常運作離不開對映象的製作、分發和執行。當前的映象在使用的過程中,需要將映象從倉庫中全量拉取到本地,再由容器 engine 進行解壓,堆疊掛載,然後才能構造成 rootfs 提供給容器。而在實際生產過程中,由於映象版本的迭代, 映象的體積往往越來越大,因而導致映象拉取耗時往往佔據了容器啟動階段的大部分時間。

2016 年的 usenix 的論文 Slacker:Fast Distribution with Lazy Docker Containers (連結見文末)中曾發表資料,在容器啟動的過程中,平均只需要讀取映象資料中的7%不到的資料,因此在實際應用過程中,通常不需要全量拉取資料我們就可以完成業務的釋出過程。同時,映象的拉取速度受限於映象倉庫和執行節點之間的網路頻寬,而容器映象的下載的承接主體是 node,即一個容器如果執行在不同的 node 上,就需要在不同的 node 中各自拉取資料,在叢集規模較大的情況下,容器併發程度較高的時候,都會對容器映象倉庫造成一定的壓力。

基於以上問題,龍蜥社群引入了 Nydus 映象加速方案以及基於 Dragonfly 的 P2P 映象加速系統,其中 Nydus 提供了映象按需載入能力,Dragonfly 提供了叢集映象 P2P 加速能力,透過以上能力的組合減少容器啟動過程中映象的拉取時間,提升叢集間的映象分發效率。

本文將介紹如何在龍蜥 OS 上構建基於 Nydus 和 Dragonfly 的映象加速端到端解決方案,其中會包含:

  • harbor 映象倉庫構建以及 Nydus 外掛的支援

  • 單機 Nydus 映象加速元件的配置以及使用

  • Nydus 格式映象的製作、提交和使用

  • 單機 Dragonfly P2P 加速元件的配置以及使用

  • 使用 Nydus 以 Dragonfly 在特定場景下的效果對比

注:Harbor、Nydus、Dragonfly 這 3 個元件是相互獨立的,您可以根據自己的實際應用場景對 3 個元件進行組合應用。

基於本解決方案,可以在特定的實驗 case 下,將叢集的擴容速度提升 100%,叢集的計算效能提升 127% ,具體實驗結果請參考:

另外,龍蜥社群推出了ACNS(OpenAnolis Cloud Native Suite),您可以用一鍵部署的方式完成 Nydus & Dragonfly 在叢集內的部署應用,歡迎大家試用!

02 在龍蜥 OS 上構建 Harbor 以及服務與 Harbor 的 Nydus 外掛

Harbor 是一個開源的企業級的容器 Registry 管理專案,提供容器 Registry 管理 UI,提供的功能包括:基 於角色訪問的控制許可權管理(RBAC)、AD/LDAP 整合、日誌稽核、管理介面、自我註冊、映象複製和中文支援等。在使用 Harbor 時,您可以在您的叢集內迅速搭建一個企業級的容器 registry 服務,不僅可以保證生產映象的安全,還可以獲得更高的穩定性保障。

Nydus 映象加速服務針對 Harbor 進行了適配,您可以在您的 harbor 映象倉庫中新增對 Nydus 的支援,這樣,使用者在推送一個映象的時候,harbor 映象倉庫會自動完成對於映象格式的轉換,避免手動修改、轉換映象的負載工作。本章將介紹如何在 Harbor 倉庫中對接使能 Nydus 服務。

首先,您需要有一個已經建立完成的 Harbor 映象倉庫,如果您還沒有,可以參考龍蜥的 Harbor 部署文件:

然後,我們需要開始適配 Nydus 的 acceld 服務,這裡我們將 accld 與 Harbor 部署在同一臺宿主機環境上:

配置 harbor 的 webhook,選擇我們需要使能 Nydus 的 project,點選進入專案,這裡採用預設的project library:

保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

在相應的 project 中選擇新增 webhook:

保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

配置 webhook:

保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

其中,事件型別選擇 Artifact pushed,即在推送映象的時候,呼叫此 webhook,然後,在 Endpoint 地址中,填寫 http://{要部署的acceld的主機IP}:2077/api/v1/conversions。

保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

在 Auth Header 中填寫 header,然後選擇新增。然後開始新增機器人賬戶:

保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

在點選新增之後,會出現賬戶的令牌, 請務必記錄令牌的內容,將賬目名和 secret 用 base64 工具生成 auth 序列:

保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

下載 acceld 元件,並配置好 acceld 的配置檔案 config.yaml.nydus:

wget 
tar -xf harbor-acceld-v0.1.1-linux-amd64.tgz
cd harbor-acceld/

# Configuration file of Harbor Acceleration Service
# http related config
server:
  name: API
  # listened host for http
  host: 0.0.0.0
  # port for http
  port: 2077
metric:
  # export metrics on `/metrics` endpoint
  enabled: true
provider:
  source:
    # hostname of harbor service
    registry.anolis.com:
      # base64 encoded `<robot-name>:<robot-secret>` for robot
      # account created in harbor
      auth: cm9ib3QkbnlkdXM6cUpDTmtiUWhzem1ydEpiQnUyZURzUWRVZ2NXTlI2TzU=
      # skip verifying server certs for HTTPS source registry
      insecure: true
      webhook:
        # webhook request auth header configured in harbor
        auth_header: header
    localhost:
      auth: YWRtaW46SGFyYm9yMTIzNDU=
  containerd:
    # ensure containerd service listening on this address
    address: /run/containerd/containerd.sock
    snapshotter: overlayfs
converter:
  # number of worker for executing conversion task
  worker: 5
  # enable to add harbor specified annotations to converted image for tracking.
  harbor_annotation: true
  driver:
    # accelerator driver type: `nydus`
    type: nydus
    config:
      work_dir: /tmp
      # `nydus-image` binary path, download it from:
      # https://github.com/dragonflyoss/image-service/releases (require v2.0.0 or higher)
      builder: nydus-image
      # specify nydus format version, possible values: `5`, `6` (EROFS-compatible), default is `5`
      # fs_version: 5
      # specify nydus blob compression algorithm, possible values: `none`, `lz4_block`, `gzip`, `zstd`, default is `lz4_block`
      # compressor: zstd
      # ensure that both OCIv1 manifest and nydus manifest are present as manifest index in the target image.
      # it's used for containerd to support running OCIv1 image or nydus image simultaneously with a single image reference.
      # note: please ensure that OCIv1 manifest already exists in target image reference.
      # merge_manifest: true
      # nydus chunk dict image reference, used for chunk-leveled data deduplication.
      # chunk_dict_ref: localhost/chunk_dict/image:latest
      # specify a storage backend for storing nydus blob, optional, possible values: oss, localfs
      # backend_type: oss
      # backend_config: '{"endpoint":"","access_key_id":"","access_key_secret":"","bucket_name":""}'
      # backend_type: localfs
      # backend_config: '{"dir":"/path/to/dir"}'
  rules:
    # add suffix to tag of source image reference as target image reference
    - tag_suffix: -nydus

首先配置 harbor 的域名,然後將剛才生產的序列號補充到 auth 中,最後將 insecure 欄位配置為 true:

保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

最後,執行 acceld:

./acceld --config config.yaml.nydus >log.txt 2>&1  &

在您執行 acceld 的機器上,需要有 nydus-image 工具用於映象轉換,如果您使用的是龍蜥 OS,那麼只需要安裝 nydus-rs 包,否則需要自行下載該工具,具體步驟請參考:

此時,只要有使用者往該 harbor 倉庫中上傳任意映象,acceld 都會自動將其轉換成 Nydus 格式的映象,以 {original_tag}-nydus 作為 tag,比如:

保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

可以看到這時harbor倉庫中會多出現一個 ubuntu:latest-nydus 的映象:

保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

03 單機 Nydus 映象加速元件的配置以及使用

在單機上安裝、使用 Nydus 元件,請參考以下文件:*

04 Nydus 格式映象的製作、提交和使用

4.1 對 Harbor 倉庫中已有映象進行轉換

如果您的 Harbor 倉庫中已經存在了一定的映象,需要進行 Nydus 格式轉換,可以採用如下方式:

首先,在已經執行了 acceld 的機器上,安裝 acceldctl 工具:

wget 
tar -xf harbor-acceld-v0.1.1-linux-amd64.tgz
cd harbor-acceld/

然後,進行轉換,比如 harbor 中已經有 nginx 的映象,我們需要進行轉換,可以採用:

./accelctl task create <harbor-service-address>/library/nginx:latest
./accelctl task list

4.2 在任意安裝了 Nydus 的機器上進行本地映象的轉換

請參考 中的第六章,您使用 nydusify convert 時,如果目標的映象指明瞭倉庫,nydusify 會自動幫您推送到相應的倉庫中去。

4.3 使用 buildkit 進行基於 dockerfile 的映象製作

我們可以使用 buildkit 工具基於 Dockerfile 構建 Nydus 格式的容器映象,Dockerfile 是一個文字檔案,其內包含了一條條的 指令(Instruction) ,每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。

  • 先建立一個 nginx 的 Dockerfile

tee Dockerfile << EOF
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
EOF

  • 安裝 Nydus 與 nerdctl

sudo yum --enablerepo Plus install -y nydus-rs
sudo yum update -y anolis-repos && sudo yum install -y anolis-experimental-release && sudo yum install -y nerdctl

  • 下載並啟動支援 Nydus 版本的 buildkit

wget ~rc.1-1.an8.x86_64.rpm
rpm -ivh buildkit-0.10.5~rc.1-1.an8.x86_64.rpm
sudo env NYDUS_BUILDER=/usr/bin/nydus-image buildkitd

  • 啟動本地映象中心

sudo nerdctl run -d --restart=always -p 5000:5000 registry

  • 構建並轉換映象

sudo buildctl build \
    --frontend=dockerfile.v0 \
    --local context=. \
    --local dockerfile=. \
    --output type=image,name=localhost:5000/nginx:latest,push=true,compression=nydus,oci-mediatypes=true

  • 啟動映象

sudo nerdctl --snapshotter nydus run --rm -it -p 80:80 localhost:5000/nginx:latest

4.4 Nydus 映象製作限制

  • 當前 Nydus 格式還不支援使用 nerdctl 或者 docker commit 進行映象製作。

  • 當前 Nydus 格式映象不支援使用 buildkit 的時候,用 from nydus 格式映象的方式製作映象。

05 Dragonfly P2P 加速元件的配置以及使用

首先,我們先要在叢集內部署 Dragonfly,如果您的叢集內還沒有 Dragonfly,請參考文章部署:*

然後,我們開始進行 Dragonfly 和 Harbor 私有倉庫的對接,這裡介紹用代理的方式來配置 Dragonfly 的方式。首先,生成 worker 節點的證照,用於 Dragonfly 的 https 劫持:

openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=localhost.com" -key ca.key -out ca.crt
mkdir -p /etc/dragonfly/cert
mv ca.key ca.crt /etc/dragonfly/cert/

修改 Dragonfly 的 daemon 配置檔案(/etc/dragonfly/dfget.yaml),將證照以及加速域名新增到配置檔案中:

保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

注意,在/etc/containerd/config.toml中,不能在registry.anolis.com中配置127.0.0.1:65001的endpoint:

保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?

mkdir /etc/systemd/system/containerd.service.d
echo "[Service]" >/etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="HTTP_PROXY=
echo 'Environment="HTTPS_PROXY=
systemctl daemon-reload
systemctl restart containerd
systemctl restart dfget-daemon

至此,Dragonfly 對接我們的自建 harbor 已經構建完畢。

更多內容還請前往龍蜥社群雲原生 SIG 檢視,連結地址:

2016 年 usenix 論文:


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

—— 完 ——


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

相關文章