构建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

说明:

  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的镜像哦(待研究)。

以上是关于构建Strimzi Kafka的ARM64镜像的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu上构建arm64的镜像

Docker 在 M1 Mac arm64架构上构建 amd64镜像。

Arm64架构下编译便携Python

deepin-for-arm64支持

docker如何构建多架构(arm64, x86_64, armv7)容器镜像?

记录MacOS M1芯片(ARM64架构)使用docker-compose方式部署Kafka