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

zhangjintao pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/apisix-helm-chart.git


The following commit(s) were added to refs/heads/dev by this push:
     new f2e21dc  feat: re-struct apisix chart values (#547)
f2e21dc is described below

commit f2e21dc3d405fe2e48e299d0ff6d1c27f7906997
Author: Sarasa Kisaragi <[email protected]>
AuthorDate: Thu Jun 8 16:27:01 2023 +0800

    feat: re-struct apisix chart values (#547)
---
 charts/apisix/Chart.yaml                           |   2 +-
 charts/apisix/README.md                            | 258 +++---
 charts/apisix/templates/NOTES.txt                  |  14 +-
 charts/apisix/templates/_helpers.tpl               |  42 +-
 charts/apisix/templates/_pod.tpl                   | 267 ------
 charts/apisix/templates/configmap.yaml             | 215 +++--
 charts/apisix/templates/daemonset.yaml             |  33 -
 charts/apisix/templates/deployment.yaml            | 286 ++++++-
 charts/apisix/templates/etcd-secret.yaml           |  10 +
 charts/apisix/templates/hpa.yaml                   |   2 +-
 charts/apisix/templates/ingress-admin.yaml         |  22 +-
 charts/apisix/templates/ingress.yaml               |  22 +-
 charts/apisix/templates/pdb.yaml                   |   8 +-
 charts/apisix/templates/service-admin.yaml         |  28 +-
 charts/apisix/templates/service-control-plane.yaml |   8 +-
 charts/apisix/templates/service-gateway.yaml       |  50 +-
 charts/apisix/templates/service-metrics.yaml       |   6 +-
 charts/apisix/templates/service-monitor.yaml       |  20 +-
 charts/apisix/values.yaml                          | 908 +++++++++++----------
 19 files changed, 1113 insertions(+), 1088 deletions(-)

diff --git a/charts/apisix/Chart.yaml b/charts/apisix/Chart.yaml
index d9665ed..e7e2225 100644
--- a/charts/apisix/Chart.yaml
+++ b/charts/apisix/Chart.yaml
@@ -31,7 +31,7 @@ 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: 1.4.0
+version: 2.0.0
 
 # 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
diff --git a/charts/apisix/README.md b/charts/apisix/README.md
index 08628ce..27f8c0c 100644
--- a/charts/apisix/README.md
+++ b/charts/apisix/README.md
@@ -40,34 +40,62 @@ The command removes all the Kubernetes components 
associated with the chart and
 
 | Key | Type | Default | Description |
 |-----|------|---------|-------------|
-| admin.allow.ipList | list | `["127.0.0.1/24"]` | The client IP CIDR allowed 
to access Apache APISIX Admin API service. |
-| admin.cors | bool | `true` | Admin API support CORS response headers |
-| admin.credentials | object | 
`{"admin":"edd1c9f034335f136f87ad84b625c8f1","secretName":"","viewer":"4054f7cf07e344346cd3f287985e76a2"}`
 | Admin API credentials |
-| admin.credentials.admin | string | `"edd1c9f034335f136f87ad84b625c8f1"` | 
Apache APISIX admin API admin role credentials |
-| admin.credentials.secretName | string | `""` | The APISIX Helm chart 
supports storing user credentials in a secret. The secret needs to contain two 
keys, admin and viewer, with their respective values set. |
-| admin.credentials.viewer | string | `"4054f7cf07e344346cd3f287985e76a2"` | 
Apache APISIX admin API viewer role credentials |
-| admin.enabled | bool | `true` | Enable Admin API |
-| admin.externalIPs | list | `[]` | IPs for which nodes in the cluster will 
also accept traffic for the servic |
-| admin.ingress | object | 
`{"annotations":{},"enabled":false,"hosts":[{"host":"apisix-admin.local","paths":["/apisix"]}],"tls":[]}`
 | Using ingress access Apache APISIX admin service |
-| admin.ingress.annotations | object | `{}` | Ingress annotations |
-| admin.ip | string | `"0.0.0.0"` | which ip to listen on for Apache APISIX 
admin API. Set to `"[::]"` when on IPv6 single stack |
-| admin.port | int | `9180` | which port to use for Apache APISIX admin API |
-| admin.servicePort | int | `9180` | Service port to use for Apache APISIX 
admin API |
-| admin.type | string | `"ClusterIP"` | admin service type |
-| apisix.affinity | object | `{}` | Set affinity for Apache APISIX deploy |
-| apisix.customLuaSharedDicts | list | `[]` | Add custom 
[lua_shared_dict](https://github.com/openresty/lua-nginx-module#toc88) 
settings, click 
[here](https://github.com/apache/apisix-helm-chart/blob/master/charts/apisix/values.yaml#L27-L30)
 to learn the format of a shared dict |
-| apisix.customizedConfig | object | `{}` | If apisix.enableCustomizedConfig 
is true, full customized config.yaml. Please note that other settings about 
APISIX config will be ignored |
-| apisix.enableCustomizedConfig | bool | `false` | Enable full customized 
config.yaml |
+| affinity | object | `{}` | Set affinity for Apache APISIX deploy |
+| apisix.admin.allow.ipList | list | `["127.0.0.1/24"]` | The client IP CIDR 
allowed to access Apache APISIX Admin API service. |
+| apisix.admin.cors | bool | `true` | Admin API support CORS response headers |
+| apisix.admin.credentials | object | 
`{"admin":"edd1c9f034335f136f87ad84b625c8f1","secretName":"","viewer":"4054f7cf07e344346cd3f287985e76a2"}`
 | Admin API credentials |
+| apisix.admin.credentials.admin | string | 
`"edd1c9f034335f136f87ad84b625c8f1"` | Apache APISIX admin API admin role 
credentials |
+| apisix.admin.credentials.secretName | string | `""` | The APISIX Helm chart 
supports storing user credentials in a secret. The secret needs to contain two 
keys, admin and viewer, with their respective values set. |
+| apisix.admin.credentials.viewer | string | 
`"4054f7cf07e344346cd3f287985e76a2"` | Apache APISIX admin API viewer role 
credentials |
+| apisix.admin.enabled | bool | `true` | Enable Admin API |
+| apisix.admin.externalIPs | list | `[]` | IPs for which nodes in the cluster 
will also accept traffic for the servic |
+| apisix.admin.ingress | object | 
`{"annotations":{},"enabled":false,"hosts":[{"host":"apisix-admin.local","paths":["/apisix"]}],"tls":[]}`
 | Using ingress access Apache APISIX admin service |
+| apisix.admin.ingress.annotations | object | `{}` | Ingress annotations |
+| apisix.admin.ip | string | `"0.0.0.0"` | which ip to listen on for Apache 
APISIX admin API. Set to `"[::]"` when on IPv6 single stack |
+| apisix.admin.port | int | `9180` | which port to use for Apache APISIX admin 
API |
+| apisix.admin.servicePort | int | `9180` | Service port to use for Apache 
APISIX admin API |
+| apisix.admin.type | string | `"ClusterIP"` | admin service type |
+| apisix.customPlugins | object | 
`{"enabled":false,"luaPath":"/opts/custom_plugins/?.lua","plugins":[{"attrs":{},"configMap":{"mounts":[{"key":"the-file-name","path":"mount-path"}],"name":"configmap-name"},"name":"plugin-name"}]}`
 | customPlugins allows you to mount your own HTTP plugins. |
+| apisix.customPlugins.enabled | bool | `false` | Whether to configure some 
custom plugins |
+| apisix.customPlugins.luaPath | string | `"/opts/custom_plugins/?.lua"` | the 
lua_path that tells APISIX where it can find plugins, note the last ';' is 
required. |
+| apisix.customPlugins.plugins[0] | object | 
`{"attrs":{},"configMap":{"mounts":[{"key":"the-file-name","path":"mount-path"}],"name":"configmap-name"},"name":"plugin-name"}`
 | plugin name. |
+| apisix.customPlugins.plugins[0].attrs | object | `{}` | plugin attrs |
+| apisix.customPlugins.plugins[0].configMap | object | 
`{"mounts":[{"key":"the-file-name","path":"mount-path"}],"name":"configmap-name"}`
 | plugin codes can be saved inside configmap object. |
+| apisix.customPlugins.plugins[0].configMap.mounts | list | 
`[{"key":"the-file-name","path":"mount-path"}]` | since keys in configmap is 
flat, mountPath allows to define the mount path, so that plugin codes can be 
mounted hierarchically. |
+| apisix.customPlugins.plugins[0].configMap.name | string | `"configmap-name"` 
| name of configmap. |
+| apisix.deployment.certs | object | 
`{"cert":"","cert_key":"","certsSecret":"","mTLSCACert":"","mTLSCACertSecret":""}`
 | certs used for certificates in decoupled mode |
+| apisix.deployment.certs.cert | string | `""` | cert name in certsSecret |
+| apisix.deployment.certs.cert_key | string | `""` | cert key in certsSecret |
+| apisix.deployment.certs.certsSecret | string | `""` | secret name used for 
decoupled mode |
+| apisix.deployment.certs.mTLSCACert | string | `""` | mTLS CA cert filename 
in mTLSCACertSecret |
+| apisix.deployment.certs.mTLSCACertSecret | string | `""` | trusted_ca_cert 
name in certsSecret |
+| apisix.deployment.controlPlane | object | 
`{"cert":"","certKey":"","certsSecret":"","confServerPort":"9280"}` | used for 
control_plane deployment mode |
+| apisix.deployment.controlPlane.cert | string | `""` | conf Server CA cert 
name in certsSecret |
+| apisix.deployment.controlPlane.certKey | string | `""` | conf Server cert 
key name in certsSecret |
+| apisix.deployment.controlPlane.certsSecret | string | `""` | secret name 
used by conf Server |
+| apisix.deployment.controlPlane.confServerPort | string | `"9280"` | conf 
Server address |
+| apisix.deployment.dataPlane | object | 
`{"controlPlane":{"host":[],"prefix":"/apisix","timeout":30}}` | used for 
data_plane deployment mode |
+| apisix.deployment.dataPlane.controlPlane.host | list | `[]` | The hosts of 
the control_plane used by the data_plane |
+| apisix.deployment.dataPlane.controlPlane.prefix | string | `"/apisix"` | The 
prefix of the control_plane used by the data_plane |
+| apisix.deployment.dataPlane.controlPlane.timeout | int | `30` | Timeout when 
the data plane connects to the control plane |
+| apisix.deployment.mode | string | `"traditional"` | Apache APISIX deployment 
mode Optional: traditional, decoupled  ref: 
https://apisix.apache.org/docs/apisix/deployment-modes/ |
+| apisix.deployment.role | string | `"traditional"` | Deployment role 
Optional: traditional, data_plane, control_plane  ref: 
https://apisix.apache.org/docs/apisix/deployment-modes/ |
+| apisix.discovery.enabled | bool | `false` | Enable or disable Apache APISIX 
integration service discovery |
+| apisix.discovery.registry | object | `{}` | Registry is the same to the one 
in APISIX 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L281),
 and refer to such file for more setting details. also refer to [this 
documentation for integration service 
discovery](https://apisix.apache.org/docs/apisix/discovery) |
+| apisix.dns.resolvers[0] | string | `"127.0.0.1"` |  |
+| apisix.dns.resolvers[1] | string | `"172.20.0.10"` |  |
+| apisix.dns.resolvers[2] | string | `"114.114.114.114"` |  |
+| apisix.dns.resolvers[3] | string | `"223.5.5.5"` |  |
+| apisix.dns.resolvers[4] | string | `"1.1.1.1"` |  |
+| apisix.dns.resolvers[5] | string | `"8.8.8.8"` |  |
+| apisix.dns.timeout | int | `5` |  |
+| apisix.dns.validity | int | `30` |  |
 | apisix.enableIPv6 | bool | `true` | Enable nginx IPv6 resolver |
 | apisix.enableServerTokens | bool | `true` | Whether the APISIX version 
number should be shown in Server header |
-| apisix.enabled | bool | `true` | Enable or disable Apache APISIX itself Set 
it to false and ingress-controller.enabled=true will deploy only 
ingress-controller |
-| apisix.extraEnvVars | list | `[]` | extraEnvVars An array to add extra env 
vars e.g: extraEnvVars:   - name: FOO     value: "bar"   - name: FOO2     
valueFrom:       secretKeyRef:         name: SECRET_NAME         key: KEY |
-| apisix.hostNetwork | bool | `false` |  |
-| apisix.httpRouter | string | `"radixtree_host_uri"` | Defines how apisix 
handles routing: - radixtree_uri: match route by uri(base on radixtree) - 
radixtree_host_uri: match route by host + uri(base on radixtree) - 
radixtree_uri_with_parameter: match route by uri with parameters |
-| apisix.image.pullPolicy | string | `"IfNotPresent"` | Apache APISIX image 
pull policy |
-| apisix.image.repository | string | `"apache/apisix"` | Apache APISIX image 
repository |
-| apisix.image.tag | string | `"3.3.0-debian"` | Apache APISIX image tag 
Overrides the image tag whose default is the chart appVersion. |
-| apisix.kind | string | `"Deployment"` | Use a `DaemonSet` or `Deployment` |
+| apisix.extPlugin.cmd | list | 
`["/path/to/apisix-plugin-runner/runner","run"]` | the command and its 
arguements to run as a subprocess |
+| apisix.extPlugin.enabled | bool | `false` | Enable External Plugins. See 
[external plugin](https://apisix.apache.org/docs/apisix/next/external-plugin/) |
+| apisix.fullCustomConfig.config | object | `{}` | If 
apisix.fullCustomConfig.enabled is true, full customized config.yaml. Please 
note that other settings about APISIX config will be ignored |
+| apisix.fullCustomConfig.enabled | bool | `false` | Enable full customized 
config.yaml |
 | apisix.luaModuleHook | object | 
`{"configMapRef":{"mounts":[{"key":"","path":""}],"name":""},"enabled":false,"hookPoint":"","luaPath":""}`
 | Whether to add a custom lua module |
 | apisix.luaModuleHook.configMapRef | object | 
`{"mounts":[{"key":"","path":""}],"name":""}` | configmap that stores the codes 
|
 | apisix.luaModuleHook.configMapRef.mounts[0] | object | 
`{"key":"","path":""}` | Name of the ConfigMap key, for setting the mapping 
relationship between ConfigMap key and the lua module code path. |
@@ -75,68 +103,54 @@ The command removes all the Kubernetes components 
associated with the chart and
 | apisix.luaModuleHook.configMapRef.name | string | `""` | Name of the 
ConfigMap where the lua module codes store |
 | apisix.luaModuleHook.hookPoint | string | `""` | the hook module which will 
be used to inject third party code into APISIX use the lua require style like: 
"module.say_hello" |
 | apisix.luaModuleHook.luaPath | string | `""` | extend lua_package_path to 
load third party code |
-| apisix.nodeSelector | object | `{}` | Node labels for Apache APISIX pod 
assignment |
-| apisix.podAnnotations | object | `{}` | Annotations to add to each pod |
-| apisix.podDisruptionBudget | object | 
`{"enabled":false,"maxUnavailable":1,"minAvailable":"90%"}` | See 
https://kubernetes.io/docs/tasks/run-application/configure-pdb/ for more 
details |
-| apisix.podDisruptionBudget.enabled | bool | `false` | Enable or disable 
podDisruptionBudget |
-| apisix.podDisruptionBudget.maxUnavailable | int | `1` | Set the 
maxUnavailable of podDisruptionBudget |
-| apisix.podDisruptionBudget.minAvailable | string | `"90%"` | Set the 
`minAvailable` of podDisruptionBudget. You can specify only one of 
`maxUnavailable` and `minAvailable` in a single PodDisruptionBudget. See 
[Specifying a Disruption Budget for your 
Application](https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget)
 for more details |
-| apisix.podSecurityContext | object | `{}` | Set the securityContext for 
Apache APISIX pods |
-| apisix.priorityClassName | string | `""` | Set 
[priorityClassName](https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#pod-priority)
 for Apache APISIX pods |
-| apisix.replicaCount | int | `1` | kind is DaemonSet, replicaCount not become 
effective |
-| apisix.resources | object | `{}` | Set pod resource requests & limits |
-| apisix.securityContext | object | `{}` | Set the securityContext for Apache 
APISIX container |
+| apisix.nginx.configurationSnippet | object | 
`{"httpAdmin":"","httpEnd":"","httpSrv":"","httpStart":"","main":"","stream":""}`
 | Custom configuration snippet. |
+| apisix.nginx.customLuaSharedDicts | list | `[]` | Add custom 
[lua_shared_dict](https://github.com/openresty/lua-nginx-module#toc88) 
settings, click 
[here](https://github.com/apache/apisix-helm-chart/blob/master/charts/apisix/values.yaml#L27-L30)
 to learn the format of a shared dict |
+| apisix.nginx.enableCPUAffinity | bool | `true` |  |
+| apisix.nginx.envs | list | `[]` |  |
+| apisix.nginx.logs.accessLog | string | `"/dev/stdout"` | Access log path |
+| apisix.nginx.logs.accessLogFormat | string | `"$remote_addr - $remote_user 
[$time_local] $http_host \\\"$request\\\" $status $body_bytes_sent 
$request_time \\\"$http_referer\\\" \\\"$http_user_agent\\\" $upstream_addr 
$upstream_status $upstream_response_time 
\\\"$upstream_scheme://$upstream_host$upstream_uri\\\""` | Access log format |
+| apisix.nginx.logs.accessLogFormatEscape | string | `"default"` | Allows 
setting json or default characters escaping in variables |
+| apisix.nginx.logs.enableAccessLog | bool | `true` | Enable access log or 
not, default true |
+| apisix.nginx.logs.errorLog | string | `"/dev/stderr"` | Error log path |
+| apisix.nginx.logs.errorLogLevel | string | `"warn"` | Error log level |
+| apisix.nginx.workerConnections | string | `"10620"` |  |
+| apisix.nginx.workerProcesses | string | `"auto"` |  |
+| apisix.nginx.workerRlimitNofile | string | `"20480"` |  |
+| apisix.pluginAttrs | object | `{}` | Set APISIX plugin attributes, see 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L376)
 for more details |
+| apisix.plugins | list | `[]` | Customize the list of APISIX plugins to 
enable. By default, APISIX's default plugins are automatically used. See 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml)
 |
+| apisix.prometheus.containerPort | int | `9091` | container port where the 
metrics are exposed |
+| apisix.prometheus.enabled | bool | `false` |  |
+| apisix.prometheus.metricPrefix | string | `"apisix_"` | prefix of the 
metrics |
+| apisix.prometheus.path | string | `"/apisix/prometheus/metrics"` | path of 
the metrics endpoint |
+| apisix.router.http | string | `"radixtree_host_uri"` | Defines how apisix 
handles routing: - radixtree_uri: match route by uri(base on radixtree) - 
radixtree_host_uri: match route by host + uri(base on radixtree) - 
radixtree_uri_with_parameter: match route by uri with parameters |
 | apisix.setIDFromPodUID | bool | `false` | Use Pod metadata.uid as the APISIX 
id. |
-| apisix.timezone | string | `""` | timezone is the timezone where apisix 
uses. For example: "UTC" or "Asia/Shanghai" This value will be set on apisix 
container's environment variable TZ. You may need to set the timezone to be 
consistent with your local time zone, otherwise the apisix's logs may used to 
retrieve event maybe in wrong timezone. |
-| apisix.tolerations | list | `[]` | List of node taints to tolerate |
+| apisix.ssl.additionalContainerPorts | list | `[]` | Support multiple https 
ports, See 
[Configuration](https://github.com/apache/apisix/blob/0bc65ea9acd726f79f80ae0abd8f50b7eb172e3d/conf/config-default.yaml#L99)
 |
+| apisix.ssl.certCAFilename | string | `""` | Filename be used in the 
apisix.ssl.existingCASecret |
+| apisix.ssl.containerPort | int | `9443` |  |
+| apisix.ssl.enabled | bool | `false` |  |
+| apisix.ssl.existingCASecret | string | `""` | Specifies the name of Secret 
contains trusted CA certificates in the PEM format used to verify the 
certificate when APISIX needs to do SSL/TLS handshaking with external services 
(e.g. etcd) |
+| apisix.ssl.http2.enabled | bool | `true` |  |
+| apisix.ssl.sslProtocols | string | `"TLSv1.2 TLSv1.3"` | TLS protocols 
allowed to use. |
+| apisix.stream_plugins | list | `[]` | Customize the list of APISIX 
stream_plugins to enable. By default, APISIX's default stream_plugins are 
automatically used. See 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml)
 |
+| apisix.vault.enabled | bool | `false` | Enable or disable the vault 
integration |
+| apisix.vault.host | string | `""` | The host address where the vault server 
is running. |
+| apisix.vault.prefix | string | `""` | Prefix allows you to better 
enforcement of policies. |
+| apisix.vault.timeout | int | `10` | HTTP timeout for each request. |
+| apisix.vault.token | string | `""` | The generated token from vault instance 
that can grant access to read data from the vault. |
+| apisix.wasm.enabled | bool | `false` | Enable Wasm Plugins. See [wasm 
plugin](https://apisix.apache.org/docs/apisix/next/wasm/) |
+| apisix.wasm.plugins | list | `[]` |  |
 | autoscaling.enabled | bool | `false` |  |
 | autoscaling.maxReplicas | int | `100` |  |
 | autoscaling.minReplicas | int | `1` |  |
 | autoscaling.targetCPUUtilizationPercentage | int | `80` |  |
 | autoscaling.targetMemoryUtilizationPercentage | int | `80` |  |
 | autoscaling.version | string | `"v2"` | HPA version, the value is "v2" or 
"v2beta1", default "v2" |
-| configurationSnippet | object | 
`{"httpAdmin":"","httpEnd":"","httpSrv":"","httpStart":"","main":"","stream":""}`
 | Custom configuration snippet. |
-| customPlugins | object | 
`{"enabled":false,"luaPath":"/opts/custom_plugins/?.lua","plugins":[{"attrs":{},"configMap":{"mounts":[{"key":"the-file-name","path":"mount-path"}],"name":"configmap-name"},"name":"plugin-name"}]}`
 | customPlugins allows you to mount your own HTTP plugins. |
-| customPlugins.enabled | bool | `false` | Whether to configure some custom 
plugins |
-| customPlugins.luaPath | string | `"/opts/custom_plugins/?.lua"` | the 
lua_path that tells APISIX where it can find plugins, note the last ';' is 
required. |
-| customPlugins.plugins[0] | object | 
`{"attrs":{},"configMap":{"mounts":[{"key":"the-file-name","path":"mount-path"}],"name":"configmap-name"},"name":"plugin-name"}`
 | plugin name. |
-| customPlugins.plugins[0].attrs | object | `{}` | plugin attrs |
-| customPlugins.plugins[0].configMap | object | 
`{"mounts":[{"key":"the-file-name","path":"mount-path"}],"name":"configmap-name"}`
 | plugin codes can be saved inside configmap object. |
-| customPlugins.plugins[0].configMap.mounts | list | 
`[{"key":"the-file-name","path":"mount-path"}]` | since keys in configmap is 
flat, mountPath allows to define the mount path, so that plugin codes can be 
mounted hierarchically. |
-| customPlugins.plugins[0].configMap.name | string | `"configmap-name"` | name 
of configmap. |
 | dashboard.config.conf.etcd.endpoints | list | `["apisix-etcd:2379"]` | 
Supports defining multiple etcd host addresses for an etcd cluster |
 | dashboard.config.conf.etcd.password | string | `nil` | Specifies etcd basic 
auth password if enable etcd auth |
 | dashboard.config.conf.etcd.prefix | string | `"/apisix"` | apisix 
configurations prefix |
 | dashboard.config.conf.etcd.username | string | `nil` | Specifies etcd basic 
auth username if enable etcd auth |
 | dashboard.enabled | bool | `false` |  |
-| deployment.certs | object | 
`{"cert":"","cert_key":"","certsSecret":"","mTLSCACert":"","mTLSCACertSecret":""}`
 | certs used for certificates in decoupled mode |
-| deployment.certs.cert | string | `""` | cert name in certsSecret |
-| deployment.certs.cert_key | string | `""` | cert key in certsSecret |
-| deployment.certs.certsSecret | string | `""` | secret name used for 
decoupled mode |
-| deployment.certs.mTLSCACert | string | `""` | mTLS CA cert filename in 
mTLSCACertSecret |
-| deployment.certs.mTLSCACertSecret | string | `""` | trusted_ca_cert name in 
certsSecret |
-| deployment.controlPlane | object | 
`{"cert":"","certKey":"","certsSecret":"","confServerPort":"9280"}` | used for 
control_plane deployment mode |
-| deployment.controlPlane.cert | string | `""` | conf Server CA cert name in 
certsSecret |
-| deployment.controlPlane.certKey | string | `""` | conf Server cert key name 
in certsSecret |
-| deployment.controlPlane.certsSecret | string | `""` | secret name used by 
conf Server |
-| deployment.controlPlane.confServerPort | string | `"9280"` | conf Server 
address |
-| deployment.dataPlane | object | 
`{"controlPlane":{"host":[],"prefix":"/apisix","timeout":30}}` | used for 
data_plane deployment mode |
-| deployment.dataPlane.controlPlane.host | list | `[]` | The hosts of the 
control_plane used by the data_plane |
-| deployment.dataPlane.controlPlane.prefix | string | `"/apisix"` | The prefix 
of the control_plane used by the data_plane |
-| deployment.dataPlane.controlPlane.timeout | int | `30` | Timeout when the 
data plane connects to the control plane |
-| deployment.mode | string | `"traditional"` | Apache APISIX deployment mode 
Optional: traditional, decoupled  ref: 
https://apisix.apache.org/docs/apisix/deployment-modes/ |
-| deployment.role | string | `"traditional"` | Deployment role Optional: 
traditional, data_plane, control_plane  ref: 
https://apisix.apache.org/docs/apisix/deployment-modes/ |
-| discovery.enabled | bool | `false` | Enable or disable Apache APISIX 
integration service discovery |
-| discovery.registry | object | `{}` | Registry is the same to the one in 
APISIX 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L281),
 and refer to such file for more setting details. also refer to [this 
documentation for integration service 
discovery](https://apisix.apache.org/docs/apisix/discovery) |
-| dns.resolvers[0] | string | `"127.0.0.1"` |  |
-| dns.resolvers[1] | string | `"172.20.0.10"` |  |
-| dns.resolvers[2] | string | `"114.114.114.114"` |  |
-| dns.resolvers[3] | string | `"223.5.5.5"` |  |
-| dns.resolvers[4] | string | `"1.1.1.1"` |  |
-| dns.resolvers[5] | string | `"8.8.8.8"` |  |
-| dns.timeout | int | `5` |  |
-| dns.validity | int | `30` |  |
-| etcd | object | 
`{"auth":{"rbac":{"create":false,"rootPassword":""},"tls":{"certFilename":"","certKeyFilename":"","enabled":false,"existingSecret":"","sni":"","verify":true}},"enabled":true,"host":["http://etcd.host:2379"],"password":"","prefix":"/apisix","replicaCount":3,"service":{"port":2379},"timeout":30,"user":""}`
 | etcd configuration use the FQDN address or the IP of the etcd |
+| etcd | object | 
`{"auth":{"rbac":{"create":false,"rootPassword":""},"tls":{"certFilename":"","certKeyFilename":"","enabled":false,"existingSecret":"","sni":"","verify":true}},"enabled":true,"prefix":"/apisix","replicaCount":3,"service":{"port":2379},"timeout":30}`
 | etcd configuration use the FQDN address or the IP of the etcd |
 | etcd.auth | object | 
`{"rbac":{"create":false,"rootPassword":""},"tls":{"certFilename":"","certKeyFilename":"","enabled":false,"existingSecret":"","sni":"","verify":true}}`
 | if etcd.enabled is true, set more values of bitnami/etcd helm chart |
 | etcd.auth.rbac.create | bool | `false` | No authentication by default. 
Switch to enable RBAC authentication |
 | etcd.auth.rbac.rootPassword | string | `""` | root password for etcd. 
Requires etcd.auth.rbac.create to be true. |
@@ -147,69 +161,61 @@ The command removes all the Kubernetes components 
associated with the chart and
 | etcd.auth.tls.sni | string | `""` | specify the TLS Server Name Indication 
extension, the ETCD endpoint hostname will be used when this setting is unset. |
 | etcd.auth.tls.verify | bool | `true` | whether to verify the etcd endpoint 
certificate when setup a TLS connection to etcd |
 | etcd.enabled | bool | `true` | install etcd(v3) by default, set false if do 
not want to install etcd(v3) together |
-| etcd.host | list | `["http://etcd.host:2379"]` | if etcd.enabled is false, 
use external etcd, support multiple address, if your etcd cluster enables TLS, 
please use https scheme, e.g. https://127.0.0.1:2379. |
-| etcd.password | string | `""` | if etcd.enabled is false, password for 
external etcd. If etcd.enabled is true, use etcd.auth.rbac.rootPassword 
instead. |
 | etcd.prefix | string | `"/apisix"` | apisix configurations prefix |
 | etcd.timeout | int | `30` | Set the timeout value in seconds for subsequent 
socket operations from apisix to etcd cluster |
-| etcd.user | string | `""` | if etcd.enabled is false, username for external 
etcd. If etcd.enabled is true, use etcd.auth.rbac.rootPassword instead. |
-| extPlugin.cmd | list | `["/path/to/apisix-plugin-runner/runner","run"]` | 
the command and its arguements to run as a subprocess |
-| extPlugin.enabled | bool | `false` | Enable External Plugins. See [external 
plugin](https://apisix.apache.org/docs/apisix/next/external-plugin/) |
+| externalEtcd | object | 
`{"existingSecret":"","host":["http://etcd.host:2379"],"password":"","secretPasswordKey":"etcd-root-password","user":"root"}`
 | external etcd configuration. If etcd.enabled is false, these configuration 
will be used. |
+| externalEtcd.existingSecret | string | `""` | if externalEtcd.existingSecret 
is the name of secret containing the external etcd password |
+| externalEtcd.host | list | `["http://etcd.host:2379"]` | if etcd.enabled is 
false, use external etcd, support multiple address, if your etcd cluster 
enables TLS, please use https scheme, e.g. https://127.0.0.1:2379. |
+| externalEtcd.password | string | `""` | if etcd.enabled is false and 
externalEtcd.existingSecret is empty, externalEtcd.password is the passsword 
for external etcd. |
+| externalEtcd.secretPasswordKey | string | `"etcd-root-password"` | 
externalEtcd.secretPasswordKey Key inside the secret containing the external 
etcd password |
+| externalEtcd.user | string | `"root"` | if etcd.enabled is false, user for 
external etcd. Set empty to disable authentication |
+| extraEnvVars | list | `[]` | extraEnvVars An array to add extra env vars 
e.g: extraEnvVars:   - name: FOO     value: "bar"   - name: FOO2     valueFrom: 
      secretKeyRef:         name: SECRET_NAME         key: KEY |
 | extraInitContainers | list | `[]` | Additional `initContainers`, See 
[Kubernetes 
initContainers](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)
 for the detail. |
 | extraVolumeMounts | list | `[]` | Additional `volume`, See [Kubernetes 
Volumes](https://kubernetes.io/docs/concepts/storage/volumes/) for the detail. |
 | extraVolumes | list | `[]` | Additional `volume`, See [Kubernetes 
Volumes](https://kubernetes.io/docs/concepts/storage/volumes/) for the detail. |
 | fullnameOverride | string | `""` |  |
-| gateway.externalIPs | list | `[]` |  |
-| gateway.externalTrafficPolicy | string | `"Cluster"` |  |
-| gateway.http | object | 
`{"additionalContainerPorts":[],"containerPort":9080,"enabled":true,"servicePort":80}`
 | Apache APISIX service settings for http |
-| gateway.http.additionalContainerPorts | list | `[]` | Support multiple http 
ports, See 
[Configuration](https://github.com/apache/apisix/blob/0bc65ea9acd726f79f80ae0abd8f50b7eb172e3d/conf/config-default.yaml#L24)
 |
-| gateway.ingress | object | 
`{"annotations":{},"enabled":false,"hosts":[{"host":"apisix.local","paths":[]}],"tls":[]}`
 | Using ingress access Apache APISIX service |
-| gateway.ingress.annotations | object | `{}` | Ingress annotations |
-| gateway.labelsOverride | object | `{}` | Override default labels assigned to 
Apache APISIX gateway resources |
-| gateway.stream | object | `{"enabled":false,"only":false,"tcp":[],"udp":[]}` 
| Apache APISIX service settings for stream. L4 proxy (TCP/UDP) |
-| gateway.tls | object | 
`{"additionalContainerPorts":[],"certCAFilename":"","containerPort":9443,"enabled":false,"existingCASecret":"","http2":{"enabled":true},"servicePort":443,"sslProtocols":"TLSv1.2
 TLSv1.3"}` | Apache APISIX service settings for tls |
-| gateway.tls.additionalContainerPorts | list | `[]` | Support multiple https 
ports, See 
[Configuration](https://github.com/apache/apisix/blob/0bc65ea9acd726f79f80ae0abd8f50b7eb172e3d/conf/config-default.yaml#L99)
 |
-| gateway.tls.certCAFilename | string | `""` | Filename be used in the 
gateway.tls.existingCASecret |
-| gateway.tls.existingCASecret | string | `""` | Specifies the name of Secret 
contains trusted CA certificates in the PEM format used to verify the 
certificate when APISIX needs to do SSL/TLS handshaking with external services 
(e.g. etcd) |
-| gateway.tls.sslProtocols | string | `"TLSv1.2 TLSv1.3"` | TLS protocols 
allowed to use. |
-| gateway.type | string | `"NodePort"` | Apache APISIX service type for user 
access itself |
 | global.imagePullSecrets | list | `[]` | Global Docker registry secret names 
as an array |
+| hostNetwork | bool | `false` |  |
+| image.pullPolicy | string | `"IfNotPresent"` | Apache APISIX image pull 
policy |
+| image.repository | string | `"apache/apisix"` | Apache APISIX image 
repository |
+| image.tag | string | `"3.3.0-debian"` | Apache APISIX image tag Overrides 
the image tag whose default is the chart appVersion. |
+| ingress | object | 
`{"annotations":{},"enabled":false,"hosts":[{"host":"apisix.local","paths":[]}],"tls":[]}`
 | Using ingress access Apache APISIX service |
 | ingress-controller | object | 
`{"config":{"apisix":{"adminAPIVersion":"v3"}},"enabled":false}` | Ingress 
controller configuration |
+| ingress.annotations | object | `{}` | Ingress annotations |
 | initContainer.image | string | `"busybox"` | Init container image |
 | initContainer.tag | float | `1.28` | Init container tag |
-| logs.accessLog | string | `"/dev/stdout"` | Access log path |
-| logs.accessLogFormat | string | `"$remote_addr - $remote_user [$time_local] 
$http_host \\\"$request\\\" $status $body_bytes_sent $request_time 
\\\"$http_referer\\\" \\\"$http_user_agent\\\" $upstream_addr $upstream_status 
$upstream_response_time 
\\\"$upstream_scheme://$upstream_host$upstream_uri\\\""` | Access log format |
-| logs.accessLogFormatEscape | string | `"default"` | Allows setting json or 
default characters escaping in variables |
-| logs.enableAccessLog | bool | `true` | Enable access log or not, default 
true |
-| logs.errorLog | string | `"/dev/stderr"` | Error log path |
-| logs.errorLogLevel | string | `"warn"` | Error log level |
+| metrics | object | 
`{"serviceMonitor":{"annotations":{},"enabled":false,"interval":"15s","labels":{},"name":"","namespace":""}}`
 | Observability configuration. |
+| metrics.serviceMonitor.annotations | object | `{}` | @param 
serviceMonitor.annotations ServiceMonitor annotations |
+| metrics.serviceMonitor.enabled | bool | `false` | Enable or disable Apache 
APISIX serviceMonitor |
+| metrics.serviceMonitor.interval | string | `"15s"` | interval at which 
metrics should be scraped |
+| metrics.serviceMonitor.labels | object | `{}` | @param serviceMonitor.labels 
ServiceMonitor extra labels |
+| metrics.serviceMonitor.name | string | `""` | name of the serviceMonitor, by 
default, it is the same as the apisix fullname |
+| metrics.serviceMonitor.namespace | string | `""` | namespace where the 
serviceMonitor is deployed, by default, it is the same as the namespace of the 
apisix |
 | nameOverride | string | `""` |  |
-| nginx.enableCPUAffinity | bool | `true` |  |
-| nginx.envs | list | `[]` |  |
-| nginx.workerConnections | string | `"10620"` |  |
-| nginx.workerProcesses | string | `"auto"` |  |
-| nginx.workerRlimitNofile | string | `"20480"` |  |
-| pluginAttrs | object | `{}` | Set APISIX plugin attributes, see 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L376)
 for more details |
-| plugins | list | `[]` | Customize the list of APISIX plugins to enable. By 
default, APISIX's default plugins are automatically used. See 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml)
 |
+| nodeSelector | object | `{}` | Node labels for Apache APISIX pod assignment |
+| podAnnotations | object | `{}` | Annotations to add to each pod |
+| podDisruptionBudget | object | 
`{"enabled":false,"maxUnavailable":1,"minAvailable":"90%"}` | See 
https://kubernetes.io/docs/tasks/run-application/configure-pdb/ for more 
details |
+| podDisruptionBudget.enabled | bool | `false` | Enable or disable 
podDisruptionBudget |
+| podDisruptionBudget.maxUnavailable | int | `1` | Set the maxUnavailable of 
podDisruptionBudget |
+| podDisruptionBudget.minAvailable | string | `"90%"` | Set the `minAvailable` 
of podDisruptionBudget. You can specify only one of `maxUnavailable` and 
`minAvailable` in a single PodDisruptionBudget. See [Specifying a Disruption 
Budget for your 
Application](https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget)
 for more details |
+| podSecurityContext | object | `{}` | Set the securityContext for Apache 
APISIX pods |
+| priorityClassName | string | `""` | Set 
[priorityClassName](https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#pod-priority)
 for Apache APISIX pods |
 | rbac.create | bool | `false` |  |
+| replicaCount | int | `1` | if useDaemonSet is true or autoscaling.enabled is 
true, replicaCount not become effective |
+| resources | object | `{}` | Set pod resource requests & limits |
+| securityContext | object | `{}` | Set the securityContext for Apache APISIX 
container |
+| service.externalIPs | list | `[]` |  |
+| service.externalTrafficPolicy | string | `"Cluster"` |  |
+| service.http | object | 
`{"additionalContainerPorts":[],"containerPort":9080,"enabled":true,"servicePort":80}`
 | Apache APISIX service settings for http |
+| service.http.additionalContainerPorts | list | `[]` | Support multiple http 
ports, See 
[Configuration](https://github.com/apache/apisix/blob/0bc65ea9acd726f79f80ae0abd8f50b7eb172e3d/conf/config-default.yaml#L24)
 |
+| service.labelsOverride | object | `{}` | Override default labels assigned to 
Apache APISIX gateway resources |
+| service.stream | object | `{"enabled":false,"only":false,"tcp":[],"udp":[]}` 
| Apache APISIX service settings for stream. L4 proxy (TCP/UDP) |
+| service.tls | object | `{"servicePort":443}` | Apache APISIX service 
settings for tls |
+| service.type | string | `"NodePort"` | Apache APISIX service type for user 
access itself |
 | serviceAccount.annotations | object | `{}` |  |
 | serviceAccount.create | bool | `false` |  |
 | serviceAccount.name | string | `""` |  |
-| serviceMonitor | object | 
`{"annotations":{},"containerPort":9091,"enabled":false,"interval":"15s","labels":{},"metricPrefix":"apisix_","name":"","namespace":"","path":"/apisix/prometheus/metrics"}`
 | Observability configuration. ref: 
https://apisix.apache.org/docs/apisix/plugins/prometheus/ |
-| serviceMonitor.annotations | object | `{}` | @param 
serviceMonitor.annotations ServiceMonitor annotations |
-| serviceMonitor.containerPort | int | `9091` | container port where the 
metrics are exposed |
-| serviceMonitor.enabled | bool | `false` | Enable or disable Apache APISIX 
serviceMonitor |
-| serviceMonitor.interval | string | `"15s"` | interval at which metrics 
should be scraped |
-| serviceMonitor.labels | object | `{}` | @param serviceMonitor.labels 
ServiceMonitor extra labels |
-| serviceMonitor.metricPrefix | string | `"apisix_"` | prefix of the metrics |
-| serviceMonitor.name | string | `""` | name of the serviceMonitor, by 
default, it is the same as the apisix fullname |
-| serviceMonitor.namespace | string | `""` | namespace where the 
serviceMonitor is deployed, by default, it is the same as the namespace of the 
apisix |
-| serviceMonitor.path | string | `"/apisix/prometheus/metrics"` | path of the 
metrics endpoint |
-| stream_plugins | list | `[]` | Customize the list of APISIX stream_plugins 
to enable. By default, APISIX's default stream_plugins are automatically used. 
See 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml)
 |
+| timezone | string | `""` | timezone is the timezone where apisix uses. For 
example: "UTC" or "Asia/Shanghai" This value will be set on apisix container's 
environment variable TZ. You may need to set the timezone to be consistent with 
your local time zone, otherwise the apisix's logs may used to retrieve event 
maybe in wrong timezone. |
+| tolerations | list | `[]` | List of node taints to tolerate |
 | updateStrategy | object | `{}` |  |
-| vault.enabled | bool | `false` | Enable or disable the vault integration |
-| vault.host | string | `""` | The host address where the vault server is 
running. |
-| vault.prefix | string | `""` | Prefix allows you to better enforcement of 
policies. |
-| vault.timeout | int | `10` | HTTP timeout for each request. |
-| vault.token | string | `""` | The generated token from vault instance that 
can grant access to read data from the vault. |
-| wasmPlugins.enabled | bool | `false` | Enable Wasm Plugins. See [wasm 
plugin](https://apisix.apache.org/docs/apisix/next/wasm/) |
-| wasmPlugins.plugins | list | `[]` |  |
+| useDaemonSet | bool | `false` | set false to use `Deployment`, set true to 
use `DaemonSet` |
diff --git a/charts/apisix/templates/NOTES.txt 
b/charts/apisix/templates/NOTES.txt
index 6796d00..43d3bf3 100644
--- a/charts/apisix/templates/NOTES.txt
+++ b/charts/apisix/templates/NOTES.txt
@@ -1,20 +1,20 @@
 1. Get the application URL by running these commands:
-{{- if .Values.gateway.ingress.enabled }}
-{{- range $host := .Values.gateway.ingress.hosts }}
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
   {{- range .paths }}
-  http{{ if $.Values.gateway.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
+  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
   {{- end }}
 {{- end }}
-{{- else if contains "NodePort" .Values.gateway.type }}
+{{- else if contains "NodePort" .Values.service.type }}
   export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o 
jsonpath="{.spec.ports[0].nodePort}" services {{ include "apisix.fullname" . 
}}-gateway)
   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.gateway.type }}
+{{- else if contains "LoadBalancer" .Values.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 "apisix.fullname" . }}-gateway'
   export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ 
include "apisix.fullname" . }}-gateway --template "{{"{{ range (index 
.status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
-  echo http://$SERVICE_IP:{{ .Values.gateway.http.servicePort }}
-{{- else if contains "ClusterIP" .Values.gateway.type }}
+  echo http://$SERVICE_IP:{{ .Values.service.http.servicePort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
   export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l 
"app.kubernetes.io/name={{ include "apisix.name" . 
}},app.kubernetes.io/instance={{ .Release.Name }}" -o 
jsonpath="{.items[0].metadata.name}")
   echo "Visit http://127.0.0.1:8080 to use your application"
   kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80
diff --git a/charts/apisix/templates/_helpers.tpl 
b/charts/apisix/templates/_helpers.tpl
index 2198734..1b92060 100644
--- a/charts/apisix/templates/_helpers.tpl
+++ b/charts/apisix/templates/_helpers.tpl
@@ -47,8 +47,8 @@ app.kubernetes.io/managed-by: {{ .Release.Service }}
 Selector labels
 */}}
 {{- define "apisix.selectorLabels" -}}
-{{- if .Values.gateway.labelsOverride }}
-{{- tpl (.Values.gateway.labelsOverride | toYaml) . }}
+{{- if .Values.service.labelsOverride }}
+{{- tpl (.Values.service.labelsOverride | toYaml) . }}
 {{- else }}
 app.kubernetes.io/name: {{ include "apisix.name" . }}
 app.kubernetes.io/instance: {{ .Release.Name }}
@@ -80,16 +80,16 @@ Usage:
 {{- end -}}
 
 {{- define "apisix.basePluginAttrs" -}}
-{{- if .Values.serviceMonitor.enabled }}
+{{- if .Values.apisix.prometheus.enabled }}
 prometheus:
   export_addr:
     ip: 0.0.0.0
-    port: {{ .Values.serviceMonitor.containerPort }}
-  export_uri: {{ .Values.serviceMonitor.path }}
-  metric_prefix: {{ .Values.serviceMonitor.metricPrefix }}
+    port: {{ .Values.apisix.prometheus.containerPort }}
+  export_uri: {{ .Values.apisix.prometheus.path }}
+  metric_prefix: {{ .Values.apisix.prometheus.metricPrefix }}
 {{- end }}
-{{- if .Values.customPlugins.enabled }}
-{{- range $plugin := .Values.customPlugins.plugins }}
+{{- if .Values.apisix.customPlugins.enabled }}
+{{- range $plugin := .Values.apisix.customPlugins.plugins }}
 {{- if $plugin.attrs }}
 {{ $plugin.name }}: {{- $plugin.attrs | toYaml | nindent 2 }}
 {{- end }}
@@ -98,7 +98,7 @@ prometheus:
 {{- end -}}
 
 {{- define "apisix.pluginAttrs" -}}
-{{- merge .Values.pluginAttrs (include "apisix.basePluginAttrs" . | fromYaml) 
| toYaml -}}
+{{- merge .Values.apisix.pluginAttrs (include "apisix.basePluginAttrs" . | 
fromYaml) | toYaml -}}
 {{- end -}}
 
 {{/*
@@ -111,3 +111,27 @@ Scheme to use while connecting etcd
 {{- "http" }}
 {{- end }}
 {{- end }}
+
+{{/*
+Return the name of etcd password secret
+*/}}
+{{- define "apisix.etcd.secretName" -}}
+{{- if and .Values.etcd.enabled .Values.etcd.auth.rbac.create }}
+{{- template "common.names.fullname" .Subcharts.etcd }}
+{{- else if .Values.externalEtcd.existingSecret }}
+{{- print .Values.externalEtcd.existingSecret }}
+{{- else if .Values.externalEtcd.user }}
+{{- printf "etcd-%s" (include "apisix.fullname" .) | trunc 63 | trimSuffix "-" 
}}
+{{- end }}
+{{- end -}}
+
+{{/*
+Return the password key name of etcd secret
+*/}}
+{{- define "apisix.etcd.secretPasswordKey" -}}
+{{- if .Values.etcd.enabled }}
+{{- print "etcd-root-password" }}
+{{- else }}
+{{- print .Values.externalEtcd.secretPasswordKey }}
+{{- end }}
+{{- end -}}
diff --git a/charts/apisix/templates/_pod.tpl b/charts/apisix/templates/_pod.tpl
deleted file mode 100644
index 50f2732..0000000
--- a/charts/apisix/templates/_pod.tpl
+++ /dev/null
@@ -1,267 +0,0 @@
-{{- define "apisix.podTemplate" -}}
-metadata:
-  annotations:
-    checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") 
. | sha256sum }}
-    {{- if .Values.apisix.podAnnotations }}
-    {{- range $key, $value := $.Values.apisix.podAnnotations }}
-    {{ $key }}: {{ $value | quote }}
-    {{- end }}
-    {{- end }}
-  labels:
-    {{- include "apisix.selectorLabels" . | nindent 4 }}
-spec:
-  {{- with .Values.global.imagePullSecrets }}
-  imagePullSecrets:
-    {{- range $.Values.global.imagePullSecrets }}
-    - name: {{ . }}
-    {{- end }}
-  {{- end }}
-  serviceAccountName: {{ include "apisix.serviceAccountName" . }}
-  {{- with .Values.apisix.podSecurityContext }}
-  securityContext: 
-    {{- . | toYaml | nindent 4 }}
-  {{- end }}
-  {{- with .Values.apisix.priorityClassName }}
-  priorityClassName: {{ . }}
-  {{- end }}
-  containers:
-    - name: {{ .Chart.Name }}
-      {{- with .Values.apisix.securityContext }}
-      securityContext:
-        {{- . | toYaml | nindent 8 }}
-      {{- end }}
-      image: "{{ .Values.apisix.image.repository }}:{{ default 
.Chart.AppVersion .Values.apisix.image.tag }}"
-      imagePullPolicy: {{ .Values.apisix.image.pullPolicy }}
-      env:
-      {{- if .Values.apisix.timezone }}
-        - name: TZ
-          value: {{ .Values.apisix.timezone }}
-      {{- end }}
-      {{- if .Values.apisix.extraEnvVars }}
-      {{- include "apisix.tplvalues.render" (dict "value" 
.Values.apisix.extraEnvVars "context" $) | nindent 8 }}
-      {{- end }}
-
-      {{- if .Values.admin.credentials.secretName }}
-        - name: APISIX_ADMIN_KEY
-          valueFrom:
-            secretKeyRef:
-              name: {{ .Values.admin.credentials.secretName }}
-              key: admin
-        - name: APISIX_VIEWER_KEY
-          valueFrom:
-            secretKeyRef:
-              name: {{ .Values.admin.credentials.secretName }}
-              key: viewer
-      {{- end }}
-
-      ports:
-        - name: http
-          containerPort: {{ .Values.gateway.http.containerPort }}
-          protocol: TCP
-        {{- range .Values.gateway.http.additionalContainerPorts }}
-        - name: http-{{ .port | toString }}
-          containerPort: {{ .port }}
-          protocol: TCP
-        {{- end }}     
-        - name: tls
-          containerPort: {{ .Values.gateway.tls.containerPort }}
-          protocol: TCP
-        {{- range .Values.gateway.tls.additionalContainerPorts }}
-        - name: tls-{{ .port | toString }}
-          containerPort: {{ .port }}
-          protocol: TCP
-        {{- end }}     
-        {{- if .Values.admin.enabled }}
-        - name: admin
-          containerPort: {{ .Values.admin.port }}
-          protocol: TCP
-        {{- end }}
-        {{- if .Values.serviceMonitor.enabled }}
-        - name: prometheus
-          containerPort: {{ .Values.serviceMonitor.containerPort }}
-          protocol: TCP
-        {{- end }}
-        {{- if and .Values.gateway.stream.enabled (or (gt (len 
.Values.gateway.stream.tcp) 0) (gt (len .Values.gateway.stream.udp) 0)) }}
-        {{- with .Values.gateway.stream }}
-        {{- if (gt (len .tcp) 0) }}
-        {{- range $index, $port := .tcp }}
-        - name: proxy-tcp-{{ $index | toString }}
-        {{- if kindIs "map" $port }}
-          containerPort: {{ splitList ":" ($port.addr | toString) | last }}
-        {{- else }}
-          containerPort: {{ $port }}
-        {{- end }}
-          protocol: TCP
-        {{- end }}
-        {{- end }}
-        {{- if (gt (len .udp) 0) }}
-        {{- range $index, $port := .udp }}
-        - name: proxy-udp-{{ $index | toString }}
-          containerPort: {{ $port }}
-          protocol: UDP
-        {{- end }}
-        {{- end }}
-        {{- end }}
-        {{- end }}
-
-      {{- if ne .Values.deployment.role "control_plane" }}
-      readinessProbe:
-        failureThreshold: 6
-        initialDelaySeconds: 10
-        periodSeconds: 10
-        successThreshold: 1
-        tcpSocket:
-          port: {{ .Values.gateway.http.containerPort }}
-        timeoutSeconds: 1
-      {{- end }}
-      lifecycle:
-        preStop:
-          exec:
-            command:
-              - /bin/sh
-              - -c
-              - "sleep 30"
-      volumeMounts:
-      {{- if .Values.apisix.setIDFromPodUID }}
-        - mountPath: /usr/local/apisix/conf/apisix.uid
-          name: id
-          subPath: apisix.uid
-      {{- end }}
-        - mountPath: /usr/local/apisix/conf/config.yaml
-          name: apisix-config
-          subPath: config.yaml
-      {{- if and .Values.gateway.tls.enabled 
.Values.gateway.tls.existingCASecret }}
-        - mountPath: /usr/local/apisix/conf/ssl/{{ 
.Values.gateway.tls.certCAFilename }}
-          name: ssl
-          subPath: {{ .Values.gateway.tls.certCAFilename }}
-      {{- end }}
-
-      {{- if and (eq .Values.deployment.role "control_plane") 
.Values.deployment.controlPlane.certsSecret }}
-        - mountPath: /conf-server-ssl
-          name: conf-server-ssl
-      {{- end }}
-
-      {{- if and (eq .Values.deployment.mode "decoupled") 
.Values.deployment.certs.mTLSCACertSecret }}
-        - mountPath: /conf-ca-ssl
-          name: conf-ca-ssl
-      {{- end }}
-
-      {{- if and (eq .Values.deployment.mode "decoupled") 
.Values.deployment.certs.certsSecret }}
-        - mountPath: /conf-client-ssl
-          name: conf-client-ssl
-      {{- end }}
-
-      {{- if .Values.etcd.auth.tls.enabled }}
-        - mountPath: /etcd-ssl
-          name: etcd-ssl
-      {{- end }}
-      {{- if .Values.customPlugins.enabled }}
-      {{- range $plugin := .Values.customPlugins.plugins }}
-      {{- range $mount := $plugin.configMap.mounts }}
-      {{- if ne $plugin.configMap.name "" }}
-        - mountPath: {{ $mount.path }}
-          name: plugin-{{ $plugin.configMap.name }}
-          subPath: {{ $mount.key }}
-      {{- end }}
-      {{- end }}
-      {{- end }}
-      {{- end }}
-      {{- if .Values.apisix.luaModuleHook.enabled }}
-      {{- range $mount := .Values.apisix.luaModuleHook.configMapRef.mounts }}
-        - mountPath: {{ $mount.path }}
-          name: lua-module-hook
-          subPath: {{ $mount.key }}
-      {{- end }}
-      {{- end }}
-      {{- if .Values.extraVolumeMounts }}
-      {{- toYaml .Values.extraVolumeMounts | nindent 8 }}
-      {{- end }}
-      resources:
-      {{- toYaml .Values.apisix.resources | nindent 8 }}
-  {{- if .Values.apisix.hostNetwork }}
-  hostNetwork: true
-  dnsPolicy: ClusterFirstWithHostNet
-  {{- end }}
-  hostNetwork: {{ .Values.apisix.hostNetwork }}
-  initContainers:
-    {{- if .Values.etcd.enabled }}
-    - name: wait-etcd
-      image: {{ .Values.initContainer.image }}:{{ .Values.initContainer.tag }}
-      {{- if .Values.etcd.fullnameOverride }}
-      command: ['sh', '-c', "until nc -z {{ .Values.etcd.fullnameOverride }} 
{{ .Values.etcd.service.port }}; do echo waiting for etcd `date`; sleep 2; 
done;"]
-      {{ else }}
-      command: ['sh', '-c', "until nc -z {{ .Release.Name }}-etcd.{{ 
.Release.Namespace }}.svc.{{ .Values.etcd.clusterDomain }} {{ 
.Values.etcd.service.port }}; do echo waiting for etcd `date`; sleep 2; done;"]
-      {{- end }}
-    {{- end }}
-    {{- if .Values.extraInitContainers }}
-    {{- toYaml .Values.extraInitContainers | nindent 4 }}
-    {{- end }}
-  volumes:
-    - configMap:
-        name: {{ include "apisix.fullname" . }}
-      name: apisix-config
-    {{- if and .Values.gateway.tls.enabled 
.Values.gateway.tls.existingCASecret }}
-    - secret:
-        secretName: {{ .Values.gateway.tls.existingCASecret | quote }}
-      name: ssl
-    {{- end }}
-    {{- if .Values.etcd.auth.tls.enabled }}
-    - secret:
-        secretName: {{ .Values.etcd.auth.tls.existingSecret | quote }}
-      name: etcd-ssl
-    {{- end }}
-    {{- if and (eq .Values.deployment.role "control_plane") 
.Values.deployment.controlPlane.certsSecret }}
-    - secret:
-        secretName: {{ .Values.deployment.controlPlane.certsSecret | quote }}
-      name: conf-server-ssl
-    {{- end }}
-
-    {{- if and (eq .Values.deployment.mode "decoupled") 
.Values.deployment.certs.mTLSCACertSecret }}
-    - secret:
-        secretName: {{ .Values.deployment.certs.mTLSCACertSecret | quote }}
-      name: conf-ca-ssl
-    {{- end }}
-
-    {{- if and (eq .Values.deployment.mode "decoupled") 
.Values.deployment.certs.certsSecret }}
-    - secret:
-        secretName: {{ .Values.deployment.certs.certsSecret | quote }}
-      name: conf-client-ssl
-    {{- end }}
-    {{- if .Values.apisix.setIDFromPodUID }}
-    - downwardAPI:
-        items:
-          - path: "apisix.uid"
-            fieldRef:
-              fieldPath: metadata.uid
-      name: id
-    {{- end }}
-    {{- if .Values.customPlugins.enabled }}
-    {{- range $plugin := .Values.customPlugins.plugins }}
-    {{- if ne $plugin.configMap.name "" }}
-    - name: plugin-{{ $plugin.configMap.name }}
-      configMap:
-        name: {{ $plugin.configMap.name }}
-    {{- end }}
-    {{- end }}
-    {{- end }}
-    {{- if .Values.apisix.luaModuleHook.enabled }}
-    - name: lua-module-hook
-      configMap:
-        name: {{ .Values.apisix.luaModuleHook.configMapRef.name }}
-    {{- end }}
-    {{- if .Values.extraVolumes }}
-    {{- toYaml .Values.extraVolumes | nindent 4 }}
-    {{- end }}
-  {{- with .Values.apisix.nodeSelector }}
-  nodeSelector:
-    {{- toYaml . | nindent 4 }}
-  {{- end }}
-  {{- with .Values.apisix.affinity }}
-  affinity:
-    {{- toYaml . | nindent 4 }}
-  {{- end }}
-  {{- with .Values.apisix.tolerations }}
-  tolerations:
-    {{- toYaml . | nindent 4 }}
-  {{- end }}
-{{- end -}}
diff --git a/charts/apisix/templates/configmap.yaml 
b/charts/apisix/templates/configmap.yaml
index 26a669b..7d803cd 100644
--- a/charts/apisix/templates/configmap.yaml
+++ b/charts/apisix/templates/configmap.yaml
@@ -14,7 +14,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- if .Values.apisix.enabled }}
 apiVersion: v1
 kind: ConfigMap
 metadata:
@@ -38,26 +37,26 @@ data:
     # See the License for the specific language governing permissions and
     # limitations under the License.
     #
-    {{- if .Values.apisix.enableCustomizedConfig }}
-    {{- range $key, $value := .Values.apisix.customizedConfig }}
+    {{- if .Values.apisix.fullCustomConfig.enabled }}
+    {{- range $key, $value := .Values.apisix.fullCustomConfig.config }}
     {{ $key }}:
       {{- include "apisix.tplvalues.render" (dict "value" $value "context" $) 
| nindent 6 }}
     {{- end }}
     {{- else }}
     apisix:    # universal configurations
-      {{- if not (eq .Values.deployment.role "control_plane") }}
+      {{- if not (eq .Values.apisix.deployment.role "control_plane") }}
       node_listen:    # APISIX listening port
-        - {{ .Values.gateway.http.containerPort }}
-        {{- with .Values.gateway.http.additionalContainerPorts }}
+        - {{ .Values.service.http.containerPort }}
+        {{- with .Values.service.http.additionalContainerPorts }}
         {{- toYaml . | nindent 8}}
         {{- end }}
       {{- end }}
       enable_heartbeat: true
-      enable_admin: {{ .Values.admin.enabled }}
-      enable_admin_cors: {{ .Values.admin.cors }}
+      enable_admin: {{ .Values.apisix.admin.enabled }}
+      enable_admin_cors: {{ .Values.apisix.admin.cors }}
       enable_debug: false
-      {{- if or .Values.customPlugins.enabled 
.Values.apisix.luaModuleHook.enabled }}
-      extra_lua_path: {{ .Values.customPlugins.luaPath }};{{ 
.Values.apisix.luaModuleHook.luaPath }}
+      {{- if or .Values.apisix.customPlugins.enabled 
.Values.apisix.luaModuleHook.enabled }}
+      extra_lua_path: {{ .Values.apisix.customPlugins.luaPath }};{{ 
.Values.apisix.luaModuleHook.luaPath }}
       {{- end }}
 
       {{- if .Values.apisix.luaModuleHook.enabled }}
@@ -94,18 +93,18 @@ data:
       #    cache_levels: "1:2"
 
       router:
-        http: {{ .Values.apisix.httpRouter }}  # radixtree_uri: match route by 
uri(base on radixtree)
+        http: {{ .Values.apisix.router.http }}  # radixtree_uri: match route 
by uri(base on radixtree)
                                     # radixtree_host_uri: match route by host 
+ uri(base on radixtree)
                                     # radixtree_uri_with_parameter: match 
route by uri with parameters
         ssl: 'radixtree_sni'        # radixtree_sni: match route by SNI(base 
on radixtree)
 
-      {{- if or (index .Values "ingress-controller" "enabled") (and 
.Values.gateway.stream.enabled (or (gt (len .Values.gateway.stream.tcp) 0) (gt 
(len .Values.gateway.stream.udp) 0))) }}
+      {{- if or (index .Values "ingress-controller" "enabled") (and 
.Values.service.stream.enabled (or (gt (len .Values.service.stream.tcp) 0) (gt 
(len .Values.service.stream.udp) 0))) }}
       stream_proxy:                 # TCP/UDP proxy
-        only: {{ .Values.gateway.stream.only }}
-        {{- if or (index .Values "ingress-controller" "enabled") (gt (len 
.Values.gateway.stream.tcp) 0) }}
+        only: {{ .Values.service.stream.only }}
+        {{- if or (index .Values "ingress-controller" "enabled") (gt (len 
.Values.service.stream.tcp) 0) }}
         tcp:                        # TCP proxy port list
-          {{- if gt (len .Values.gateway.stream.tcp) 0}}
-          {{- range .Values.gateway.stream.tcp }}
+          {{- if gt (len .Values.service.stream.tcp) 0}}
+          {{- range .Values.service.stream.tcp }}
           {{- if kindIs "map" . }}
           - addr: {{ .addr }}
           {{- if hasKey . "tls" }}
@@ -119,10 +118,10 @@ data:
           - 9100
           {{- end }}
         {{- end }}
-        {{- if or (index .Values "ingress-controller" "enabled") (gt (len 
.Values.gateway.stream.udp) 0) }}
+        {{- if or (index .Values "ingress-controller" "enabled") (gt (len 
.Values.service.stream.udp) 0) }}
         udp:                        # UDP proxy port list
-          {{- if gt (len .Values.gateway.stream.udp) 0}}
-          {{- range .Values.gateway.stream.udp }}
+          {{- if gt (len .Values.service.stream.udp) 0}}
+          {{- range .Values.service.stream.udp }}
           - {{ . }}
           {{- end }}
           {{- else}}
@@ -131,45 +130,45 @@ data:
         {{- end }}
       {{- end }}
       # dns_resolver:
-      #   {{- range $resolver := .Values.dns.resolvers }}
+      #   {{- range $resolver := .Values.apisix.dns.resolvers }}
       #   - {{ $resolver }}
       #   {{- end }}
-      dns_resolver_valid: {{.Values.dns.validity}}
-      resolver_timeout: {{.Values.dns.timeout}}
+      dns_resolver_valid: {{.Values.apisix.dns.validity}}
+      resolver_timeout: {{.Values.apisix.dns.timeout}}
       ssl:
-        enable: {{ .Values.gateway.tls.enabled }}
+        enable: {{ .Values.apisix.ssl.enabled }}
         listen:
-          - port: {{ .Values.gateway.tls.containerPort }}
-            enable_http2: {{ .Values.gateway.tls.http2.enabled }}
-          {{- with .Values.gateway.tls.additionalContainerPorts }}
+          - port: {{ .Values.apisix.ssl.containerPort }}
+            enable_http2: {{ .Values.apisix.ssl.http2.enabled }}
+          {{- with .Values.apisix.ssl.additionalContainerPorts }}
           {{- toYaml . | nindent 10}}
           {{- end }}
-        ssl_protocols: {{ .Values.gateway.tls.sslProtocols | quote }}
+        ssl_protocols: {{ .Values.apisix.ssl.sslProtocols | quote }}
         ssl_ciphers: 
"ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-
 [...]
-        {{- if and .Values.gateway.tls.enabled 
.Values.gateway.tls.existingCASecret }}
-        ssl_trusted_certificate: "/usr/local/apisix/conf/ssl/{{ 
.Values.gateway.tls.certCAFilename }}"
+        {{- if and .Values.apisix.ssl.enabled 
.Values.apisix.ssl.existingCASecret }}
+        ssl_trusted_certificate: "/usr/local/apisix/conf/ssl/{{ 
.Values.apisix.ssl.certCAFilename }}"
         {{- end }}
 
     nginx_config:    # config for render the template to genarate nginx.conf
