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

相关推荐
喂完待续1 小时前
Apache Hudi:数据湖的实时革命
大数据·数据仓库·分布式·架构·apache·数据库架构
yh云想10 小时前
《从入门到精通:Kafka核心原理全解析》
分布式·kafka
YLAD14 小时前
gnu arm toolchain中的arm-none-eabi-gdb.exe的使用方法?
arm开发
ModelWhale14 小时前
“大模型”技术专栏 | 浅谈基于 Kubernetes 的 LLM 分布式推理框架架构:概览
分布式·kubernetes·大模型
愿天堂没有C++15 小时前
C++——分布式
分布式
饶宇航15 小时前
嵌入式硬件——ARM
arm开发
UPToZ15 小时前
【Docker】搭建一个高性能的分布式对象存储服务 - MinIO
分布式·docker·容器
前端世界1 天前
鸿蒙任务调度机制深度解析:优先级、时间片、多核与分布式的流畅秘密
分布式·华为·harmonyos
A尘埃1 天前
金融项目高可用分布式TCC-Transaction(开源框架)
分布式·金融·开源
夜影风1 天前
RabbitMQ核心架构与应用
分布式·架构·rabbitmq