add dubbo-admin-zookeeper (#971)

diff --git a/deploy/charts/dubbo-admin/Chart.yaml b/deploy/charts/dubbo-admin/Chart.yaml
index a412fd6..a7c29d4 100644
--- a/deploy/charts/dubbo-admin/Chart.yaml
+++ b/deploy/charts/dubbo-admin/Chart.yaml
@@ -1,13 +1,13 @@
 apiVersion: v2
-appVersion: 3.1.6
+appVersion: 0.5.0
 name: dubbo-admin
 description: Distributed application monitoring and management platform.
 home: https://cn.dubbo.apache.org
 kubeVersion: '>=1.20.0-0'
 maintainers:
-  - email: mfordjody@gmail.com
-    name: mfordjody
+  - email: dev@dubbo.apache.org
+    name: dubbo
 sources:
   - https://github.com/apache/dubbo
 type: application
-version: 0.5.0
\ No newline at end of file
+version: 3.1.6
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/NOTES.txt b/deploy/charts/dubbo-admin/templates/NOTES.txt
index 1bb1f8e..2320a48 100644
--- a/deploy/charts/dubbo-admin/templates/NOTES.txt
+++ b/deploy/charts/dubbo-admin/templates/NOTES.txt
@@ -1,6 +1,12 @@
+====================================================
 CHART NAME: {{ .Chart.Name }}
-CHART VERSION: {{ .Chart.Version }}
-APP VERSION: {{ .Chart.AppVersion }}
+VERSION: {{ .Chart.Name }}:{{ .Chart.AppVersion }}
+====================================================
+{{- if .Values.zookeeper.enabled }}
+Registration Center:{{ .Values.zookeeper.zoo_name }}
+VERSION: {{ .Values.zookeeper.zoo_name }}:{{ .Values.image.zoo_tag }}
+{{- end }}
+====================================================
 
 1.  Get your '{{ .Chart.Name }}' by running:
 
diff --git a/deploy/charts/dubbo-admin/templates/_helpers.tpl b/deploy/charts/dubbo-admin/templates/_helpers.tpl
deleted file mode 100644
index 98cdd5a..0000000
--- a/deploy/charts/dubbo-admin/templates/_helpers.tpl
+++ /dev/null
@@ -1,163 +0,0 @@
-{{/* vim: set filetype=mustache: */}}
-{{/*
-Expand the name of the chart.
-*/}}
-{{- define "dubbo-admin.name" -}}
-{{- default .Chart.Name .Values.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 "dubbo-admin.fullname" -}}
-{{- if .Values.fullnameOverride }}
-{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
-{{- else }}
-{{- $name := default .Chart.Name .Values.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 "dubbo-admin.chart" -}}
-{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
-{{- end }}
-
-
-{{/*
-Allow the release namespace to be overridden for multi-namespace deployments in combined charts
-*/}}
-{{- define "dubbo-admin.namespace" -}}
-{{- if .Values.namespaceOverride }}
-{{- .Values.namespaceOverride }}
-{{- else }}
-{{- .Release.Namespace }}
-{{- end }}
-{{- end }}
-{{/*
-Common labels
-*/}}
-
-
-{{- define "dubbo-admin.labels" -}}
-helm.sh/chart: {{ include "dubbo-admin.chart" . }}
-{{ include "dubbo-admin.selectorLabels" . }}
-{{- if .Chart.AppVersion }}
-app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
-{{- end }}
-app.kubernetes.io/managed-by: {{ .Release.Service }}
-{{- end }}
-
-
-{{/*
-Return the appropriate apiVersion for rbac.
-*/}}
-{{- define "dubbo-admin.rbac.apiVersion" -}}
-{{- if $.Capabilities.APIVersions.Has "rbac.authorization.k8s.io/v1" }}
-{{- print "rbac.authorization.k8s.io/v1" }}
-{{- else }}
-{{- print "rbac.authorization.k8s.io/v1beta1" }}
-{{- end }}
-{{- end }}
-
-
-{{- define "dubbo-admin.selectorLabels" -}}
-app.kubernetes.io/name: {{ include "dubbo-admin.name" . }}
-app.kubernetes.io/instance: {{ .Release.Name }}
-{{- end }}
-
-
-{{/*
-Create the name of the service account to use
-*/}}
-{{- define "dubbo-admin.serviceAccountName" -}}
-{{- if .Values.serviceAccount.create }}
-{{- default (include "dubbo-admin.fullname" .) .Values.serviceAccount.name }}
-{{- else }}
-{{- default "default" .Values.serviceAccount.name }}
-{{- end }}
-{{- end }}
-
-
-{{- define "dubbo-admin.serviceAccountNameTest" -}}
-{{- if .Values.serviceAccount.create }}
-{{- default (print (include "dubbo-admin.fullname" .) "-test") .Values.serviceAccount.nameTest }}
-{{- else }}
-{{- default "default" .Values.serviceAccount.nameTest }}
-{{- end }}
-{{- end }}
-
-
-{{/*
-Formats imagePullSecrets. Input is (dict "root" . "imagePullSecrets" .{specific imagePullSecrets})
-*/}}
-{{- define "dubbo-admin.imagePullSecrets" -}}
-{{- $root := .root }}
-{{- range (concat .root.Values.global.imagePullSecrets .imagePullSecrets) }}
-{{- if eq (typeOf .) "map[string]interface {}" }}
-- {{ toYaml (dict "name" (tpl .name $root)) | trim }}
-{{- else }}
-- name: {{ tpl . $root }}
-{{- end }}
-{{- end }}
-{{- end }}
-
-
-{{/*
-Return if ingress is stable.
-*/}}
-{{- define "dubbo-admin.ingress.isStable" -}}
-{{- eq (include "dubbo-admin.ingress.apiVersion" .) "networking.k8s.io/v1" }}
-{{- end }}
-
-
-{{/*
-Return if ingress supports ingressClassName.
-*/}}
-{{- define "dubbo-admin.ingress.supportsIngressClassName" -}}
-{{- or (eq (include "dubbo-admin.ingress.isStable" .) "true") (and (eq (include "dubbo-admin.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" .Capabilities.KubeVersion.Version)) }}
-{{- end }}
-
-
-{{/*
-Return if ingress supports pathType.
-*/}}
-{{- define "dubbo-admin.ingress.supportsPathType" -}}
-{{- or (eq (include "dubbo-admin.ingress.isStable" .) "true") (and (eq (include "dubbo-admin.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" .Capabilities.KubeVersion.Version)) }}
-{{- end }}
-
-
-{{/*
-Return the appropriate apiVersion for ingress.
-*/}}
-{{- define "dubbo-admin.ingress.apiVersion" -}}
-{{- if and ($.Capabilities.APIVersions.Has "networking.k8s.io/v1") (semverCompare ">= 1.19-0" .Capabilities.KubeVersion.Version) }}
-{{- print "networking.k8s.io/v1" }}
-{{- else if $.Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }}
-{{- print "networking.k8s.io/v1beta1" }}
-{{- else }}
-{{- print "extensions/v1beta1" }}
-{{- end }}
-{{- end }}
-
-
-{{/*
-Return the appropriate apiVersion for podDisruptionBudget.
-*/}}
-{{- define "dubbo-admin.podDisruptionBudget.apiVersion" -}}
-{{- if $.Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }}
-{{- print "policy/v1" }}
-{{- else }}
-{{- print "policy/v1beta1" }}
-{{- end }}
-{{- end }}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/clusterrole.yaml b/deploy/charts/dubbo-admin/templates/admin-clusterrole.yaml
similarity index 89%
rename from deploy/charts/dubbo-admin/templates/clusterrole.yaml
rename to deploy/charts/dubbo-admin/templates/admin-clusterrole.yaml
index 5cc6aa3..89fdd64 100644
--- a/deploy/charts/dubbo-admin/templates/clusterrole.yaml
+++ b/deploy/charts/dubbo-admin/templates/admin-clusterrole.yaml
@@ -1,4 +1,4 @@
-{{- if and .Values.rbac.create (not .Values.rbac.namespaced) (not .Values.rbac.useExistingRole) }}
+{{- if and .Values.rbac.enabled (not .Values.rbac.namespaced) (not .Values.rbac.useExistingRole) }}
 apiVersion: {{ include "dubbo-admin.rbac.apiVersion" . }}
 kind: ClusterRole
 metadata:
diff --git a/deploy/charts/dubbo-admin/templates/clusterrolebinding.yaml b/deploy/charts/dubbo-admin/templates/admin-clusterrolebinding.yaml
similarity index 91%
rename from deploy/charts/dubbo-admin/templates/clusterrolebinding.yaml
rename to deploy/charts/dubbo-admin/templates/admin-clusterrolebinding.yaml
index 09f9966..2f73ac3 100644
--- a/deploy/charts/dubbo-admin/templates/clusterrolebinding.yaml
+++ b/deploy/charts/dubbo-admin/templates/admin-clusterrolebinding.yaml
@@ -1,4 +1,4 @@
-{{- if and .Values.rbac.create (not .Values.rbac.namespaced) }}
+{{- if and .Values.rbac.enabled (not .Values.rbac.namespaced) }}
 apiVersion: {{ include "dubbo-admin.rbac.apiVersion" . }}
 kind: ClusterRoleBinding
 metadata:
diff --git a/deploy/charts/dubbo-admin/templates/deployment.yaml b/deploy/charts/dubbo-admin/templates/admin-deployment.yaml
similarity index 100%
rename from deploy/charts/dubbo-admin/templates/deployment.yaml
rename to deploy/charts/dubbo-admin/templates/admin-deployment.yaml
diff --git a/deploy/charts/dubbo-admin/templates/hpa.yaml b/deploy/charts/dubbo-admin/templates/admin-hpa.yaml
similarity index 100%
rename from deploy/charts/dubbo-admin/templates/hpa.yaml
rename to deploy/charts/dubbo-admin/templates/admin-hpa.yaml
diff --git a/deploy/charts/dubbo-admin/templates/ingress.yaml b/deploy/charts/dubbo-admin/templates/admin-ingress.yaml
similarity index 100%
rename from deploy/charts/dubbo-admin/templates/ingress.yaml
rename to deploy/charts/dubbo-admin/templates/admin-ingress.yaml
diff --git a/deploy/charts/dubbo-admin/templates/networkpolicy.yaml b/deploy/charts/dubbo-admin/templates/admin-networkpolicy.yaml
similarity index 100%
rename from deploy/charts/dubbo-admin/templates/networkpolicy.yaml
rename to deploy/charts/dubbo-admin/templates/admin-networkpolicy.yaml
diff --git a/deploy/charts/dubbo-admin/templates/poddisruptionbudget.yaml b/deploy/charts/dubbo-admin/templates/admin-pdb.yaml
similarity index 100%
rename from deploy/charts/dubbo-admin/templates/poddisruptionbudget.yaml
rename to deploy/charts/dubbo-admin/templates/admin-pdb.yaml
diff --git a/deploy/charts/dubbo-admin/templates/podsecuritypolicy.yaml b/deploy/charts/dubbo-admin/templates/admin-psp.yaml
similarity index 100%
rename from deploy/charts/dubbo-admin/templates/podsecuritypolicy.yaml
rename to deploy/charts/dubbo-admin/templates/admin-psp.yaml
diff --git a/deploy/charts/dubbo-admin/templates/pvc.yaml b/deploy/charts/dubbo-admin/templates/admin-pvc.yaml
similarity index 100%
rename from deploy/charts/dubbo-admin/templates/pvc.yaml
rename to deploy/charts/dubbo-admin/templates/admin-pvc.yaml
diff --git a/deploy/charts/dubbo-admin/templates/role.yaml b/deploy/charts/dubbo-admin/templates/admin-role.yaml
similarity index 92%
rename from deploy/charts/dubbo-admin/templates/role.yaml
rename to deploy/charts/dubbo-admin/templates/admin-role.yaml
index d1c1b48..de391e7 100644
--- a/deploy/charts/dubbo-admin/templates/role.yaml
+++ b/deploy/charts/dubbo-admin/templates/admin-role.yaml
@@ -1,4 +1,4 @@
-{{- if and .Values.rbac.create (not .Values.rbac.useExistingRole) -}}
+{{- if and .Values.rbac.enabled (not .Values.rbac.useExistingRole) -}}
 apiVersion: {{ include "dubbo-admin.rbac.apiVersion" . }}
 kind: Role
 metadata:
diff --git a/deploy/charts/dubbo-admin/templates/rolebinding.yaml b/deploy/charts/dubbo-admin/templates/admin-rolebinding.yaml
similarity index 95%
rename from deploy/charts/dubbo-admin/templates/rolebinding.yaml
rename to deploy/charts/dubbo-admin/templates/admin-rolebinding.yaml
index 6154260..49034af 100644
--- a/deploy/charts/dubbo-admin/templates/rolebinding.yaml
+++ b/deploy/charts/dubbo-admin/templates/admin-rolebinding.yaml
@@ -1,4 +1,4 @@
-{{- if .Values.rbac.create }}
+{{- if .Values.rbac.enabled }}
 apiVersion: {{ include "dubbo-admin.rbac.apiVersion" . }}
 kind: RoleBinding
 metadata:
diff --git a/deploy/charts/dubbo-admin/templates/secret-env.yaml b/deploy/charts/dubbo-admin/templates/admin-secret-env.yaml
similarity index 77%
rename from deploy/charts/dubbo-admin/templates/secret-env.yaml
rename to deploy/charts/dubbo-admin/templates/admin-secret-env.yaml
index 7b1e1bb..73525e0 100644
--- a/deploy/charts/dubbo-admin/templates/secret-env.yaml
+++ b/deploy/charts/dubbo-admin/templates/admin-secret-env.yaml
@@ -1,4 +1,4 @@
-{{- if .Values.envRenderSecret }}
+{{- if .Values.envSecret }}
 apiVersion: v1
 kind: Secret
 metadata:
@@ -8,7 +8,7 @@
     {{- include "dubbo-admin.labels" . | nindent 4 }}
 type: Opaque
 data:
-{{- range $key, $val := .Values.envRenderSecret }}
+{{- range $key, $val := .Values.envSecret }}
   {{ $key }}: {{ $val | b64enc | quote }}
 {{- end }}
 {{- end }}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/secret.yaml b/deploy/charts/dubbo-admin/templates/admin-secret.yaml
similarity index 100%
rename from deploy/charts/dubbo-admin/templates/secret.yaml
rename to deploy/charts/dubbo-admin/templates/admin-secret.yaml
diff --git a/deploy/charts/dubbo-admin/templates/serviceaccount.yaml b/deploy/charts/dubbo-admin/templates/admin-serviceaccount.yaml
similarity index 91%
rename from deploy/charts/dubbo-admin/templates/serviceaccount.yaml
rename to deploy/charts/dubbo-admin/templates/admin-serviceaccount.yaml
index b493f32..3ccaf61 100644
--- a/deploy/charts/dubbo-admin/templates/serviceaccount.yaml
+++ b/deploy/charts/dubbo-admin/templates/admin-serviceaccount.yaml
@@ -1,4 +1,4 @@
-{{- if .Values.serviceAccount.create }}
+{{- if .Values.serviceAccount.enabled }}
 {{- $admin := . -}}
 apiVersion: v1
 kind: ServiceAccount
diff --git a/deploy/charts/dubbo-admin/templates/svc-headless.yaml b/deploy/charts/dubbo-admin/templates/admin-svc-headless.yaml
similarity index 100%
rename from deploy/charts/dubbo-admin/templates/svc-headless.yaml
rename to deploy/charts/dubbo-admin/templates/admin-svc-headless.yaml
diff --git a/deploy/charts/dubbo-admin/templates/svc.yaml b/deploy/charts/dubbo-admin/templates/admin-svc.yaml
similarity index 100%
rename from deploy/charts/dubbo-admin/templates/svc.yaml
rename to deploy/charts/dubbo-admin/templates/admin-svc.yaml
diff --git a/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-configmap.yaml b/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-configmap.yaml
new file mode 100644
index 0000000..df46791
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-configmap.yaml
@@ -0,0 +1,27 @@
+{{- if .Values.zookeeper.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ printf "%s-scripts" (include "zookeeper.fullname" .) }}
+  namespace: {{ template "zookeeper.namespace" . }}
+data:
+  setup.sh: |-
+    #!/bin/bash
+
+    # Execute entrypoint as usual after obtaining ZOO_SERVER_ID
+    # check ZOO_SERVER_ID in persistent volume via myid
+    # if not present, set based on POD hostname
+    if [[ -f "/bitnami/zookeeper/data/myid" ]]; then
+        export ZOO_SERVER_ID="$(cat /bitnami/zookeeper/data/myid)"
+    else
+        HOSTNAME="$(hostname -s)"
+        if [[ $HOSTNAME =~ (.*)-([0-9]+)$ ]]; then
+            ORD=${BASH_REMATCH[2]}
+            export ZOO_SERVER_ID="$((ORD + {{ .Values.minServerId }} ))"
+        else
+            echo "Failed to get index from hostname $HOST"
+            exit 1
+        fi
+    fi
+    exec /entrypoint.sh /run.sh
+  {{- end }}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-networkpolicy.yaml b/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-networkpolicy.yaml
new file mode 100644
index 0000000..8b302e3
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-networkpolicy.yaml
@@ -0,0 +1,41 @@
+{{- if .Values.networkPolicy.enabled }}
+kind: NetworkPolicy
+apiVersion: {{ include "zookeeper.networkPolicy.apiVersion" . }}
+metadata:
+  name: {{ include "zookeeper.fullname" . }}
+  namespace: {{ template "zookeeper.namespace" . }}
+  labels: {{- include "zookeeper.labels" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "zookeeper.tplvalues" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "zookeeper.tplvalues" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  podSelector:
+    matchLabels: {{- include "zookeeper.matchLabels" . | nindent 6 }}
+  policyTypes:
+    - Ingress
+  ingress:
+    # Allow inbound connections to ZooKeeper
+    - ports:
+        - port: {{ .Values.containerPorts.client }}
+        {{- if .Values.metrics.enabled }}
+        - port: {{ .Values.metrics.containerPort }}
+        {{- end }}
+      {{- if not .Values.networkPolicy.allowExternal }}
+      from:
+        - podSelector:
+            matchLabels:
+              {{ include "zookeeper.fullname" . }}-client: "true"
+        - podSelector:
+            matchLabels: {{- include "zookeeper.matchLabels" . | nindent 14 }}
+      {{- end }}
+    # Allow internal communications between nodes
+    - ports:
+        - port: {{ .Values.containerPorts.follower }}
+        - port: {{ .Values.containerPorts.election }}
+      from:
+        - podSelector:
+            matchLabels: {{- include "zookeeper.matchLabels" . | nindent 14 }}
+{{- end }}
diff --git a/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-pdb.yaml b/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-pdb.yaml
new file mode 100644
index 0000000..efd42c1
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-pdb.yaml
@@ -0,0 +1,26 @@
+{{- $replica := int .Values.replicas }}
+{{- if and .Values.podDisruptionBudget.enabled (gt $replica 1) }}
+apiVersion: {{ include "zookeeper.policy.apiVersion" . }}
+kind: PodDisruptionBudget
+metadata:
+  name: {{ template "zookeeper.fullname" . }}
+  namespace: {{ template "zookeeper.namespace" . }}
+  labels: {{- include "zookeeper.labels" . | nindent 4 }}
+    app.kubernetes.io/component: zookeeper
+    {{- if .Values.commonLabels }}
+    {{- include "zookeeper.tplvalues" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "zookeeper.tplvalues" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  {{- if .Values.podDisruptionBudget.minAvailable }}
+  minAvailable: {{ .Values.podDisruptionBudget.minAvailable }}
+  {{- end  }}
+  {{- if .Values.podDisruptionBudget.maxUnavailable }}
+  maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }}
+  {{- end  }}
+  selector:
+    matchLabels: {{- include "zookeeper.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/component: zookeeper
+{{- end }}
diff --git a/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-statefulset.yaml b/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-statefulset.yaml
new file mode 100644
index 0000000..038c728
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-statefulset.yaml
@@ -0,0 +1,168 @@
+{{- if .Values.zookeeper.enabled }}
+apiVersion: {{ include "zookeeper.statefulset.apiVersion" . }}
+kind: StatefulSet
+metadata:
+  name: {{ template "zookeeper.fullname" . }}
+  namespace: {{ template "zookeeper.namespace" . }}
+spec:
+  replicas: {{ .Values.replicas }}
+  selector:
+    matchLabels: {{- include "zookeeper.matchLabels" . | nindent 6 }}
+  serviceName: {{ printf "%s-%s" (include "zookeeper.fullname" .) (default "headless" .Values.service.headless.servicenameOverride) | trunc 63 | trimSuffix "-" }}
+  template:
+    metadata:
+      labels:
+        app.kubernetes.io/name: zookeeper
+    spec:
+      containers:
+        - name: zookeeper
+          image: {{ .Values.image.zoo_repository }}:{{ .Values.image.zoo_tag }}
+          imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
+          {{- if .Values.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.resources }}
+          resources: {{- toYaml .Values.extraresources | nindent 12 }}
+          {{- end }}
+          env:
+            - name: BITNAMI_DEBUG
+              value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }}
+            - name: ZOO_DATA_LOG_DIR
+              value: {{ .Values.dataLogDir | quote }}
+            - name: ZOO_PORT_NUMBER
+              value: {{ .Values.containerPorts.client | quote }}
+            - name: ZOO_TICK_TIME
+              value: {{ .Values.tickTime | quote }}
+            - name: ZOO_INIT_LIMIT
+              value: {{ .Values.initLimit | quote }}
+            - name: ZOO_SYNC_LIMIT
+              value: {{ .Values.syncLimit | quote }}
+            - name: ZOO_PRE_ALLOC_SIZE
+              value: {{ .Values.preAllocSize | quote }}
+            - name: ZOO_SNAPCOUNT
+              value: {{ .Values.snapCount | quote }}
+            - name: ZOO_MAX_CLIENT_CNXNS
+              value: {{ .Values.maxClientCnxns | quote }}
+            - name: ZOO_4LW_COMMANDS_WHITELIST
+              value: {{ .Values.fourlwCommandsWhitelist | quote }}
+            - name: ZOO_LISTEN_ALLIPS_ENABLED
+              value: {{ ternary "yes" "no" .Values.listenOnAllIPs | quote }}
+            - name: ZOO_AUTOPURGE_INTERVAL
+              value: {{ .Values.autopurge.purgeInterval | quote }}
+            - name: ZOO_AUTOPURGE_RETAIN_COUNT
+              value: {{ .Values.autopurge.snapRetainCount | quote }}
+            - name: ZOO_MAX_SESSION_TIMEOUT
+              value: {{ .Values.maxSessionTimeout | quote }}
+            - name: ZOO_ENABLE_AUTH
+              value: {{ ternary "yes" "no" .Values.auth.client.enabled | quote }}
+            - name: ZOO_SERVERS
+              {{- $replicaCount := int .Values.replicas }}
+              {{- $minServerId := int .Values.minServerId }}
+              {{- $followerPort := int .Values.containerPorts.follower }}
+              {{- $electionPort := int .Values.containerPorts.election }}
+              {{- $releaseNamespace := include "zookeeper.namespace" . }}
+              {{- $zookeeperFullname := include "zookeeper.fullname" . }}
+              {{- $zookeeperHeadlessServiceName := printf "%s-%s" $zookeeperFullname "headless" | trunc 63  }}
+              {{- $clusterDomain := .Values.clusterDomain }}
+              value: {{ range $i, $e := until $replicaCount }}{{ $zookeeperFullname }}-{{ $e }}.{{ $zookeeperHeadlessServiceName }}.{{ $releaseNamespace }}.svc.{{ $clusterDomain }}:{{ $followerPort }}:{{ $electionPort }}::{{ add $e $minServerId }} {{ end }}
+            - name: ZOO_HEAP_SIZE
+              value: {{ .Values.heapSize | quote }}
+            - name: ZOO_LOG_LEVEL
+              value: {{ .Values.logLevel | quote }}
+            - name: ALLOW_ANONYMOUS_LOGIN
+              value: {{ ternary "no" "yes" .Values.auth.client.enabled | quote }}
+          ports:
+            {{- if not .Values.service.disableBaseClientPort }}
+            - name: client
+              containerPort: {{ .Values.containerPorts.client }}
+            {{- end }}
+            - name: follower
+              containerPort: {{ .Values.containerPorts.follower }}
+            - name: election
+              containerPort: {{ .Values.containerPorts.election }}
+          volumeMounts:
+            - name: scripts
+              mountPath: /scripts/setup.sh
+              subPath: setup.sh
+            - name: data
+              mountPath: /bitnami/zookeeper
+            {{- if .Values.dataLogDir }}
+            - name: data-log
+              mountPath: {{ .Values.dataLogDir }}
+            {{- end }}
+            {{- if or .Values.configuration .Values.existingConfigmap }}
+            - name: config
+              mountPath: /opt/bitnami/zookeeper/conf/zoo.cfg
+              subPath: zoo.cfg
+            {{- end }}
+      volumes:
+        - name: scripts
+          configMap:
+            name: {{ printf "%s-scripts" (include "zookeeper.fullname" .) }}
+            defaultMode: 0755
+        {{- if or .Values.configuration .Values.existingConfigmap }}
+        - name: config
+          configMap:
+            name: {{ include "zookeeper.configmapName" . }}
+        {{- end }}
+        {{- if and .Values.persistence.enabled .Values.persistence.existingClaim }}
+        - name: data
+          persistentVolumeClaim:
+            claimName: {{ printf "%s" (tpl .Values.persistence.existingClaim .) }}
+        {{- else if not .Values.persistence.enabled }}
+        - name: data
+          emptyDir: {}
+        {{- end }}
+        {{- if and .Values.persistence.enabled .Values.persistence.dataLogDir.existingClaim }}
+        - name: data-log
+          persistentVolumeClaim:
+            claimName: {{ printf "%s" (tpl .Values.persistence.dataLogDir.existingClaim .) }}
+        {{- else if and ( not .Values.persistence.enabled ) .Values.dataLogDir }}
+        - name: data-log
+          emptyDir: {}
+        {{- end }}
+        {{- if .Values.extraVolumes }}
+        {{- include "zookeeper.tplvalues" (dict "value" .Values.extraVolumes "context" $) | nindent 8 }}
+        {{- end }}
+  {{- if and .Values.persistence.enabled (not (and .Values.persistence.existingClaim .Values.persistence.dataLogDir.existingClaim) ) }}
+  volumeClaimTemplates:
+    {{- if not .Values.persistence.existingClaim }}
+    - metadata:
+        name: data
+        {{- if .Values.persistence.annotations }}
+        annotations: {{- include "zookeeper.tplvalues" (dict "value" .Values.persistence.annotations "context" $) | nindent 10 }}
+        {{- end }}
+        {{- if .Values.persistence.labels }}
+        labels: {{- include "zookeeper.tplvalues" (dict "value" .Values.persistence.labels "context" $) | nindent 10 }}
+        {{- end }}
+      spec:
+        accessModes:
+        {{- range .Values.persistence.accessModes }}
+          - {{ . | quote }}
+        {{- end }}
+        resources:
+          requests:
+            storage: {{ .Values.persistence.size | quote }}
+        {{- include "zookeeper.storage.class" (dict "persistence" .Values.persistence "global" .Values.global) | nindent 8 }}
+        {{- if .Values.persistence.selector }}
+        selector: {{- include "zookeeper.tplvalues" (dict "value" .Values.persistence.selector "context" $) | nindent 10 }}
+        {{- end }}
+    {{- end }}
+    {{- if and (not .Values.persistence.dataLogDir.existingClaim) .Values.dataLogDir }}
+    - metadata:
+        name: data-log
+      spec:
+        accessModes:
+        {{- range .Values.persistence.accessModes }}
+          - {{ . | quote }}
+        {{- end }}
+        resources:
+          requests:
+            storage: {{ .Values.persistence.dataLogDir.size | quote }}
+        {{- include "zookeeper.storage.class" (dict "persistence" .Values.persistence "global" .Values.global) | nindent 8 }}
+        {{- if .Values.persistence.dataLogDir.selector }}
+        selector: {{- include "zookeeper.tplvalues" (dict "value" .Values.persistence.dataLogDir.selector "context" $) | nindent 10 }}
+        {{- end }}
+    {{- end }}
+  {{- end }}
+  {{- end }}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-svc-headless.yaml b/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-svc-headless.yaml
new file mode 100644
index 0000000..b68d0e4
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-svc-headless.yaml
@@ -0,0 +1,24 @@
+{{- if .Values.zookeeper.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "zookeeper.fullname" . }}-headless
+  namespace: {{ template "zookeeper.namespace" . }}
+  labels: {{- include "zookeeper.labels" . | nindent 4 }}
+spec:
+  type: {{ .Values.service.type }}
+  clusterIP: None
+  ports:
+    {{- if not .Values.service.disableBaseClientPort }}
+    - name: tcp-client
+      port: {{ .Values.service.ports.client }}
+      targetPort: client
+    {{- end }}
+    - name: tcp-follower
+      port: {{ .Values.service.ports.follower }}
+      targetPort: follower
+    - name: tcp-election
+      port: {{ .Values.service.ports.election }}
+      targetPort: election
+  selector: {{- include "zookeeper.matchLabels" . | nindent 4 }}
+  {{- end }}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-svc.yaml b/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-svc.yaml
new file mode 100644
index 0000000..80ee6cd
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/admin-zookeeper/admin-zk-svc.yaml
@@ -0,0 +1,48 @@
+{{- if .Values.zookeeper.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "zookeeper.fullname" . }}
+  namespace: {{ template "zookeeper.namespace" . }}
+  labels: {{- include "zookeeper.labels" . | nindent 4 }}
+spec:
+  type: {{ .Values.service.type }}
+  {{- if and .Values.service.clusterIP (eq .Values.service.type "ClusterIP") }}
+  clusterIP: {{ .Values.service.clusterIP }}
+  {{- end }}
+  {{- if or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort") }}
+  externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{- if and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerSourceRanges)) }}
+  loadBalancerSourceRanges: {{ .Values.service.loadBalancerSourceRanges }}
+  {{- end }}
+  {{- if and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerIP)) }}
+  loadBalancerIP: {{ .Values.service.loadBalancerIP }}
+  {{- end }}
+  {{- if .Values.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "zookeeper.tplvalues" (dict "value" .Values.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  ports:
+    {{- if not .Values.service.disableBaseClientPort }}
+    - name: tcp-client
+      port: {{ .Values.service.ports.client }}
+      targetPort: client
+      {{- if and (or (eq .Values.service.type "NodePort") (eq .Values.service.type "LoadBalancer")) (not (empty .Values.service.nodePorts.client)) }}
+      nodePort: {{ .Values.service.nodePorts.client }}
+      {{- else if eq .Values.service.type "ClusterIP" }}
+      {{- end }}
+    {{- end }}
+    - name: tcp-follower
+      port: {{ .Values.service.ports.follower }}
+      targetPort: follower
+    - name: tcp-election
+      port: {{ .Values.service.ports.election }}
+      targetPort: election
+    {{- if .Values.service.extraPorts }}
+    {{- include "zookeeper.tplvalues" (dict "value" .Values.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "zookeeper.matchLabels" . | nindent 4 }}
+  {{- end }}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/tests/test-role.yaml b/deploy/charts/dubbo-admin/templates/tests/test-role.yaml
index c7f8995..5a59823 100644
--- a/deploy/charts/dubbo-admin/templates/tests/test-role.yaml
+++ b/deploy/charts/dubbo-admin/templates/tests/test-role.yaml
@@ -1,4 +1,4 @@
-{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled .Values.rbac.pspEnabled }}
+{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.tests.enabled .Values.rbac.pspEnabled }}
 apiVersion: rbac.authorization.k8s.io/v1
 kind: Role
 metadata:
diff --git a/deploy/charts/dubbo-admin/templates/tests/test-rolebinding.yaml b/deploy/charts/dubbo-admin/templates/tests/test-rolebinding.yaml
index 6f01922..7bb20eb 100644
--- a/deploy/charts/dubbo-admin/templates/tests/test-rolebinding.yaml
+++ b/deploy/charts/dubbo-admin/templates/tests/test-rolebinding.yaml
@@ -1,4 +1,4 @@
-{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled .Values.rbac.pspEnabled }}
+{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.tests.enabled .Values.rbac.pspEnabled }}
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding
 metadata:
diff --git a/deploy/charts/dubbo-admin/templates/tests/test-serviceaccount.yaml b/deploy/charts/dubbo-admin/templates/tests/test-serviceaccount.yaml
index 681d30b..0590e0b 100644
--- a/deploy/charts/dubbo-admin/templates/tests/test-serviceaccount.yaml
+++ b/deploy/charts/dubbo-admin/templates/tests/test-serviceaccount.yaml
@@ -1,4 +1,4 @@
-{{- if and .Values.testFramework.enabled .Values.serviceAccount.create }}
+{{- if and .Values.tests.enabled .Values.serviceAccount.enabled }}
 apiVersion: v1
 kind: ServiceAccount
 metadata:
diff --git a/deploy/charts/dubbo-admin/templates/tests/test.yaml b/deploy/charts/dubbo-admin/templates/tests/test.yaml
index 95ca164..1cf6b64 100644
--- a/deploy/charts/dubbo-admin/templates/tests/test.yaml
+++ b/deploy/charts/dubbo-admin/templates/tests/test.yaml
@@ -1,4 +1,4 @@
-{{- if .Values.testFramework.enabled }}
+{{- if .Values.tests.enabled }}
 {{- $root := . }}
 apiVersion: v1
 kind: Pod
@@ -12,7 +12,7 @@
   namespace: {{ include "dubbo-admin.namespace" . }}
 spec:
   serviceAccountName: {{ include "dubbo-admin.serviceAccountName" . }}
-  {{- with .Values.testFramework.securityContext }}
+  {{- with .Values.tests.securityContext }}
   securityContext:
     {{- toYaml . | nindent 4 }}
   {{- end }}
@@ -34,8 +34,8 @@
   {{- end }}
   containers:
     - name: {{ .Release.Name }}-test
-      image: "{{ .Values.testFramework.image}}"
-      imagePullPolicy: "{{ .Values.testFramework.imagePullPolicy}}"
+      image: "{{ .Values.tests.image}}"
+      imagePullPolicy: "{{ .Values.tests.imagePullPolicy}}"
       command: ["wget"]
       volumeMounts:
         - mountPath: /tests
diff --git a/deploy/charts/dubbo-admin/templates/tpl/_charts.tpl b/deploy/charts/dubbo-admin/templates/tpl/_charts.tpl
new file mode 100644
index 0000000..376e671
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/tpl/_charts.tpl
@@ -0,0 +1,14 @@
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "dubbo-admin.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "zookeeper.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/tpl/_helpers.tpl b/deploy/charts/dubbo-admin/templates/tpl/_helpers.tpl
new file mode 100644
index 0000000..183f1ca
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/tpl/_helpers.tpl
@@ -0,0 +1,112 @@
+{{/*
+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 "dubbo-admin.fullname" -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.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 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 "zookeeper.fullname" -}}
+{{- if .Values.zookeeper.zoo_name -}}
+{{- .Values.zookeeper.zoo_name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Values.zookeeper.zoo_name -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+
+{{/*
+Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector
+*/}}
+{{- define "zookeeper.matchLabels" -}}
+app.kubernetes.io/name: {{ include "zookeeper.name" . }}
+{{- end -}}
+
+
+{{- define "dubbo-admin.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "dubbo-admin.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "dubbo-admin.serviceAccountName" -}}
+{{- if .Values.serviceAccount.enabled }}
+{{- default (include "dubbo-admin.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
+
+
+{{- define "dubbo-admin.serviceAccountNameTest" -}}
+{{- if .Values.serviceAccount.enabled }}
+{{- default (print (include "dubbo-admin.fullname" .) "-test") .Values.serviceAccount.nameTest }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.nameTest }}
+{{- end }}
+{{- end }}
+
+
+{{/*
+Return the ZooKeeper configuration ConfigMap name
+*/}}
+{{- define "zookeeper.configmapName" -}}
+{{- if .Values.existingConfigmap -}}
+    {{- printf "%s" (tpl .Values.existingConfigmap $) -}}
+{{- else -}}
+    {{- printf "%s" (include "zookeeper.fullname" .) -}}
+{{- end -}}
+{{- end -}}
+
+
+{{/*
+Formats imagePullSecrets. Input is (dict "root" . "imagePullSecrets" .{specific imagePullSecrets})
+*/}}
+{{- define "dubbo-admin.imagePullSecrets" -}}
+{{- $root := .root }}
+{{- range (concat .root.Values.global.imagePullSecrets .imagePullSecrets) }}
+{{- if eq (typeOf .) "map[string]interface {}" }}
+- {{ toYaml (dict "name" (tpl .name $root)) | trim }}
+{{- else }}
+- name: {{ tpl . $root }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Renders a value that contains template.
+Usage:
+{{ include "zookeeper.tplvalues" ( dict "value" .Values.path.to.the.Value "context" $) }}
+*/}}
+{{- define "zookeeper.tplvalues" -}}
+    {{- if typeIs "string" .value }}
+        {{- tpl .value .context }}
+    {{- else }}
+        {{- tpl (.value | toYaml) .context }}
+    {{- end }}
+{{- end -}}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/tpl/_images.tpl b/deploy/charts/dubbo-admin/templates/tpl/_images.tpl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/tpl/_images.tpl
diff --git a/deploy/charts/dubbo-admin/templates/tpl/_ingress.tpl b/deploy/charts/dubbo-admin/templates/tpl/_ingress.tpl
new file mode 100644
index 0000000..0e63964
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/tpl/_ingress.tpl
@@ -0,0 +1,22 @@
+{{/*
+Return if ingress is stable.
+*/}}
+{{- define "dubbo-admin.ingress.isStable" -}}
+{{- eq (include "dubbo-admin.ingress.apiVersion" .) "networking.k8s.io/v1" }}
+{{- end }}
+
+
+{{/*
+Return if ingress supports ingressClassName.
+*/}}
+{{- define "dubbo-admin.ingress.supportsIngressClassName" -}}
+{{- or (eq (include "dubbo-admin.ingress.isStable" .) "true") (and (eq (include "dubbo-admin.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" .Capabilities.KubeVersion.Version)) }}
+{{- end }}
+
+
+{{/*
+Return if ingress supports pathType.
+*/}}
+{{- define "dubbo-admin.ingress.supportsPathType" -}}
+{{- or (eq (include "dubbo-admin.ingress.isStable" .) "true") (and (eq (include "dubbo-admin.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" .Capabilities.KubeVersion.Version)) }}
+{{- end }}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/tpl/_labels.tpl b/deploy/charts/dubbo-admin/templates/tpl/_labels.tpl
new file mode 100644
index 0000000..d716807
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/tpl/_labels.tpl
@@ -0,0 +1,16 @@
+{{- define "dubbo-admin.labels" -}}
+helm.sh/chart: {{ include "dubbo-admin.chart" . }}
+{{ include "dubbo-admin.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+
+{{- define "zookeeper.labels" -}}
+app.kubernetes.io/name: {{ include "zookeeper.name" . }}
+helm.sh/chart: {{ include "zookeeper.chart" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/tpl/_names.tpl b/deploy/charts/dubbo-admin/templates/tpl/_names.tpl
new file mode 100644
index 0000000..2893e3e
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/tpl/_names.tpl
@@ -0,0 +1,16 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "dubbo-admin.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "zookeeper.name" -}}
+{{- default .Values.zookeeper.zoo_name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/tpl/_namespaces.tpl b/deploy/charts/dubbo-admin/templates/tpl/_namespaces.tpl
new file mode 100644
index 0000000..7a18a9c
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/tpl/_namespaces.tpl
@@ -0,0 +1,22 @@
+{{/*
+Allow the release namespace to be overridden for multi-namespace deployments in combined charts
+*/}}
+{{- define "dubbo-admin.namespace" -}}
+{{- if .Values.namespaceOverride }}
+{{- .Values.namespaceOverride }}
+{{- else }}
+{{- .Release.Namespace }}
+{{- end }}
+{{- end }}
+
+
+{{/*
+Return ZooKeeper Namespace to use
+*/}}
+{{- define "zookeeper.namespace" -}}
+{{- if .Values.namespaceOverride -}}
+    {{- .Values.namespaceOverride -}}
+{{- else -}}
+    {{- .Release.Namespace -}}
+{{- end -}}
+{{- end -}}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/tpl/_storages.tpl b/deploy/charts/dubbo-admin/templates/tpl/_storages.tpl
new file mode 100644
index 0000000..198a3d6
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/tpl/_storages.tpl
@@ -0,0 +1,23 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Return  the proper Storage Class
+{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }}
+*/}}
+{{- define "zookeeper.storage.class" -}}
+
+{{- $storageClass := .vpersistence.storageClass -}}
+{{- if .global -}}
+    {{- if .global.storageClass -}}
+        {{- $storageClass = .global.storageClass -}}
+    {{- end -}}
+{{- end -}}
+
+{{- if $storageClass -}}
+  {{- if (eq "-" $storageClass) -}}
+      {{- printf "storageClassName: \"\"" -}}
+  {{- else }}
+      {{- printf "storageClassName: %s" $storageClass -}}
+  {{- end -}}
+{{- end -}}
+
+{{- end -}}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/tpl/_versions.tpl b/deploy/charts/dubbo-admin/templates/tpl/_versions.tpl
new file mode 100644
index 0000000..bf19c10
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/tpl/_versions.tpl
@@ -0,0 +1,94 @@
+{{/*
+Return the appropriate apiVersion for rbac.
+*/}}
+{{- define "dubbo-admin.rbac.apiVersion" -}}
+{{- if $.Capabilities.APIVersions.Has "rbac.authorization.k8s.io/v1" }}
+{{- print "rbac.authorization.k8s.io/v1" }}
+{{- else }}
+{{- print "rbac.authorization.k8s.io/v1beta1" }}
+{{- end }}
+{{- end }}
+
+
+{{/*
+Return the appropriate apiVersion for ingress.
+*/}}
+{{- define "dubbo-admin.ingress.apiVersion" -}}
+{{- if and ($.Capabilities.APIVersions.Has "networking.k8s.io/v1") (semverCompare ">= 1.19-0" .Capabilities.KubeVersion.Version) }}
+{{- print "networking.k8s.io/v1" }}
+{{- else if $.Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }}
+{{- print "networking.k8s.io/v1beta1" }}
+{{- else }}
+{{- print "extensions/v1beta1" }}
+{{- end }}
+{{- end }}
+
+
+{{/*
+Return the appropriate apiVersion for podDisruptionBudget.
+*/}}
+{{- define "dubbo-admin.podDisruptionBudget.apiVersion" -}}
+{{- if $.Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }}
+{{- print "policy/v1" }}
+{{- else }}
+{{- print "policy/v1beta1" }}
+{{- end }}
+{{- end }}
+
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "zookeeper.chart" -}}
+{{- end -}}
+{{/*
+Return the target Kubernetes version
+*/}}
+{{- define "zookeeper.kubeVersion" -}}
+{{- if .Values.global }}
+    {{- if .Values.global.kubeVersion }}
+    {{- .Values.global.kubeVersion -}}
+    {{- else }}
+    {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}}
+    {{- end -}}
+{{- else }}
+{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}}
+{{- end -}}
+{{- end -}}
+
+
+{{/*
+Return the appropriate apiVersion for statefulset.
+*/}}
+{{- define "zookeeper.statefulset.apiVersion" -}}
+{{- if semverCompare "<1.14-0" (include "zookeeper.kubeVersion" .) -}}
+{{- print "apps/v1beta1" -}}
+{{- else -}}
+{{- print "apps/v1" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the appropriate apiVersion for networkpolicy.
+*/}}
+{{- define "zookeeper.networkPolicy.apiVersion" -}}
+{{- if semverCompare "<1.7-0" (include "zookeeper.kubeVersion" .) -}}
+{{- print "extensions/v1beta1" -}}
+{{- else -}}
+{{- print "networking.k8s.io/v1" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the appropriate apiVersion for poddisruptionbudget.
+*/}}
+{{- define "zookeeper.policy.apiVersion" -}}
+{{- if semverCompare "<1.21-0" (include "zookeeper.kubeVersion" .) -}}
+{{- print "policy/v1beta1" -}}
+{{- else -}}
+{{- print "policy/v1" -}}
+{{- end -}}
+{{- end -}}
+
+
+
diff --git a/deploy/charts/dubbo-admin/values.yaml b/deploy/charts/dubbo-admin/values.yaml
index b7b2d38..1c5e5d2 100644
--- a/deploy/charts/dubbo-admin/values.yaml
+++ b/deploy/charts/dubbo-admin/values.yaml
@@ -1,3 +1,31 @@
+## fullnameOverride String to fully override common.names.fullname template
+##
+##
+fullnameOverride: ""
+##
+##
+## nameOverride String to partially override common.names.fullname template (will maintain the release name)
+##
+nameOverride: ""
+##
+##
+## namespaceOverride String to partially override common.names.namespace template
+##
+namespaceOverride: ""
+##
+##
+## labels String to override common.names.labels template
+##
+labels: ""
+##
+##
+## annotations String to override common.names.annotations template
+##
+annotations: ""
+##
+##
+##
+##
 ## global.imageRegistry Global Docker image registry
 ## global.imagePullSecrets Global Docker registry secret names as an array
 ## global.storageClass Global StorageClass for Persistent Volume(s)
@@ -9,44 +37,10 @@
   ##   - myRegistryKeySecretName
   ##
   imagePullSecrets: []
-  ##
-  ##
-## fullnameOverride String to fully override common.names.fullname template
-##
-fullnameOverride: {}
-##
-##
-## nameOverride String to partially override common.names.fullname template (will maintain the release name)
-##
-nameOverride: {}
-##
-##
-## namespaceOverride String to partially override common.names.namespace template
-##
-namespaceOverride: {}
-##
-##
-## labels String to override common.names.labels template
-##
-labels: {}
-##
-##
-## annotations String to override common.names.annotations template
-##
-annotations: {}
-##
-##
-##
-##
-## See `kubectl explain poddisruptionbudget.spec` for more
-## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/
-podDisruptionBudget:
-  minAvailable: 1
-  # maxUnavailable: 1
 
 
 rbac:
-  create: true
+  enabled: true
   # Use an existing ClusterRole/Role (depending on rbac.namespaced false/true)
   pspEnabled: true
   pspUseAppArmor: true
@@ -61,18 +55,23 @@
   #   resources: []
   #   verbs: []
 
-  ## serviceAccount Name
+## serviceAccount
 serviceAccount:
-  create: true
-  name:
+  enabled: true
+  ## ## ServiceAccount name.
+  name: {}
+  ## ServiceAccount nameTests.
+  nameTest: {}
   ## ServiceAccount labels.
   labels: {}
+  ## ServiceAccount annotations.
   annotations: {}
 
 
-## Number of service copies
+## replicas
 replicas: 1
 
+
 # -- Optional array of imagePullSecrets containing private registry credentials
 ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
 imagePullSecrets: []
@@ -103,7 +102,7 @@
   type: RollingUpdate
 
 
-## @param readinessProbe.enabled Enable readinessProbe on ZooKeeper containers
+## @param readinessProbe.enabled Enable readinessProbe on containers
 ## @param readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
 ## @param readinessProbe.periodSeconds Period seconds for readinessProbe
 ## @param readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
@@ -120,9 +119,10 @@
   periodSeconds: 10
   successThreshold: 1
   failureThreshold: 3
+  probeCommandTimeout: 1
 
 
-## @param livenessProbe.enabled Enable livenessProbe on ZooKeeper containers
+## @param livenessProbe.enabled Enable livenessProbe on containers
 ## @param livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
 ## @param livenessProbe.periodSeconds Period seconds for livenessProbe
 ## @param livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
@@ -139,8 +139,10 @@
   periodSeconds: 10
   successThreshold: 1
   failureThreshold: 3
+  probeCommandTimeout: 1
 
-## @param startupProbe.enabled Enable startupProbe on ZooKeeper containers
+
+## @param startupProbe.enabled Enable startupProbe on containers
 ## @param startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
 ## @param startupProbe.periodSeconds Period seconds for startupProbe
 ## @param startupProbe.timeoutSeconds Timeout seconds for startupProbe
@@ -158,10 +160,28 @@
   failureThreshold: 3
 
 
-## Dubbo-admin image version
+## This module is the image acquisition method
 image:
+  registry: docker.io
+  ##  e.g registry.k8s.io
+  ##  e.g k8s.gcr.io
+  ##
   repository: apache/dubbo-admin
+  ##
+  ##
   tag: "0.5.0"
+  ## version
+  ##
+  zoo_repository: bitnami/zookeeper
+  ##
+  ##
+  zoo_tag: 3.8.1-debian-11-r0
+  ## zookeeper version
+  ##
+  digest: ""
+  ##
+  ##
+  debug: false
   ##
   ## Specify a imagePullPolicy
   ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
@@ -185,7 +205,7 @@
   # fsGroup: 570
 
 
-testFramework:
+tests:
   enabled: true
   image: busybox
   tag: ""
@@ -194,12 +214,13 @@
 
 
 ## Init container Security Context
-containerSecurityContext: {}
+containerSecurityContext:
+  enabled: false
 
 
 ## Sensible environment variables that will be rendered as new secret object
 ## This can be useful for auth tokens, etc
-envRenderSecret: {}
+envSecret: {}
 
 
 # -- `minReadySeconds` to avoid killing pods before we are ready
@@ -211,7 +232,7 @@
 
 
 ## Create or not configmap
-createConfigmap: true
+ConfigmapEnabled: true
 
 
 ## configmap mounts
@@ -244,12 +265,12 @@
 #   mountPath: /
 
 
-## Apply extra labels to common labels.
+## Apply extra labels.
 extraLabels: {}
 
 
 ## Assign a PriorityClassName to pods if set
-# priorityClassName:
+# priorityClassName: {}
 
 
 ## Pod Annotations
@@ -267,61 +288,117 @@
 service:
   name: http
   ##
-  ##
+  ## Service name.
   ##
   enabled: true
   ##
-  ##
+  ## Service enable true or false.
   ##
   type: ClusterIP
   ##
+  ## Service type.
   ##
+  clusterIP: ""
   ##
-  clusterIP: []
+  ## Service clusterIP.
   ##
+  loadBalancerIP: ""
   ##
+  ## Service loadBalancerIP.
   ##
-  loadBalancerIP: []
+  loadBalancerSourceRanges: ""
   ##
+  ## Service loadBalancerSourceRanges.
   ##
+  externalIPs: ""
   ##
-  loadBalancerSourceRanges: []
+  ## Service externalIPs.
   ##
+  nodePort: ""
   ##
-  ##
-  externalIPs: []
-  ##
-  ##
-  ##
-  nodePort: []
-  ##
-  ##
+  ## Service nodePort.
   ##
   path: /
   ##
-  ##
+  ## Service path.
   ##
   port: 38080
   ##
-  ##
+  ## Service port.
   ##
   targetPort: http
   ##
-  ##
+  ## Service targetPort.
   ##
   containerPort: 8080
   ##
-  ##
+  ## Service containerPort.
   ##
   protocol: TCP
   ##
+  ## Service protocol.
   ##
   ##
+  annotations: {}
+  ##
   ## Service annotations. Can be templated.
-  annotations: {}
+  ##
   labels: {}
+  ##
+  ## Service labels.
+  ##
   portName: service
+  ##
+  ## Service portName.
+  ##
   appProtocol: ""
+  ##
+  ## Service appProtocol.
+  ##
+  ## Zookeeper Service.
+  ## @param service.type Kubernetes Service type
+  ##
+  ports:
+    client: 2181
+    follower: 2888
+    election: 3888
+  ## Node ports to expose
+  ## NOTE: choose port between <30000-32767>
+  ## @param service.nodePorts.client Node port for clients
+  ## @param service.nodePorts.tls Node port for TLS
+  ##
+  nodePorts:
+    client: ""
+  ## @param service.disableBaseClientPort Remove client port from service definitions.
+  ##
+  disableBaseClientPort: false
+  ## @param service.sessionAffinity Control where client requests go, to the same pod or round-robin
+  ## Values: ClientIP or None
+  ## ref: https://kubernetes.io/docs/user-guide/services/
+  ##
+  sessionAffinity: None
+  ## @param service.sessionAffinityConfig Additional settings for the sessionAffinity
+  ## sessionAffinityConfig:
+  ##   clientIP:
+  ##     timeoutSeconds: 300
+  ##
+  sessionAffinityConfig: {}
+  ##
+  ##
+  ##
+  externalTrafficPolicy: Cluster
+  ## @param service.annotations Additional custom annotations for ZooKeeper service
+  ##
+  ##
+  extraPorts: []
+  ## @param service.headless.annotations Annotations for the Headless Service
+  ## @param service.headless.publishNotReadyAddresses If the ZooKeeper headless service should publish DNS records for not ready pods
+  ## @param service.headless.servicenameOverride String to partially override headless service name
+  ##
+  headless:
+    publishNotReadyAddresses: true
+    annotations: {}
+    servicenameOverride: ""
 
 
 ingress:
@@ -335,12 +412,12 @@
   # kubernetes.io/tls-acme: "true"
   labels: {}
   path: /
-
-
+  ##
+  ##
   # pathType is only for k8s >= 1.1=
   pathType: Prefix
-
-
+  ##
+  ##
   hosts:
     - chart-example.local
   ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
@@ -357,8 +434,8 @@
   #       name: ssl-redirect
   #       port:
   #         name: use-annotation
-
-
+  ##
+  ##
   tls: []
   #  - secretName: chart-example-tls
   #    hosts:
@@ -410,11 +487,13 @@
 persistence:
   enabled: false
   type: pvc
-  storageClassName: {}
+  storageClassName: ""
   accessModes:
     - ReadWriteOnce
   size: 10Gi
+  labels: {}
   annotations: {}
+  existingClaim: ""
   finalizers:
     - kubernetes.io/pvc-protection
   selectorLabels: {}
@@ -439,9 +518,29 @@
     ## dubbo-admin emptyDir volume size limit
     ##
     sizeLimit: ""
+  selector: {}
+    ## Persistence for a dedicated data log directory
+    ##
+  dataLogDir:
+    ## @param persistence.dataLogDir.size PVC Storage Request for ZooKeeper's dedicated data log directory
+    ##
+    size: 8Gi
+    ## @param persistence.dataLogDir.existingClaim Provide an existing `PersistentVolumeClaim` for ZooKeeper's data log directory
+    ## If defined, PVC must be created manually before volume will be bound
+    ## The value is evaluated as a template
+    ##
+    existingClaim: ""
+    ## @param persistence.dataLogDir.selector Selector to match an existing Persistent Volume for ZooKeeper's data log PVC
+    ## If set, the PVC can't have a PV dynamically provisioned for it
+    ## E.g.
+    ## selector:
+    ##   matchLabels:
+    ##     app: my-app
+    ##
+    selector: {}
 
 
-initChownData:
+initChown:
   ## If false, data ownership will not be reset at startup
   ## This allows the dubbo-admin-server to be run with an arbitrary user
   ##
@@ -462,7 +561,7 @@
   ##
   ##
   ##
-  ## initChownData resource requests and limits
+  ## initChown resource requests and limits
   ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
   ##
   resources: {}
@@ -481,7 +580,18 @@
 lifecycleHooks: {}
   # postStart:
   #   exec:
-#     command: []
+  #     command: []
+  # preStop:
+  #   exec:
+  #     command: []
+
+
+## See `kubectl explain poddisruptionbudget.spec` for more
+## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/
+podDisruptionBudget:
+  enabled: false
+  minAvailable: 1
+  # maxUnavailable: 1
 
 
 networkPolicy:
@@ -532,25 +642,225 @@
       ## - port: 80
       ## - port: 443
 
-## dubbo-admin-server/src/main/resources/application.properties
-#
-#
-# 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.
-#
-#
+
+## Zookeeper Necessary configuration
+zookeeper:
+  enabled: true
+  ##
+  ##
+  zoo_name: zookeeper
+  ## Create a headless service for the deployment
+  headlessService: false
+  ##
+  ##
+  ## Create HorizontalPodAutoscaler object for deployment type
+  autoscaling:
+    enabled: false
+    minReplicas: 1
+    maxReplicas: 5
+    targetCPU: "60"
+    targetMemory: ""
+    behavior: {}
+  ##
+  ##
+  ## Number of old ReplicaSets to retain
+  ##
+  revisionHistoryLimit: 10
+  ##
+  ##
+  ## See `kubectl explain deployment.spec.strategy` for more
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
+  deploymentStrategy:
+    type: RollingUpdate
+  ##
+  ##
+## zookeeper container Ports
+containerPorts:
+  client: 2181
+  tls: 3181
+  follower: 2888
+  election: 3888
+##
+##
+extraVolumes: []
+## @param extraVolumeMounts Optionally specify extra list of additional volumeMounts for the ZooKeeper container(s)
+## Example Use Case: mount certificates to enable TLS
+## e.g:
+## extraVolumeMounts:
+## - name: zookeeper-keystore
+##   mountPath: /certs/keystore
+##   readOnly: true
+## - name: zookeeper-truststore
+##   mountPath: /certs/truststore
+##   readOnly: true
+##
+extraVolumeMounts: []
+## @param sidecars Add additional sidecar containers to the ZooKeeper pod(s)
+## e.g:
+## sidecars:
+##   - name: your-image-name
+##     image: your-image
+##     imagePullPolicy: Always
+##     ports:
+##       - name: portname
+##         containerPort: 1234
+##
+## @param tickTime Basic time unit (in milliseconds) used by ZooKeeper for heartbeats
+##
+##
+auth:
+  client:
+    ## @param auth.client.enabled Enable ZooKeeper client-server authentication. It uses SASL/Digest-MD5
+    ##
+    enabled: false
+    ## @param auth.client.clientUser User that will use ZooKeeper clients to auth
+    ##
+    clientUser: ""
+    ## @param auth.client.clientPassword Password that will use ZooKeeper clients to auth
+    ##
+    clientPassword: ""
+    ## @param auth.client.serverUsers Comma, semicolon or whitespace separated list of user to be created
+    ## Specify them as a string, for example: "user1,user2,admin"
+    ##
+    serverUsers: ""
+    ## @param auth.client.serverPasswords Comma, semicolon or whitespace separated list of passwords to assign to users when created
+    ## Specify them as a string, for example: "pass4user1, pass4user2, pass4admin"
+    ##
+    serverPasswords: ""
+    ## @param auth.client.existingSecret Use existing secret (ignores previous passwords)
+    ##
+    existingSecret: ""
+  quorum:
+    ## @param auth.quorum.enabled Enable ZooKeeper server-server authentication. It uses SASL/Digest-MD5
+    ##
+    enabled: false
+    ## @param auth.quorum.learnerUser User that the ZooKeeper quorumLearner will use to authenticate to quorumServers.
+    ## Note: Make sure the user is included in auth.quorum.serverUsers
+    ##
+    learnerUser: ""
+    ## @param auth.quorum.learnerPassword Password that the ZooKeeper quorumLearner will use to authenticate to quorumServers.
+    ##
+    learnerPassword: ""
+    ## @param auth.quorum.serverUsers Comma, semicolon or whitespace separated list of users for the quorumServers.
+    ## Specify them as a string, for example: "user1,user2,admin"
+    ##
+    serverUsers: ""
+    ## @param auth.quorum.serverPasswords Comma, semicolon or whitespace separated list of passwords to assign to users when created
+    ## Specify them as a string, for example: "pass4user1, pass4user2, pass4admin"
+    ##
+    serverPasswords: ""
+    ## @param auth.quorum.existingSecret Use existing secret (ignores previous passwords)
+    ##
+    existingSecret: ""
+## @param tickTime Basic time unit (in milliseconds) used by ZooKeeper for heartbeats
+##
+tickTime: 2000
+## @param initLimit ZooKeeper uses to limit the length of time the ZooKeeper servers in quorum have to connect to a leader
+##
+initLimit: 10
+## @param syncLimit How far out of date a server can be from a leader
+##
+syncLimit: 5
+## @param preAllocSize Block size for transaction log file
+##
+preAllocSize: 65536
+## @param snapCount The number of transactions recorded in the transaction log before a snapshot can be taken (and the transaction log rolled)
+##
+snapCount: 100000
+## @param maxClientCnxns Limits the number of concurrent connections that a single client may make to a single member of the ZooKeeper ensemble
+##
+maxClientCnxns: 60
+## @param maxSessionTimeout Maximum session timeout (in milliseconds) that the server will allow the client to negotiate
+## Defaults to 20 times the tickTime
+##
+maxSessionTimeout: 40000
+## @param heapSize Size (in MB) for the Java Heap options (Xmx and Xms)
+## This env var is ignored if Xmx an Xms are configured via `jvmFlags`
+##
+heapSize: 1024
+## @param fourlwCommandsWhitelist A list of comma separated Four Letter Words commands that can be executed
+##
+fourlwCommandsWhitelist: srvr, mntr, ruok
+## @param minServerId Minimal SERVER_ID value, nodes increment their IDs respectively
+## Servers increment their ID starting at this minimal value.
+## E.g., with `minServerId=10` and 3 replicas, server IDs will be 10, 11, 12 for z-0, z-1 and z-2 respectively.
+##
+minServerId: 1
+## @param listenOnAllIPs Allow ZooKeeper to listen for connections from its peers on all available IP addresses
+##
+listenOnAllIPs: false
+## Ongoing data directory cleanup configuration
+##
+autopurge:
+  ## @param autopurge.snapRetainCount The most recent snapshots amount (and corresponding transaction logs) to retain
+  ##
+  snapRetainCount: 3
+  ## @param autopurge.purgeInterval The time interval (in hours) for which the purge task has to be triggered
+  ## Set to a positive integer to enable the auto purging
+  ##
+  purgeInterval: 0
+## @param logLevel Log level for the ZooKeeper server. ERROR by default
+## Have in mind if you set it to INFO or WARN the ReadinessProve will produce a lot of logs
+##
+logLevel: ERROR
+## @param jvmFlags Default JVM flags for the ZooKeeper process
+##
+jvmFlags: ""
+## @param dataLogDir Dedicated data log directory
+## This allows a dedicated log device to be used, and helps avoid competition between logging and snapshots.
+## E.g.
+## dataLogDir: /bitnami/zookeeper/dataLog
+##
+dataLogDir: ""
+##
+##
+configuration: ""
+## @param existingConfigmap The name of an existing ConfigMap with your custom configuration for ZooKeeper
+## NOTE: When it's set the `configuration` parameter is ignored
+##
+existingConfigmap: ""
+## @param extraEnvVars Array with extra environment variables to add to ZooKeeper nodes
+## e.g:
+## extraEnvVars:
+##   - name: FOO
+##     value: "bar"
+##
+##
+## @param clusterDomain Kubernetes Cluster Domain
+##
+clusterDomain: cluster.local
+## @param extraDeploy Extra objects to deploy (evaluated as a template)
+##
+extraDeploy: []
+## @param commonLabels Add labels to all the deployed resources
+##
+commonLabels: {}
+## @param commonAnnotations Add annotations to all the deployed resources
+##
+commonAnnotations: {}
+## @param namespaceOverride Override namespace for ZooKeeper resources
+## Useful when including ZooKeeper as a chart dependency, so it can be released into a different namespace than the parent
+##
+diagnosticMode:
+  ## @param diagnosticMode.enabled Enable diagnostic mode (all probes will be disabled and the command will be overridden)
+  ##
+  enabled: false
+  ## @param diagnosticMode.command Command to override all containers in the statefulset
+  ##
+  command:
+    - sleep
+  ## @param diagnosticMode.args Args to override all containers in the statefulset
+  ##
+  args:
+    - infinity
+
+## Nacos Necessary configuration
+nacos:
+  enabled: false
+
+
+
+##  @param Dubbo-admin Default Enable Configuration
 properties:
   admin.registry.address: zookeeper://zookeeper:2181
   admin.config-center: zookeeper://zookeeper:2181