-      error_log: "{{ .Values.logs.errorLog }}"
-      error_log_level: "{{ .Values.logs.errorLogLevel }}"    # warn,error
-      worker_processes: "{{ .Values.nginx.workerProcesses }}"
-      enable_cpu_affinity: {{ and true .Values.nginx.enableCPUAffinity }}
-      worker_rlimit_nofile: {{ default "20480" 
.Values.nginx.workerRlimitNofile }}  # the number of files a worker process can 
open, should be larger than worker_connections
+      error_log: "{{ .Values.apisix.nginx.logs.errorLog }}"
+      error_log_level: "{{ .Values.apisix.nginx.logs.errorLogLevel }}"    # 
warn,error
+      worker_processes: "{{ .Values.apisix.nginx.workerProcesses }}"
+      enable_cpu_affinity: {{ and true .Values.apisix.nginx.enableCPUAffinity 
}}
+      worker_rlimit_nofile: {{ default "20480" 
.Values.apisix.nginx.workerRlimitNofile }}  # the number of files a worker 
process can open, should be larger than worker_connections
       event:
-        worker_connections: {{ default "10620" .Values.nginx.workerConnections 
 }}
-      {{- with .Values.nginx.envs }}
+        worker_connections: {{ default "10620" 
.Values.apisix.nginx.workerConnections  }}
+      {{- with .Values.apisix.nginx.envs }}
       envs:
       {{- range $env := . }}
         - {{ $env }}
       {{- end }}
       {{- end }}
       http:
