构建Strimzi Kafka的ARM64镜像
Posted t_huanghai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构建Strimzi Kafka的ARM64镜像相关的知识,希望对你有一定的参考价值。
在K8s上部署一个有状态的集群——Kafka集群原始构建比较繁琐,所以寻找了了很多Operator,在离线的K8s上我个人目前推荐的是Strimzi Kafka Operator。原因:成熟,紧跟Kafka的发行,文档丰富,开源。缺点:只提供了AMD64的镜像,其他架构的之支持ARM64和Power架构,且非AMD64的镜像需要自行编译构建,虽然有说明文档,当自己构建的时候还是踩了很多坑。
1. 准备工作
主备构建的主机(AMD64架构的主机即可)
- Fedora 34
- CentOS 8/CentOS Stream 8
本人写此文章的时候是2021-09-02,使用的是最新的版本的Fedora,CentOS 7不推荐,主要是源中自带的Maven版本额太低,不满足构建要求,当然自己使用二进制替代安装另算。Debain系列本人没有使用在此就不说明,但也可作为构建环境。下载Strimzi Kafka Operator源码
地址:https://github.com/strimzi/strimzi-kafka-operator/archive/refs/tags/0.25.0.tar.gz
根据开发文档准备编译环境
开发文档路径为<source_code_root_direcotory/development-docs/DEV_GUIDE.md
文档中列出的需要安装的工具 - make - Make build system
- mvn (version 3.5 and above) - Maven CLI
- helm (version 3) - Helm Package Management System for Kubernetes asciidoctor and asciidoctor-pdf - Documentation generation. Use gem to install the latest version for your platform.
- yq - (version 4.2.1 and above) YAML manipulation tool. Warning: There are several different yq YAML projects in the wild. Use this one. You need version 4.2.1 or above.
- docker - Docker command line client
- shellcheck - ShellCheck is a GPLv3 tool that gives warnings and suggestions for bash/sh shell scripts.
通过自带源进行安装
sudo dnf install make maven ShellCheck -y
安装Docker-CE
以下使用是华为云的镜像源进行安装
sudo wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/fedora/docker-ce.repo # 软件仓库地址替换为: sudo sed -i \'s+download.docker.com+repo.huaweicloud.com/docker-ce+\' /etc/yum.repos.d/docker-ce.repo # 更新索引文件并安装 sudo dnf makecache sudo dnf install docker-ce # 将当前用户加入docker组 sudo usermod -aG docker <your_login_usr_name> # 启动docker并设置自启动 sudo systemctl enable docker --now
安装yq和helm
根据说明文件中的连接下载对应的二进制文件,解压后直接放在/usr/local/bin目录下即可。
- yq: https://github.com/mikefarah/yq
- helm: https://helm.sh/
2. 编译源文件中的java程序
准备Maven镜像库
为更快的使用maven构建建议增加maven的镜像,这里使用华为maven镜像库。
sudo vim /usr/share/mavne/conf/settings.xml
...
# mirrors节点中添加如下内容:
<mirror>
<id>huaweicloud</id>
<mirrorOf>*</mirrorOf>
<url>https://repo.huaweicloud.com/repository/maven/</url>
</mirror>
...
确定需要构建的kafka版本
在源码根目录下文件kafka-versions.yaml编译选择需要的版本,注释调不需要的,如我自己只需要最新的kafka 2.8.0,我的kafka-version.yaml文件节选如下:
...
#- version: 2.7.1
# format: 2.7
# protocol: 2.7
# url: https://archive.apache.org/dist/kafka/2.7.1/kafka_2.13-2.7.1.tgz
# checksum: A1FC222284E3E1B538AB7FBC9205C735A2E8B31D84EE9F8D5CCC84F6FD48B885591899EEA538C909A26676C9C1F44520CC56E6748C4632E23B8A5AF0B788B48A
# zookeeper: 3.5.9
# third-party-libs: 2.7.x
# supported: true
# default: false
- version: 2.8.0
format: 2.8
protocol: 2.8
url: https://archive.apache.org/dist/kafka/2.8.0/kafka_2.13-2.8.0.tgz
checksum: 3C49DCA1147A0A249DD88E089F40AF31A67B8207ED2D9E2294FA9A6D41F5ED0B006943CD60D8E30D7E69D760D398F299CAFCD68B6ED7BEDF9F93D1B7A9E8C487
zookeeper: 3.5.9
third-party-libs: 2.8.x
supported: true
default: true
编译java文件
进入源代码的根目录,运行
make MVN_ARGS=\'-DskipTests -DskipITs\' docker_build
说明:
- 源代码的开发说明文件是要准备好docker.io的仓库,进行后期镜像的pull/push,但是国内访问速度和次数实在感人,本人此处用的是\'docker_build\'而不是原来的\'all\', 本地构建而没有push,当然也可以使用国内的容器镜像服务如华为和阿里的来进行操作,不过需要修改后面构建镜像时使用的FROM的路径。
- \'MVN_ARGS=\'-DskipTests -DskipITs\'免去了一些测试
- 上面程序运行完成后工程所需jar文件是全部都有了,这样就可以以此构建镜像文件,包括ARM64的镜像,但镜像不能构建成功,需要修改几处地方。
3. 构建镜像文件
此处直接构建ARM64的镜像,同时兼顾AMD64的说明,因为之前已经构建好jar包,构建镜像时可进入源代码工程下的\'docker-image\'目录,运行\'make docker-build\'直接构建镜像文件。
0.准备buildx
准备构建器
因为我自己安装的是docker-ce 20.10.8,buildx已经有了,但默认不支持linux/arm64平台,运行下面命令使得默认构建器支持其他所有平台
docker run --privileged --rm tonistiigi/binfmt --install all
准备环境变量
开发文档末尾有描述,以下是构建ARM64需要修改的
export DOCKER_BUILDX=buildx export DOCKER_BUILD_ARGS="--platform linux/amd64 --load" # 因为我是根据0.25.0进行arm64镜像构建再追加个环境参数 export DOCKER_TAG=0.25.0-arm64
1.构建strimzi/base
首先构建的就是这个基础镜像,对于AMD64,没有什么需要注意的,但对于ARM64,需要修改FROM语句:
vim docker-image/base/Dockerfile
FROM --platform=linux/arm64 registry.access.redhat.com/ubi8/ubi-minimal:latest
如果后面的tini不好下载,建议换个好的时间段,或者使用github下载的国内加速器下载。
镜像构建语句:
docker buildx build --platform linux/arm64 --load --build-arg JAVA_VERSION=11 --build-arg strimzi_version=0.25.0 -t strimzi/base:0.25.0-arm64 ./
## 2.构建strimzi/operator
其次,构建operator。由于需要拉取使用之前的base镜像,可以将自己构建好的镜像上传至华为或者阿里的镜像服务中,同时修改FROM语句指向,或者将base的构建语句拷贝到operator的构建语句前,直接重头构建。
镜像构建语句:
docker buildx build --platform linux/arm64 --load --build-arg JAVA_VERSION=11 --build-arg strimzi_version=0.25.0 -t strimzi/operator:0.25.0-arm64 ./
# 3.构建strimzi/jmxtrans
再次,构建jmxtrans。根operator的构建步骤一样,在此不重复叙述。
镜像构建语句:
docker buildx build --platform linux/arm64 --load --build-arg JAVA_VERSION=11 --build-arg strimzi_version=0.25.0 -t strimzi/jmxtrans:0.25.0-arm64 ./
# 4. 构建strimzi/kaniko-executor
再其次,这个镜像用于构建镜像用的,感觉不影响后面的构建,但还是说说构建方法吧。这个是gcr.io/kaniko-project/executor:v1.6.0的(还是kaniko-project下的),国内肯定没法拉取,这个时候可以借助阿里镜像服务进行远程构建。
注意:
- 要选择海外构建;
- 要在FROM后加上\'--platform=linux/arm64\';
- 同时修改Makefile文件,拉取阿里镜像服务中构建的镜像。
# 5. 构建strimzi/kafka
最后,是Kafka镜像,根operator的构建步骤一样,中途会下载之前指定的kafka版本,在此不重复叙述。
镜像构建语句:
docker buildx build --platform linux/arm64 --load --build-arg JAVA_VERSION=11 --build-arg KAFKA_VERSION=2.8.0 --build-arg KAFKA_DIST_DIR=./tmp/2.8.0 --build-arg THIRD_PARTY_LIBS=2.8.x --build-arg strimzi_version=0.25.0 -t strimzi/kafka:0.25.0-arm64-kafka-2.8.0 ./
# 结束语
至此工程构建完毕,可以使用\'docker save\'命令导出镜像到离线环境使用,工程不包含kafka-bridge的镜像哦(待研究)。
以上是关于构建Strimzi Kafka的ARM64镜像的主要内容,如果未能解决你的问题,请参考以下文章
Docker 在 M1 Mac arm64架构上构建 amd64镜像。