文/云原生 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% ,具体试验后果请参考:https://openanolis.cn/sig/cloud-native/doc/664655138551659287。

另外,龙蜥社区推出了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 部署文档:https://openanolis.cn/sig/cloud-native/doc/663184185494429473。

而后,咱们须要开始适配 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 https://github.com/goharbor/acceleration-service/releases/download/v0.1.1/harbor-acceld-v0.1.1-linux-amd64.tgztar -xf harbor-acceld-v0.1.1-linux-amd64.tgzcd harbor-acceld/

# Configuration file of Harbor Acceleration Service# http related configserver:  name: API  # listened host for http  host: 0.0.0.0  # port for http  port: 2077metric:  # export metrics on `/metrics` endpoint  enabled: trueprovider:  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: overlayfsconverter:  # 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 包,否则须要自行下载该工具,具体步骤请参考:https://openanolis.cn/sig/cloud-native/doc/624244092113272868。

此时,只有有用户往该 harbor 仓库中上传任意镜像,acceld 都会主动将其转换成 Nydus 格局的镜像,以 {original_tag}-nydus 作为 tag,比方:

能够看到这时harbor仓库中会多呈现一个 ubuntu:latest-nydus 的镜像:

03 单机 Nydus 镜像减速组件的配置以及应用

在单机上安装、应用 Nydus 组件,请参考以下文档:*https://openanolis.cn/sig/cloud-native/doc/624244092113272868*。

04 Nydus 格局镜像的制作、提交和应用

4.1 对 Harbor 仓库中已有镜像进行转换

如果您的 Harbor 仓库中曾经存在了肯定的镜像,须要进行 Nydus 格局转换,能够采纳如下形式:

首先,在曾经运行了 acceld 的机器上,装置 acceldctl 工具:

wget https://github.com/goharbor/acceleration-service/releases/download/v0.1.1/harbor-acceld-v0.1.1-linux-amd64.tgztar -xf harbor-acceld-v0.1.1-linux-amd64.tgzcd harbor-acceld/

而后,进行转换,比方 harbor 中曾经有 nginx 的镜像,咱们须要进行转换,能够采纳:

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

4.2 在任意装置了 Nydus 的机器上进行本地镜像的转换

请参考 https://openanolis.cn/sig/cloud-native/doc/624244092113272868 中的第六章,您应用 nydusify convert 时,如果指标的镜像指明了仓库,nydusify 会主动帮您推送到相应的仓库中去。

4.3 应用 buildkit 进行基于 dockerfile 的镜像制作

咱们能够应用 buildkit 工具基于 Dockerfile 构建 Nydus 格局的容器镜像,Dockerfile 是一个文本文件,其内蕴含了一条条的指令(Instruction) ,每一条指令构建一层,因而每一条指令的内容,就是形容该层该当如何构建。

  • 先创立一个 nginx 的 Dockerfile
tee Dockerfile << EOFFROM nginxRUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.htmlEOF 
  • 装置 Nydus 与 nerdctl
sudo yum --enablerepo Plus install -y nydus-rssudo yum update -y anolis-repos && sudo yum install -y anolis-experimental-release && sudo yum install -y nerdctl
  • 下载并启动反对 Nydus 版本的 buildkit
wget https://gitee.com/anolis/buildkit/releases/download/v0.10.5-rc.1/buildkit-0.10.5~rc.1-1.an8.x86_64.rpmrpm -ivh buildkit-0.10.5~rc.1-1.an8.x86_64.rpmsudo 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,请参考文章部署:*https://openanolis.cn/sig/cloud-native/doc/663184381485245340*。

而后,咱们开始进行 Dragonfly 和 Harbor 公有仓库的对接,这里介绍用代理的形式来配置 Dragonfly 的形式。首先,生成 worker 节点的证书,用于 Dragonfly 的 https 劫持:

openssl genrsa -out ca.key 4096openssl 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.crtmkdir -p /etc/dragonfly/certmv 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.decho "[Service]" >/etc/systemd/system/containerd.service.d/http-proxy.confecho 'Environment="HTTP_PROXY=http://127.0.0.1:65001"' >>/etc/systemd/system/containerd.service.d/http-proxy.confecho 'Environment="HTTPS_PROXY=http://127.0.0.1:65001"' >>/etc/systemd/system/containerd.service.d/http-proxy.confsystemctl daemon-reloadsystemctl restart containerdsystemctl restart dfget-daemon

至此,Dragonfly 对接咱们的自建 harbor 曾经构建结束。

更多内容还请返回龙蜥社区云原生 SIG 查看,链接地址:

https://openanolis.cn/sig/cloud-native

2016 年 usenix 论文:

https://www.usenix.org/system/files/conference/fast16/fast16-...

—— 完 ——