-        enable_access_log: {{ .Values.logs.enableAccessLog }}
-        {{- if .Values.logs.enableAccessLog }}
-        access_log: "{{ .Values.logs.accessLog }}"
-        access_log_format: '{{ .Values.logs.accessLogFormat }}'
-        access_log_format_escape: {{ .Values.logs.accessLogFormatEscape }}
+        enable_access_log: {{ .Values.apisix.nginx.logs.enableAccessLog }}
+        {{- if .Values.apisix.nginx.logs.enableAccessLog }}
+        access_log: "{{ .Values.apisix.nginx.logs.accessLog }}"
+        access_log_format: '{{ .Values.apisix.nginx.logs.accessLogFormat }}'
+        access_log_format_escape: {{ 
.Values.apisix.nginx.logs.accessLogFormatEscape }}
         {{- end }}
         keepalive_timeout: 60s         # timeout during which a keep-alive 
client connection will stay open on the server side.
         client_header_timeout: 60s     # timeout for reading client request 
header, then 408 (Request Time-out) error is returned to the client
@@ -180,34 +179,34 @@ data:
         real_ip_from:                  # 
http://nginx.org/en/docs/http/ngx_http_realip_module.html#set_real_ip_from
           - 127.0.0.1
           - 'unix:'
-        {{- if .Values.apisix.customLuaSharedDicts }}
+        {{- if .Values.apisix.nginx.customLuaSharedDicts }}
         custom_lua_shared_dict:        # add custom shared cache to nginx.conf
