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

ORD=${BASH_REMATCH2}

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

相关推荐
lsc_blog3 小时前
听到优化风声,先准备能由自己掌控的事
数据库·分布式·中间件·职场和发展·重构
jianqiang.xue8 小时前
3倍向量算力:Arm给最小MCU装上本地AI
arm开发·人工智能·单片机
蜀黍@猿10 小时前
ARM 汇编入门(十二):MMU、页表与虚拟内存全解析
汇编·arm开发·stm32·mcu
Lansonli1 天前
大数据Spark(八十七):Spark-Submit 参数详解
大数据·分布式·spark
qq_452396231 天前
第二篇:《CommitLog + ConsumeQueue:一条日志解决 Kafka 多分区随机写的难题》
分布式·kafka
蜀黍@猿1 天前
ARM 汇编入门(十):标量浮点与 VFP 指令全解析
汇编·arm开发·stm32·mcu
Alluxio2 天前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
阿卡好可爱2 天前
Lua 热更新不生效:改完文件线上仍是旧逻辑,package.loaded 与 upvalue 重绑定详解
数据结构·分布式·后端·架构·lua
Good白10193 天前
嵌入式:1.嵌入式入门|初识嵌入式、处理器、ARM与STM32
arm开发·stm32·嵌入式硬件