构建Strimzi Kafka的ARM64镜像

听闻少年二字,当与平庸相斥。这篇文章主要讲述构建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
    根据开发文档准备编译环境【构建Strimzi Kafka的ARM64镜像】开发文档路径为< 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

说明:
  1. 源代码的开发说明文件是要准备好docker.io的仓库,进行后期镜像的pull/push,但是国内访问速度和次数实在感人,本人此处用的是\'docker_build\'而不是原来的\'all\', 本地构建而没有push,当然也可以使用国内的容器镜像服务如华为和阿里的来进行操作,不过需要修改后面构建镜像时使用的FROM的路径。
  2. \'MVN_ARGS=\'-DskipTests -DskipITs\'免去了一些测试
  3. 上面程序运行完成后工程所需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的镜像哦(待研究)。


    推荐阅读