-        {{- range $dict := .Values.apisix.customLuaSharedDicts }}
+        {{- range $dict := .Values.apisix.nginx.customLuaSharedDicts }}
           {{ $dict.name }}: {{ $dict.size }}
         {{- end }}
         {{- end }}
-      {{- if .Values.configurationSnippet.main }}
-      main_configuration_snippet: {{- toYaml .Values.configurationSnippet.main 
| indent 6 }}
+      {{- if .Values.apisix.nginx.configurationSnippet.main }}
+      main_configuration_snippet: {{- toYaml 
.Values.apisix.nginx.configurationSnippet.main | indent 6 }}
       {{- end }}
-      {{- if .Values.configurationSnippet.httpStart }}
-      http_configuration_snippet: {{- toYaml 
.Values.configurationSnippet.httpStart | indent 6 }}
+      {{- if .Values.apisix.nginx.configurationSnippet.httpStart }}
+      http_configuration_snippet: {{- toYaml 
.Values.apisix.nginx.configurationSnippet.httpStart | indent 6 }}
       {{- end }}
-      {{- if .Values.configurationSnippet.httpEnd }}
-      http_end_configuration_snippet: {{- toYaml 
.Values.configurationSnippet.httpEnd | indent 6 }}
+      {{- if .Values.apisix.nginx.configurationSnippet.httpEnd }}
+      http_end_configuration_snippet: {{- toYaml 
.Values.apisix.nginx.configurationSnippet.httpEnd | indent 6 }}
       {{- end }}
-      {{- if .Values.configurationSnippet.httpSrv }}
-      http_server_configuration_snippet: {{- toYaml 
.Values.configurationSnippet.httpSrv | indent 6 }}
+      {{- if .Values.apisix.nginx.configurationSnippet.httpSrv }}
+      http_server_configuration_snippet: {{- toYaml 
.Values.apisix.nginx.configurationSnippet.httpSrv | indent 6 }}
       {{- end }}
-      {{- if .Values.configurationSnippet.httpAdmin }}
-      http_admin_configuration_snippet: {{ toYaml 
.Values.configurationSnippet.httpAdmin | indent 6 }}
+      {{- if .Values.apisix.nginx.configurationSnippet.httpAdmin }}
+      http_admin_configuration_snippet: {{ toYaml 
.Values.apisix.nginx.configurationSnippet.httpAdmin | indent 6 }}
       {{- end }}
-      {{- if .Values.configurationSnippet.stream }}
-      stream_configuration_snippet: {{- toYaml 
.Values.configurationSnippet.stream | indent 6 }}
+      {{- if .Values.apisix.nginx.configurationSnippet.stream }}
+      stream_configuration_snippet: {{- toYaml 
.Values.apisix.nginx.configurationSnippet.stream | indent 6 }}
       {{- end }}
 
-    {{- if .Values.discovery.enabled }}
+    {{- if .Values.apisix.discovery.enabled }}
     discovery:
-      {{- range $key, $value := .Values.discovery.registry }}
+      {{- range $key, $value := .Values.apisix.discovery.registry }}
       {{- if $value }}
       {{ $key }}:
         {{- include "apisix.tplvalues.render" (dict "value" $value "context" 
$) | nindent 8 }}
@@ -217,82 +216,82 @@ data:
       {{- end }}
     {{- end }}
 
-    {{- if .Values.vault.enabled }}
+    {{- if .Values.apisix.vault.enabled }}
     vault:
-      host: {{ .Values.vault.host }}
-      timeout: {{ .Values.vault.timeout }}
-      token: {{ .Values.vault.token }}
-      prefix: {{ .Values.vault.prefix }}
+      host: {{ .Values.apisix.vault.host }}
+      timeout: {{ .Values.apisix.vault.timeout }}
+      token: {{ .Values.apisix.vault.token }}
+      prefix: {{ .Values.apisix.vault.prefix }}
     {{- end }}
 
-    {{- if .Values.plugins }}
+    {{- if .Values.apisix.plugins }}
     plugins:    # plugin list
-    {{- range $plugin := .Values.plugins }}
+    {{- range $plugin := .Values.apisix.plugins }}
       {{- if ne $plugin "" }}
       - {{ $plugin }}
       {{- end }}
     {{- end }}
-    {{- if .Values.customPlugins.enabled }}
-    {{- range $plugin := .Values.customPlugins.plugins }}
+    {{- if .Values.apisix.customPlugins.enabled }}
+    {{- range $plugin := .Values.apisix.customPlugins.plugins }}
       - {{ $plugin.name }}
     {{- end }}
     {{- end }}
     {{- end }}
-    {{- if .Values.stream_plugins }}
+    {{- if .Values.apisix.stream_plugins }}
     stream_plugins:
-    {{- range $plugin := .Values.stream_plugins }}
+    {{- range $plugin := .Values.apisix.stream_plugins }}
       {{- if ne $plugin "" }}
       - {{ $plugin }}
       {{- end }}
     {{- end }}
     {{- end }}
 
-    {{- if .Values.extPlugin.enabled }}
+    {{- if .Values.apisix.extPlugin.enabled }}
     ext-plugin:
       cmd:
-      {{- range $arg := .Values.extPlugin.cmd }}
+      {{- range $arg := .Values.apisix.extPlugin.cmd }}
         - {{ $arg }}
       {{- end }}
     {{- end }}
 
-    {{- if or .Values.pluginAttrs .Values.customPlugins.enabled 
.Values.serviceMonitor.enabled}}
+    {{- if or .Values.apisix.pluginAttrs .Values.apisix.customPlugins.enabled 
.Values.apisix.prometheus.enabled}}
     {{- $pluginAttrs := include "apisix.pluginAttrs" . -}}
     {{- if gt (len ($pluginAttrs | fromYaml)) 0 }}
     plugin_attr: {{- $pluginAttrs | nindent 6 }}
     {{- end }}
     {{- end }}
 
-    {{- if .Values.wasmPlugins.enabled }}
+    {{- if .Values.apisix.wasm.enabled }}
     wasm:
       plugins:
-        {{- toYaml .Values.wasmPlugins.plugins | nindent 8 }}
+        {{- toYaml .Values.apisix.wasm.plugins | nindent 8 }}
     {{- end }}
 
     deployment:
-      role: {{ .Values.deployment.role }}
-      {{- if or (eq .Values.deployment.role "traditional") (eq 
.Values.deployment.role "control_plane") }}
+      role: {{ .Values.apisix.deployment.role }}
+      {{- if or (eq .Values.apisix.deployment.role "traditional") (eq 
.Values.apisix.deployment.role "control_plane") }}
 
-      {{- if eq .Values.deployment.role "traditional" }}
+      {{- if eq .Values.apisix.deployment.role "traditional" }}
       role_traditional:
         config_provider: etcd
       {{- end }}
 
-      {{- if eq .Values.deployment.role "control_plane" }}
+      {{- if eq .Values.apisix.deployment.role "control_plane" }}
       role_control_plane:
         config_provider: etcd
         conf_server:
-          listen: 0.0.0.0:{{ .Values.deployment.controlPlane.confServerPort }}
-          cert: "/conf-server-ssl/{{ .Values.deployment.controlPlane.cert }}"
-          cert_key: "/conf-server-ssl/{{ 
.Values.deployment.controlPlane.certKey }}"
-          {{- if .Values.deployment.certs.mTLSCACertSecret }}
-          client_ca_cert: "/conf-ca-ssl/{{ .Values.deployment.certs.mTLSCACert 
}}"
+          listen: 0.0.0.0:{{ 
.Values.apisix.deployment.controlPlane.confServerPort }}
+          cert: "/conf-server-ssl/{{ 
.Values.apisix.deployment.controlPlane.cert }}"
+          cert_key: "/conf-server-ssl/{{ 
.Values.apisix.deployment.controlPlane.certKey }}"
+          {{- if .Values.apisix.deployment.certs.mTLSCACertSecret }}
+          client_ca_cert: "/conf-ca-ssl/{{ 
.Values.apisix.deployment.certs.mTLSCACert }}"
           {{- end }}
       {{- end }}
 
       admin:
         allow_admin:    # 
http://nginx.org/en/docs/http/ngx_http_access_module.html#allow
-        {{- if .Values.admin.allow.ipList }}
-        {{- range $ips := .Values.admin.allow.ipList }}
+        {{- if .Values.apisix.admin.allow.ipList }}
+        {{- range $ips := .Values.apisix.admin.allow.ipList }}
           - {{ $ips }}
         {{- end }}
         {{- else }}
@@ -302,10 +301,10 @@ data:
           - 0.0.0.0/0
         {{- end}}
         #   - "::/64"
-        {{- if .Values.admin.enabled }}
+        {{- if .Values.apisix.admin.enabled }}
         admin_listen:
-          ip: {{ .Values.admin.ip }}
-          port: {{ .Values.admin.port }}
+          ip: {{ .Values.apisix.admin.ip }}
+          port: {{ .Values.apisix.admin.port }}
         {{- end }}
         # Default token when use API to call for Admin API.
         # *NOTE*: Highly recommended to modify this value to protect APISIX's 
Admin API.
@@ -314,22 +313,22 @@ data:
         admin_key:
           # admin: can everything for configuration data
           - name: "admin"
