This is an automated email from the ASF dual-hosted git repository.

caigy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/rocketmq-docker.git


The following commit(s) were added to refs/heads/master by this push:
     new 6caf9c7  [ISSUE #66] Add rocketmq5.x helm chart for CI (#69)
6caf9c7 is described below

commit 6caf9c7c8ad201876be294ecad39389cf1d191b2
Author: yueya <[email protected]>
AuthorDate: Mon Feb 6 14:14:06 2023 +0800

    [ISSUE #66] Add rocketmq5.x helm chart for CI (#69)
    
    * add helm chart use by ci
    
    * update build-image-local.sh
    
    * update dockerfile.sh
    
    * update dockerfile.sh
    
    * update dockerfile.sh
    
    * update dockerfile.sh
    
    * update helm
    
    * update dockerfile
    
    * update dockerfile
    
    * update proxy deployment.yaml and Dockerfile-centos
    
    * update helm chart
    
    * update helm chart
    
    * update dockerfile
    
    * update build-image-local.sh
    
    * update build-image-local.sh
    
    * update build-image-local.sh
    
    * update customize.sh
    
    * update build-image-local.sh
    
    * update dockerfile
    
    * support jacoco
    
    * support jacoco
    
    * support jacoco
    
    * support jacoco
    
    * support jacoco
    
    * update script
    
    * update scripts
    
    * update scripts
    
    ---------
    
    Co-authored-by: 月伢 <[email protected]>
---
 image-build-ci/Dockerfile-alpine                   |  81 ++++++++
 image-build-ci/Dockerfile-centos                   |  87 +++++++++
 image-build-ci/Dockerfile-ubuntu                   |  87 +++++++++
 image-build-ci/build-image-local.sh                |  80 ++++++++
 image-build-ci/scripts/runbroker-customize.sh      | 156 ++++++++++++++++
 image-build-ci/scripts/runserver-customize.sh      | 142 ++++++++++++++
 rocketmq-k8s-helm/.helmignore                      |  23 +++
 rocketmq-k8s-helm/Chart.yaml                       |  24 +++
 rocketmq-k8s-helm/templates/broker/NOTES.txt       |   1 +
 .../templates/broker/_brokerconfig.tpl             |  49 +++++
 rocketmq-k8s-helm/templates/broker/_helpers.tpl    |  70 +++++++
 rocketmq-k8s-helm/templates/broker/configmap.yaml  |   8 +
 rocketmq-k8s-helm/templates/broker/service.yaml    |  15 ++
 .../templates/broker/statefulset.yaml              | 102 +++++++++++
 rocketmq-k8s-helm/templates/nameserver/NOTES.txt   |  23 +++
 .../templates/nameserver/_helpers.tpl              |  59 ++++++
 .../templates/nameserver/configmap.yaml            |  10 +
 .../templates/nameserver/deployment.yaml           |  69 +++++++
 .../templates/nameserver/service.yaml              |  15 ++
 rocketmq-k8s-helm/templates/proxy/_helpers.tpl     |  47 +++++
 rocketmq-k8s-helm/templates/proxy/_proxyconfig.tpl |  26 +++
 rocketmq-k8s-helm/templates/proxy/configmap.yaml   |   6 +
 rocketmq-k8s-helm/templates/proxy/deployment.yaml  |  80 ++++++++
 rocketmq-k8s-helm/templates/proxy/service.yaml     |  19 ++
 rocketmq-k8s-helm/values.yaml                      | 203 +++++++++++++++++++++
 25 files changed, 1482 insertions(+)

diff --git a/image-build-ci/Dockerfile-alpine b/image-build-ci/Dockerfile-alpine
new file mode 100644
index 0000000..61c7ee5
--- /dev/null
+++ b/image-build-ci/Dockerfile-alpine
@@ -0,0 +1,81 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+#
+
+ARG BASE_IMAGE
+FROM $BASE_IMAGE
+
+RUN apk add --no-cache bash gettext nmap-ncat openssl busybox-extras 
libc6-compat
+
+ARG user=rocketmq
+ARG group=rocketmq
+ARG uid=3000
+ARG gid=3000
+
+# RocketMQ is run with user `rocketmq`, uid = 3000
+# If you bind mount a volume from the host or a data container,
+# ensure you use the same uid
+RUN addgroup --gid ${gid} ${group} \
+    && adduser --uid ${uid} -G ${group} ${user} -s /bin/bash -D
+
+ARG version
+
+# Rocketmq version
+ENV ROCKETMQ_VERSION ${version}
+
+# Rocketmq home
+ENV ROCKETMQ_HOME  /home/rocketmq/rocketmq-${ROCKETMQ_VERSION}
+
+WORKDIR  ${ROCKETMQ_HOME}
+
+# Install
+COPY rocketmq/ ${ROCKETMQ_HOME}/dist
+
+RUN mv ${ROCKETMQ_HOME}/dist/rocketmq*/rocketmq*/* ${ROCKETMQ_HOME}/; \
+    rm -rf ${ROCKETMQ_HOME}/dist; \
+    ls ${ROCKETMQ_HOME}
+
+# Copy customized scripts
+COPY scripts ${ROCKETMQ_HOME}/bin/
+
+RUN chown -R ${uid}:${gid} ${ROCKETMQ_HOME}
+
+
+# Expose namesrv&proxy port
+EXPOSE 9876 8080 8081 7001
+
+RUN mv ${ROCKETMQ_HOME}/bin/runserver-customize.sh 
${ROCKETMQ_HOME}/bin/runserver.sh \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/runserver.sh \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/mqadmin \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/mqnamesrv \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/mqproxy
+
+# Expose broker port
+EXPOSE 10909 10911 10912
+
+RUN mv ${ROCKETMQ_HOME}/bin/runbroker-customize.sh 
${ROCKETMQ_HOME}/bin/runbroker.sh \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/runbroker.sh \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/mqbroker
+
+# Export Java options
+RUN export JAVA_OPT=" -Duser.home=/opt"
+
+# Add ${JAVA_HOME}/lib/ext as java.ext.dirs
+RUN sed -i 
's/${JAVA_HOME}\/jre\/lib\/ext/${JAVA_HOME}\/jre\/lib\/ext:${JAVA_HOME}\/lib\/ext/'
 ${ROCKETMQ_HOME}/bin/tools.sh
+
+USER ${user}
+
+WORKDIR ${ROCKETMQ_HOME}/bin
\ No newline at end of file
diff --git a/image-build-ci/Dockerfile-centos b/image-build-ci/Dockerfile-centos
new file mode 100644
index 0000000..ea71dd0
--- /dev/null
+++ b/image-build-ci/Dockerfile-centos
@@ -0,0 +1,87 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+#
+
+ARG BASE_IMAGE
+FROM $BASE_IMAGE
+
+RUN yum install -y java-1.8.0-openjdk-devel.x86_64 unzip gettext nmap-ncat 
openssl, which gnupg, telnet \
+ && yum clean all -y
+
+# FROM openjdk:8-jdk
+# RUN apt-get update && apt-get install -y --no-install-recommends \
+#              bash libapr1 unzip telnet wget gnupg ca-certificates \
+#      && rm -rf /var/lib/apt/lists/*
+
+ARG user=rocketmq
+ARG group=rocketmq
+ARG uid=3000
+ARG gid=3000
+
+# RocketMQ is run with user `rocketmq`, uid = 3000
+# If you bind mount a volume from the host or a data container,
+# ensure you use the same uid
+RUN groupadd -g ${gid} ${group} \
+    && useradd -u ${uid} -g ${gid} -m -s /bin/bash ${user}
+
+ARG version
+
+# Rocketmq version
+ENV ROCKETMQ_VERSION ${version}
+
+# Rocketmq home
+ENV ROCKETMQ_HOME  /home/rocketmq/rocketmq-${ROCKETMQ_VERSION}
+
+WORKDIR  ${ROCKETMQ_HOME}
+
+# Install
+COPY rocketmq/ ${ROCKETMQ_HOME}/dist
+
+RUN mv ${ROCKETMQ_HOME}/dist/rocketmq*/rocketmq*/* ${ROCKETMQ_HOME}/; \
+    rm -rf ${ROCKETMQ_HOME}/dist; \
+    ls ${ROCKETMQ_HOME}
+
+# Copy customized scripts
+COPY scripts ${ROCKETMQ_HOME}/bin/
+
+RUN chown -R ${uid}:${gid} ${ROCKETMQ_HOME}
+
+
+# Expose namesrv&proxy port
+EXPOSE 9876 8080 8081 7001
+
+RUN mv ${ROCKETMQ_HOME}/bin/runserver-customize.sh 
${ROCKETMQ_HOME}/bin/runserver.sh \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/runserver.sh \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/mqadmin \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/mqnamesrv \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/mqproxy
+
+# Expose broker port
+EXPOSE 10909 10911 10912
+
+RUN mv ${ROCKETMQ_HOME}/bin/runbroker-customize.sh 
${ROCKETMQ_HOME}/bin/runbroker.sh \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/runbroker.sh \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/mqbroker
+
+# export Java options
+RUN export JAVA_OPT=" -Duser.home=/opt"
+
+# Add ${JAVA_HOME}/lib/ext as java.ext.dirs
+RUN sed -i 
's/${JAVA_HOME}\/jre\/lib\/ext/${JAVA_HOME}\/jre\/lib\/ext:${JAVA_HOME}\/lib\/ext/'
 ${ROCKETMQ_HOME}/bin/tools.sh
+
+USER ${user}
+
+WORKDIR ${ROCKETMQ_HOME}/bin
diff --git a/image-build-ci/Dockerfile-ubuntu b/image-build-ci/Dockerfile-ubuntu
new file mode 100644
index 0000000..7298988
--- /dev/null
+++ b/image-build-ci/Dockerfile-ubuntu
@@ -0,0 +1,87 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+#
+
+ARG BASE_IMAGE
+FROM $BASE_IMAGE
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+               bash unzip telnet wget gnupg ca-certificates
+
+ARG user=rocketmq
+ARG group=rocketmq
+ARG uid=3000
+ARG gid=3000
+
+# RocketMQ is run with user `rocketmq`, uid = 3000
+# If you bind mount a volume from the host or a data container,
+# ensure you use the same uid
+RUN groupadd -g ${gid} ${group} \
+    && useradd -u ${uid} -g ${gid} -m -s /bin/bash ${user}
+
+ARG version
+
+# Rocketmq version
+ENV ROCKETMQ_VERSION ${version}
+
+# Rocketmq home
+ENV ROCKETMQ_HOME  /home/rocketmq/rocketmq-${ROCKETMQ_VERSION}
+
+WORKDIR  ${ROCKETMQ_HOME}
+
+# Install
+COPY rocketmq/ ${ROCKETMQ_HOME}/dist
+
+RUN mv ${ROCKETMQ_HOME}/dist/rocketmq*/rocketmq*/* ${ROCKETMQ_HOME}/; \
+    rm -rf ${ROCKETMQ_HOME}/dist; \
+    ls ${ROCKETMQ_HOME}
+
+# Copy customized scripts
+COPY scripts ${ROCKETMQ_HOME}/bin/
+
+RUN chown -R ${uid}:${gid} ${ROCKETMQ_HOME}
+
+
+# Expose namesrv&proxy port
+EXPOSE 9876 8080 8081 7001 2023
+
+RUN wget 
https://repo1.maven.org/maven2/org/jacoco/jacoco/0.8.8/jacoco-0.8.8.zip -O 
jacoco-0.8.8.zip && \
+unzip jacoco-0.8.8.zip -d jacoco
+
+ENV 
JAVA_OPT="-javaagent:${ROCKETMQ_HOME}/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=2023,address=0.0.0.0"
+
+RUN mv ${ROCKETMQ_HOME}/bin/runserver-customize.sh 
${ROCKETMQ_HOME}/bin/runserver.sh \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/runserver.sh \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/mqadmin \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/mqnamesrv \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/mqproxy
+
+# Expose broker port
+EXPOSE 10909 10911 10912
+
+RUN mv ${ROCKETMQ_HOME}/bin/runbroker-customize.sh 
${ROCKETMQ_HOME}/bin/runbroker.sh \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/runbroker.sh \
+ && chmod a+x ${ROCKETMQ_HOME}/bin/mqbroker
+
+# export Java options
+RUN export JAVA_OPT=" -Duser.home=/opt"
+
+# Add ${JAVA_HOME}/lib/ext as java.ext.dirs
+RUN sed -i 
's/${JAVA_HOME}\/jre\/lib\/ext/${JAVA_HOME}\/jre\/lib\/ext:${JAVA_HOME}\/lib\/ext/'
 ${ROCKETMQ_HOME}/bin/tools.sh
+
+USER ${user}
+
+WORKDIR ${ROCKETMQ_HOME}/bin
diff --git a/image-build-ci/build-image-local.sh 
b/image-build-ci/build-image-local.sh
new file mode 100755
index 0000000..3eeca9e
--- /dev/null
+++ b/image-build-ci/build-image-local.sh
@@ -0,0 +1,80 @@
+#!/usr/bin/env bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+if [ $# -lt 6 ]; then
+  echo -e "Usage: sh $0 ROCKETMQ_VERSION BASE_IMAGE JAVA_VERSION IMAGE_REPO 
IMAGE_REPO_USERNAME IMAGE_REPO_PASSWORD"
+  exit -1
+fi
+
+ROCKETMQ_VERSION=$1
+BASE_IMAGE=$2
+JAVA_VERSION=$3
+IMAGE_REPO=$4
+IMAGE_REPO_USERNAME=$5
+IMAGE_REPO_PASSWORD=$6
+
+TAG=${ROCKETMQ_VERSION}-$(echo $BASE_IMAGE | sed -e "s/:/-/g")
+
+cp -r ../../rocketmq ./
+
+docker login --username=$IMAGE_REPO_USERNAME --password=$IMAGE_REPO_PASSWORD 
${IMAGE_REPO%%/*}
+
+# Build rocketmq
+case "${BASE_IMAGE}" in
+#alpine)
+#  if [ "$JAVA_VERSION" -eq 8 ]; then
+#    docker build --no-cache -f Dockerfile-alpine -t ${IMAGE_REPO}:${TAG} 
--build-arg version=${ROCKETMQ_VERSION} --build-arg 
BASE_IMAGE=eclipse-temurin:8-jre-alpine .
+#  elif [ "$JAVA_VERSION" -eq 11 ]; then
+#    docker build --no-cache -f Dockerfile-alpine -t ${IMAGE_REPO}:${TAG} 
--build-arg version=${ROCKETMQ_VERSION} --build-arg 
BASE_IMAGE=eclipse-temurin:11-jre-alpine .
+#  else
+#    echo "in ${BASE_IMAGE}, jdk ${JAVA_VERSION} is not supported, supported 
java versions: 8, 11"
+#  fi
+#  ;;
+#centos)
+#  if [ "$JAVA_VERSION" -eq 8 ]; then
+#    docker build --no-cache -f Dockerfile-centos -t ${IMAGE_REPO}:${TAG} 
--build-arg version=${ROCKETMQ_VERSION} --build-arg 
BASE_IMAGE=eclipse-temurin:8-centos7 .
+#  elif [ "$JAVA_VERSION" -eq 11 ]; then
+#    docker build --no-cache -f Dockerfile-centos -t ${IMAGE_REPO}:${TAG} 
--build-arg version=${ROCKETMQ_VERSION} --build-arg 
BASE_IMAGE=eclipse-temurin:11-centos7 .
+#  else
+#    echo "in ${BASE_IMAGE}, jdk ${JAVA_VERSION} is not supported, supported 
java versions: 8, 11"
+#  fi
+#  ;;
+ubuntu)
+  if [ "$JAVA_VERSION" -eq 8 ]; then
+    docker build --no-cache -f Dockerfile-ubuntu -t ${IMAGE_REPO}:${TAG} 
--build-arg version=${ROCKETMQ_VERSION} --build-arg 
BASE_IMAGE=eclipse-temurin:8-jre .
+#  elif [ "$JAVA_VERSION" -eq 11 ]; then
+#    docker build --no-cache -f Dockerfile-ubuntu -t ${IMAGE_REPO}:${TAG} 
--build-arg version=${ROCKETMQ_VERSION} --build-arg 
BASE_IMAGE=eclipse-temurin:11-jre .
+  else
+    echo "in ${BASE_IMAGE}, jdk ${JAVA_VERSION} is not supported, supported 
java versions: 8, 11"
+  fi
+  ;;
+#windows)
+#  if [ "$JAVA_VERSION" -eq 8 ]; then
+#    docker build --no-cache -f Dockerfile-windows -t ${IMAGE_REPO}:${TAG} 
--build-arg version=${ROCKETMQ_VERSION} --build-arg 
BASE_IMAGE=eclipse-temurin:8-jre-windowsservercore .
+#  elif [ "$JAVA_VERSION" -eq 11 ]; then
+#    docker build --no-cache -f Dockerfile-windows -t ${IMAGE_REPO}:${TAG} 
--build-arg version=${ROCKETMQ_VERSION} --build-arg 
BASE_IMAGE=eclipse-temurin:11-jre-windowsservercore .
+#  else
+#    echo "in ${BASE_IMAGE}, jdk ${JAVA_VERSION} is not supported, supported 
java versions: 8, 11"
+#  fi
+#  ;;
+*)
+  echo "${BASE_IMAGE} is not supported, supported base images: ubuntu, centos, 
alpine, windows"
+  exit -1
+  ;;
+esac
+
+docker push ${IMAGE_REPO}:${TAG}
diff --git a/image-build-ci/scripts/runbroker-customize.sh 
b/image-build-ci/scripts/runbroker-customize.sh
new file mode 100755
index 0000000..ae780aa
--- /dev/null
+++ b/image-build-ci/scripts/runbroker-customize.sh
@@ -0,0 +1,156 @@
+#!/bin/bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+#===========================================================================================
+# Java Environment Setting
+#===========================================================================================
+error_exit ()
+{
+    echo "ERROR: $1 !!"
+    exit 1
+}
+
+find_java_home()
+{
+    case "`uname`" in
+        Darwin)
+            JAVA_HOME=$(/usr/libexec/java_home)
+        ;;
+        *)
+            JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
+        ;;
+    esac
+}
+
+find_java_home
+
+[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
+[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
+[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME 
variable in your environment, We need java(x64)!"
+
+export JAVA_HOME
+export JAVA="$JAVA_HOME/bin/java"
+export BASE_DIR=$(dirname $0)/..
+export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
+
+#===========================================================================================
+# JVM Configuration
+#===========================================================================================
+calculate_heap_sizes()
+{
+    case "`uname`" in
+        Linux)
+            system_memory_in_mb=`free -m| sed -n '2p' | awk '{print $2}'`
+            system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' 
/proc/cpuinfo`
+        ;;
+        FreeBSD)
+            system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`
+            system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
+            system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
+        ;;
+        SunOS)
+            system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'`
+            system_cpu_cores=`psrinfo | wc -l`
+        ;;
+        Darwin)
+            system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'`
+            system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
+            system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
+        ;;
+        *)
+            # assume reasonable defaults for e.g. a modern desktop or
+            # cheap server
+            system_memory_in_mb="2048"
+            system_cpu_cores="2"
+        ;;
+    esac
+
+    # some systems like the raspberry pi don't report cores, use at least 1
+    if [ "$system_cpu_cores" -lt "1" ]
+    then
+        system_cpu_cores="1"
+    fi
+
+    # set max heap size based on the following
+    # max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB))
+    # calculate 1/2 ram and cap to 1024MB
+    # calculate 1/4 ram and cap to 8192MB
+    # pick the max
+    half_system_memory_in_mb=`expr $system_memory_in_mb / 2`
+    quarter_system_memory_in_mb=`expr $half_system_memory_in_mb / 2`
+    if [ "$half_system_memory_in_mb" -gt "1024" ]
+    then
+        half_system_memory_in_mb="1024"
+    fi
+    if [ "$quarter_system_memory_in_mb" -gt "8192" ]
+    then
+        quarter_system_memory_in_mb="8192"
+    fi
+    if [ "$half_system_memory_in_mb" -gt "$quarter_system_memory_in_mb" ]
+    then
+        max_heap_size_in_mb="$half_system_memory_in_mb"
+    else
+        max_heap_size_in_mb="$quarter_system_memory_in_mb"
+    fi
+    MAX_HEAP_SIZE="${max_heap_size_in_mb}M"
+
+    # Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 * heap 
size)
+    max_sensible_yg_per_core_in_mb="100"
+    max_sensible_yg_in_mb=`expr $max_sensible_yg_per_core_in_mb "*" 
$system_cpu_cores`
+
+    desired_yg_in_mb=`expr $max_heap_size_in_mb / 4`
+
+    if [ "$desired_yg_in_mb" -gt "$max_sensible_yg_in_mb" ]
+    then
+        HEAP_NEWSIZE="${max_sensible_yg_in_mb}M"
+    else
+        HEAP_NEWSIZE="${desired_yg_in_mb}M"
+    fi
+}
+
+calculate_heap_sizes
+
+# Dynamically calculate parameters, for reference.
+Xms=$MAX_HEAP_SIZE
+Xmx=$MAX_HEAP_SIZE
+Xmn=$HEAP_NEWSIZE
+MaxDirectMemorySize=$MAX_HEAP_SIZE
+# Set for `JAVA_OPT`.
+JAVA_OPT="${JAVA_OPT} -server -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn}"
+JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m 
-XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 
-XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8"
+JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log 
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime 
-XX:+PrintAdaptiveSizePolicy"
+JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 
-XX:GCLogFileSize=30m"
+JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
+JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
+JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=${MaxDirectMemorySize}"
+JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"
+JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
+#JAVA_OPT="${JAVA_OPT} -Xdebug 
-Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
+JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
+JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
+
+numactl --interleave=all pwd > /dev/null 2>&1
+if [ $? -eq 0 ]
+then
+       if [ -z "$RMQ_NUMA_NODE" ] ; then
+               numactl --interleave=all $JAVA ${JAVA_OPT} $@
+       else
+               numactl --cpunodebind=$RMQ_NUMA_NODE --membind=$RMQ_NUMA_NODE 
$JAVA ${JAVA_OPT} $@
+       fi
+else
+       $JAVA ${JAVA_OPT} $@
+fi
diff --git a/image-build-ci/scripts/runserver-customize.sh 
b/image-build-ci/scripts/runserver-customize.sh
new file mode 100755
index 0000000..92f685b
--- /dev/null
+++ b/image-build-ci/scripts/runserver-customize.sh
@@ -0,0 +1,142 @@
+#!/bin/bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+#===========================================================================================
+# Java Environment Setting
+#===========================================================================================
+error_exit ()
+{
+    echo "ERROR: $1 !!"
+    exit 1
+}
+
+find_java_home()
+{
+    case "`uname`" in
+        Darwin)
+            JAVA_HOME=$(/usr/libexec/java_home)
+        ;;
+        *)
+            JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
+        ;;
+    esac
+}
+
+find_java_home
+
+[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
+[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
+[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME 
variable in your environment, We need java(x64)!"
+
+export JAVA_HOME
+export JAVA="$JAVA_HOME/bin/java"
+export BASE_DIR=$(dirname $0)/..
+export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
+
+#===========================================================================================
+# JVM Configuration
+#===========================================================================================
+calculate_heap_sizes()
+{
+    case "`uname`" in
+        Linux)
+            system_memory_in_mb=`free -m| sed -n '2p' | awk '{print $2}'`
+            system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' 
/proc/cpuinfo`
+        ;;
+        FreeBSD)
+            system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`
+            system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
+            system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
+        ;;
+        SunOS)
+            system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'`
+            system_cpu_cores=`psrinfo | wc -l`
+        ;;
+        Darwin)
+            system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'`
+            system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
+            system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
+        ;;
+        *)
+            # assume reasonable defaults for e.g. a modern desktop or
+            # cheap server
+            system_memory_in_mb="2048"
+            system_cpu_cores="2"
+        ;;
+    esac
+
+    # some systems like the raspberry pi don't report cores, use at least 1
+    if [ "$system_cpu_cores" -lt "1" ]
+    then
+        system_cpu_cores="1"
+    fi
+
+    # set max heap size based on the following
+    # max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB))
+    # calculate 1/2 ram and cap to 1024MB
+    # calculate 1/4 ram and cap to 8192MB
+    # pick the max
+    half_system_memory_in_mb=`expr $system_memory_in_mb / 2`
+    quarter_system_memory_in_mb=`expr $half_system_memory_in_mb / 2`
+    if [ "$half_system_memory_in_mb" -gt "1024" ]
+    then
+        half_system_memory_in_mb="1024"
+    fi
+    if [ "$quarter_system_memory_in_mb" -gt "8192" ]
+    then
+        quarter_system_memory_in_mb="8192"
+    fi
+    if [ "$half_system_memory_in_mb" -gt "$quarter_system_memory_in_mb" ]
+    then
+        max_heap_size_in_mb="$half_system_memory_in_mb"
+    else
+        max_heap_size_in_mb="$quarter_system_memory_in_mb"
+    fi
+    MAX_HEAP_SIZE="${max_heap_size_in_mb}M"
+
+    # Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 * heap 
size)
+    max_sensible_yg_per_core_in_mb="100"
+    max_sensible_yg_in_mb=`expr $max_sensible_yg_per_core_in_mb "*" 
$system_cpu_cores`
+
+    desired_yg_in_mb=`expr $max_heap_size_in_mb / 4`
+
+    if [ "$desired_yg_in_mb" -gt "$max_sensible_yg_in_mb" ]
+    then
+        HEAP_NEWSIZE="${max_sensible_yg_in_mb}M"
+    else
+        HEAP_NEWSIZE="${desired_yg_in_mb}M"
+    fi
+}
+
+calculate_heap_sizes
+
+# Dynamically calculate parameters, for reference.
+Xms=$MAX_HEAP_SIZE
+Xmx=$MAX_HEAP_SIZE
+Xmn=$HEAP_NEWSIZE
+# Set for `JAVA_OPT`.
+JAVA_OPT="${JAVA_OPT} -server -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn}"
+JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC 
-XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 
-XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 
-XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8  -XX:-UseParNewGC"
+JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log 
-XX:+PrintGCDetails"
+JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
+JAVA_OPT="${JAVA_OPT}  -XX:-UseLargePages"
+JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
+#JAVA_OPT="${JAVA_OPT} -Xdebug 
-Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
+JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
+JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
+
+$JAVA ${JAVA_OPT} $@
diff --git a/rocketmq-k8s-helm/.helmignore b/rocketmq-k8s-helm/.helmignore
new file mode 100644
index 0000000..0e8a0eb
--- /dev/null
+++ b/rocketmq-k8s-helm/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/rocketmq-k8s-helm/Chart.yaml b/rocketmq-k8s-helm/Chart.yaml
new file mode 100644
index 0000000..559a412
--- /dev/null
+++ b/rocketmq-k8s-helm/Chart.yaml
@@ -0,0 +1,24 @@
+apiVersion: v2
+name: rocketmq
+description: A Helm chart for Kubernetes
+
+# A chart can be either an 'application' or a 'library' chart.
+#
+# Application charts are a collection of templates that can be packaged into 
versioned archives
+# to be deployed.
+#
+# Library charts provide useful utilities or functions for the chart 
developer. They're included as
+# a dependency of application charts to inject those utilities and functions 
into the rendering
+# pipeline. Library charts do not define any templates and therefore cannot be 
deployed.
+type: application
+
+# This is the chart version. This version number should be incremented each 
time you make changes
+# to the chart and its templates, including the app version.
+# Versions are expected to follow Semantic Versioning (https://semver.org/)
+version: 0.0.1
+
+# This is the version number of the application being deployed. This version 
number should be
+# incremented each time you make changes to the application. Versions are not 
expected to
+# follow Semantic Versioning. They should reflect the version the application 
is using.
+# It is recommended to use it with quotes.
+appVersion: "1.16.0"
diff --git a/rocketmq-k8s-helm/templates/broker/NOTES.txt 
b/rocketmq-k8s-helm/templates/broker/NOTES.txt
new file mode 100644
index 0000000..0a6fe66
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/broker/NOTES.txt
@@ -0,0 +1 @@
+1. Get the application URL by running these commands:
\ No newline at end of file
diff --git a/rocketmq-k8s-helm/templates/broker/_brokerconfig.tpl 
b/rocketmq-k8s-helm/templates/broker/_brokerconfig.tpl
new file mode 100644
index 0000000..f2dd23d
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/broker/_brokerconfig.tpl
@@ -0,0 +1,49 @@
+{{- define "rocketmq-broker.config" -}}
+{{- $name := include "rocketmq-broker.fullname" . }}
+{{- $clusterName := include "rocketmq-broker.clusterName" . }}
+{{- $brokerNamePrefix := include "rocketmq-broker.brokerNamePrefix" . }}
+{{- $config := .Values.broker.config }}
+{{- $replicaCount := .Values.broker.replicaCount | int }}
+{{- range $index := until $replicaCount }}
+  {{ $name }}-{{ $index }}: |
+    brokerClusterName={{ $clusterName }}
+    brokerName={{ $brokerNamePrefix }}-{{ $index }}
+    enableNameServerAddressResolve=true
+
+    # common configs
+    traceOn=true
+    autoCreateTopicEnable=false
+    autoCreateSubscriptionGroup=true
+    enableIncrementalTopicCreation=true
+    generateConfigForScaleOutEnable=false
+    enableNotifyAfterPopOrderLockRelease=true
+    autoMessageVersionOnTopicLen=true
+
+    # pop config
+    enablePopBufferMerge=true
+    enableConsumePopRetryTopic=true
+    enableConsumePullRetryTopic=true
+    enableSkipLongWaitAck=true
+
+    # Store config
+    flushDiskType=SYNC_FLUSH
+
+    # Enable SQL92
+    enablePropertyFilter=true
+
+    # Transaction config
+    transactionCheckMaxTimeInMs=14400000
+    transactionCheckInterval=60000
+
+    # Delay config
+    timerWheelEnable=true
+    timerMaxDelaySec=86400
+
+    waitTimeMillsInSendQueue=900
+    maxMessageSize=5242880
+
+    # stream
+    litePullMessageEnable=true
+{{ $config | indent 4 }}
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/rocketmq-k8s-helm/templates/broker/_helpers.tpl 
b/rocketmq-k8s-helm/templates/broker/_helpers.tpl
new file mode 100644
index 0000000..32a4b2f
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/broker/_helpers.tpl
@@ -0,0 +1,70 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "rocketmq-broker.name" -}}
+{{- default .Chart.Name .Values.broker.nameOverride | trunc 63 | trimSuffix 
"-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to 
this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "rocketmq-broker.fullname" -}}
+{{- if .Values.broker.fullnameOverride }}
+{{- .Values.broker.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.broker.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "rocketmq-broker.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | 
trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "rocketmq-broker.labels" -}}
+{{ include "rocketmq-broker.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "rocketmq-broker.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "rocketmq-broker.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{- define "rocketmq-broker.clusterName" -}}
+{{- if .Values.broker.conf.clusterNameOverride }}
+{{- .Values.broker.conf.clusterNameOverride | trunc 63 | trimSuffix "-" }}
+{{- else -}}
+DefaultCluster
+{{- end }}
+{{- end }}
+
+{{- define "rocketmq-broker.brokerNamePrefix" -}}
+{{- if .Values.broker.conf.brokerNamePrefixOverride }}
+{{- .Values.broker.conf.brokerNamePrefixOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- include "rocketmq-broker.fullname" . }}
+{{- end }}
+{{- end }}
+
+{{- define "rocketmq-broker.brokerImage" -}}
+{{ .Values.broker.image.repository }}:{{ .Values.broker.image.tag | default 
.Chart.AppVersion }}
+{{- end }}
diff --git a/rocketmq-k8s-helm/templates/broker/configmap.yaml 
b/rocketmq-k8s-helm/templates/broker/configmap.yaml
new file mode 100644
index 0000000..2265bef
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/broker/configmap.yaml
@@ -0,0 +1,8 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: broker-conf
+  labels:
+    {{- include "rocketmq-broker.labels" . | nindent 4 }}
+data:
+{{- include "rocketmq-broker.config" . }}
\ No newline at end of file
diff --git a/rocketmq-k8s-helm/templates/broker/service.yaml 
b/rocketmq-k8s-helm/templates/broker/service.yaml
new file mode 100644
index 0000000..1fe13d2
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/broker/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "rocketmq-broker.fullname" . }}
+  labels:
+    {{- include "rocketmq-broker.labels" . | nindent 4 }}
+spec:
+  ports:
+    - port: {{ .Values.broker.service.port }}
+      targetPort: broker-port
+      protocol: TCP
+      name: broker-port
+  selector:
+    {{- include "rocketmq-broker.selectorLabels" . | nindent 4 }}
+  clusterIP: None
diff --git a/rocketmq-k8s-helm/templates/broker/statefulset.yaml 
b/rocketmq-k8s-helm/templates/broker/statefulset.yaml
new file mode 100644
index 0000000..a62cdf5
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/broker/statefulset.yaml
@@ -0,0 +1,102 @@
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+  name: {{ include "rocketmq-broker.fullname" . }}
+spec:
+  replicas: {{ .Values.broker.replicaCount }}
+  serviceName: {{ include "rocketmq-broker.fullname" . }}
+  selector:
+    matchLabels:
+      {{- include "rocketmq-broker.selectorLabels" . | nindent 6 }}
+  podManagementPolicy: Parallel
+  updateStrategy:
+    type: RollingUpdate
+  template:
+    metadata:
+      labels:
+        {{- include "rocketmq-broker.selectorLabels" . | nindent 8 }}
+    spec:
+      imagePullSecrets:
+        - name: onetest-regcred
+      containers:
+        - name: broker
+          image: {{ include "rocketmq-broker.brokerImage" . }}
+        {{- if $.Values.broker.image.pullPolicy }}
+          imagePullPolicy: {{ $.Values.broker.image.pullPolicy }}
+        {{- end }}
+          command: [ "/bin/sh" ]
+          args: [ "-c", "./mqbroker -c /home/rocketmq/conf/$(POD_NAME)" ]
+          env:
+            - name: POD_NAME
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.name
+            - name: POD_IP
+              valueFrom:
+                fieldRef:
+                  fieldPath: status.podIP
+            - name: BROKER_MEM
+              value: {{ .Values.broker.jvmMemory }}
+            - name: NAMESRV_ADDR
+              value: {{ include "rocketmq-nameserver.fullname" . }}:9876
+          ports:
+            - name: broker
+              containerPort: 10911
+              protocol: TCP
+            - name: con-nameserver
+              containerPort: 10909
+              protocol: TCP
+            - name: ha
+              containerPort: 10912
+              protocol: TCP
+            - name: proxy
+              containerPort: 8081
+              protocol: TCP
+          readinessProbe:
+            failureThreshold: 3
+            initialDelaySeconds: 60
+            periodSeconds: 15
+            successThreshold: 1
+            tcpSocket:
+              port: 10911
+            timeoutSeconds: 1
+          livenessProbe:
+            failureThreshold: 3
+            initialDelaySeconds: 60
+            periodSeconds: 15
+            successThreshold: 1
+            tcpSocket:
+              port: 10911
+            timeoutSeconds: 1
+          resources:
+            {{- toYaml .Values.broker.resources | nindent 12 }}
+          volumeMounts:
+            - mountPath: /home/rocketmq/conf
+              name: broker-config
+            - mountPath: /home/rocketmq/logs
+              name: broker-storage
+              subPath: home/rocketmq/rocketmq-broker
+            - mountPath: /root/store
+              name: broker-storage
+              subPath: store/rocketmq-broker
+      {{- with .Values.broker.nodeSelector }}
+      nodeSelector:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      volumes:
+        - name: broker-config
+          configMap:
+            name: broker-conf
+  {{- if not $.Values.broker.persistence.enabled }}
+        - name: broker-storage
+          emptyDir: { }
+  {{- else }}
+  volumeClaimTemplates:
+    - metadata:
+        name: broker-storage
+      spec:
+        accessModes: [ "ReadWriteOnce" ]
+        resources:
+          requests:
+            storage: {{ .Values.broker.store.data.size }}
+  {{- end }}
\ No newline at end of file
diff --git a/rocketmq-k8s-helm/templates/nameserver/NOTES.txt 
b/rocketmq-k8s-helm/templates/nameserver/NOTES.txt
new file mode 100644
index 0000000..7e35d14
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/nameserver/NOTES.txt
@@ -0,0 +1,23 @@
+1. Get the application URL by running these commands:
+{{- if .Values.nameserver.ingress.enabled }}
+{{- range $host := .Values.nameserver.ingress.hosts }}
+  {{- range .paths }}
+  http{{ if $.Values.nameserver.ingress.tls }}s{{ end }}://{{ $host.host }}{{ 
.path }}
+  {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.nameserver.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o 
jsonpath="{.spec.ports[0].nodePort}" services {{ include 
"rocketmq-nameserver.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o 
jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.nameserver.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ 
.Release.Namespace }} svc -w {{ include "rocketmq-nameserver.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ 
include "rocketmq-nameserver.fullname" . }} --template "{{"{{ range (index 
.status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
+  echo http://$SERVICE_IP:{{ .Values.nameserver.service.port }}
+{{- else if contains "ClusterIP" .Values.nameserver.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l 
"app.kubernetes.io/name={{ include "rocketmq-nameserver.name" . 
}},app.kubernetes.io/instance={{ .Release.Name }}" -o 
jsonpath="{.items[0].metadata.name}")
+  export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} 
$POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 
8080:$CONTAINER_PORT
+{{- end }}
+helm ls --all-namespaces
\ No newline at end of file
diff --git a/rocketmq-k8s-helm/templates/nameserver/_helpers.tpl 
b/rocketmq-k8s-helm/templates/nameserver/_helpers.tpl
new file mode 100644
index 0000000..8125311
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/nameserver/_helpers.tpl
@@ -0,0 +1,59 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "rocketmq-nameserver.name" -}}
+{{- default .Chart.Name .Values.nameserver.nameOverride | trunc 63 | 
trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to 
this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "rocketmq-nameserver.fullname" -}}
+{{- if .Values.nameserver.fullnameOverride }}
+{{- .Values.nameserver.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameserver.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "rocketmq-nameserver.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | 
trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "rocketmq-nameserver.labels" -}}
+helm.sh/chart: {{ include "rocketmq-nameserver.chart" . }}
+{{ include "rocketmq-nameserver.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "rocketmq-nameserver.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "rocketmq-nameserver.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{- define "rocketmq-nameserver.namesrvImage" -}}
+{{ .Values.nameserver.image.repository }}:{{ .Values.nameserver.image.tag | 
default .Chart.AppVersion }}
+{{- end }}
+
+{{- define "rocketmq-nameserver.port" -}}
+{{- .Values.nameserver.port  }}
+{{- end }}
diff --git a/rocketmq-k8s-helm/templates/nameserver/configmap.yaml 
b/rocketmq-k8s-helm/templates/nameserver/configmap.yaml
new file mode 100644
index 0000000..905255f
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/nameserver/configmap.yaml
@@ -0,0 +1,10 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: nameserver-conf
+  labels:
+    {{- include "rocketmq-nameserver.labels" . | nindent 4 }}
+data:
+  namesrv.p: |
+    listenPort={{ include "rocketmq-nameserver.port" . }}
+    {{ .Values.nameserver.configmap | indent 4 | trim }}
diff --git a/rocketmq-k8s-helm/templates/nameserver/deployment.yaml 
b/rocketmq-k8s-helm/templates/nameserver/deployment.yaml
new file mode 100644
index 0000000..2debadb
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/nameserver/deployment.yaml
@@ -0,0 +1,69 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "rocketmq-nameserver.fullname" . }}
+spec:
+  replicas: {{ .Values.nameserver.replicaCount }}
+  selector:
+    matchLabels:
+      {{- include "rocketmq-nameserver.selectorLabels" . | nindent 6 }}
+      component: nameserver
+  template:
+    metadata:
+      labels:
+        {{- include "rocketmq-nameserver.selectorLabels" . | nindent 8 }}
+        component: nameserver
+    spec:
+      imagePullSecrets:
+        - name: onetest-regcred
+      containers:
+        - name: nameserver
+          image: {{ include "rocketmq-nameserver.namesrvImage" .  }}
+          {{- if .Values.nameserver.image.pullPolicy }}
+          imagePullPolicy: {{ .Values.nameserver.image.pullPolicy | quote }}
+          {{- end }}
+          command: [ "/bin/sh" ]
+          args: [ "-c", "./mqnamesrv -c /home/rocketmq/config/namesrv.p" ]
+          env:
+            - name: JAVA_HEAP_SIZE
+              value: {{ .Values.nameserver.heapSize }}
+          ports:
+            - name: nameserver
+              containerPort: {{ include "rocketmq-nameserver.port" . }}
+              protocol: TCP
+          startupProbe:
+            tcpSocket:
+              port: nameserver
+            periodSeconds: 5
+            initialDelaySeconds: 20
+            failureThreshold: 3
+          livenessProbe:
+            tcpSocket:
+              port: nameserver
+            initialDelaySeconds: 5
+            periodSeconds: 5
+            failureThreshold: 3
+          readinessProbe:
+            tcpSocket:
+              port: nameserver
+            initialDelaySeconds: 5
+            periodSeconds: 5
+            timeoutSeconds: 1
+            failureThreshold: 3
+          resources:
+            {{- toYaml .Values.nameserver.resources | nindent 12 }}
+          volumeMounts:
+            - mountPath: /home/rocketmq/config
+              name: nameserver-config
+            - mountPath: /home/rocketmq/logs
+              name: nameserver-log
+      volumes:
+        - name: nameserver-config
+          configMap:
+            name: nameserver-conf
+        - name: nameserver-log
+          emptyDir: { }
+      {{- with .Values.nameserver.nodeSelector }}
+      nodeSelector:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
\ No newline at end of file
diff --git a/rocketmq-k8s-helm/templates/nameserver/service.yaml 
b/rocketmq-k8s-helm/templates/nameserver/service.yaml
new file mode 100644
index 0000000..a285f20
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/nameserver/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "rocketmq-nameserver.fullname" . }}
+  labels:
+    {{- include "rocketmq-nameserver.labels" . | nindent 4 }}
+spec:
+  clusterIP: None
+  ports:
+    - port: {{ .Values.nameserver.service.servicePort }}
+      targetPort: {{ include "rocketmq-nameserver.port" . }}
+      protocol: TCP
+      name: nameserver-service
+  selector:
+    {{- include "rocketmq-nameserver.selectorLabels" . | nindent 4 }}
diff --git a/rocketmq-k8s-helm/templates/proxy/_helpers.tpl 
b/rocketmq-k8s-helm/templates/proxy/_helpers.tpl
new file mode 100644
index 0000000..2d5f168
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/proxy/_helpers.tpl
@@ -0,0 +1,47 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "rocketmq-proxy.name" -}}
+{{- default .Chart.Name .Values.proxy.nameOverride | trunc 63 | trimSuffix "-" 
}}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to 
this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "rocketmq-proxy.fullname" -}}
+{{- if .Values.proxy.fullnameOverride }}
+{{- .Values.proxy.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.proxy.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "rocketmq-proxy.labels" -}}
+{{ include "rocketmq-proxy.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "rocketmq-proxy.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "rocketmq-proxy.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{- define "rocketmq-proxy.proxyImage" -}}
+{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag | default 
.Chart.AppVersion }}
+{{- end }}
diff --git a/rocketmq-k8s-helm/templates/proxy/_proxyconfig.tpl 
b/rocketmq-k8s-helm/templates/proxy/_proxyconfig.tpl
new file mode 100644
index 0000000..f49655c
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/proxy/_proxyconfig.tpl
@@ -0,0 +1,26 @@
+{{/*
+Using mergeOverwrite to merge configs from Values into regional config,
+valuse from .Values.config have the higher priority.
+*/}}
+
+{{- define "rocketmq-proxy.conf" -}}
+{{- $commonConf := fromYaml (include "rocketmq-proxy.common.conf" . ) -}}
+  rmq-proxy.json: |
+{{- mergeOverwrite $commonConf .Values.proxy.config | mustToPrettyJson | 
nindent 4 }}
+{{- end }}
+{{- define "rocketmq-proxy.common.conf" -}}
+enableFlowControl: true
+enableFlowLimitAction: true
+metricCollectorMode: "proxy"
+longPollingReserveTimeInMillis: 1000
+maxMessageSize: 4194304
+maxUserPropertySize: 16384
+userPropertyMaxNum: 128
+maxMessageGroupSize: 64
+grpcClientProducerBackoffInitialMillis: 5
+grpcClientProducerBackoffMultiplier: 5
+grpcClientProducerBackoffMaxMillis: 1000
+transactionHeartbeatBatchNum: 1
+rocketMQClusterName: "{{ include "rocketmq-broker.clusterName" . }}"
+namesrvAddr: "{{ include "rocketmq-nameserver.fullname" . }}:9876"
+{{- end -}}
\ No newline at end of file
diff --git a/rocketmq-k8s-helm/templates/proxy/configmap.yaml 
b/rocketmq-k8s-helm/templates/proxy/configmap.yaml
new file mode 100644
index 0000000..452e9e0
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/proxy/configmap.yaml
@@ -0,0 +1,6 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: proxy-conf
+data:
+  {{ include "rocketmq-proxy.conf" . }}
diff --git a/rocketmq-k8s-helm/templates/proxy/deployment.yaml 
b/rocketmq-k8s-helm/templates/proxy/deployment.yaml
new file mode 100644
index 0000000..e1d697e
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/proxy/deployment.yaml
@@ -0,0 +1,80 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "rocketmq-proxy.fullname" . }}
+spec:
+{{- if not .Values.proxy.autoscaling.enabled }}
+  replicas: {{ .Values.proxy.replicaCount }}
+{{- end }}
+  selector:
+    matchLabels:
+      {{- include "rocketmq-proxy.selectorLabels" . | nindent 6 }}
+  template:
+    metadata:
+    {{- with .Values.proxy.podAnnotations }}
+      annotations:
+        {{- toYaml . | nindent 8 }}
+    {{- end }}
+      labels:
+        {{- include "rocketmq-proxy.selectorLabels" . | nindent 8 }}
+    spec:
+      imagePullSecrets:
+        - name: onetest-regcred
+      containers:
+        - name: proxy
+          image: {{ include "rocketmq-proxy.proxyImage" . }}
+          {{- if .Values.proxy.image.pullPolicy }}
+          imagePullPolicy: {{ .Values.proxy.image.pullPolicy | quote }}
+          {{- end }}
+          command: [ "/bin/sh" ]
+          args: [ "-c", "./mqproxy -pc 
/home/rocketmq/rocketmq-proxy/configmap/rmq-proxy.json" ]
+          env:
+            - name: RMQ_PROXY_NAME
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.name
+            - name: NAMESRV_ADDR
+              value: {{ include "rocketmq-nameserver.fullname" . }}:9876
+            - name: RMQ_PROXY_CONFIG_PATH
+              value: /home/rocketmq/rocketmq-proxy/configmap
+          lifecycle:
+            preStop:
+              exec:
+                command:
+                  - sh
+                  - ./bin/mqshutdown
+                  - proxy
+          ports:
+            - name: remote
+              containerPort: 8080
+              protocol: TCP
+            - name: grpc
+              containerPort: 8081
+              protocol: TCP
+          startupProbe:
+            tcpSocket:
+              port: grpc
+            initialDelaySeconds: 10
+            failureThreshold: 30
+            periodSeconds: 10
+          readinessProbe:
+            tcpSocket:
+              port: grpc
+            periodSeconds: 5
+          livenessProbe:
+            tcpSocket:
+              port: grpc
+            periodSeconds: 10
+          resources:
+            {{- toYaml .Values.proxy.resources | nindent 12 }}
+          volumeMounts:
+            - name: conf
+              mountPath: /home/rocketmq/rocketmq-proxy/configmap/
+      volumes:
+        - name: conf
+          configMap:
+            name: proxy-conf
+      {{- with .Values.proxy.nodeSelector }}
+      nodeSelector:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
\ No newline at end of file
diff --git a/rocketmq-k8s-helm/templates/proxy/service.yaml 
b/rocketmq-k8s-helm/templates/proxy/service.yaml
new file mode 100644
index 0000000..78732c3
--- /dev/null
+++ b/rocketmq-k8s-helm/templates/proxy/service.yaml
@@ -0,0 +1,19 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "rocketmq-proxy.fullname" . }}
+  labels:
+    {{- include "rocketmq-proxy.labels" . | nindent 4 }}
+spec:
+  clusterIP: None
+  ports:
+    - port: {{ .Values.proxy.service.remotingInternetPort }}
+      targetPort: 7001
+      protocol: TCP
+      name: remoting-internet
+    - port: {{ .Values.proxy.service.grpcPort }}
+      targetPort: 8081
+      protocol: TCP
+      name: grpc
+  selector:
+    {{- include "rocketmq-proxy.selectorLabels" . | nindent 4 }}
\ No newline at end of file
diff --git a/rocketmq-k8s-helm/values.yaml b/rocketmq-k8s-helm/values.yaml
new file mode 100644
index 0000000..ad53487
--- /dev/null
+++ b/rocketmq-k8s-helm/values.yaml
@@ -0,0 +1,203 @@
+# Default values for rocketmq-proxy.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+nameserver:
+  replicaCount: 1
+  image:
+    pullPolicy: IfNotPresent
+    repository: "apache/rocketmq"
+    tag: "latest"
+
+  imagePullSecrets: [ ]
+  nameOverride: "nameserver"
+  fullnameOverride: ""
+
+  port: 9876
+  heapSize: "1792M"
+
+  serviceAccount:
+    # Specifies whether a service account should be created
+    create: false
+    # Annotations to add to the service account
+    annotations: { }
+    # The name of the service account to use.
+    # If not set and create is true, a name is generated using the fullname 
template
+    name: ""
+
+  podAnnotations: { }
+  nodeSelector: { }
+
+  podSecurityContext:
+    { }
+  # fsGroup: 2000
+
+  service:
+    type: ClusterIP
+    servicePort: 9876
+    enableDraining: true
+    drainTimeout: 30
+
+  ingress:
+    enabled: false
+    className: ""
+    annotations:
+      { }
+    # kubernetes.io/ingress.class: nginx
+    # kubernetes.io/tls-acme: "true"
+    hosts:
+      - host: chart-example.local
+        paths:
+          - path: /
+            pathType: ImplementationSpecific
+    tls: [ ]
+    #  - secretName: chart-example-tls
+    #    hosts:
+    #      - chart-example.local
+
+  persistence:
+    enabled: false
+    size: 8Gi
+
+  resources:
+    limits:
+      cpu: 1
+      memory: 2Gi
+    requests:
+      cpu: 250m
+      memory: 2Gi
+
+  autoscaling:
+    enabled: false
+    minReplicas: 1
+    maxReplicas: 100
+    targetCPUUtilizationPercentage: 80
+    # targetMemoryUtilizationPercentage: 80
+
+  configmap: |
+    defaultThreadPoolNums=4
+    deleteTopicWithBrokerRegistration=true
+
+
+proxy:
+  replicaCount: 1
+  image:
+    pullPolicy: IfNotPresent
+    repository: "apache/rocketmq"
+    tag: "latest"
+
+  imagePullSecrets: [ ]
+  nameOverride: "proxy"
+  fullnameOverride: ""
+
+  heapSize: "1920M"
+  maxDirectMemorySize: "384M"
+  rocketMQClusterName: "DefaultCluster"
+
+  config: { }
+
+  serviceAccount:
+    # Specifies whether a service account should be created
+    create: false
+    # Annotations to add to the service account
+    annotations: { }
+    # The name of the service account to use.
+    # If not set and create is true, a name is generated using the fullname 
template
+    name: ""
+
+  podAnnotations:
+
+  service:
+    remotingInternetPort: 8080
+    grpcPort: 8081
+    adminPort: 8088
+    internet:
+      enabled: false
+      acl:
+        enabled: false
+        id: ""
+      configs:
+        - id: ""
+
+  ingress:
+    enabled: false
+    annotations: { }
+    # kubernetes.io/ingress.class: nginx
+    # kubernetes.io/tls-acme: "true"
+    hosts:
+      - host: chart-example.local
+        paths: [ ]
+    tls: [ ]
+    #  - secretName: chart-example-tls
+    #    hosts:
+    #      - chart-example.local
+
+  resources:
+    limits:
+      cpu: 1
+      memory: 8Gi
+    requests:
+      cpu: 1
+      memory: 8Gi
+
+  autoscaling:
+    enabled: false
+    minReplicas: 1
+    maxReplicas: 100
+    targetCPUUtilizationPercentage: 80
+
+  nodeSelector: { }
+
+  tolerations: [ ]
+
+  affinity: { }
+
+
+broker:
+  replicaCount: 1
+  image:
+    pullPolicy: IfNotPresent
+    repository: "apache/rocketmq"
+    tag: "latest"
+
+  partition: 0
+  persistence:
+    enabled: false
+    size: 8Gi
+
+  nameOverride: "broker"
+  fullnameOverride: ""
+  namesrvAddr: ""
+
+  conf:
+    clusterNameOverride: ""
+    brokerNamePrefixOverride: ""
+    tlsMode: disabled
+    heapSize: "3G"
+    enableStartupProbe: false
+    startupProbeNamesrvAddr: ""
+    nameServerHeadlessAddr: ""
+
+  config: ""
+
+  store:
+    data:
+      size: 10Gi
+    log:
+      size: 10Gi
+
+  service:
+    port: 10911
+
+  jvmMemory: " -Xms4g -Xmx4g -Xmn2g -XX:MaxDirectMemorySize=8g "
+  resources:
+    limits:
+      cpu: 2
+      memory: 4Gi
+    requests:
+      cpu: 2
+      memory: 4Gi
+
+  nodeSelector: { }
+
+  tolerations: [ ]
\ No newline at end of file

Reply via email to