这是坚持技术写作计划(含翻译)的第70篇,定个小目标999,每周最少2篇。
简单介绍下
- 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
别看官网文档,已经年久失修了,直接看github文档,更保险点是看github代码,切记,切记,切记。
helm安装
官方文档 github.com/dragonflyos…
考虑到国内特殊国情,可能会访问github失败,可以用 gitee.com/projects/im… 中转(也可以用我的 gitee.com/anjia/drago…)
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
,支持的配置有 github.com/dragonflyos…
注意点
- 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还没过 github.com/dragonflyos… ,可以先手动修改 - 通过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版本可以,参见文档 github.com/dragonflyos…
- 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程序员,大数据工程师,运维工程师,前端工程师。