-            {{- if .Values.admin.credentials.secretName }}
+            {{- if .Values.apisix.admin.credentials.secretName }}
             key: "{{"{{"}}APISIX_ADMIN_KEY{{"}}"}}"
             {{- else }}
-            key: {{ .Values.admin.credentials.admin }}
+            key: {{ .Values.apisix.admin.credentials.admin }}
             {{- end }}
             role: admin
           # viewer: only can view configuration data
           - name: "viewer"
-            {{- if .Values.admin.credentials.secretName }}
+            {{- if .Values.apisix.admin.credentials.secretName }}
             key: "{{"{{"}}APISIX_VIEWER_KEY{{"}}"}}"
             {{- else }}
-            key: {{ .Values.admin.credentials.viewer }}
+            key: {{ .Values.apisix.admin.credentials.viewer }}
             {{- end }}
             role: viewer
 
-      {{- if not (eq .Values.deployment.role "data_plane") }}
+      {{- if not (eq .Values.apisix.deployment.role "data_plane") }}
       etcd:
       {{- if .Values.etcd.enabled }}
         host:                          # it's possible to define multiple etcd 
hosts addresses of the same etcd cluster.
@@ -340,18 +339,18 @@ data:
           {{- end}}
       {{- else }}
         host:                          # it's possible to define multiple etcd 
hosts addresses of the same etcd cluster.
-          {{- range $value := .Values.etcd.host }}
+          {{- range $value := .Values.externalEtcd.host }}
           - "{{ $value }}"             # multiple etcd address
           {{- end}}
       {{- end }}
         prefix: {{ .Values.etcd.prefix | quote }}    # configuration prefix in 
etcd
         timeout: {{ .Values.etcd.timeout }}    # 30 seconds
-        {{- if and (not .Values.etcd.enabled) .Values.etcd.user }}
-        user: {{ .Values.etcd.user | quote }}
-        password: {{ .Values.etcd.password | quote }}
+        {{- if and (not .Values.etcd.enabled) .Values.externalEtcd.user }}
+        user: {{ .Values.externalEtcd.user | quote }}
+        password: "{{ print "${{ APISIX_ETCD_PASSWORD }}" }}"
         {{- else if and .Values.etcd.enabled .Values.etcd.auth.rbac.create }}
         user: "root"
-        password: {{ .Values.etcd.auth.rbac.rootPassword | quote }}
+        password: "{{ print "${{APISIX_ETCD_PASSWORD}}" }}"
         {{- end }}
         {{- if .Values.etcd.auth.tls.enabled }}
         tls:
@@ -364,27 +363,25 @@ data:
     {{- end }}
       {{- end }}
 
-      {{- if eq .Values.deployment.role "data_plane" }}
+      {{- if eq .Values.apisix.deployment.role "data_plane" }}
       role_data_plane:
         config_provider: control_plane
         control_plane:
           host:
-            {{- range $.Values.deployment.dataPlane.controlPlane.host }}
+            {{- range $.Values.apisix.deployment.dataPlane.controlPlane.host }}
             - {{ . | quote }}
             {{- end }}
-          prefix: {{ .Values.deployment.dataPlane.controlPlane.prefix }}
-          timeout: {{ .Values.deployment.dataPlane.controlPlane.timeout }}
+          prefix: {{ .Values.apisix.deployment.dataPlane.controlPlane.prefix }}
+          timeout: {{ .Values.apisix.deployment.dataPlane.controlPlane.timeout 
}}
       {{- end }}
 
-      {{- if eq .Values.deployment.mode "decoupled"}}
-      {{- if .Values.deployment.certs.certsSecret }}
+      {{- if eq .Values.apisix.deployment.mode "decoupled"}}
+      {{- if .Values.apisix.deployment.certs.certsSecret }}
       certs:
-        cert: "/conf-client-ssl/{{ .Values.deployment.certs.cert }}"
-        cert_key: "/conf-client-ssl/{{ .Values.deployment.certs.cert_key }}"
-        {{- if .Values.deployment.certs.mTLSCACertSecret }}
-        trusted_ca_cert: "/conf-ca-ssl/{{ .Values.deployment.certs.mTLSCACert 
}}"
+        cert: "/conf-client-ssl/{{ .Values.apisix.deployment.certs.cert }}"
+        cert_key: "/conf-client-ssl/{{ 
.Values.apisix.deployment.certs.cert_key }}"
+        {{- if .Values.apisix.deployment.certs.mTLSCACertSecret }}
+        trusted_ca_cert: "/conf-ca-ssl/{{ 
.Values.apisix.deployment.certs.mTLSCACert }}"
         {{- end }}
       {{- end }}
       {{- end }}
-
-{{- end }}
diff --git a/charts/apisix/templates/daemonset.yaml 
b/charts/apisix/templates/daemonset.yaml
deleted file mode 100644
index b22a775..0000000
--- a/charts/apisix/templates/daemonset.yaml
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# 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 and (.Values.apisix.enabled) (eq .Values.apisix.kind "DaemonSet") }}
-apiVersion: apps/v1
-kind: DaemonSet
-metadata:
-  name: {{ include "apisix.fullname" . }}
-  namespace: {{ .Release.Namespace }}
-  labels:
-    {{- include "apisix.labels" . | nindent 4 }}
-spec:
-  selector:
-    matchLabels:
-      {{- include "apisix.selectorLabels" . | nindent 6 }}
-  {{- if .Values.updateStrategy }}
-  updateStrategy: {{ toYaml .Values.updateStrategy | nindent 4 }}
-  {{- end }}
-  template:
-  {{- include "apisix.podTemplate" . | nindent 4 }}
-{{- end }}
diff --git a/charts/apisix/templates/deployment.yaml 
b/charts/apisix/templates/deployment.yaml
index 8ce2fcb..1b6b843 100644
--- a/charts/apisix/templates/deployment.yaml
+++ b/charts/apisix/templates/deployment.yaml
@@ -13,24 +13,298 @@
 # 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 and (.Values.apisix.enabled) (eq .Values.apisix.kind "Deployment") }}
 apiVersion: apps/v1
-kind: Deployment
+kind: {{ ternary "DaemonSet" "Deployment" .Values.useDaemonSet }}
 metadata:
   name: {{ include "apisix.fullname" . }}
   namespace: {{ .Release.Namespace }}
   labels:
     {{- include "apisix.labels" . | nindent 4 }}
 spec:
-{{- if not .Values.autoscaling.enabled }}
-  replicas: {{ .Values.apisix.replicaCount }}
+{{- if and (not .Values.useDaemonSet) (not .Values.autoscaling.enabled) }}
+  replicas: {{ .Values.replicaCount }}
 {{- end }}
   selector:
     matchLabels:
       {{- include "apisix.selectorLabels" . | nindent 6 }}
   {{- if .Values.updateStrategy }}
+  {{- if (not .Values.useDaemonSet) }}
   strategy: {{ toYaml .Values.updateStrategy | nindent 4 }}
+  {{- else }}
+  updateStrategy: {{ toYaml .Values.updateStrategy | nindent 4 }}
+  {{- end }}
   {{- end }}
   template:
-  {{- include "apisix.podTemplate" . | nindent 4 }}
-{{- end }}
+    metadata:
+      annotations:
+        checksum/config: {{ include (print $.Template.BasePath 
"/configmap.yaml") . | sha256sum }}
+        {{- if .Values.podAnnotations }}
+        {{- range $key, $value := $.Values.podAnnotations }}
+        {{ $key }}: {{ $value | quote }}
+        {{- end }}
+        {{- end }}
+      labels:
+        {{- include "apisix.selectorLabels" . | nindent 8 }}
+    spec:
+      {{- with .Values.global.imagePullSecrets }}
+      imagePullSecrets:
+        {{- range $.Values.global.imagePullSecrets }}
+        - name: {{ . }}
+        {{- end }}
+      {{- end }}
+      serviceAccountName: {{ include "apisix.serviceAccountName" . }}
+      {{- with .Values.podSecurityContext }}
+      securityContext: 
+        {{- . | toYaml | nindent 8 }}
+      {{- end }}
+      {{- with .Values.priorityClassName }}
+      priorityClassName: {{ . }}
+      {{- end }}
+      containers:
+        - name: {{ .Chart.Name }}
+          {{- with .Values.securityContext }}
+          securityContext:
+            {{- . | toYaml | nindent 12 }}
+          {{- end }}
+          image: "{{ .Values.image.repository }}:{{ default .Chart.AppVersion 
.Values.image.tag }}"
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          env:
+          {{- if .Values.timezone }}
+            - name: TZ
+              value: {{ .Values.timezone }}
+          {{- end }}
+          {{- if .Values.extraEnvVars }}
+          {{- include "apisix.tplvalues.render" (dict "value" 
.Values.extraEnvVars "context" $) | nindent 12 }}
+          {{- end }}
+
+          {{- if .Values.apisix.admin.credentials.secretName }}
+            - name: APISIX_ADMIN_KEY
+              valueFrom:
+                secretKeyRef:
+                  name: {{ .Values.apisix.admin.credentials.secretName }}
+                  key: admin
+            - name: APISIX_VIEWER_KEY
+              valueFrom:
+                secretKeyRef:
+                  name: {{ .Values.apisix.admin.credentials.secretName }}
+                  key: viewer
+          {{- end }}
+
+          {{- if or (and .Values.etcd.enabled .Values.etcd.auth.rbac.create) 
(and (not .Values.etcd.enabled) .Values.externalEtcd.user) }}
+            - name: APISIX_ETCD_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: {{ include "apisix.etcd.secretName" . }}
+                  key: {{ include "apisix.etcd.secretPasswordKey" . }}
+          {{- end }}
+
+          ports:
+            - name: http
+              containerPort: {{ .Values.service.http.containerPort }}
+              protocol: TCP
+            {{- range .Values.service.http.additionalContainerPorts }}
+            - name: http-{{ .port | toString }}
+              containerPort: {{ .port }}
+              protocol: TCP
+            {{- end }}     
+            - name: tls
+              containerPort: {{ .Values.apisix.ssl.containerPort }}
+              protocol: TCP
+            {{- range .Values.apisix.ssl.additionalContainerPorts }}
+            - name: tls-{{ .port | toString }}
+              containerPort: {{ .port }}
+              protocol: TCP
+            {{- end }}     
+            {{- if .Values.apisix.admin.enabled }}
+            - name: admin
+              containerPort: {{ .Values.apisix.admin.port }}
+              protocol: TCP
+            {{- end }}
+            {{- if .Values.apisix.prometheus.enabled }}
+            - name: prometheus
+              containerPort: {{ .Values.apisix.prometheus.containerPort }}
+              protocol: TCP
+            {{- end }}
+            {{- if and .Values.service.stream.enabled (or (gt (len 
.Values.service.stream.tcp) 0) (gt (len .Values.service.stream.udp) 0)) }}
+            {{- with .Values.service.stream }}
+            {{- if (gt (len .tcp) 0) }}
+            {{- range $index, $port := .tcp }}
+            - name: proxy-tcp-{{ $index | toString }}
+            {{- if kindIs "map" $port }}
+              containerPort: {{ splitList ":" ($port.addr | toString) | last }}
+            {{- else }}
+              containerPort: {{ $port }}
+            {{- end }}
+              protocol: TCP
+            {{- end }}
+            {{- end }}
+            {{- if (gt (len .udp) 0) }}
+            {{- range $index, $port := .udp }}
+            - name: proxy-udp-{{ $index | toString }}
+              containerPort: {{ $port }}
+              protocol: UDP
+            {{- end }}
+            {{- end }}
+            {{- end }}
+            {{- end }}
+
+          {{- if ne .Values.apisix.deployment.role "control_plane" }}
+          readinessProbe:
+            failureThreshold: 6
+            initialDelaySeconds: 10
+            periodSeconds: 10
+            successThreshold: 1
+            tcpSocket:
+              port: {{ .Values.service.http.containerPort }}
+            timeoutSeconds: 1
+          {{- end }}
+          lifecycle:
+            preStop:
+              exec:
+                command:
+                  - /bin/sh
+                  - -c
+                  - "sleep 30"
+          volumeMounts:
+          {{- if .Values.apisix.setIDFromPodUID }}
+            - mountPath: /usr/local/apisix/conf/apisix.uid
+              name: id
+              subPath: apisix.uid
+          {{- end }}
+            - mountPath: /usr/local/apisix/conf/config.yaml
+              name: apisix-config
+              subPath: config.yaml
+          {{- if and .Values.apisix.ssl.enabled 
.Values.apisix.ssl.existingCASecret }}
+            - mountPath: /usr/local/apisix/conf/ssl/{{ 
.Values.apisix.ssl.certCAFilename }}
+              name: ssl
+              subPath: {{ .Values.apisix.ssl.certCAFilename }}
+          {{- end }}
+
+          {{- if and (eq .Values.apisix.deployment.role "control_plane") 
.Values.apisix.deployment.controlPlane.certsSecret }}
+            - mountPath: /conf-server-ssl
+              name: conf-server-ssl
+          {{- end }}
+
+          {{- if and (eq .Values.apisix.deployment.mode "decoupled") 
.Values.apisix.deployment.certs.mTLSCACertSecret }}
+            - mountPath: /conf-ca-ssl
+              name: conf-ca-ssl
+          {{- end }}
+
+          {{- if and (eq .Values.apisix.deployment.mode "decoupled") 
.Values.apisix.deployment.certs.certsSecret }}
+            - mountPath: /conf-client-ssl
+              name: conf-client-ssl
+          {{- end }}
+
+          {{- if .Values.etcd.auth.tls.enabled }}
+            - mountPath: /etcd-ssl
+              name: etcd-ssl
+          {{- end }}
+          {{- if .Values.apisix.customPlugins.enabled }}
+          {{- range $plugin := .Values.apisix.customPlugins.plugins }}
+          {{- range $mount := $plugin.configMap.mounts }}
+          {{- if ne $plugin.configMap.name "" }}
+            - mountPath: {{ $mount.path }}
+              name: plugin-{{ $plugin.configMap.name }}
+              subPath: {{ $mount.key }}
+          {{- end }}
+          {{- end }}
+          {{- end }}
+          {{- end }}
+          {{- if .Values.apisix.luaModuleHook.enabled }}
+          {{- range $mount := .Values.apisix.luaModuleHook.configMapRef.mounts 
}}
+            - mountPath: {{ $mount.path }}
+              name: lua-module-hook
+              subPath: {{ $mount.key }}
+          {{- end }}
+          {{- end }}
+          {{- if .Values.extraVolumeMounts }}
+          {{- toYaml .Values.extraVolumeMounts | nindent 12 }}
+          {{- end }}
+          resources:
+          {{- toYaml .Values.resources | nindent 12 }}
+      {{- if .Values.hostNetwork }}
+      hostNetwork: true
+      dnsPolicy: ClusterFirstWithHostNet
+      {{- end }}
+      hostNetwork: {{ .Values.hostNetwork }}
+      initContainers:
+        {{- if .Values.etcd.enabled }}
+        - name: wait-etcd
+          image: {{ .Values.initContainer.image }}:{{ 
.Values.initContainer.tag }}
+          {{- if .Values.etcd.fullnameOverride }}
+          command: ['sh', '-c', "until nc -z {{ .Values.etcd.fullnameOverride 
}} {{ .Values.etcd.service.port }}; do echo waiting for etcd `date`; sleep 2; 
done;"]
+          {{ else }}
+          command: ['sh', '-c', "until nc -z {{ .Release.Name }}-etcd.{{ 
.Release.Namespace }}.svc.{{ .Values.etcd.clusterDomain }} {{ 
.Values.etcd.service.port }}; do echo waiting for etcd `date`; sleep 2; done;"]
+          {{- end }}
+        {{- end }}
+        {{- if .Values.extraInitContainers }}
+        {{- toYaml .Values.extraInitContainers | nindent 8 }}
+        {{- end }}
+      volumes:
+        - configMap:
+            name: {{ include "apisix.fullname" . }}
+          name: apisix-config
+        {{- if and .Values.apisix.ssl.enabled 
.Values.apisix.ssl.existingCASecret }}
+        - secret:
+            secretName: {{ .Values.apisix.ssl.existingCASecret | quote }}
+          name: ssl
+        {{- end }}
+        {{- if .Values.etcd.auth.tls.enabled }}
+        - secret:
+            secretName: {{ .Values.etcd.auth.tls.existingSecret | quote }}
+          name: etcd-ssl
+        {{- end }}
+        {{- if and (eq .Values.apisix.deployment.role "control_plane") 
.Values.apisix.deployment.controlPlane.certsSecret }}
+        - secret:
+            secretName: {{ .Values.apisix.deployment.controlPlane.certsSecret 
| quote }}
+          name: conf-server-ssl
+        {{- end }}
+
+        {{- if and (eq .Values.apisix.deployment.mode "decoupled") 
.Values.apisix.deployment.certs.mTLSCACertSecret }}
+        - secret:
+            secretName: {{ .Values.apisix.deployment.certs.mTLSCACertSecret | 
quote }}
+          name: conf-ca-ssl
+        {{- end }}
+
+        {{- if and (eq .Values.apisix.deployment.mode "decoupled") 
.Values.apisix.deployment.certs.certsSecret }}
+        - secret:
+            secretName: {{ .Values.apisix.deployment.certs.certsSecret | quote 
}}
+          name: conf-client-ssl
+        {{- end }}
+        {{- if .Values.apisix.setIDFromPodUID }}
+        - downwardAPI:
+            items:
+              - path: "apisix.uid"
+                fieldRef:
+                  fieldPath: metadata.uid
+          name: id
+        {{- end }}
+        {{- if .Values.apisix.customPlugins.enabled }}
+        {{- range $plugin := .Values.apisix.customPlugins.plugins }}
+        {{- if ne $plugin.configMap.name "" }}
+        - name: plugin-{{ $plugin.configMap.name }}
+          configMap:
+            name: {{ $plugin.configMap.name }}
+        {{- end }}
+        {{- end }}
+        {{- end }}
+        {{- if .Values.apisix.luaModuleHook.enabled }}
+        - name: lua-module-hook
+          configMap:
+            name: {{ .Values.apisix.luaModuleHook.configMapRef.name }}
+        {{- end }}
+        {{- if .Values.extraVolumes }}
+        {{- toYaml .Values.extraVolumes | nindent 8 }}
+        {{- end }}
+      {{- with .Values.nodeSelector }}
+      nodeSelector:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.affinity }}
+      affinity:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.tolerations }}
+      tolerations:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
diff --git a/charts/apisix/templates/etcd-secret.yaml 
b/charts/apisix/templates/etcd-secret.yaml
new file mode 100644
index 0000000..ffc15d8
--- /dev/null
+++ b/charts/apisix/templates/etcd-secret.yaml
@@ -0,0 +1,10 @@
+{{- if and .Values.externalEtcd.user (and (not .Values.etcd.enabled) (not 
.Values.externalEtcd.existingSecret)) }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "apisix.etcd.secretName" . }}
+  namespace: {{ .Release.Namespace }}
+type: Opaque
+data:
+  {{ .Values.externalEtcd.secretPasswordKey }}: {{ 
.Values.externalEtcd.password | b64enc | quote }}
+{{- end }}
diff --git a/charts/apisix/templates/hpa.yaml b/charts/apisix/templates/hpa.yaml
index c994c88..db3acc5 100644
--- a/charts/apisix/templates/hpa.yaml
+++ b/charts/apisix/templates/hpa.yaml
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- if and .Values.apisix.enabled .Values.autoscaling.enabled }}
+{{- if .Values.autoscaling.enabled }}
 
 apiVersion: autoscaling/{{ .Values.autoscaling.version }}
 kind: HorizontalPodAutoscaler
