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

相关推荐
苍煜3 小时前
分布式事务生产实战选型对比
分布式
JAVA面经实录9176 小时前
企业级java+LangChain4j-RAG系统 限流熔断降级
java·开发语言·分布式·langchain
YaBingSec10 小时前
玄机网络安全靶场:Hadoop YARN ResourceManager 未授权 RCE WP
大数据·数据库·hadoop·redis·笔记·分布式·web安全
空中海11 小时前
第六篇:可靠性篇 — Sentinel 熔断限流与 Seata 分布式事务
分布式·sentinel
rustfs11 小时前
MinIO 国产平替,RustFS 发布 Beta 版本啦
分布式·docker·云原生·rust·开源
CinzWS12 小时前
A53 FPGA原型验证:从RTL到可运行系统的挑战
arm开发·嵌入式·芯片验证·原型验证·a53
AI服务老曹12 小时前
深度解析:支持 GB28181/RTSP 及异构计算(X86/ARM+GPU/NPU)的 AI 视频管理平台架构方案(附源码交付与 Docker 部署)
arm开发·人工智能·音视频
2302_8138062213 小时前
基础环境篇 – 交叉编译环境搭建与NFS服务配置
arm开发
极创信息13 小时前
信创领域五种主流CPU架构(X86 / ARM / RISC-V / MIPS / LoongArch)
java·arm开发·数据库·spring boot·mysql·软件工程·risc-v
Mr_sst13 小时前
文件上传并发控制:为什么选Redisson可过期信号量?(避坑指南)
网络·数据库·redis·分布式·安全架构