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

相关推荐
HongXuan-Yuan1 小时前
系统设计:高并发策略与缓存设计
java·分布式·高并发
掘了2 小时前
分布式系统中如何保证崩溃一致性?
分布式·后端·面试
磨十三3 小时前
ARM-----数据处理、异常处理、模式切换
arm开发
程序员 小柴4 小时前
RabbitMQ概述和安装
分布式·rabbitmq
猿java4 小时前
程序员,你使用过灰度发布吗?
java·分布式·后端
半间烟雨4 小时前
⼆、Kafka客户端消息流转流程
分布式·kafka
hweiyu006 小时前
从JVM到分布式锁:高并发架构设计的六把密钥
jvm·redis·分布式·mysql·etcd
最后一个bug7 小时前
教你快速理解linux中的NUMA节点探测是干什么用的?
linux·c语言·开发语言·arm开发·嵌入式硬件
Acrel12348 小时前
安科瑞防逆流方案在内蒙古中高绿能能源7MW分布式光伏项目的应用
分布式·能源
塞尔维亚大汉8 小时前
OpenHarmony之分布式软总线json.payload.c(三)
分布式·嵌入式·harmonyos