diff --git a/charts/apisix/templates/ingress-admin.yaml 
b/charts/apisix/templates/ingress-admin.yaml
index 8d5e3ff..45b8747 100644
--- a/charts/apisix/templates/ingress-admin.yaml
+++ b/charts/apisix/templates/ingress-admin.yaml
@@ -14,12 +14,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- if (and .Values.admin.enabled .Values.admin.ingress.enabled) -}}
+{{- if (and .Values.apisix.admin.enabled .Values.apisix.admin.ingress.enabled) 
-}}
 {{- $fullName := include "apisix.fullname" . -}}
-{{- $svcPort := .Values.admin.servicePort -}}
-{{- if and .Values.admin.ingress.className (not (semverCompare ">=1.18-0" 
.Capabilities.KubeVersion.GitVersion)) }}
-  {{- if not (hasKey .Values.admin.ingress.annotations 
"kubernetes.io/ingress.class") }}
-  {{- $_ := set .Values.admin.ingress.annotations 
"kubernetes.io/ingress.class" .Values.admin.ingress.className}}
+{{- $svcPort := .Values.apisix.admin.servicePort -}}
+{{- if and .Values.apisix.admin.ingress.className (not (semverCompare 
">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
+  {{- if not (hasKey .Values.apisix.admin.ingress.annotations 
"kubernetes.io/ingress.class") }}
+  {{- $_ := set .Values.apisix.admin.ingress.annotations 
"kubernetes.io/ingress.class" .Values.apisix.admin.ingress.className}}
   {{- end }}
 {{- end }}
 {{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.Version }}
@@ -34,17 +34,17 @@ metadata:
   name: {{ $fullName }}-admin
   labels:
     {{- include "apisix.labels" . | nindent 4 }}
-  {{- with .Values.admin.ingress.annotations }}
+  {{- with .Values.apisix.admin.ingress.annotations }}
   annotations:
     {{- toYaml . | nindent 4 }}
   {{- end }}
 spec:
-  {{- if and .Values.admin.ingress.className (semverCompare ">=1.18-0" 
.Capabilities.KubeVersion.GitVersion) }}
-  ingressClassName: {{ .Values.admin.ingress.className }}
+  {{- if and .Values.apisix.admin.ingress.className (semverCompare ">=1.18-0" 
.Capabilities.KubeVersion.GitVersion) }}
+  ingressClassName: {{ .Values.apisix.admin.ingress.className }}
   {{- end }}
-  {{- if .Values.admin.ingress.tls }}
+  {{- if .Values.apisix.admin.ingress.tls }}
   tls:
-    {{- range .Values.admin.ingress.tls }}
+    {{- range .Values.apisix.admin.ingress.tls }}
     - hosts:
         {{- range .hosts }}
         - {{ . | quote }}
@@ -53,7 +53,7 @@ spec:
     {{- end }}
   {{- end }}
   rules:
-    {{- range .Values.admin.ingress.hosts }}
+    {{- range .Values.apisix.admin.ingress.hosts }}
     - host: {{ .host | quote }}
       http:
         paths:
diff --git a/charts/apisix/templates/ingress.yaml 
b/charts/apisix/templates/ingress.yaml
index 7ab3347..75d52d4 100644
--- a/charts/apisix/templates/ingress.yaml
+++ b/charts/apisix/templates/ingress.yaml
@@ -14,12 +14,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- if (and .Values.apisix.enabled .Values.gateway.ingress.enabled) -}}
+{{- if (.Values.ingress.enabled) -}}
 {{- $fullName := include "apisix.fullname" . -}}
-{{- $svcPort := .Values.gateway.http.servicePort -}}
-{{- if and .Values.gateway.ingress.className (not (semverCompare ">=1.18-0" 
.Capabilities.KubeVersion.GitVersion)) }}
-  {{- if not (hasKey .Values.gateway.ingress.annotations 
"kubernetes.io/ingress.class") }}
-  {{- $_ := set .Values.gateway.ingress.annotations 
"kubernetes.io/ingress.class" .Values.gateway.ingress.className}}
+{{- $svcPort := .Values.service.http.servicePort -}}
+{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" 
.Capabilities.KubeVersion.GitVersion)) }}
+  {{- if not (hasKey .Values.ingress.annotations 
"kubernetes.io/ingress.class") }}
+  {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" 
.Values.ingress.className}}
   {{- end }}
 {{- end }}
 {{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.Version }}
@@ -34,17 +34,17 @@ metadata:
   name: {{ $fullName }}
   labels:
     {{- include "apisix.labels" . | nindent 4 }}
-  {{- with .Values.gateway.ingress.annotations }}
+  {{- with .Values.ingress.annotations }}
   annotations:
     {{- toYaml . | nindent 4 }}
   {{- end }}
 spec:
-  {{- if and .Values.gateway.ingress.className (semverCompare ">=1.18-0" 
.Capabilities.KubeVersion.GitVersion) }}
-  ingressClassName: {{ .Values.gateway.ingress.className }}
+  {{- if and .Values.ingress.className (semverCompare ">=1.18-0" 
.Capabilities.KubeVersion.GitVersion) }}
+  ingressClassName: {{ .Values.ingress.className }}
   {{- end }}
-  {{- if .Values.gateway.ingress.tls }}
+  {{- if .Values.ingress.tls }}
   tls:
-    {{- range .Values.gateway.ingress.tls }}
+    {{- range .Values.ingress.tls }}
     - hosts:
         {{- range .hosts }}
         - {{ . | quote }}
@@ -53,7 +53,7 @@ spec:
     {{- end }}
   {{- end }}
   rules:
-    {{- range .Values.gateway.ingress.hosts }}
+    {{- range .Values.ingress.hosts }}
     - host: {{ .host | quote }}
       http:
         paths:
diff --git a/charts/apisix/templates/pdb.yaml b/charts/apisix/templates/pdb.yaml
index e37239f..df8b796 100644
--- a/charts/apisix/templates/pdb.yaml
+++ b/charts/apisix/templates/pdb.yaml
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- if (and .Values.apisix.enabled .Values.apisix.podDisruptionBudget.enabled) 
}}
+{{- if (.Values.podDisruptionBudget.enabled) }}
 apiVersion: policy/v1beta1
 kind: PodDisruptionBudget
 metadata:
@@ -23,10 +23,10 @@ metadata:
   labels:
     {{- include "apisix.labels" . | nindent 4 }}
 spec:
-{{- if .Values.apisix.podDisruptionBudget.minAvailable }}
-  minAvailable: {{ .Values.apisix.podDisruptionBudget.minAvailable }}
+{{- if .Values.podDisruptionBudget.minAvailable }}
+  minAvailable: {{ .Values.podDisruptionBudget.minAvailable }}
 {{- else }}
-  maxUnavailable: {{ .Values.apisix.podDisruptionBudget.maxUnavailable }}
+  maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }}
 {{- end }}
   selector:
     matchLabels:
diff --git a/charts/apisix/templates/service-admin.yaml 
b/charts/apisix/templates/service-admin.yaml
index 4a033d2..c776c6e 100644
--- a/charts/apisix/templates/service-admin.yaml
+++ b/charts/apisix/templates/service-admin.yaml
@@ -13,44 +13,44 @@
 # 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 (and .Values.apisix.enabled .Values.admin.enabled) }}
+{{ if (.Values.apisix.admin.enabled) }}
 apiVersion: v1
 kind: Service
 metadata:
   name: {{ include "apisix.fullname" . }}-admin
   namespace: {{ .Release.Namespace }}
   annotations:
-    {{- range $key, $value := .Values.admin.annotations }}
+    {{- range $key, $value := .Values.apisix.admin.annotations }}
       {{ $key }}: {{ $value | quote }}
     {{- end }}
   labels:
     {{- include "apisix.labels" . | nindent 4 }}
     app.kubernetes.io/service: apisix-admin
 spec:
-  type: {{ .Values.admin.type }}
-  {{- if eq .Values.admin.type "LoadBalancer" }}
-  {{- if .Values.admin.loadBalancerIP }}
-  loadBalancerIP: {{ .Values.admin.loadBalancerIP }}
+  type: {{ .Values.apisix.admin.type }}
+  {{- if eq .Values.apisix.admin.type "LoadBalancer" }}
+  {{- if .Values.apisix.admin.loadBalancerIP }}
+  loadBalancerIP: {{ .Values.apisix.admin.loadBalancerIP }}
   {{- end }}
-  {{- if .Values.admin.loadBalancerSourceRanges }}
+  {{- if .Values.apisix.admin.loadBalancerSourceRanges }}
   loadBalancerSourceRanges:
-  {{- range $cidr := .Values.admin.loadBalancerSourceRanges }}
+  {{- range $cidr := .Values.apisix.admin.loadBalancerSourceRanges }}
   - {{ $cidr }}
   {{- end }}
   {{- end }}
   {{- end }}
-  {{- if gt (len .Values.admin.externalIPs) 0 }}
+  {{- if gt (len .Values.apisix.admin.externalIPs) 0 }}
   externalIPs:
-  {{- range $ip := .Values.admin.externalIPs }}
+  {{- range $ip := .Values.apisix.admin.externalIPs }}
   - {{ $ip }}
   {{- end }}
   {{- end }}
   ports:
   - name: apisix-admin
-    port: {{ .Values.admin.servicePort }}
-    targetPort: {{ .Values.admin.port }}
-  {{- if (and (eq .Values.admin.type "NodePort") (not (empty 
.Values.admin.nodePort))) }}
-    nodePort: {{ .Values.admin.nodePort }}
+    port: {{ .Values.apisix.admin.servicePort }}
+    targetPort: {{ .Values.apisix.admin.port }}
+  {{- if (and (eq .Values.apisix.admin.type "NodePort") (not (empty 
.Values.apisix.admin.nodePort))) }}
+    nodePort: {{ .Values.apisix.admin.nodePort }}
   {{- end }}
     protocol: TCP
   selector:
diff --git a/charts/apisix/templates/service-control-plane.yaml 
b/charts/apisix/templates/service-control-plane.yaml
index a532641..b61ffd4 100644
--- a/charts/apisix/templates/service-control-plane.yaml
+++ b/charts/apisix/templates/service-control-plane.yaml
@@ -13,14 +13,14 @@
 # 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 and (eq .Values.deployment.mode "decoupled") (eq 
.Values.deployment.role "control_plane") }}
+{{- if and (eq .Values.apisix.deployment.mode "decoupled") (eq 
.Values.apisix.deployment.role "control_plane") }}
 apiVersion: v1
 kind: Service
 metadata:
   name: {{ include "apisix.fullname" . }}-control-plane
   namespace: {{ .Release.Namespace }}
   annotations:
-    {{- range $key, $value := .Values.admin.annotations }}
+    {{- range $key, $value := .Values.apisix.admin.annotations }}
       {{ $key }}: {{ $value | quote }}
     {{- end }}
   labels:
@@ -30,8 +30,8 @@ spec:
   type: "ClusterIP"
   ports:
   - name: apisix-control-plane
-    port: {{ .Values.deployment.controlPlane.confServerPort }}
-    targetPort: {{ .Values.deployment.controlPlane.confServerPort }}
+    port: {{ .Values.apisix.deployment.controlPlane.confServerPort }}
+    targetPort: {{ .Values.apisix.deployment.controlPlane.confServerPort }}
     protocol: TCP
   selector:
     {{- include "apisix.selectorLabels" . | nindent 4 }}
diff --git a/charts/apisix/templates/service-gateway.yaml 
b/charts/apisix/templates/service-gateway.yaml
index 1d4aafa..7797435 100644
--- a/charts/apisix/templates/service-gateway.yaml
+++ b/charts/apisix/templates/service-gateway.yaml
@@ -14,71 +14,70 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- if .Values.apisix.enabled }}
 apiVersion: v1
 kind: Service
 metadata:
   name: {{ include "apisix.fullname" . }}-gateway
   namespace: {{ .Release.Namespace }}
   annotations:
-    {{- range $key, $value := .Values.gateway.annotations }}
+    {{- range $key, $value := .Values.service.annotations }}
       {{ $key }}: {{ $value | quote }}
     {{- end }}
   labels:
     {{- include "apisix.labels" . | nindent 4 }}
     app.kubernetes.io/service: apisix-gateway
 spec:
-  type: {{ .Values.gateway.type }}
-  externalTrafficPolicy: {{ .Values.gateway.externalTrafficPolicy }}
-  {{- if eq .Values.gateway.type "LoadBalancer" }}
-  {{- if .Values.gateway.loadBalancerIP }}
-  loadBalancerIP: {{ .Values.gateway.loadBalancerIP }}
+  type: {{ .Values.service.type }}
+  externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy }}
+  {{- if eq .Values.service.type "LoadBalancer" }}
+  {{- if .Values.service.loadBalancerIP }}
+  loadBalancerIP: {{ .Values.service.loadBalancerIP }}
   {{- end }}
-  {{- if .Values.gateway.loadBalancerSourceRanges }}
+  {{- if .Values.service.loadBalancerSourceRanges }}
   loadBalancerSourceRanges:
-  {{- range $cidr := .Values.gateway.loadBalancerSourceRanges }}
+  {{- range $cidr := .Values.service.loadBalancerSourceRanges }}
   - {{ $cidr }}
   {{- end }}
   {{- end }}
   {{- end }}
-  {{- if gt (len .Values.gateway.externalIPs) 0 }}
+  {{- if gt (len .Values.service.externalIPs) 0 }}
   externalIPs:
-  {{- range $ip := .Values.gateway.externalIPs }}
+  {{- range $ip := .Values.service.externalIPs }}
   - {{ $ip }}
   {{- end }}
   {{- end }}
   ports:
-  {{- if .Values.gateway.http.enabled }}
+  {{- if .Values.service.http.enabled }}
   - name: apisix-gateway
-    port: {{ .Values.gateway.http.servicePort }}
-    targetPort: {{ .Values.gateway.http.containerPort }}
-  {{- if (and (eq .Values.gateway.type "NodePort") (not (empty 
.Values.gateway.http.nodePort))) }}
-    nodePort: {{ .Values.gateway.http.nodePort }}
+    port: {{ .Values.service.http.servicePort }}
+    targetPort: {{ .Values.service.http.containerPort }}
+  {{- if (and (eq .Values.service.type "NodePort") (not (empty 
.Values.service.http.nodePort))) }}
+    nodePort: {{ .Values.service.http.nodePort }}
   {{- end }}
     protocol: TCP
   {{- end }}
-  {{- range .Values.gateway.http.additionalContainerPorts }}
+  {{- range .Values.service.http.additionalContainerPorts }}
   - name: apisix-gateway-{{ .port | toString }}
     port: {{ .port }}
     targetPort: {{ .port }}
     protocol: TCP
   {{- end }}
-  {{- if or .Values.gateway.tls.enabled }}
+  {{- if or .Values.apisix.ssl.enabled }}
   - name: apisix-gateway-tls
-    port: {{ .Values.gateway.tls.servicePort }}
-    targetPort: {{ .Values.gateway.tls.containerPort }}
-  {{- if (and (eq .Values.gateway.type "NodePort") (not (empty 
.Values.gateway.tls.nodePort))) }}
-    nodePort: {{ .Values.gateway.tls.nodePort }}
+    port: {{ .Values.service.tls.servicePort }}
+    targetPort: {{ .Values.apisix.ssl.containerPort }}
+  {{- if (and (eq .Values.service.type "NodePort") (not (empty 
.Values.service.tls.nodePort))) }}
+    nodePort: {{ .Values.service.tls.nodePort }}
   {{- end }}
     protocol: TCP
   {{- end }}
-  {{- range .Values.gateway.tls.additionalContainerPorts }}
+  {{- range .Values.apisix.ssl.additionalContainerPorts }}
   - name: apisix-gateway-tls-{{ .port | toString }}
     port: {{ .port }}
     targetPort: {{ .port }}
   {{- end }}
-  {{- if and .Values.gateway.stream.enabled (or (gt (len 
.Values.gateway.stream.tcp) 0) (gt (len .Values.gateway.stream.udp) 0)) }}
-  {{- with .Values.gateway.stream }}
+  {{- if and .Values.service.stream.enabled (or (gt (len 
.Values.service.stream.tcp) 0) (gt (len .Values.service.stream.udp) 0)) }}
+  {{- with .Values.service.stream }}
   {{- if (gt (len .tcp) 0) }}
   {{- range $index, $port := .tcp }}
   - name: proxy-tcp-{{ $index | toString }}
@@ -105,4 +104,3 @@ spec:
   {{- end }}
   selector:
     {{- include "apisix.selectorLabels" . | nindent 4 }}
-{{- end }}
diff --git a/charts/apisix/templates/service-metrics.yaml 
b/charts/apisix/templates/service-metrics.yaml
index aa05713..6dad0e2 100644
--- a/charts/apisix/templates/service-metrics.yaml
+++ b/charts/apisix/templates/service-metrics.yaml
@@ -13,7 +13,7 @@
 # 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 .Values.serviceMonitor.enabled}}
+{{- if .Values.apisix.prometheus.enabled}}
 apiVersion: v1
 kind: Service
 metadata:
@@ -26,8 +26,8 @@ spec:
   type: ClusterIP
   ports:
   - name: prometheus
-    port: {{ .Values.serviceMonitor.containerPort }}
-    targetPort: {{ .Values.serviceMonitor.containerPort }}
+    port: {{ .Values.apisix.prometheus.containerPort }}
+    targetPort: {{ .Values.apisix.prometheus.containerPort }}
     protocol: TCP
   selector:
     {{- include "apisix.selectorLabels" . | nindent 4 }}
diff --git a/charts/apisix/templates/service-monitor.yaml 
b/charts/apisix/templates/service-monitor.yaml
index b35b0d4..1b4d146 100644
--- a/charts/apisix/templates/service-monitor.yaml
+++ b/charts/apisix/templates/service-monitor.yaml
@@ -14,24 +14,24 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- if .Values.serviceMonitor.enabled }}
+{{- if .Values.metrics.serviceMonitor.enabled }}
 apiVersion: monitoring.coreos.com/v1
 kind: ServiceMonitor
 metadata:
-  name: {{ .Values.serviceMonitor.name | default (include "apisix.fullname" .) 
}}
-  namespace: {{ .Values.serviceMonitor.namespace | default .Release.Namespace 
}}
+  name: {{ .Values.metrics.serviceMonitor.name | default (include 
"apisix.fullname" .) }}
+  namespace: {{ .Values.metrics.serviceMonitor.namespace | default 
.Release.Namespace }}
   labels:
     {{- include "apisix.labels" . | nindent 4 }}
-    {{- if .Values.serviceMonitor.labels }}
-    {{- toYaml .Values.serviceMonitor.labels | nindent 4 }}
+    {{- if .Values.metrics.serviceMonitor.labels }}
+    {{- toYaml .Values.metrics.serviceMonitor.labels | nindent 4 }}
     {{- end }}
-  {{- if .Values.serviceMonitor.annotations }}
-  annotations: {{- toYaml .Values.serviceMonitor.annotations | nindent 4 }}
+  {{- if .Values.metrics.serviceMonitor.annotations }}
+  annotations: {{- toYaml .Values.metrics.serviceMonitor.annotations | nindent 
4 }}
   {{- end }}
 spec:
   namespaceSelector:
     matchNames:
-    - {{ .Values.serviceMonitor.namespace | default .Release.Namespace }}
+    - {{ .Values.metrics.serviceMonitor.namespace | default .Release.Namespace 
}}
   selector:
     matchLabels:
       {{- include "apisix.labels" . | nindent 6 }}
