简单介绍下
- google jib :支持 gradle 和 maven,用于构建 java 应用镜像时,将基础镜像(jdk),
- 依赖(jar lib),资源文件(resources),class 文件等进行分层(layer),这样依赖,在拉取和推送镜像时,起到加速和节省带宽的目的。
- Dragonfly2:是阿里开源的一款基于 P2P 协议的,镜像和文件分发加速工具,
- 与 dragonfly1 相比,dragonfly2 用 golang 重构了,运行时占用资源更少。理论上可以基于 dragonfly 做一个局域网 CDN,及局域网镜像加速器,
- 文件通过 dragonfly 下载后,缓存到局域网内,再次请求时,如果局域网节点内有,且未过期,则通过 p2p 协议从局域网内拉取,防止占用公网带宽及某个节点过 载被打死的情况。
简单总结下,jib 解决的是 java 应用动不动 100M+甚至 1G+的情况(变成了 80M JDK(基本不变)+200M jar(基本不变)+300M resource(基本不变)+ 1M class(每次发版会变)), 而 dragonfly2 解决的是节省公网带宽,减少内部 registry 节点过热的情况,加起来就是,容器 push&pull 的过程更快了
其实三年前写过阿里 Dragonfly+google jib 的文章,但是时间比较久远,有些内容已经过时,所以准备重新整理下。 之前文章如下:
- 加速和简化构建 Docker(基于 Google jib)
- 046-解决 google jib 多任务问题
- 012-P2P 加速 Docker 镜像分发(阿里 Dragonfly)
- 013-阿里 Dragonfly 体验之私有 registry 下载
Google Jib
jib 支持 maven: jib-maven-plugin 和gradle: jib-gradle-plugin , 以及常见的 多模块场景
翻了翻新版的 jib-maven-plugin 文档,
主要部分跟我之前的 加速和简化构建 Docker(基于 Google jib) 差不多,不再CV
了
但是加了不少新特性,比如
特别的说一下,jib 的很多配置,除了改 pom.xml 外,还支持无侵入的通过命令行指定,并且,命令行传入优先级更高,
比如 mvn compile com.google.cloud.tools:jib-maven-plugin:3.2.0:build -Dimage=<MY IMAGE>
中的-Dimage=
对应的是 pom.xml 里的<configuration><to><image></image></to></configuration>
K8S(kubernetes)以 rke2 为例
安装 k8s 集群,如果只是简单测试一下,可以用 k3s 或者 本地分布式开发环境搭建使用 Vagrant 和 Virtualbox 或者 rke2 (如果会用 ansible 也可以用 ansible playbook rke2 )
如果想可视化看下 k8s 集群,可以用kube-explorer, k9s 也可以用rancher2.6(注意如果用 rancher 的话 ,注意 rke2 安装的版本,以最新稳定版本 2.6.3为例,默认支持的是 k8s v1.21.7,也就是得用rke2 v1.21.7+rke2r2)
Dragonfly2
详细内容可参考官网 d8y.io。
helm 安装
官方文档 https://github.com/dragonflyoss/helm-charts/blob/main/charts/dragonfly/README.md
考虑到国内特殊国情,可能会访问 github 失败,可以用 https://gitee.com/projects/import/url 中转(也可以用我的 https://gitee.com/anjia/dragonflyoss-helm-charts)
git clone https://gitee.com/anjia/dragonflyoss-helm-charts.git
cd ./dragonflyoss-helm-charts/charts/dragonfly
helm dependency update
helm install --create-namespace --namespace dragonfly-system dragonfly . -f values.yml
如果要自定义参数,通过 -f values.yml 来指定,如果默认则移除 -f values.yml
,
支持的配置有 https://github.com/dragonflyoss/helm-charts/tree/main/charts/dragonfly#values
注意点
- dragonfly 的 helm 支持 docker 和 containerd 两种引擎,官方推荐使用 containerd(因为支持 fallback,docker 不支持),如果是加速多镜像库官方推荐使
用 containerd1.5.x+,
因为
/etc/containerd/config.toml
是 version2 版本,支持多个注册中心的加速,否则只支持一个,当然也有办法解决,后边再说。 - rke2 是通过
/etc/rancher/rke2/registries.yaml
来生成/var/lib/rancher/rke2/agent/etc/containerd/config.toml
的, 而目前版本的 helm 不支持自定义/etc/containerd/config.toml
就会导致 daemon 启动失败, 提了个 pr 还没过 https://github.com/dragonflyoss/helm-charts/pull/51,可以先手动修改 - 通过 d7y 的 helm 修改的 config.toml 一重启 rke2-server/agent 就会被覆盖,所以,最终要修改
/etc/rancher/rke2/registries.yaml
, 而这个改动需要重启 rke2-server/agent 才生效,所以注意测试是否对业务有影响,尽量一次改完 - 注意污点(taints)对于 d7y daemon 的影响,如果确定要不走 d7y 的,注意别改
/etc/rancher/rke2/registries.yaml
, 虽然 containerd 有 fallback,但是多少影响点时间不是么,如果有污点也有用 d7y 记得在 values 里加上对应的容忍(tolerations) - 注意 d7y 的磁盘规划,以及缓存时间的设置
- 可以通过 多次运行
time sudo /var/lib/rancher/rke2/bin/crictl --config=/var/lib/rancher/rke2/agent/etc/crictl.yaml pull xxx:latest
镜像来评估 d7y 对于镜像的加速作用(如果是在一台执行,记得执行sudo /var/lib/rancher/rke2/bin/crictl --config=/var/lib/rancher/rke2/agent/etc/crictl.yaml rmi --prune
来清理无用镜像) - containerd1.4.x 支持多注册中心的办法:1. 等 d7y 官方支持,参见 PRchore: enable range feature gate in e2e, 2,等 rancher 官方支持 containerd1.5.9 且你的集群升得动,3,改 hosts 劫持(但是不支持 fallback),4,只加速最常用的一个注册中心, 5,将其他不常用的注册中心的镜像 pull&push 到加速的注册中心里(注意别有镜像冲突)6,起两套 daemon 分别监听 65001 65002
- d7y 支持预热功能,但是 consoleui 版本的,暂时没测通,api 版本可以,
- 参见文档 Preheat API
- Harbor p2p 预热支持 d7y
- containerd 如果要配置私有镜像库加速,需要配置
127.0.0.1:65001
的 auth,详见 issues dragonflyoss/Dragonfly2/#1065
附赠:docker hub 转移镜像到阿里私服 bash 脚本
注意将 xxxx 替换成实际值
用法 /path/to/pull_push.sh nginx:alpine
#!/usr/bin/env bash
sudo service docker start
sudo docker login -uxxxx -pxxxxx registry.cn-zhangjiakou.aliyuncs.com
sudo docker pull $1
sudo docker tag $1 registry.cn-zhangjiakou.aliyuncs.com/xxxx/${1##*/}
sudo docker push registry.cn-zhangjiakou.aliyuncs.com/xxxx/${1##*/}
招聘小广告
山东济南的小伙伴欢迎投简历啊 加入我们 , 一起搞事情。 长期招聘,Java 程序员,大数据工程师,运维工程师,前端工程师。