构建Arm版本的Zookeeper镜像(版本3.8.4)

1、Dockerfile

ARG java_image_tag=17-jre

FROM eclipse-temurin:${java_image_tag}

COPY sources.list /etc/apt/sources.list

RUN set -ex && \

apt-get update && \

apt-get install -y \

bash \

tini \

libc6 \

libpam-modules vim tar git wget curl rsync bzip2 iptables tcpdump less telnet net-tools lsof rpm \

krb5-user gcc automake make telnet net-tools \

libnss3 net-tools \

procps \

lvm2 tcpdump netcat-openbsd && \

ln -s /lib /lib64 && \

rm -rf /var/cache/apt/* /var/lib/apt/lists/*

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \

echo 'Asia/Shanghai' > /etc/timezone

WORKDIR /opt

RUN wget https://download.oracle.com/java/17/archive/jdk-17.0.12_linux-aarch64_bin.tar.gz

解压 JDK 到 /usr/java/ 目录

RUN mkdir -p /usr/java && \

tar -xzvf jdk-17.0.12_linux-aarch64_bin.tar.gz -C /usr/java

RUN chmod -R 777 /usr/java/jdk-17.0.12

RUN wget -O /opt/apache-zookeeper-3.8.4-bin.tar.gz https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz && \

tar -zxvf /opt/apache-zookeeper-3.8.4-bin.tar.gz -C /opt && \

cp -r /opt/apache-zookeeper-3.8.4-bin /opt/zookeeper && \

chmod -R 777 /opt/zookeeper

ADD start-zookeeper /opt/zookeeper/bin

ADD zookeeper-metrics /opt/zookeeper/bin

ADD zookeeper-ready /opt/zookeeper/bin

RUN chmod -R 777 /opt/zookeeper/bin

可选:列出 zookeeper 目录以验证解压内容(可以根据需要删除)

RUN ls -l /opt/zookeeper

ENV ZOOKEEPER_HOME /opt/zookeeper

ENV JAVA_HOME /usr/java/jdk-17.0.12

ENV CLASSPATH .:JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jar

ENV PATH PATH:JAVA_HOME/bin:$ZOOKEEPER_HOME/bin

MAINTAINER liebe

ENV LANG=C.UTF-8

EXPOSE 22 80 443 9090

2、镜像构建

docker buildx build --load --platform linux/arm64 --tag zookeeper:3.8.4 .

还有其他sources.list、start-zookeeper、zookeeper-metrics、zookeeper-ready

3、 sources.list

deb https://mirrors.aliyun.com/ubuntu-ports/ noble main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu-ports/ noble main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu-ports/ noble-security main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu-ports/ noble-security main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu-ports/ noble-updates main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu-ports/ noble-updates main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu-ports/ noble-proposed main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu-ports/ noble-proposed main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu-ports/ noble-backports main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu-ports/ noble-backports main restricted universe multiverse

4、start-zookeeper

#!/usr/bin/env bash

Copyright 2017 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

#Usage: start-zookeeper [OPTIONS]

Starts a ZooKeeper server based on the supplied options.

--servers The number of servers in the ensemble. The default

value is 1.

--data_dir The directory where the ZooKeeper process will store its

snapshots. The default is /opt/zookeeper/data.

--data_log_dir The directory where the ZooKeeper process will store its

write ahead log. The default is

/opt/zookeeper/data/log.

--conf_dir The directoyr where the ZooKeeper process will store its

configuration. The default is /opt/zookeeper/conf.

--client_port The port on which the ZooKeeper process will listen for

client requests. The default is 2181.

--election_port The port on which the ZooKeeper process will perform

leader election. The default is 3888.

--server_port The port on which the ZooKeeper process will listen for

requests from other servers in the ensemble. The

default is 2888.

--tick_time The length of a ZooKeeper tick in ms. The default is

2000.

--init_limit The number of Ticks that an ensemble member is allowed

to perform leader election. The default is 10.

--sync_limit The maximum session timeout that the ensemble will

allows a client to request. The default is 5.

--heap The maximum amount of heap to use. The format is the

same as that used for the Xmx and Xms parameters to the

JVM. e.g. --heap=2G. The default is 2G.

--max_client_cnxns The maximum number of client connections that the

ZooKeeper process will accept simultaneously. The

default is 60.

--snap_retain_count The maximum number of snapshots the ZooKeeper process

will retain if purge_interval is greater than 0. The

default is 3.

--purge_interval The number of hours the ZooKeeper process will wait

between purging its old snapshots. If set to 0 old

snapshots will never be purged. The default is 0.

--max_session_timeout The maximum time in milliseconds for a client session

timeout. The default value is 2 * tick time.

--min_session_timeout The minimum time in milliseconds for a client session

timeout. The default value is 20 * tick time.

--log_level The log level for the zookeeeper server. Either FATAL,

ERROR, WARN, INFO, DEBUG. The default is INFO.

USER=`whoami`

HOST=`hostname -s`

DOMAIN=`hostname -d`

LOG_LEVEL=INFO

DATA_DIR="/opt/zookeeper/data"

DATA_LOG_DIR="/opt/zookeeper/log"

LOG_DIR="/var/log/zookeeper"

CONF_DIR="/opt/zookeeper/conf"

CLIENT_PORT=2181

SERVER_PORT=2888

ELECTION_PORT=3888

TICK_TIME=2000

INIT_LIMIT=10

SYNC_LIMIT=5

HEAP=2G

MAX_CLIENT_CNXNS=60

SNAP_RETAIN_COUNT=3

PURGE_INTERVAL=0

SERVERS=1

COMMANDS_WHITE_LIST=*

function print_usage() {

echo "\

Usage: start-zookeeper [OPTIONS]

Starts a ZooKeeper server based on the supplied options.

--servers The number of servers in the ensemble. The default

value is 1.

--data_dir The directory where the ZooKeeper process will store its

snapshots. The default is /opt/zookeeper/data.

--data_log_dir The directory where the ZooKeeper process will store its

write ahead log. The default is

/opt/zookeeper/data/log.

--conf_dir The directoyr where the ZooKeeper process will store its

configuration. The default is /opt/zookeeper/conf.

--client_port The port on which the ZooKeeper process will listen for

client requests. The default is 2181.

--election_port The port on which the ZooKeeper process will perform

leader election. The default is 3888.

--server_port The port on which the ZooKeeper process will listen for

requests from other servers in the ensemble. The

default is 2888.

--tick_time The length of a ZooKeeper tick in ms. The default is

--init_limit The number of Ticks that an ensemble member is allowed

to perform leader election. The default is 10.

--sync_limit The maximum session timeout that the ensemble will

allows a client to request. The default is 5.

--heap The maximum amount of heap to use. The format is the

same as that used for the Xmx and Xms parameters to the

JVM. e.g. --heap=2G. The default is 2G.

--max_client_cnxns The maximum number of client connections that the

ZooKeeper process will accept simultaneously. The

default is 60.

--snap_retain_count The maximum number of snapshots the ZooKeeper process

will retain if purge_interval is greater than 0. The

default is 3.

--purge_interval The number of hours the ZooKeeper process will wait

between purging its old snapshots. If set to 0 old

snapshots will never be purged. The default is 0.

--max_session_timeout The maximum time in milliseconds for a client session

timeout. The default value is 2 * tick time.

--min_session_timeout The minimum time in milliseconds for a client session

timeout. The default value is 20 * tick time.

--log_level The log level for the zookeeeper server. Either FATAL,

ERROR, WARN, INFO, DEBUG. The default is INFO.

--4lw.commands.whitelist 这将允许所有四字命令执行。如果你只想启用特定的命令,比如 ruok,可以将配置项设为.ruok,srvr,stat

"

}

function create_data_dirs() {

if [ ! -d $DATA_DIR ]; then

mkdir -p $DATA_DIR

chown -R USER:USER $DATA_DIR

fi

if [ ! -d $DATA_LOG_DIR ]; then

mkdir -p $DATA_LOG_DIR

chown -R USER:USER DATA_LOG_DIR

fi

if [ ! -d $LOG_DIR ]; then

mkdir -p $LOG_DIR

chown -R USER:USER $LOG_DIR

fi

if [ ! -f ID_FILE \] \&\& \[ SERVERS -gt 1 ]; then

echo MY_ID \>\> ID_FILE

fi

}

function print_servers() {

for (( i=1; i<=$SERVERS; i++ ))

do

echo "server.i=NAME-((i-1)).DOMAIN:SERVER_PORT:ELECTION_PORT"

done

}

function create_config() {

rm -f $CONFIG_FILE

echo "#This file was autogenerated DO NOT EDIT" >> $CONFIG_FILE

echo "clientPort=CLIENT_PORT" \>\> CONFIG_FILE

echo "dataDir=DATA_DIR" \>\> CONFIG_FILE

echo "dataLogDir=DATA_LOG_DIR" \>\> CONFIG_FILE

echo "tickTime=TICK_TIME" \>\> CONFIG_FILE

echo "initLimit=INIT_LIMIT" \>\> CONFIG_FILE

echo "syncLimit=SYNC_LIMIT" \>\> CONFIG_FILE

echo "maxClientCnxns=MAX_CLIENT_CNXNS" \>\> CONFIG_FILE

echo "minSessionTimeout=MIN_SESSION_TIMEOUT" \>\> CONFIG_FILE

echo "maxSessionTimeout=MAX_SESSION_TIMEOUT" \>\> CONFIG_FILE

echo "autopurge.snapRetainCount=SNAP_RETAIN_COUNT" \>\> CONFIG_FILE

echo "autopurge.purgeInteval=PURGE_INTERVAL" \>\> CONFIG_FILE

echo "4lw.commands.whitelist=COMMANDS_WHITE_LIST" \>\> CONFIG_FILE

if [ $SERVERS -gt 1 ]; then

print_servers >> $CONFIG_FILE

fi

cat $CONFIG_FILE >&2

}

function create_jvm_props() {

rm -f $JAVA_ENV_FILE

echo "ZOO_LOG_DIR=LOG_DIR" \>\> JAVA_ENV_FILE

echo "JVMFLAGS=\"-XmxHEAP -XmsHEAP\"" >> $JAVA_ENV_FILE

}

function create_log_props() {

rm -f $LOGGER_PROPS_FILE

echo "Creating ZooKeeper log4j configuration"

echo "zookeeper.root.logger=CONSOLE" >> $LOGGER_PROPS_FILE

echo "zookeeper.console.threshold="LOG_LEVEL \>\> LOGGER_PROPS_FILE

echo "log4j.rootLogger=\{zookeeper.root.logger}" \>\> LOGGER_PROPS_FILE

echo "log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender" >> $LOGGER_PROPS_FILE

echo "log4j.appender.CONSOLE.Threshold=\{zookeeper.console.threshold}" \>\> LOGGER_PROPS_FILE

echo "log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout" >> $LOGGER_PROPS_FILE

echo "log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n" >> $LOGGER_PROPS_FILE

}

optspec=":hv-:"

while getopts "$optspec" optchar; do

case "${optchar}" in

-)

case "${OPTARG}" in

servers=*)

SERVERS=${OPTARG##*=}

;;

data_dir=*)

DATA_DIR=${OPTARG##*=}

;;

data_log_dir=*)

DATA_LOG_DIR=${OPTARG##*=}

;;

log_dir=*)

LOG_DIR=${OPTARG##*=}

;;

conf_dir=*)

CONF_DIR=${OPTARG##*=}

;;

client_port=*)

CLIENT_PORT=${OPTARG##*=}

;;

election_port=*)

ELECTION_PORT=${OPTARG##*=}

;;

server_port=*)

SERVER_PORT=${OPTARG##*=}

;;

tick_time=*)

TICK_TIME=${OPTARG##*=}

;;

init_limit=*)

INIT_LIMIT=${OPTARG##*=}

;;

sync_limit=*)

SYNC_LIMIT=${OPTARG##*=}

;;

heap=*)

HEAP=${OPTARG##*=}

;;

max_client_cnxns=*)

MAX_CLIENT_CNXNS=${OPTARG##*=}

;;

snap_retain_count=*)

SNAP_RETAIN_COUNT=${OPTARG##*=}

;;

purge_interval=*)

PURGE_INTERVAL=${OPTARG##*=}

;;

commands_white_list=*)

COMMANDS_WHITE_LIST=${OPTARG##*=}

;;

max_session_timeout=*)

MAX_SESSION_TIMEOUT=${OPTARG##*=}

;;

min_session_timeout=*)

MIN_SESSION_TIMEOUT=${OPTARG##*=}

;;

log_level=*)

LOG_LEVEL=${OPTARG##*=}

;;

*)

echo "Unknown option --${OPTARG}" >&2

exit 1

;;

esac;;

h)

print_usage

exit

;;

v)

echo "Parsing option: '-${optchar}'" >&2

;;

*)

if [ "OPTERR" != 1 \] \|\| \[ "{optspec:0:1}" = ":" ]; then

echo "Non-option argument: '-${OPTARG}'" >&2

fi

;;

esac

done

MIN_SESSION_TIMEOUT={MIN_SESSION_TIMEOUT:- ((TICK_TIME*2))}

MAX_SESSION_TIMEOUT={MAX_SESSION_TIMEOUT:- ((TICK_TIME*20))}

ID_FILE="$DATA_DIR/myid"

CONFIG_FILE="$CONF_DIR/zoo.cfg"

LOGGER_PROPS_FILE="$CONF_DIR/log4j.properties"

JAVA_ENV_FILE="$CONF_DIR/java.env"

if [[ HOST =\~ (.\*)-(\[0-9\]+) ]]; then

NAME=${BASH_REMATCH[1]}

ORD=${BASH_REMATCH[2]}

else

echo "Fialed to parse name and ordinal of Pod"

exit 1

fi

MY_ID=$((ORD+1))

create_config && create_jvm_props && create_log_props && create_data_dirs && exec zkServer.sh start-foreground

5、zookeeper-metrics

#!/usr/bin/env bash

Copyright 2017 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

echo mntr | nc localhost $1 >& 1

6、zookeeper-ready

#!/usr/bin/env bash

Copyright 2017 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

zkOk.sh uses the ruok ZooKeeper four letter work to determine if the instance

is health. The $? variable will be set to 0 if server responds that it is

healthy, or 1 if the server fails to respond.

OK=(echo ruok \| nc 127.0.0.1 1)

if [ "$OK" == "imok" ]; then

exit 0

else

exit 1

fi

7、zookeeper.yaml

apiVersion: v1

kind: Service

metadata:

name: zk-hs

namespace: dev

labels:

app: zk

spec:

ports:

  • port: 2888

name: server

  • port: 3888

name: leader-election

clusterIP: None

selector:

app: zk


apiVersion: v1

kind: Service

metadata:

name: zk

namespace: dev

labels:

app: zk

spec:

ports:

  • port: 2181

name: client

selector:

app: zk


apiVersion: policy/v1

kind: PodDisruptionBudget

metadata:

name: zk

namespace: dev

spec:

selector:

matchLabels:

app: zk

maxUnavailable: 1


apiVersion: apps/v1

kind: StatefulSet

metadata:

name: zk

namespace: dev

spec:

selector:

matchLabels:

app: zk

serviceName: zk-hs

replicas: 1

updateStrategy:

type: RollingUpdate

podManagementPolicy: Parallel

template:

metadata:

labels:

app: zk

spec:

imagePullSecrets:

  • name: registry-key

containers:

  • name: kubernetes-zookeeper

imagePullPolicy: IfNotPresent

image: zookeeper:3.8.4

resources:

requests:

memory: "20Mi"

cpu: "0.1"

ports:

  • containerPort: 2181

name: client

  • containerPort: 2888

name: server

  • containerPort: 3888

name: leader-election

command:

  • sh

  • -c

  • "start-zookeeper \

--servers=1 \

--data_dir=/opt/zookeeper/data \

--data_log_dir=/opt/zookeeper/logs \

--conf_dir=/opt/zookeeper/conf \

--client_port=2181 \

--election_port=3888 \

--server_port=2888 \

--tick_time=2000 \

--init_limit=10 \

--sync_limit=5 \

--heap=512M \

--max_client_cnxns=60 \

--snap_retain_count=3 \

--purge_interval=12 \

--commands_white_list=ruok,srvr,mntr,stat \

--max_session_timeout=40000 \

--min_session_timeout=4000 \

--log_level=INFO"

readinessProbe:

exec:

command:

  • sh

  • -c

  • "zookeeper-ready 2181"

initialDelaySeconds: 10

timeoutSeconds: 60

livenessProbe:

exec:

command:

  • sh

  • -c

  • "zookeeper-ready 2181"

initialDelaySeconds: 10

timeoutSeconds: 60

volumeMounts:

  • name: zkdatadir

mountPath: /opt/zookeeper/data

  • name: zkdatalogs

mountPath: /opt/zookeeper/logs

securityContext:

runAsUser: 1000

fsGroup: 1000

volumeClaimTemplates:

  • metadata:

name: zkdatadir

annotations:

volume.beta.kubernetes.io/storage-class: "nfs-client"

spec:

accessModes: [ "ReadWriteMany" ]

resources:

requests:

storage: 5Gi

  • metadata:

name: zkdatalogs

annotations:

volume.beta.kubernetes.io/storage-class: "nfs-client"

spec:

accessModes: [ "ReadWriteMany" ]

resources:

requests:

storage: 5Gi

相关推荐
Coder_Boy_1 小时前
基于SpringAI的在线考试系统-相关技术栈(分布式场景下事件机制)
java·spring boot·分布式·ddd
森G2 小时前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
程序员泠零澪回家种桔子4 小时前
分布式事务核心解析与实战方案
分布式
VekiSon5 小时前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
凯子坚持 c5 小时前
CANN 生态中的分布式训练利器:深入 `collective-ops` 项目实现高效多卡协同
分布式
AI+程序员在路上6 小时前
Nand Flash与EMMC区别及ARM开发板中的应用对比
arm开发
惊讶的猫6 小时前
rabbitmq实践小案例
分布式·rabbitmq
禁默7 小时前
打破集群通信“内存墙”:手把手教你用 CANN SHMEM 重构 AIGC 分布式算子
分布式·重构·aigc
惊讶的猫8 小时前
rabbitmq初步介绍
分布式·rabbitmq
小镇敲码人9 小时前
华为CANN框架中HCCL仓库的全面解析:分布式通信的引擎
分布式·华为