@@ -39,6 +39,6 @@ spec:
   endpoints:
   - scheme: http
     targetPort: prometheus
-    path: {{ .Values.serviceMonitor.path }}
-    interval: {{ .Values.serviceMonitor.interval }}
+    path: {{ .Values.apisix.prometheus.path }}
+    interval: {{ .Values.metrics.serviceMonitor.interval }}
 {{- end }}
diff --git a/charts/apisix/values.yaml b/charts/apisix/values.yaml
index bec9c4b..af4930e 100644
--- a/charts/apisix/values.yaml
+++ b/charts/apisix/values.yaml
@@ -22,140 +22,123 @@ global:
   # -- Global Docker registry secret names as an array
   imagePullSecrets: []
 
-apisix:
-  # -- Enable or disable Apache APISIX itself
-  # Set it to false and ingress-controller.enabled=true will deploy only 
ingress-controller
-  enabled: true
+image:
+  # -- Apache APISIX image repository
+  repository: apache/apisix
+  # -- Apache APISIX image pull policy
+  pullPolicy: IfNotPresent
+  # -- Apache APISIX image tag
+  # Overrides the image tag whose default is the chart appVersion.
+  tag: 3.3.0-debian
+
+# -- set false to use `Deployment`, set true to use `DaemonSet`
+useDaemonSet: false
+# -- if useDaemonSet is true or autoscaling.enabled is true, replicaCount not 
become effective
+replicaCount: 1
+
+# -- Set 
[priorityClassName](https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#pod-priority)
 for Apache APISIX pods
+priorityClassName: ""
+# -- Annotations to add to each pod
+podAnnotations: {}
+# -- Set the securityContext for Apache APISIX pods
+podSecurityContext: {}
+  # fsGroup: 2000
+# -- Set the securityContext for Apache APISIX container
+securityContext: {}
+  # capabilities:
+  #   drop:
+  #   - ALL
+  # readOnlyRootFilesystem: true
+  # runAsNonRoot: true
+  # runAsUser: 1000
+
+# -- See https://kubernetes.io/docs/tasks/run-application/configure-pdb/ for 
more details
+podDisruptionBudget:
+  # -- Enable or disable podDisruptionBudget
+  enabled: false
+  # -- Set the `minAvailable` of podDisruptionBudget. You can specify only one 
of `maxUnavailable` and `minAvailable` in a single PodDisruptionBudget.
+  # See [Specifying a Disruption Budget for your 
Application](https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget)
+  # for more details
+  minAvailable: 90%
+  # -- Set the maxUnavailable of podDisruptionBudget
+  maxUnavailable: 1
+
+# -- Set pod resource requests & limits
+resources: {}
+  # -- Use the host's network namespace
+
+  # We usually recommend not to specify default resources and to leave this as 
a conscious
+  # choice for the user. This also increases chances charts run on 
environments with little
+  # resources, such as Minikube. If you do want to specify resources, 
uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 
'resources:'.
+  # limits:
+  #   cpu: 100m
+  #   memory: 128Mi
+  # requests:
+  #   cpu: 100m
+  #   memory: 128Mi
+hostNetwork: false
+
+# -- Node labels for Apache APISIX pod assignment
+nodeSelector: {}
+# -- List of node taints to tolerate
+tolerations: []
+# -- Set affinity for Apache APISIX deploy
+affinity: {}
+
+# -- timezone is the timezone where apisix uses.
+# For example: "UTC" or "Asia/Shanghai"
+# This value will be set on apisix container's environment variable TZ.
+# You may need to set the timezone to be consistent with your local time zone,
+# otherwise the apisix's logs may used to retrieve event maybe in wrong 
timezone.
+timezone: ""
+
+# -- extraEnvVars An array to add extra env vars
+# e.g:
+# extraEnvVars:
+#   - name: FOO
+#     value: "bar"
+#   - name: FOO2
+#     valueFrom:
+#       secretKeyRef:
+#         name: SECRET_NAME
+#         key: KEY
+extraEnvVars: []
 
-  # -- Enable nginx IPv6 resolver
-  enableIPv6: true
+updateStrategy: {}
+  # type: RollingUpdate
 
