保姆級教程!如何在 Anolis 8 上構建基於 Nydus 和 Dragonfly 的映象加速解決方案?
文/雲原生 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:
在相應的 project 中選擇新增 webhook:
配置 webhook:
其中,事件型別選擇 Artifact pushed,即在推送映象的時候,呼叫此 webhook,然後,在 Endpoint 地址中,填寫 http://{要部署的acceld的主機IP}:2077/api/v1/conversions。
在 Auth Header 中填寫 header,然後選擇新增。然後開始新增機器人賬戶:
在點選新增之後,會出現賬戶的令牌, 請務必記錄令牌的內容,將賬目名和 secret 用 base64 工具生成 auth 序列:
下載 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:
最後,執行 acceld:
./acceld --config config.yaml.nydus >log.txt 2>&1 &
在您執行 acceld 的機器上,需要有 nydus-image 工具用於映象轉換,如果您使用的是龍蜥 OS,那麼只需要安裝 nydus-rs 包,否則需要自行下載該工具,具體步驟請參考:
此時,只要有使用者往該 harbor 倉庫中上傳任意映象,acceld 都會自動將其轉換成 Nydus 格式的映象,以 {original_tag}-nydus 作為 tag,比如:
可以看到這時harbor倉庫中會多出現一個 ubuntu:latest-nydus 的映象:
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),將證照以及加速域名新增到配置檔案中:
注意,在/etc/containerd/config.toml中,不能在registry.anolis.com中配置127.0.0.1:65001的endpoint:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何在 Anolis 8上部署 Nydus 映象加速方案?
- 螞蟻安全科技 Nydus 與 Dragonfly 映象加速實踐 | 龍蜥技術Go
- Nydus 映象掃描加速
- 讓容器應用管理更快更安全,Dragonfly 釋出 Nydus 容器映象加速服務Go
- Nerdctl 原生支援 Nydus 加速映象
- Jou 的解決方案系列:Composer 映象加速與 NPM 映象加速NPM
- 火山引擎基於 Dragonfly 加速實踐Go
- 基於ubuntu映象構建redis映象UbuntuRedis
- 技術解讀:Dragonfly 基於 P2P 的智慧映象加速系統 | 龍蜥技術Go
- 如何在 Windows 上安裝SSMS,保姆級教程來了!WindowsSSM
- Nydus 映象加速外掛遷入 Containerd 旗下AI
- hbase構建二級索引解決方案索引
- 基於開源軟體構建儲存解決方案的思考
- 加速和簡化構建Docker(基於Google jib)DockerGo
- Dragonfly 基於 P2P 的檔案和映象分發系統Go
- Nydus 在約苗平臺的容器映象加速實踐
- Nydus 加速映象一致性校驗增強
- 多多益善|基於Artifactory和Buildx構建多架構Docker映象UI架構Docker
- 如何在Windows上從原始碼構建OpenJFX 8Windows原始碼
- 012-P2P加速Docker映象分發(阿里Dragonfly)Docker阿里Go
- Containerd 的前世今生和保姆級入門教程AI
- Verizon和Novell推出基於雲的安全解決方案
- Docker 映象加速教程Docker
- Kunbernetes-基於Nexus構建私有映象倉庫
- 開源生態與AI晶片的碰撞&Dragonfly基於P2P的映象加速系統 | 第 39-40 期AI晶片Go
- 基於WPSOffice+Pywpsrpc構建Docker映象,實現文件轉換和線上預覽服務RPCDocker
- SpringCloud搭建保姆級教程SpringGCCloud
- 構建真“智慧”的智慧社群解決方案
- 基於Vue構造器建立Form元件的通用解決方案VueORM元件
- 如何在Anolis 8 安裝 極狐GitLab RunnerGitlab
- 微服務部署-基於DockerMaven外掛構建映象部署微服務DockerMaven
- combineLatest 使用的一個陷阱和基於 debounceTime 的解決方案
- 保姆級教程,如何發現 GitHub 上的優質專案?Github
- 基於 Flink SQL 和 Paimon 構建流式湖倉新方案SQLAI
- 基於 EventBridge 構建 SaaS 應用整合方案
- graspnet復現保姆級教程
- SeaweedFS + TiKV 部署保姆級教程
- 基於jib-maven-plugin快速構建微服務docker映象MavenPlugin微服務Docker