-  # -- Whether the APISIX version number should be shown in Server header
-  enableServerTokens: true
+# -- Additional `volume`, See [Kubernetes 
Volumes](https://kubernetes.io/docs/concepts/storage/volumes/) for the detail.
+extraVolumes: []
+# - name: extras
+#   emptyDir: {}
 
-  # -- Use Pod metadata.uid as the APISIX id.
-  setIDFromPodUID: false
+# -- Additional `volume`, See [Kubernetes 
Volumes](https://kubernetes.io/docs/concepts/storage/volumes/) for the detail.
+extraVolumeMounts: []
+# - name: extras
+#   mountPath: /usr/share/extras
+#   readOnly: true
 
-  # -- Add custom 
[lua_shared_dict](https://github.com/openresty/lua-nginx-module#toc88) settings,
-  # click 
[here](https://github.com/apache/apisix-helm-chart/blob/master/charts/apisix/values.yaml#L27-L30)
 to learn the format of a shared dict
-  customLuaSharedDicts: []
-    # - name: foo
-    #   size: 10k
-    # - name: bar
-    #   size: 1m
-  # -- Whether to add a custom lua module
-  luaModuleHook:
-    enabled: false
-    # -- extend lua_package_path to load third party code
-    luaPath: ""
-    # -- the hook module which will be used to inject third party code into 
APISIX
-    # use the lua require style like: "module.say_hello"
-    hookPoint: ""
-    # -- configmap that stores the codes
-    configMapRef:
-      # -- Name of the ConfigMap where the lua module codes store
-      name: ""
-      # mounts decides how to mount the codes to the container.
-      mounts:
-        # -- Name of the ConfigMap key, for setting the mapping relationship 
between ConfigMap key and the lua module code path.
-        - key: ""
-        # -- Filepath of the plugin code, for setting the mapping relationship 
between ConfigMap key and the lua module code path.
-          path: ""
+# -- Additional `initContainers`, See [Kubernetes 
initContainers](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)
 for the detail.
+extraInitContainers: []
+# - name: init-myservice
+#   image: busybox:1.28
+#   command: ['sh', '-c', "until nslookup myservice.$(cat 
/var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do 
echo waiting for myservice; sleep 2; done"]
 
-  # -- Defines how apisix handles routing:
-  # - radixtree_uri: match route by uri(base on radixtree)
-  # - radixtree_host_uri: match route by host + uri(base on radixtree)
-  # - radixtree_uri_with_parameter: match route by uri with parameters
-  httpRouter: radixtree_host_uri
-
-  # -- Enable full customized config.yaml
-  enableCustomizedConfig: false
-  # -- If apisix.enableCustomizedConfig is true, full customized config.yaml.
-  # Please note that other settings about APISIX config will be ignored
-  customizedConfig: {}
-
-  image:
-    # -- Apache APISIX image repository
-    repository: apache/apisix
-    # -- Apache APISIX image pull policy
-    pullPolicy: IfNotPresent
-    # -- Apache APISIX image tag
-    # Overrides the image tag whose default is the chart appVersion.
-    tag: 3.3.0-debian
-
-  # -- Use a `DaemonSet` or `Deployment`
-  kind: Deployment
-  # -- kind is DaemonSet, replicaCount not become effective
-  replicaCount: 1
-
-  # -- Set 
[priorityClassName](https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#pod-priority)
 for Apache APISIX pods
-  priorityClassName: ""
-  # -- Annotations to add to each pod
-  podAnnotations: {}
-  # -- Set the securityContext for Apache APISIX pods
-  podSecurityContext: {}
-    # fsGroup: 2000
-  # -- Set the securityContext for Apache APISIX container
-  securityContext: {}
-    # capabilities:
-    #   drop:
-    #   - ALL
-    # readOnlyRootFilesystem: true
-    # runAsNonRoot: true
-    # runAsUser: 1000
-
-  # -- See https://kubernetes.io/docs/tasks/run-application/configure-pdb/ for 
more details
-  podDisruptionBudget:
-    # -- Enable or disable podDisruptionBudget
-    enabled: false
-    # -- Set the `minAvailable` of podDisruptionBudget. You can specify only 
one of `maxUnavailable` and `minAvailable` in a single PodDisruptionBudget.
-    # See [Specifying a Disruption Budget for your 
Application](https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget)
-    # for more details
-    minAvailable: 90%
-    # -- Set the maxUnavailable of podDisruptionBudget
-    maxUnavailable: 1
-
-  # -- Set pod resource requests & limits
-  resources: {}
-    # -- Use the host's network namespace
-
-    # We usually recommend not to specify default resources and to leave this 
as a conscious
-    # choice for the user. This also increases chances charts run on 
environments with little
-    # resources, such as Minikube. If you do want to specify resources, 
uncomment the following
-    # lines, adjust them as necessary, and remove the curly braces after 
'resources:'.
-    # limits:
-    #   cpu: 100m
-    #   memory: 128Mi
-    # requests:
-    #   cpu: 100m
-    #   memory: 128Mi
-  hostNetwork: false
-
-  # -- Node labels for Apache APISIX pod assignment
-  nodeSelector: {}
-  # -- List of node taints to tolerate
-  tolerations: []
-  # -- Set affinity for Apache APISIX deploy
-  affinity: {}
-
-  # -- timezone is the timezone where apisix uses.
-  # For example: "UTC" or "Asia/Shanghai"
-  # This value will be set on apisix container's environment variable TZ.
-  # You may need to set the timezone to be consistent with your local time 
zone,
-  # otherwise the apisix's logs may used to retrieve event maybe in wrong 
timezone.
-  timezone: ""
-
-  # -- extraEnvVars An array to add extra env vars
-  # e.g:
-  # extraEnvVars:
-  #   - name: FOO
-  #     value: "bar"
-  #   - name: FOO2
-  #     valueFrom:
-  #       secretKeyRef:
-  #         name: SECRET_NAME
-  #         key: KEY
-  extraEnvVars: []
+initContainer:
+  # -- Init container image
+  image: busybox
+  # -- Init container tag
+  tag: 1.28
+
+autoscaling:
+  enabled: false
+  # -- HPA version, the value is "v2" or "v2beta1", default "v2"
+  version: v2
+  minReplicas: 1
+  maxReplicas: 100
+  targetCPUUtilizationPercentage: 80
+  targetMemoryUtilizationPercentage: 80
 
 nameOverride: ""
 fullnameOverride: ""
@@ -168,55 +151,7 @@ serviceAccount:
 rbac:
   create: false
 
-deployment:
-  # -- Apache APISIX deployment mode
-  # Optional: traditional, decoupled
-  #
-  # ref: https://apisix.apache.org/docs/apisix/deployment-modes/
-  mode: traditional
-
-  # -- Deployment role
-  # Optional: traditional, data_plane, control_plane
-  #
-  # ref: https://apisix.apache.org/docs/apisix/deployment-modes/
-  role: "traditional"
-
-  # -- used for control_plane deployment mode
-  controlPlane:
-    # -- conf Server address
-    confServerPort: "9280"
-    # -- secret name used by conf Server
-    certsSecret: ""
-    # -- conf Server CA cert name in certsSecret
-    cert: ""
-    # -- conf Server cert key name in certsSecret
-    certKey: ""
-
-  # -- used for data_plane deployment mode
-  dataPlane:
-    controlPlane:
-      # -- The hosts of the control_plane used by the data_plane
-      host: []
-      # -- The prefix of the control_plane used by the data_plane
-      prefix: "/apisix"
-      # -- Timeout when the data plane connects to the control plane
-      timeout: 30
-
-  # -- certs used for certificates in decoupled mode
-  certs:
-    # -- secret name used for decoupled mode
-    certsSecret: ""
-    # -- cert name in certsSecret
-    cert: ""
-    # -- cert key in certsSecret
-    cert_key: ""
-
-    # -- trusted_ca_cert name in certsSecret
-    mTLSCACertSecret: ""
-    # -- mTLS CA cert filename in mTLSCACertSecret
-    mTLSCACert: ""
-
-gateway:
+service:
   # -- Apache APISIX service type for user access itself
   type: NodePort
   # -- Setting how the Service route external traffic
@@ -242,39 +177,15 @@ gateway:
       #   enable_http2: true
   # -- Apache APISIX service settings for tls
   tls:
-    enabled: false
     servicePort: 443
-    containerPort: 9443
-    # -- Support multiple https ports, See 
[Configuration](https://github.com/apache/apisix/blob/0bc65ea9acd726f79f80ae0abd8f50b7eb172e3d/conf/config-default.yaml#L99)
-    additionalContainerPorts: []
-      # - ip: 127.0.0.3           # Specific IP, If not set, the default value 
is `0.0.0.0`.
-      #   port: 9445
-      #   enable_http2: true
-    # -- Specifies the name of Secret contains trusted CA certificates in the 
PEM format used to verify the certificate when APISIX needs to do SSL/TLS 
handshaking with external services (e.g. etcd)
-    existingCASecret: ""
-    # -- Filename be used in the gateway.tls.existingCASecret
-    certCAFilename: ""
-    http2:
-      enabled: true
-    # -- TLS protocols allowed to use.
-    sslProtocols: "TLSv1.2 TLSv1.3"
+    # nodePort: 4443
+
   # -- Apache APISIX service settings for stream. L4 proxy (TCP/UDP)
   stream:
     enabled: false
     only: false
     tcp: []
     udp: []
-  # -- Using ingress access Apache APISIX service
-  ingress:
-    enabled: false
-    # -- Ingress annotations
-    annotations: {}
-      # kubernetes.io/ingress.class: nginx
-      # kubernetes.io/tls-acme: "true"
-    hosts:
-      - host: apisix.local
-        paths: []
-    tls: []
   #  - secretName: apisix-tls
   #    hosts:
   #      - chart-example.local
@@ -283,259 +194,376 @@ gateway:
   # labelsOverride:
   #   app.kubernetes.io/name: "{{ .Release.Name }}"
   #   app.kubernetes.io/instance: '{{ include "apisix.name" . }}'
-admin:
-  # -- Enable Admin API
-  enabled: true
-  # -- admin service type
-  type: ClusterIP
-  # loadBalancerIP: a.b.c.d
-  # loadBalancerSourceRanges:
-  #   - "143.231.0.0/16"
-  # -- IPs for which nodes in the cluster will also accept traffic for the 
servic
-  externalIPs: []
-  # -- which ip to listen on for Apache APISIX admin API. Set to `"[::]"` when 
on IPv6 single stack
-  ip: 0.0.0.0
-  # -- which port to use for Apache APISIX admin API
-  port: 9180
-  # -- Service port to use for Apache APISIX admin API
-  servicePort: 9180
-  # -- Admin API support CORS response headers
-  cors: true
-  # -- Admin API credentials
-  credentials:
-    # -- Apache APISIX admin API admin role credentials
-    admin: edd1c9f034335f136f87ad84b625c8f1
-    # -- Apache APISIX admin API viewer role credentials
-    viewer: 4054f7cf07e344346cd3f287985e76a2
-
-    # -- The APISIX Helm chart supports storing user credentials in a secret.
-    # The secret needs to contain two keys, admin and viewer, with their 
respective values set.
-    secretName: ""
-
-  allow:
-    # -- The client IP CIDR allowed to access Apache APISIX Admin API service.
-    ipList:
-      - 127.0.0.1/24
-  # -- Using ingress access Apache APISIX admin service
-  ingress:
-    enabled: false
-    # -- Ingress annotations
-    annotations:
-      {}
-      # kubernetes.io/ingress.class: nginx
-      # kubernetes.io/tls-acme: "true"
-    hosts:
-      - host: apisix-admin.local
-        paths:
-          - "/apisix"
-    tls: []
-  #  - secretName: apisix-tls
-  #    hosts:
-  #      - chart-example.local
-
-nginx:
-  workerRlimitNofile: "20480"
-  workerConnections: "10620"
-  workerProcesses: auto
-  enableCPUAffinity: true
-  envs: []
-
-# -- Customize the list of APISIX plugins to enable. By default, APISIX's 
default plugins are automatically used. See 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml)
-plugins: []
-# -- Customize the list of APISIX stream_plugins to enable. By default, 
APISIX's default stream_plugins are automatically used. See 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml)
-stream_plugins: []
-
-# -- Set APISIX plugin attributes, see 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L376)
 for more details
-pluginAttrs: {}
-
-extPlugin:
-  # -- Enable External Plugins. See [external 
plugin](https://apisix.apache.org/docs/apisix/next/external-plugin/)
-  enabled: false
-  # -- the command and its arguements to run as a subprocess
-  cmd: ["/path/to/apisix-plugin-runner/runner", "run"]
 
-wasmPlugins:
-  # -- Enable Wasm Plugins. See [wasm 
plugin](https://apisix.apache.org/docs/apisix/next/wasm/)
+# -- Using ingress access Apache APISIX service
+ingress:
   enabled: false
-  plugins: []
+  # -- Ingress annotations
+  annotations: {}
+    # kubernetes.io/ingress.class: nginx
+    # kubernetes.io/tls-acme: "true"
+  hosts:
+    - host: apisix.local
+      paths: []
+  tls: []
 
-# -- customPlugins allows you to mount your own HTTP plugins.
-customPlugins:
-  # -- Whether to configure some custom plugins
-  enabled: false
-  # -- the lua_path that tells APISIX where it can find plugins,
-  # note the last ';' is required.
-  luaPath: "/opts/custom_plugins/?.lua"
-  plugins:
-    # -- plugin name.
-    - name: "plugin-name"
-      # -- plugin attrs
-      attrs: {}
-      # -- plugin codes can be saved inside configmap object.
-      configMap:
-        # -- name of configmap.
-        name: "configmap-name"
-        # -- since keys in configmap is flat, mountPath allows to define the 
mount
-        # path, so that plugin codes can be mounted hierarchically.
-        mounts:
-          - key: "the-file-name"
-            path: "mount-path"
+# -- Observability configuration.
+metrics:
+  serviceMonitor:
+    # -- Enable or disable Apache APISIX serviceMonitor
+    enabled: false
+    # -- namespace where the serviceMonitor is deployed, by default, it is the 
same as the namespace of the apisix
+    namespace: ""
+    # -- name of the serviceMonitor, by default, it is the same as the apisix 
fullname
+    name: ""
+    # -- interval at which metrics should be scraped
+    interval: 15s
+    # -- @param serviceMonitor.labels ServiceMonitor extra labels
+    labels: {}
+    # -- @param serviceMonitor.annotations ServiceMonitor annotations
+    annotations: {}
 
-updateStrategy: {}
-  # type: RollingUpdate
+apisix:
+  # -- Enable nginx IPv6 resolver
+  enableIPv6: true
 
-# -- Additional `volume`, See [Kubernetes 
Volumes](https://kubernetes.io/docs/concepts/storage/volumes/) for the detail.
-extraVolumes: []
-# - name: extras
-#   emptyDir: {}
+  # -- Whether the APISIX version number should be shown in Server header
+  enableServerTokens: true
 
-# -- Additional `volume`, See [Kubernetes 
Volumes](https://kubernetes.io/docs/concepts/storage/volumes/) for the detail.
-extraVolumeMounts: []
-# - name: extras
-#   mountPath: /usr/share/extras
-#   readOnly: true
+  # -- Use Pod metadata.uid as the APISIX id.
+  setIDFromPodUID: false
 
-# -- Additional `initContainers`, See [Kubernetes 
initContainers](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)
 for the detail.
-extraInitContainers: []
-# - name: init-myservice
-#   image: busybox:1.28
-#   command: ['sh', '-c', "until nslookup myservice.$(cat 
/var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do 
echo waiting for myservice; sleep 2; done"]
+  # -- Whether to add a custom lua module
+  luaModuleHook:
+    enabled: false
+    # -- extend lua_package_path to load third party code
+    luaPath: ""
+    # -- the hook module which will be used to inject third party code into 
APISIX
+    # use the lua require style like: "module.say_hello"
+    hookPoint: ""
+    # -- configmap that stores the codes
+    configMapRef:
+      # -- Name of the ConfigMap where the lua module codes store
+      name: ""
+      # mounts decides how to mount the codes to the container.
+      mounts:
+        # -- Name of the ConfigMap key, for setting the mapping relationship 
between ConfigMap key and the lua module code path.
+        - key: ""
+        # -- Filepath of the plugin code, for setting the mapping relationship 
between ConfigMap key and the lua module code path.
+          path: ""
 
-discovery:
-  # -- Enable or disable Apache APISIX integration service discovery
-  enabled: false
-  # -- Registry is the same to the one in APISIX 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L281),
-  # and refer to such file for more setting details. also refer to [this 
documentation for integration service 
discovery](https://apisix.apache.org/docs/apisix/discovery)
-  registry: {}
-    # Integration service discovery registry. E.g eureka\dns\nacos\consul_kv
-    # reference:
-    # https://apisix.apache.org/docs/apisix/discovery/#configuration-for-eureka
-    # 
https://apisix.apache.org/docs/apisix/discovery/dns/#service-discovery-via-dns
-    # 
https://apisix.apache.org/docs/apisix/discovery/consul_kv/#configuration-for-consul-kv
-    # 
https://apisix.apache.org/docs/apisix/discovery/nacos/#configuration-for-nacos
-    # https://apisix.apache.org/docs/apisix/discovery/kubernetes/#configuration
-    #
-    # an eureka example:
-    # ```
-    # eureka:
-    #   host:
-    #     - "http://${username}:${password}@${eureka_host1}:${eureka_port1}";
-    #     - "http://${username}:${password}@${eureka_host2}:${eureka_port2}";
-    #   prefix: "/eureka/"
-    #   fetch_interval: 30
-    #   weight: 100
-    #   timeout:
-    #     connect: 2000
-    #     send: 2000
-    #     read: 5000
-    # ```
-    #
-    # the minimal Kubernetes example:
-    # ```
-    # kubernetes: {}
-    # ```
-    #
-    # The prerequisites for the above minimal Kubernetes example:
-    #  1. [Optional] Set `.serviceAccount.create` to `true` to create a 
dedicated ServiceAccount.
-    #     It is recommended to do so, otherwise the default ServiceAccount 
"default" will be used.
-    #  2. [Required] Set `.rbac.create` to `true` to create and bind the 
necessary RBAC resources.
-    #     This grants the ServiceAccount in use to List-Watch Kubernetes 
Endpoints resources.
-    #  3. [Required] Include the following environment variables in 
`.nginx.envs` to pass them into
-    #     nginx worker processes 
(https://nginx.org/en/docs/ngx_core_module.html#env):
-    #      - KUBERNETES_SERVICE_HOST
-    #      - KUBERNETES_SERVICE_PORT
-    #     This is for allowing the default `host` and `port` of 
`.discovery.registry.kubernetes.service`.
-
-# access log and error log configuration
-logs:
-  # -- Enable access log or not, default true
-  enableAccessLog: true
-  # -- Access log path
-  accessLog: "/dev/stdout"
-  # -- Access log format
-  accessLogFormat: '$remote_addr - $remote_user [$time_local] $http_host 
\"$request\" $status $body_bytes_sent $request_time \"$http_referer\" 
\"$http_user_agent\" $upstream_addr $upstream_status $upstream_response_time 
\"$upstream_scheme://$upstream_host$upstream_uri\"'
-  # -- Allows setting json or default characters escaping in variables
-  accessLogFormatEscape: default
-  # -- Error log path
-  errorLog: "/dev/stderr"
-  # -- Error log level
-  errorLogLevel: "warn"
-
-dns:
-  resolvers:
-    - 127.0.0.1
-    - 172.20.0.10
-    - 114.114.114.114
-    - 223.5.5.5
-    - 1.1.1.1
-    - 8.8.8.8
-  validity: 30
-  timeout: 5
+  ssl:
+    enabled: false
+    containerPort: 9443
+    # -- Support multiple https ports, See 
[Configuration](https://github.com/apache/apisix/blob/0bc65ea9acd726f79f80ae0abd8f50b7eb172e3d/conf/config-default.yaml#L99)
+    additionalContainerPorts: []
+      # - ip: 127.0.0.3           # Specific IP, If not set, the default value 
is `0.0.0.0`.
+      #   port: 9445
+      #   enable_http2: true
+    # -- Specifies the name of Secret contains trusted CA certificates in the 
PEM format used to verify the certificate when APISIX needs to do SSL/TLS 
handshaking with external services (e.g. etcd)
+    existingCASecret: ""
+    # -- Filename be used in the apisix.ssl.existingCASecret
+    certCAFilename: ""
+    http2:
+      enabled: true
+    # -- TLS protocols allowed to use.
+    sslProtocols: "TLSv1.2 TLSv1.3"
 
-initContainer:
-  # -- Init container image
-  image: busybox
-  # -- Init container tag
-  tag: 1.28
+  router:
+    # -- Defines how apisix handles routing:
+    # - radixtree_uri: match route by uri(base on radixtree)
+    # - radixtree_host_uri: match route by host + uri(base on radixtree)
+    # - radixtree_uri_with_parameter: match route by uri with parameters
+    http: radixtree_host_uri
 
-autoscaling:
-  enabled: false
-  # -- HPA version, the value is "v2" or "v2beta1", default "v2"
-  version: v2
-  minReplicas: 1
-  maxReplicas: 100
-  targetCPUUtilizationPercentage: 80
-  targetMemoryUtilizationPercentage: 80
+  fullCustomConfig:
+    # -- Enable full customized config.yaml
+    enabled: false
+    # -- If apisix.fullCustomConfig.enabled is true, full customized 
config.yaml.
+    # Please note that other settings about APISIX config will be ignored
+    config: {}
 
-# -- Custom configuration snippet.
-configurationSnippet:
-  main: |
+  deployment:
+    # -- Apache APISIX deployment mode
+    # Optional: traditional, decoupled
+    #
+    # ref: https://apisix.apache.org/docs/apisix/deployment-modes/
+    mode: traditional
 
-  httpStart: |
+    # -- Deployment role
+    # Optional: traditional, data_plane, control_plane
+    #
+    # ref: https://apisix.apache.org/docs/apisix/deployment-modes/
+    role: "traditional"
 
-  httpEnd: |
+    # -- used for control_plane deployment mode
+    controlPlane:
+      # -- conf Server address
+      confServerPort: "9280"
+      # -- secret name used by conf Server
+      certsSecret: ""
+      # -- conf Server CA cert name in certsSecret
+      cert: ""
+      # -- conf Server cert key name in certsSecret
+      certKey: ""
+
+    # -- used for data_plane deployment mode
+    dataPlane:
+      controlPlane:
+        # -- The hosts of the control_plane used by the data_plane
+        host: []
+        # -- The prefix of the control_plane used by the data_plane
+        prefix: "/apisix"
+        # -- Timeout when the data plane connects to the control plane
+        timeout: 30
+
+    # -- certs used for certificates in decoupled mode
+    certs:
+      # -- secret name used for decoupled mode
+      certsSecret: ""
+      # -- cert name in certsSecret
+      cert: ""
+      # -- cert key in certsSecret
+      cert_key: ""
+
+      # -- trusted_ca_cert name in certsSecret
+      mTLSCACertSecret: ""
+      # -- mTLS CA cert filename in mTLSCACertSecret
+      mTLSCACert: ""
+
+  admin:
+    # -- Enable Admin API
+    enabled: true
+    # -- admin service type
+    type: ClusterIP
+    # loadBalancerIP: a.b.c.d
+    # loadBalancerSourceRanges:
+    #   - "143.231.0.0/16"
+    # -- IPs for which nodes in the cluster will also accept traffic for the 
servic
+    externalIPs: []
+    # -- which ip to listen on for Apache APISIX admin API. Set to `"[::]"` 
when on IPv6 single stack
+    ip: 0.0.0.0
+    # -- which port to use for Apache APISIX admin API
+    port: 9180
+    # -- Service port to use for Apache APISIX admin API
+    servicePort: 9180
+    # -- Admin API support CORS response headers
+    cors: true
+    # -- Admin API credentials
+    credentials:
+      # -- Apache APISIX admin API admin role credentials
+      admin: edd1c9f034335f136f87ad84b625c8f1
+      # -- Apache APISIX admin API viewer role credentials
+      viewer: 4054f7cf07e344346cd3f287985e76a2
+
+      # -- The APISIX Helm chart supports storing user credentials in a secret.
+      # The secret needs to contain two keys, admin and viewer, with their 
respective values set.
+      secretName: ""
+
+    allow:
+      # -- The client IP CIDR allowed to access Apache APISIX Admin API 
service.
+      ipList:
+        - 127.0.0.1/24
+    # -- Using ingress access Apache APISIX admin service
+    ingress:
+      enabled: false
+      # -- Ingress annotations
+      annotations:
+        {}
+        # kubernetes.io/ingress.class: nginx
+        # kubernetes.io/tls-acme: "true"
+      hosts:
+        - host: apisix-admin.local
+          paths:
+            - "/apisix"
+      tls: []
+    #  - secretName: apisix-tls
+    #    hosts:
+    #      - chart-example.local
+
+  nginx:
+    workerRlimitNofile: "20480"
+    workerConnections: "10620"
+    workerProcesses: auto
+    enableCPUAffinity: true
+    envs: []
+    # access log and error log configuration
+    logs:
+      # -- Enable access log or not, default true
+      enableAccessLog: true
+      # -- Access log path
+      accessLog: "/dev/stdout"
+      # -- Access log format
+      accessLogFormat: '$remote_addr - $remote_user [$time_local] $http_host 
\"$request\" $status $body_bytes_sent $request_time \"$http_referer\" 
\"$http_user_agent\" $upstream_addr $upstream_status $upstream_response_time 
\"$upstream_scheme://$upstream_host$upstream_uri\"'
+      # -- Allows setting json or default characters escaping in variables
+      accessLogFormatEscape: default
+      # -- Error log path
+      errorLog: "/dev/stderr"
+      # -- Error log level
+      errorLogLevel: "warn"
+    # -- Custom configuration snippet.
+    configurationSnippet:
+      main: |
+
+      httpStart: |
+
+      httpEnd: |
+
+      httpSrv: |
+
+      httpAdmin: |
+
+      stream: |
+
+    # -- Add custom 
[lua_shared_dict](https://github.com/openresty/lua-nginx-module#toc88) settings,
+    # click 
[here](https://github.com/apache/apisix-helm-chart/blob/master/charts/apisix/values.yaml#L27-L30)
 to learn the format of a shared dict
+    customLuaSharedDicts: []
+      # - name: foo
+      #   size: 10k
+      # - name: bar
+      #   size: 1m
+
+  discovery:
+    # -- Enable or disable Apache APISIX integration service discovery
+    enabled: false
+    # -- Registry is the same to the one in APISIX 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L281),
+    # and refer to such file for more setting details. also refer to [this 
documentation for integration service 
discovery](https://apisix.apache.org/docs/apisix/discovery)
+    registry: {}
+      # Integration service discovery registry. E.g eureka\dns\nacos\consul_kv
+      # reference:
+      # 
https://apisix.apache.org/docs/apisix/discovery/#configuration-for-eureka
+      # 
https://apisix.apache.org/docs/apisix/discovery/dns/#service-discovery-via-dns
+      # 
https://apisix.apache.org/docs/apisix/discovery/consul_kv/#configuration-for-consul-kv
+      # 
https://apisix.apache.org/docs/apisix/discovery/nacos/#configuration-for-nacos
+      # 
https://apisix.apache.org/docs/apisix/discovery/kubernetes/#configuration
+      #
+      # an eureka example:
+      # ```
+      # eureka:
+      #   host:
+      #     - "http://${username}:${password}@${eureka_host1}:${eureka_port1}";
+      #     - "http://${username}:${password}@${eureka_host2}:${eureka_port2}";
+      #   prefix: "/eureka/"
+      #   fetch_interval: 30
+      #   weight: 100
+      #   timeout:
+      #     connect: 2000
+      #     send: 2000
+      #     read: 5000
+      # ```
+      #
+      # the minimal Kubernetes example:
+      # ```
+      # kubernetes: {}
+      # ```
+      #
+      # The prerequisites for the above minimal Kubernetes example:
+      #  1. [Optional] Set `.serviceAccount.create` to `true` to create a 
dedicated ServiceAccount.
+      #     It is recommended to do so, otherwise the default ServiceAccount 
"default" will be used.
+      #  2. [Required] Set `.rbac.create` to `true` to create and bind the 
necessary RBAC resources.
+      #     This grants the ServiceAccount in use to List-Watch Kubernetes 
Endpoints resources.
+      #  3. [Required] Include the following environment variables in 
`.nginx.envs` to pass them into
+      #     nginx worker processes 
(https://nginx.org/en/docs/ngx_core_module.html#env):
+      #      - KUBERNETES_SERVICE_HOST
+      #      - KUBERNETES_SERVICE_PORT
+      #     This is for allowing the default `host` and `port` of 
`.discovery.registry.kubernetes.service`.
+
+  dns:
+    resolvers:
+      - 127.0.0.1
+      - 172.20.0.10
+      - 114.114.114.114
+      - 223.5.5.5
+      - 1.1.1.1
+      - 8.8.8.8
+    validity: 30
+    timeout: 5
+
+  vault:
+    # -- Enable or disable the vault integration
+    enabled: false
+    # -- The host address where the vault server is running.
+    host: ""
+    # -- HTTP timeout for each request.
+    timeout: 10
+    # -- The generated token from vault instance that can grant access to read 
data from the vault.
+    token: ""
+    # -- Prefix allows you to better enforcement of policies.
+    prefix: ""
+
+  prometheus:
+    # ref: https://apisix.apache.org/docs/apisix/plugins/prometheus/
+    enabled: false
+    # -- path of the metrics endpoint
+    path: /apisix/prometheus/metrics
+    # -- prefix of the metrics
+    metricPrefix: apisix_
+    # -- container port where the metrics are exposed
+    containerPort: 9091
+
+  # -- Customize the list of APISIX plugins to enable. By default, APISIX's 
default plugins are automatically used. See 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml)
+  plugins: []
+  # -- Customize the list of APISIX stream_plugins to enable. By default, 
APISIX's default stream_plugins are automatically used. See 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml)
+  stream_plugins: []
 
-  httpSrv: |
+  # -- Set APISIX plugin attributes, see 
[config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L376)
 for more details
+  pluginAttrs: {}
 
-  httpAdmin: |
+  extPlugin:
+    # -- Enable External Plugins. See [external 
plugin](https://apisix.apache.org/docs/apisix/next/external-plugin/)
+    enabled: false
+    # -- the command and its arguements to run as a subprocess
+    cmd: ["/path/to/apisix-plugin-runner/runner", "run"]
 
-  stream: |
+  wasm:
+    # -- Enable Wasm Plugins. See [wasm 
plugin](https://apisix.apache.org/docs/apisix/next/wasm/)
+    enabled: false
+    plugins: []
 
-# -- Observability configuration.
-# ref: https://apisix.apache.org/docs/apisix/plugins/prometheus/
-serviceMonitor:
-  # -- Enable or disable Apache APISIX serviceMonitor
-  enabled: false
-  # -- namespace where the serviceMonitor is deployed, by default, it is the 
same as the namespace of the apisix
-  namespace: ""
-  # -- name of the serviceMonitor, by default, it is the same as the apisix 
fullname
-  name: ""
-  # -- interval at which metrics should be scraped
-  interval: 15s
-  # -- path of the metrics endpoint
-  path: /apisix/prometheus/metrics
-  # -- prefix of the metrics
-  metricPrefix: apisix_
-  # -- container port where the metrics are exposed
-  containerPort: 9091
-  # -- @param serviceMonitor.labels ServiceMonitor extra labels
-  labels: {}
-  # -- @param serviceMonitor.annotations ServiceMonitor annotations
-  annotations: {}
+  # -- customPlugins allows you to mount your own HTTP plugins.
+  customPlugins:
+    # -- Whether to configure some custom plugins
+    enabled: false
+    # -- the lua_path that tells APISIX where it can find plugins,
+    # note the last ';' is required.
+    luaPath: "/opts/custom_plugins/?.lua"
+    plugins:
+      # -- plugin name.
+      - name: "plugin-name"
+        # -- plugin attrs
+        attrs: {}
+        # -- plugin codes can be saved inside configmap object.
+        configMap:
+          # -- name of configmap.
+          name: "configmap-name"
+          # -- since keys in configmap is flat, mountPath allows to define the 
mount
+          # path, so that plugin codes can be mounted hierarchically.
+          mounts:
+            - key: "the-file-name"
+              path: "mount-path"
+
+# -- external etcd configuration. If etcd.enabled is false, these 
configuration will be used.
+externalEtcd:
+  # -- if etcd.enabled is false, use external etcd, support multiple address, 
if your etcd cluster enables TLS, please use https scheme, e.g. 
https://127.0.0.1:2379.
+  host:
+    # host or ip e.g. http://172.20.128.89:2379
+    - http://etcd.host:2379
+  # -- if etcd.enabled is false, user for external etcd. Set empty to disable 
authentication
+  user: root
+  # -- if etcd.enabled is true, use etcd.auth.rbac.rootPassword instead.
+  # -- if etcd.enabled is false and externalEtcd.existingSecret is not empty, 
the password should store in the corresponding secret
+  # -- if etcd.enabled is false and externalEtcd.existingSecret is empty, 
externalEtcd.password is the passsword for external etcd.
+  password: ""
+  # -- if externalEtcd.existingSecret is the name of secret containing the 
external etcd password
+  existingSecret: ""
+  # -- externalEtcd.secretPasswordKey Key inside the secret containing the 
external etcd password
+  secretPasswordKey: "etcd-root-password"
 
 # -- etcd configuration
 # use the FQDN address or the IP of the etcd
 etcd:
   # -- install etcd(v3) by default, set false if do not want to install 
etcd(v3) together
   enabled: true
-  # -- if etcd.enabled is false, use external etcd, support multiple address, 
if your etcd cluster enables TLS, please use https scheme, e.g. 
https://127.0.0.1:2379.
-  host:
-    # host or ip e.g. http://172.20.128.89:2379
-    - http://etcd.host:2379
-  # -- if etcd.enabled is false, username for external etcd. If etcd.enabled 
is true, use etcd.auth.rbac.rootPassword instead.
-  user: ""
-  # -- if etcd.enabled is false, password for external etcd. If etcd.enabled 
is true, use etcd.auth.rbac.rootPassword instead.
-  password: ""
   # -- apisix configurations prefix
   prefix: "/apisix"
   # -- Set the timeout value in seconds for subsequent socket operations from 
apisix to etcd cluster
@@ -588,15 +616,3 @@ ingress-controller:
   config:
     apisix:
       adminAPIVersion: "v3"
-
-vault:
-  # -- Enable or disable the vault integration
-  enabled: false
-  # -- The host address where the vault server is running.
-  host: ""
-  # -- HTTP timeout for each request.
-  timeout: 10
-  # -- The generated token from vault instance that can grant access to read 
data from the vault.
-  token: ""
-  # -- Prefix allows you to better enforcement of policies.
-  prefix: ""


Reply via email to