You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2023/03/25 12:24:17 UTC

[skywalking-showcase] 01/01: Migrate to Helm Chart

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

kezhenxu94 pushed a commit to branch helm
in repository https://gitbox.apache.org/repos/asf/skywalking-showcase.git

commit d1eb146e5f123010774887fc1f63811d8a8d37d1
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Sat Mar 25 20:24:05 2023 +0800

    Migrate to Helm Chart
---
 .gitignore                                         |   5 +
 deploy/platform/docker/Makefile.in                 |   2 +-
 ...ysql.yaml => docker-compose.mysql-monitor.yaml} |   0
 ...yaml => docker-compose.postgresql-monitor.yaml} |   0
 ...pose.vm.yaml => docker-compose.vm-monitor.yaml} |   0
 deploy/platform/kubernetes/Chart.yaml              |  54 ++++
 deploy/platform/kubernetes/Makefile                | 145 +++++++---
 deploy/platform/kubernetes/Makefile.in             |   5 +-
 .../kubernetes/feature-cluster/permissions.yaml    |  57 ----
 .../kubernetes/feature-cluster/resources.yaml      | 310 ---------------------
 .../feature-elasticsearch/resources.yaml           |  65 -----
 .../kubernetes/feature-satellite/permissions.yaml  |  48 ----
 .../kubernetes/feature-satellite/resources.yaml    |  75 -----
 .../feature-single-node/permissions.yaml           |  52 ----
 .../kubernetes/feature-single-node/resources.yaml  | 221 ---------------
 deploy/platform/kubernetes/features.mk             | 104 +------
 deploy/platform/kubernetes/templates/NOTES.txt     |  56 ++++
 deploy/platform/kubernetes/templates/_helpers.tpl  |  35 +++
 .../{ => templates}/feature-agent/resources.yaml   |  87 ++++--
 .../feature-apisix-monitor/permissions.yaml        |   6 +-
 .../feature-apisix-monitor/resources.yaml          |   4 +-
 .../{ => templates}/feature-event/permissions.yaml |   5 +-
 .../{ => templates}/feature-event/resources.yaml   |  36 +--
 .../{ => templates}/feature-event/scaler.yaml      |  11 +-
 .../{ => templates}/feature-function/resource.yaml |  13 +-
 .../feature-istiod-monitor/open-telemetry.yaml     |   4 +-
 .../feature-istiod-monitor/permissions.yaml        |   6 +-
 .../feature-kubernetes-monitor/open-telemetry.yaml |   6 +-
 .../feature-kubernetes-monitor/permissions.yaml    |   5 +-
 .../feature-mysql-monitor}/fluent-bit.yaml         |   6 +-
 .../feature-mysql-monitor}/mysql.yaml              |   2 +
 .../feature-mysql-monitor}/open-telemetry.yaml     |   2 +
 .../feature-mysql-monitor}/permissions.yaml        |   6 +-
 .../feature-postgresql-monitor}/fluent-bit.yaml    |   5 +-
 .../open-telemetry.yaml                            |   3 +
 .../feature-postgresql-monitor}/permissions.yaml   |   6 +-
 .../feature-postgresql-monitor}/psql.yaml          |   3 +
 .../feature-promql/configmaps.yaml}                |  17 +-
 .../{ => templates}/feature-promql/resources.yaml  |  21 +-
 .../{ => templates}/feature-rover/permissions.yaml |   6 +-
 .../{ => templates}/feature-rover/profiling.yaml   |  21 +-
 .../{ => templates}/feature-rover/resources.yaml   |  18 +-
 .../feature-so11y/open-telemetry.yaml              |   3 +
 .../{ => templates}/feature-so11y/permissions.yaml |   6 +-
 .../feature-trace-profiling/profiling.yaml         |   9 +-
 .../feature-vm-monitor}/open-telemetry.yaml        |   3 +
 .../feature-vm-monitor}/permissions.yaml           |   6 +-
 .../feature-vm-monitor}/vm.yaml                    |   3 +
 deploy/platform/kubernetes/values.yaml             | 259 +++++++++++++++++
 docs/readme.md                                     |   8 +-
 scripts/wait-cert-manager-ready.sh                 |  59 ----
 51 files changed, 744 insertions(+), 1145 deletions(-)

diff --git a/.gitignore b/.gitignore
index 6388ee9..49fe0f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -60,3 +60,8 @@ out/
 
 ### VS Code ###
 .vscode/
+
+deploy/platform/kubernetes/Chart.lock
+deploy/platform/kubernetes/charts/
+
+deploy/platform/kubernetes/generated
diff --git a/deploy/platform/docker/Makefile.in b/deploy/platform/docker/Makefile.in
index a0bea00..6c8ef8f 100644
--- a/deploy/platform/docker/Makefile.in
+++ b/deploy/platform/docker/Makefile.in
@@ -17,4 +17,4 @@
 #
 
 .EXPORT_ALL_VARIABLES:
-FEATURE_FLAGS ?= agent,cluster,so11y,vm,event,mysql,apisix-monitor,promql
+FEATURE_FLAGS ?= agent,cluster,so11y,vm-monitor,event,mysql-monitor,apisix-monitor,promql
diff --git a/deploy/platform/docker/docker-compose.mysql.yaml b/deploy/platform/docker/docker-compose.mysql-monitor.yaml
similarity index 100%
rename from deploy/platform/docker/docker-compose.mysql.yaml
rename to deploy/platform/docker/docker-compose.mysql-monitor.yaml
diff --git a/deploy/platform/docker/docker-compose.postgresql.yaml b/deploy/platform/docker/docker-compose.postgresql-monitor.yaml
similarity index 100%
rename from deploy/platform/docker/docker-compose.postgresql.yaml
rename to deploy/platform/docker/docker-compose.postgresql-monitor.yaml
diff --git a/deploy/platform/docker/docker-compose.vm.yaml b/deploy/platform/docker/docker-compose.vm-monitor.yaml
similarity index 100%
rename from deploy/platform/docker/docker-compose.vm.yaml
rename to deploy/platform/docker/docker-compose.vm-monitor.yaml
diff --git a/deploy/platform/kubernetes/Chart.yaml b/deploy/platform/kubernetes/Chart.yaml
new file mode 100644
index 0000000..612daf4
--- /dev/null
+++ b/deploy/platform/kubernetes/Chart.yaml
@@ -0,0 +1,54 @@
+# 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.
+
+apiVersion: v2
+name: skywalking-showcase
+home: https://skywalking.apache.org
+version: 0.0.0
+description: Apache SkyWalking showcase
+icon: https://raw.githubusercontent.com/apache/skywalking-kubernetes/master/logo/sw-logo-for-chart.jpg
+sources:
+  - https://github.com/apache/skywalking-showcase
+dependencies:
+  - name: skywalking-helm
+    version: 0.0.0-8cf4be873ca693340408b854d128d97fd088614e
+    repository: oci://ghcr.io/apache/skywalking-kubernetes
+
+    # @feature: java-agent-injector; the java agent injector is a component of the swck operator, so we need to deploy the swck operator firstly
+  - name: skywalking-helm-swck-operator
+    version: 0.0.0-8cf4be873ca693340408b854d128d97fd088614e
+    repository: oci://ghcr.io/apache/skywalking-kubernetes
+    condition: agentInjector.enabled
+
+    # @feature: function; install open function resources
+  - name: openfunction
+    version: 0.5.0
+    repository: https://openfunction.github.io/charts
+    condition: openfunction.enabled
+
+  - name: kube-state-metrics
+    version: 5.0.1
+    repository: https://prometheus-community.github.io/helm-charts
+    condition: kube-state-metrics.enabled
+
+  - name: base
+    version: 1.14.4
+    repository: https://istio-release.storage.googleapis.com/charts
+    condition: istio.enabled
+
+  - name: istiod
+    version: 1.14.4
+    repository: https://istio-release.storage.googleapis.com/charts
+    condition: istio.enabled
diff --git a/deploy/platform/kubernetes/Makefile b/deploy/platform/kubernetes/Makefile
index e7c1565..e3d456b 100644
--- a/deploy/platform/kubernetes/Makefile
+++ b/deploy/platform/kubernetes/Makefile
@@ -26,47 +26,118 @@ ifneq (,$(findstring satellite,$(features)))
 	BACKEND_SERVICE := satellite
 endif
 
-# Deploy
-deploy_features := $(foreach r,$(features),deploy.$(r))
-.PHONY: $(deploy_features)
-$(deploy_features): %: %.resources
-
-deploy_resources := $(foreach r,$(deploy_features),$(r).resources)
-.PHONY: $(deploy_resources)
-$(deploy_resources): deploy.%.resources: %
-	$(eval resources := $(wildcard $(shell pwd)/$</*))
-	@$(foreach resource, $(resources), docker run --rm -v "$(pwd)/$(resource)":/input \
-		$(foreach v,$(EXPORTED_VARS),-e $(v)) \
-		bhgedigital/envsubst sh -c "envsubst < /input" | kubectl -n $(NAMESPACE) apply -f - ; \
-	)
-
-.PHONY: deploy
-deploy: $(deploy_features)
-ifneq ($(SHOW_TIPS),false)
-	@echo
-	@echo "Now wait the Pods to be ready and use the following command to expose the port of SkyWalking UI"
-	@echo
-	@echo "  $$ kubectl port-forward svc/ui 8080:8080 --namespace $(NAMESPACE)"
-	@echo
-	@echo "Then open your browser and navigate to http://localhost:8080"
-	@echo
+DEBUG ?= false
+HELM_OPTIONS := --set skywalking-helm.fullnameOverride=$(RELEASE)
+ifeq ($(DEBUG),true)
+	HELM_OPTIONS := $(HELM_OPTIONS) --dry-run
 endif
 
-# Undeploy
-undeploy_features := $(foreach r,$(features),undeploy.$(r))
-.PHONY: $(undeploy_features)
-$(undeploy_features): %: %.resources
+.PHONY: helm
+helm:
+	@helm version >/dev/null 2>&1 || (echo "No helm in PATH, please make sure helm is available in PATH."; exit 1)
+
+# @feature: java-agent-injector; use the java agent injector to inject the java agent more natively
+.PHONY: feature-java-agent-injector
+feature-java-agent-injector:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set agentInjector.enabled=true)
+
+.PHONY: feature-single-node
+feature-single-node:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set skywalking-helm.oap.replicas=1)
+
+.PHONY: feature-cluster
+feature-cluster:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set skywalking-helm.oap.replicas=2)
+
+.PHONY: feature-elasticsearch
+feature-elasticsearch:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set skywalking-helm.oap.storageType=elasticsearch)
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set skywalking-helm.elasticsearch.enabled=true)
+
+.PHONY: feature-postgresql
+feature-postgresql:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set skywalking-helm.oap.storageType=postgresql)
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set skywalking-helm.postgresql.enabled=true)
+
+.PHONY: feature-so11y
+feature-so11y:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.so11y.enabled=true)
+
+.PHONY: feature-vm-monitor
+feature-vm-monitor:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.vmMonitor.enabled=true)
+
+.PHONY: feature-event
+feature-event:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.event.enabled=true)
+
+.PHONY: feature-istiod-monitor
+feature-istiod-monitor:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.istiodMonitor.enabled=true)
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set istio.enabled=true --set istiod.global.istioNamespace=$(NAMESPACE) --set base.global.istioNamespace=$(NAMESPACE))
+
+.PHONY: feature-als
+feature-als:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.als.enabled=true)
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set istio.enabled=true)
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set istiod.meshConfig.defaultConfig.tracing.zipkin.address=$(RELEASE)-oap.$(NAMESPACE).svc:9411)
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set istiod.meshConfig.defaultConfig.envoyMetricsService.address=$(RELEASE)-oap.$(NAMESPACE).svc:11800)
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set istiod.meshConfig.defaultConfig.envoyAccessLogService.address=$(RELEASE)-oap.$(NAMESPACE).svc:11800)
 
-undeploy_resources := $(foreach r,$(undeploy_features),$(r).resources)
-.PHONY: $(undeploy_resources)
-$(undeploy_resources): undeploy.%.resources: %
-	$(eval resources := $(wildcard $(shell pwd)/$</*))
-	@$(foreach resource, $(resources), docker run --rm -v "$(pwd)/$(resource)":/input \
-		$(foreach v,$(EXPORTED_VARS),-e $(v)) \
-		bhgedigital/envsubst sh -c "envsubst < /input" | kubectl -n $(NAMESPACE) delete --ignore-not-found -f - ; \
-	)
+.PHONY: feature-satellite
+feature-satellite:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.satellite.enabled=true)
+
+.PHONY: feature-rover
+feature-rover:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.rover.enabled=true)
+
+.PHONY: feature-trace-profiling
+feature-trace-profiling:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.traceProfiling.enabled=true)
+
+.PHONY: feature-mysql-monitor
+feature-mysql-monitor:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.mysqlMonitor.enabled=true)
+
+.PHONY: feature-postgresql-monitor
+feature-postgresql-monitor:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.postgresqlMonitor.enabled=true)
+
+.PHONY: feature-apisix-monitor
+feature-apisix-monitor:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.apisixMonitor.enabled=true)
+
+# @feature: kubernetes-monitor; extra resources to install for kubernetes monitoring, standard kube-state-metrics
+.PHONY: feature-kubernetes-monitor
+feature-kubernetes-monitor:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.kubernetesMonitor.enabled=true)
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set kube-state-metrics.enabled=true)
+
+.PHONY: feature-function
+feature-function:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.function.enabled=true)
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set openfunction.enabled=true)
+
+.PHONY: feature-promql
+feature-promql:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.promql.enabled=true)
+	@mkdir -p ./generated/promql-configs/
+	@cp ../config/promql/dashboards/*.json ./generated/promql-configs/
+
+.PHONY: feature-mesh-with-agent
+feature-mesh-with-agent:
+	$(eval HELM_OPTIONS := $(HELM_OPTIONS) --set features.meshWithAgent.enabled=true)
+
+.PHONY: deploy
+deploy: $(features)
+	helm dep up .
+	helm -n $(NAMESPACE) upgrade --install $(RELEASE) . --create-namespace $(HELM_OPTIONS) \
+	--set sampleServices.hub=ghcr.io/apache/skywalking-showcase \
+	--set sampleServices.tag=f36d4b4
 
 .PHONY: undeploy
-undeploy: $(undeploy_features)
+undeploy:
+	helm -n $(NAMESPACE) delete $(RELEASE)
 
 include features.mk
diff --git a/deploy/platform/kubernetes/Makefile.in b/deploy/platform/kubernetes/Makefile.in
index 6ddc6e6..67beb61 100644
--- a/deploy/platform/kubernetes/Makefile.in
+++ b/deploy/platform/kubernetes/Makefile.in
@@ -18,8 +18,9 @@
 
 .EXPORT_ALL_VARIABLES:
 
-NAMESPACE ?= default
+NAMESPACE ?= skywalking-showcase
+RELEASE ?= demo
 AGENTLESS ?= false
 BACKEND_SERVICE ?= oap
 
-FEATURE_FLAGS ?= java-agent-injector,cluster,elasticsearch,kubernetes-monitor,so11y,vm,als,event,istiod-monitor,satellite,rover,trace-profiling,mysql,apisix-monitor,promql
+FEATURE_FLAGS ?= java-agent-injector,cluster,elasticsearch,kubernetes-monitor,so11y,vm-monitor,als,event,istiod-monitor,satellite,rover,trace-profiling,mysql-monitor,postgresql-monitor,apisix-monitor,promql
diff --git a/deploy/platform/kubernetes/feature-cluster/permissions.yaml b/deploy/platform/kubernetes/feature-cluster/permissions.yaml
deleted file mode 100644
index dad1c9d..0000000
--- a/deploy/platform/kubernetes/feature-cluster/permissions.yaml
+++ /dev/null
@@ -1,57 +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.
-#
----
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: skywalking-oap-sa-cluster
-
----
-kind: ClusterRole
-apiVersion: rbac.authorization.k8s.io/v1
-metadata:
-  name: skywalking-oap-sa-cluster-role
-rules:
-  - apiGroups: [ "" ]
-    resources:
-      - "pods" # @feature: cluster; OAP needs to read other OAP Pods information to form a cluster
-               # @feature: als; OAP needs to read Pods metadata to analyze the access logs
-      - "pods/log" # @feature: on-demand-pod-logs; in feature on demand Pod logs, OAP needs to read pods logs
-      - "services" # @feature: als; OAP needs to read services metadata to analyze the access logs
-      - "endpoints" # @feature: als; OAP needs to read endpoints metadata to analyze the access logs
-      - "nodes" # @feature: als; OAP needs to read nodes metadata to analyze the access logs
-      - "configmaps"
-    verbs: [ "get", "watch", "list" ]
-  - apiGroups: [ "batch" ]
-    resources:
-      - "jobs" # @feature: cluster; OAP needs to wait for the init job to complete
-    verbs: [ "get", "watch", "list" ]
-
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
-  name: skywalking-oap-sa-cluster-role-binding
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: ClusterRole
-  name: skywalking-oap-sa-cluster-role
-subjects:
-  - kind: ServiceAccount
-    name: skywalking-oap-sa-cluster
-    namespace: ${NAMESPACE}
diff --git a/deploy/platform/kubernetes/feature-cluster/resources.yaml b/deploy/platform/kubernetes/feature-cluster/resources.yaml
deleted file mode 100644
index 0fc9099..0000000
--- a/deploy/platform/kubernetes/feature-cluster/resources.yaml
+++ /dev/null
@@ -1,310 +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.
-#
-
----
-apiVersion: v1
-data:
-  metadata-service-mapping.yaml: |
-    serviceName: mesh-svr::${LABELS."service.istio.io/canonical-name",LABELS."app.kubernetes.io/name",LABELS.app}
-    serviceInstanceName: ${NAME,NAME} # Just to skip the "envsubst" replacement
-  alarm-settings.yml: |
-    rules:
-      service_resp_time_rule:
-        metrics-name: service_resp_time
-        threshold: 20 # 20ms is just for demo
-        op: ">"
-        period: 5
-        count: 1
-        message: Response time of service {name} is more than 20ms.
-kind: ConfigMap
-metadata:
-  name: oap-static-config
-
----
-apiVersion: v1
-data:
-  core.default.log4j-xml: |-
-    <Configuration status="WARN">
-       <Appenders>
-         <Console name="Console" target="SYSTEM_OUT">
-           <PatternLayout charset="UTF-8" pattern="%d - %c - %L [%t] %-5p %x - %m%n"/>
-         </Console>
-       </Appenders>
-       <Loggers>
-         <logger name="io.grpc.netty" level="INFO"/>
-         <logger name="org.apache.skywalking.oap.server.configuration.api" level="TRACE"/>
-         <logger name="org.apache.skywalking.oap.server.configuration.configmap" level="DEBUG"/>
-         <Root level="INFO">
-           <AppenderRef ref="Console"/>
-         </Root>
-        </Loggers>
-    </Configuration>
-kind: ConfigMap
-metadata:
-  labels:
-    app: oap
-  name: oap-dynamic-config
-
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: oap
-spec:
-  selector:
-    app: oap
-  ports:
-    - name: metrics
-      port: 1234
-    - name: grpc
-      port: 11800
-    - name: http
-      port: 12800
-    - name: zipkin-receiver
-      port: 9411
-    - name: zipkin-query
-      port: 9412
-    - name: promql
-      port: 9090
-
----
-apiVersion: batch/v1
-kind: Job
-metadata:
-  name: oap-init-job # @feature: cluster; set up an init job to initialize ES templates and indices
-spec:
-  template:
-    metadata:
-      name: oap-init-job
-      annotations:
-        sidecar.istio.io/inject: "false"
-    spec:
-      serviceAccountName: skywalking-oap-sa-cluster
-      restartPolicy: Never
-      initContainers:
-        - name: wait-for-es
-          image: busybox:1.30
-          command:
-            - "sh"
-            - "-c"
-            - "for i in $(seq 1 60); do nc -z -w3 elasticsearch 9200 && exit 0 || sleep 5; done; exit 1"
-      containers:
-        - name: oap-init
-          image: ${SW_OAP_IMAGE}
-          imagePullPolicy: Always
-          env: # @feature: cluster; make sure all env vars are the same with the cluster nodes as this will affect templates / indices
-            - name: JAVA_OPTS
-              value: "-Dmode=init" # @feature: cluster; set the OAP mode to "init" so the job can complete
-            - name: SW_OTEL_RECEIVER
-              value: default
-            - name: SW_OTEL_RECEIVER_ENABLED_OTEL_RULES
-              # @feature: vm; enable vm rules to analyze VM metrics
-              # @feature: so11y; enable oap rules to analyze OAP metrics
-              # @feature: kubernetes-monitor; enable rules to analyze Kubernetes Cluster/Node/Service metrics
-              # @feature: istiod-monitor; enable rules to analyze Istio control plane metrics
-              # @feature: mysql; enable mysql rules to analyze MySQL metrics
-              # @feature: apisix-monitor; enable APISIX rules to analyze APISIX metrics
-              value: vm,oap,k8s/*,istio-controlplane,mysql/*,postgresql/*,apisix
-            - name: SW_STORAGE
-              value: elasticsearch
-            - name: SW_STORAGE_ES_CLUSTER_NODES
-              value: elasticsearch:9200
-            - name: SW_STORAGE_ES_INDEX_REPLICAS_NUMBER
-              value: "0"
-            - name: SW_TELEMETRY
-              value: prometheus
-            - name: SW_METER_ANALYZER_ACTIVE_FILES
-              value: datasource,threadpool,satellite,network-profiling,spring-sleuth
-            - name: SW_STORAGE_ES_RESPONSE_TIMEOUT
-              value: "50000"
-            - name: SW_STORAGE_ES_INDEX_SHARDS_NUMBER
-              value: "6"
-            - name: SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR
-              value: "2"
-            - name: SW_RECEIVER_ZIPKIN
-              value: default
-            - name: SW_QUERY_ZIPKIN
-              value: default
-          volumeMounts:
-            - name: config-volume
-              mountPath: /skywalking/ext-config
-      volumes:
-        - name: config-volume
-          configMap:
-            name: oap-static-config
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: oap-deployment
-  labels:
-    app: oap
-spec:
-  replicas: 2 # @feature: cluster; set OAP replicas to >1
-  selector:
-    matchLabels:
-      app: oap
-  template:
-    metadata:
-      labels:
-        app: oap
-      annotations:
-        sidecar.istio.io/inject: "false"
-    spec:
-      serviceAccountName: skywalking-oap-sa-cluster # @feature: cluster; set a service account with Pod "read" permission
-      initContainers:
-        - name: wait-for-oap-init
-          image: bitnami/kubectl:1.20.12
-          command:
-            - "kubectl"
-            - "wait"
-            - "--for=condition=complete"
-            - "job/oap-init-job"
-      containers:
-        - name: oap
-          image: ${SW_OAP_IMAGE}
-          imagePullPolicy: Always
-          resources:
-            limits:
-              cpu: 4000m
-              memory: "4096Mi"
-            requests:
-              cpu: 1000m
-              memory: "1024Mi"
-          ports:
-            - name: metrics # @feature: so11y; set a name for the metrics port that can be referenced in otel config
-              containerPort: 1234
-            - name: grpc
-              containerPort: 11800
-            - name: http
-              containerPort: 12800
-            - name: zipkin-receiver
-              containerPort: 9411
-            - name: zipkin-query
-              containerPort: 9412
-            - name: promql
-              containerPort: 9090
-          env:
-            - name: JAVA_OPTS
-              value: "-Dmode=no-init"
-            - name: SW_CLUSTER
-              value: kubernetes # @feature: cluster; set cluster coordinator to kubernetes
-            - name: SW_CLUSTER_K8S_NAMESPACE
-              value: ${NAMESPACE}
-            - name: SW_CLUSTER_K8S_LABEL
-              value: app=oap # @feature: cluster; set label selectors to select OAP Pods as a cluster
-            - name: SKYWALKING_COLLECTOR_UID # @feature: cluster; set collector uid to identify the OAP node
-              valueFrom:
-                fieldRef:
-                  fieldPath: metadata.uid
-            - name: SW_HEALTH_CHECKER
-              value: default
-            - name: SW_OTEL_RECEIVER
-              value: default # @feature: so11y;,mysql;kubernetes-monitor enable OpenTelemetry receiver to receive OpenTelemetry metrics
-            - name: SW_OTEL_RECEIVER_ENABLED_OTEL_RULES
-              # @feature: vm; enable vm rules to analyze VM metrics
-              # @feature: so11y; enable oap rules to analyze OAP metrics
-              # @feature: kubernetes-monitor; enable rules to analyze Kubernetes Cluster/Node/Service metrics
-              # @feature: istiod-monitor; enable rules to analyze Istio control plane metrics
-              # @feature: mysql; enable mysql rules to analyze MySQL metrics
-              # @feature: apisix-monitor; enable APISIX rules to analyze APISIX metrics
-              value: vm,oap,k8s/*,istio-controlplane,mysql/*,postgresql/*,apisix
-            - name: SW_STORAGE
-              value: elasticsearch
-            - name: SW_STORAGE_ES_CLUSTER_NODES
-              value: elasticsearch:9200
-            - name: SW_TELEMETRY
-              value: prometheus # @feature: so11y; expose the metrics of self o11y through prometheus
-            - name: SW_ENVOY_METRIC_ALS_HTTP_ANALYSIS
-              value: "mx-mesh,persistence" # @feature: als; enable mesh analyzer (mx-mesh) to analyze ALS logs
-            - name: K8S_SERVICE_NAME_RULE
-              value: "mesh-svr::${service.metadata.name}"
-            - name: SW_CONFIGURATION
-              value: k8s-configmap
-            - name: SW_ENVOY_METRIC_ALS_TCP_ANALYSIS
-              value: "mx-mesh"
-            - name: SW_ENABLE_UPDATE_UI_TEMPLATE
-              value: "false"
-            - name: SW_SLOW_DB_THRESHOLD
-              value: default:0,mongodb:100
-            - name: SW_ENABLE_ON_DEMAND_POD_LOG
-              value: "true"
-            - name: SW_METER_ANALYZER_ACTIVE_FILES
-              value: datasource,threadpool,satellite,network-profiling,spring-sleuth
-            - name: SW_STORAGE_ES_RESPONSE_TIMEOUT
-              value: "50000"
-            - name: SW_STORAGE_ES_INDEX_SHARDS_NUMBER
-              value: "6"
-            - name: SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR
-              value: "2"
-            - name: SW_RECEIVER_ZIPKIN
-              value: default
-            - name: SW_QUERY_ZIPKIN
-              value: default
-          volumeMounts:
-            - name: config-volume
-              mountPath: /skywalking/ext-config
-      volumes:
-        - name: config-volume
-          configMap:
-            name: oap-static-config
-
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: ui
-spec:
-  selector:
-    app: ui
-  ports:
-    - protocol: TCP
-      port: 8080
-      targetPort: 8080
-
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: ui-deployment
-  labels:
-    app: ui
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: ui
-  template:
-    metadata:
-      labels:
-        app: ui
-      annotations:
-        sidecar.istio.io/inject: "false"
-    spec:
-      serviceAccountName: skywalking-oap-sa-cluster
-      containers:
-        - name: ui
-          image: ${SW_UI_IMAGE}
-          imagePullPolicy: Always
-          ports:
-            - containerPort: 8080
-          env:
-            - name: SW_OAP_ADDRESS
-              value: http://oap:12800
-            - name: SW_ZIPKIN_ADDRESS
-              value: http://oap:9412
diff --git a/deploy/platform/kubernetes/feature-elasticsearch/resources.yaml b/deploy/platform/kubernetes/feature-elasticsearch/resources.yaml
deleted file mode 100644
index 755b362..0000000
--- a/deploy/platform/kubernetes/feature-elasticsearch/resources.yaml
+++ /dev/null
@@ -1,65 +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.
-
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: elasticsearch
-spec:
-  selector:
-    app: elasticsearch
-  ports:
-    - protocol: TCP
-      port: 9200
-      targetPort: 9200
-
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: es-deployment
-  labels:
-    app: elasticsearch
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: elasticsearch
-  template:
-    metadata:
-      labels:
-        app: elasticsearch
-      annotations:
-        sidecar.istio.io/inject: "false"
-    spec:
-      containers:
-        - name: elasticsearch
-          image: ${ES_IMAGE}
-          imagePullPolicy: Always
-          resources:
-            limits:
-              cpu: 4000m
-              memory: "4096Mi"
-            requests:
-              cpu: 4000m
-              memory: "4096Mi"
-          ports:
-            - containerPort: 9200
-          env:
-            - name: "discovery.type"
-              value: "single-node"
diff --git a/deploy/platform/kubernetes/feature-satellite/permissions.yaml b/deploy/platform/kubernetes/feature-satellite/permissions.yaml
deleted file mode 100644
index 43f90fc..0000000
--- a/deploy/platform/kubernetes/feature-satellite/permissions.yaml
+++ /dev/null
@@ -1,48 +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.
-#
----
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: skywalking-satellite-sa
-  namespace: ${NAMESPACE}
-
----
-kind: ClusterRole
-apiVersion: rbac.authorization.k8s.io/v1
-metadata:
-  name: skywalking-satellite-sa-role
-rules:
-  - apiGroups: [ "" ]
-    resources:
-      - "pods"
-    verbs: [ "get", "watch", "list" ]
-
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
-  name: skywalking-satellite-sa-role-binding
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: ClusterRole
-  name: skywalking-satellite-sa-role
-subjects:
-  - kind: ServiceAccount
-    name: skywalking-satellite-sa
-    namespace: ${NAMESPACE}
\ No newline at end of file
diff --git a/deploy/platform/kubernetes/feature-satellite/resources.yaml b/deploy/platform/kubernetes/feature-satellite/resources.yaml
deleted file mode 100644
index cad94d9..0000000
--- a/deploy/platform/kubernetes/feature-satellite/resources.yaml
+++ /dev/null
@@ -1,75 +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.
-#
-apiVersion: v1
-kind: Service
-metadata:
-  name: satellite
-spec:
-  selector:
-    app: satellite
-  ports:
-    - name: grpc
-      port: 11800
-
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: satellite-deployment
-  labels:
-    app: satellite
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: satellite
-  template:
-    metadata:
-      labels:
-        app: satellite
-      annotations:
-        sidecar.istio.io/inject: "false"
-    spec:
-      serviceAccountName: skywalking-satellite-sa
-      containers:
-        - name: satellite
-          image: ${SW_SATELLITE_IMAGE}
-          imagePullPolicy: Always
-          resources:
-            limits:
-              cpu: 500m
-              memory: "512Mi"
-            requests:
-              cpu: 500m
-              memory: "512Mi"
-          ports:
-            - name: grpc
-              containerPort: 11800
-          env:
-            - name: SATELLITE_GRPC_CLIENT_FINDER
-              value: kubernetes
-            - name: SATELLITE_GRPC_CLIENT_KUBERNETES_NAMESPACE
-              value: ${NAMESPACE}
-            - name: SATELLITE_GRPC_CLIENT_KUBERNETES_KIND
-              value: pod
-            - name: SATELLITE_GRPC_CLIENT_KUBERNETES_SELECTOR_LABEL
-              value: app=oap
-            - name: SATELLITE_GRPC_CLIENT_KUBERNETES_EXTRA_PORT
-              value: "11800"
-            - name: SATELLITE_TELEMETRY_EXPORT_TYPE
-              value: metrics_service
\ No newline at end of file
diff --git a/deploy/platform/kubernetes/feature-single-node/permissions.yaml b/deploy/platform/kubernetes/feature-single-node/permissions.yaml
deleted file mode 100644
index 4b4148a..0000000
--- a/deploy/platform/kubernetes/feature-single-node/permissions.yaml
+++ /dev/null
@@ -1,52 +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.
-#
----
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: skywalking-oap-sa
-
----
-kind: ClusterRole
-apiVersion: rbac.authorization.k8s.io/v1
-metadata:
-  name: skywalking-oap-sa-role
-rules:
-  - apiGroups: [ "" ]
-    resources:
-      - "pods" # @feature: als; OAP needs to read pods metadata to analyze the access logs
-      - "pods/log" # @feature: on-demand-pod-logs; in feature on demand Pod logs, OAP needs to read pods logs
-      - "services" # @feature: als; OAP needs to read services metadata to analyze the access logs
-      - "endpoints" # @feature: als; OAP needs to read endpoints metadata to analyze the access logs
-      - "nodes" # @feature: als; OAP needs to read nodes metadata to analyze the access logs
-      - "configmaps"
-    verbs: [ "get", "watch", "list" ]
-
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
-  name: skywalking-oap-sa-role-binding
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: ClusterRole
-  name: skywalking-oap-sa-role
-subjects:
-  - kind: ServiceAccount
-    name: skywalking-oap-sa
-    namespace: ${NAMESPACE}
diff --git a/deploy/platform/kubernetes/feature-single-node/resources.yaml b/deploy/platform/kubernetes/feature-single-node/resources.yaml
deleted file mode 100644
index 31c8149..0000000
--- a/deploy/platform/kubernetes/feature-single-node/resources.yaml
+++ /dev/null
@@ -1,221 +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.
-#
----
-apiVersion: v1
-data:
-  metadata-service-mapping.yaml: |
-    serviceName: mesh-svr::${LABELS."service.istio.io/canonical-name",LABELS."app.kubernetes.io/name",LABELS.app}
-    serviceInstanceName: ${NAME,NAME} # Just to skip the "envsubst" replacement
-  alarm-settings.yml: |
-    rules:
-      service_resp_time_rule:
-        metrics-name: service_resp_time
-        threshold: 20 # 20ms is just for demo
-        op: ">"
-        period: 5
-        count: 1
-        message: Response time of service {name} is more than 20ms.
-kind: ConfigMap
-metadata:
-  name: oap-static-config
-
----
-apiVersion: v1
-data:
-  core.default.log4j-xml: |-
-    <Configuration status="WARN">
-       <Appenders>
-         <Console name="Console" target="SYSTEM_OUT">
-           <PatternLayout charset="UTF-8" pattern="%d - %c - %L [%t] %-5p %x - %m%n"/>
-         </Console>
-       </Appenders>
-       <Loggers>
-         <logger name="io.grpc.netty" level="INFO"/>
-         <logger name="org.apache.skywalking.oap.server.configuration.api" level="TRACE"/>
-         <logger name="org.apache.skywalking.oap.server.configuration.configmap" level="DEBUG"/>
-         <Root level="INFO">
-           <AppenderRef ref="Console"/>
-         </Root>
-        </Loggers>
-    </Configuration>
-kind: ConfigMap
-metadata:
-  labels:
-    app: oap
-  name: oap-dynamic-config
-
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: oap
-spec:
-  selector:
-    app: oap
-  ports:
-    - name: metrics
-      port: 1234
-    - name: grpc
-      port: 11800
-    - name: http
-      port: 12800
-    - name: zipkin-receiver
-      port: 9411
-    - name: zipkin-query
-      port: 9412
-
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: oap-deployment
-  labels:
-    app: oap
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: oap
-  template:
-    metadata:
-      labels:
-        app: oap
-      annotations:
-        sidecar.istio.io/inject: "false"
-    spec:
-      serviceAccountName: skywalking-oap-sa # @feature: als; set a service account with Pods/Endpoints/Services/Nodes permissions to analyze Envoy access logs
-      containers:
-        - name: oap
-          image: ${SW_OAP_IMAGE}
-          imagePullPolicy: Always
-          resources:
-            limits:
-              cpu: 4000m
-              memory: "4096Mi"
-            requests:
-              cpu: 1000m
-              memory: "1024Mi"
-          ports:
-            - name: metrics # @feature: so11y; set a name for the metrics port that can be referenced in otel config
-              containerPort: 1234
-            - name: grpc
-              containerPort: 11800
-            - name: http
-              containerPort: 12800
-            - name: zipkin-receiver
-              containerPort: 9411
-            - name: zipkin-query
-              containerPort: 9412
-          env:
-            - name: SW_CLUSTER_K8S_NAMESPACE
-              value: ${NAMESPACE}
-            - name: SW_CLUSTER_K8S_LABEL
-              value: app=oap
-            - name: SW_HEALTH_CHECKER
-              value: default
-            - name: SW_OTEL_RECEIVER
-              value: default # @feature: so11y;mysql;vm;kubernetes-monitor enable OpenTelemetry receiver to receive OpenTelemetry metrics
-            - name: SW_OTEL_RECEIVER_ENABLED_OTEL_RULES
-              # @feature: vm; enable vm rules to analyze VM metrics
-              # @feature: so11y; enable oap rules to analyze OAP metrics
-              # @feature: kubernetes-monitor; enable rules to analyze Kubernetes Cluster/Node/Service metrics
-              # @feature: istiod-monitor; enable rules to analyze Istio metrics
-              # @feature: mysql; enable rules to analyze MySQL metrics
-              value: vm,oap,k8s/*,istio-controlplane,mysql/*
-            - name: SW_STORAGE
-              value: elasticsearch
-            - name: SW_STORAGE_ES_CLUSTER_NODES
-              value: elasticsearch:9200
-            - name: SW_STORAGE_ES_INDEX_REPLICAS_NUMBER
-              value: "0"
-            - name: SW_TELEMETRY
-              value: prometheus # @feature: so11y; expose the metrics of self o11y through prometheus
-            - name: SW_ENVOY_METRIC_ALS_HTTP_ANALYSIS
-              value: "k8s-mesh,persistence" # @feature: als; enable mesh analyzer (k8s-mesh) to analyze ALS logs
-            - name: K8S_SERVICE_NAME_RULE
-              value: "mesh-svr::${service.metadata.name}"
-            - name: SW_CONFIGURATION
-              value: k8s-configmap
-            - name: SW_ENABLE_ON_DEMAND_POD_LOG
-              value: "true"
-            - name: SW_METER_ANALYZER_ACTIVE_FILES
-              value: datasource,threadpool,satellite,network-profiling,spring-sleuth
-            - name: SW_STORAGE_ES_RESPONSE_TIMEOUT
-              value: "50000"
-            - name: SW_RECEIVER_ZIPKIN
-              value: default
-            - name: SW_QUERY_ZIPKIN
-              value: default
-          volumeMounts:
-            - name: config-volume
-              mountPath: /skywalking/ext-config
-      volumes:
-        - name: config-volume
-          configMap:
-            name: oap-static-config
-
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: ui
-spec:
-  selector:
-    app: ui
-  ports:
-    - protocol: TCP
-      port: 8080
-      targetPort: 8080
-
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: ui-deployment
-  labels:
-    app: ui
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: ui
-  template:
-    metadata:
-      labels:
-        app: ui
-      annotations:
-        sidecar.istio.io/inject: "false"
-    spec:
-      containers:
-        - name: ui
-          image: ${SW_UI_IMAGE}
-          imagePullPolicy: Always
-          ports:
-            - containerPort: 8080
-          readinessProbe:
-            httpGet:
-              path: /
-              port: 8080
-            initialDelaySeconds: 3
-            periodSeconds: 3
-            failureThreshold: 10
-          env:
-            - name: SW_OAP_ADDRESS
-              value: http://oap:12800
-            - name: SW_ZIPKIN_ADDRESS
-              value: http://oap:9412
diff --git a/deploy/platform/kubernetes/features.mk b/deploy/platform/kubernetes/features.mk
index 159fccb..c9eaac8 100644
--- a/deploy/platform/kubernetes/features.mk
+++ b/deploy/platform/kubernetes/features.mk
@@ -22,38 +22,13 @@
 
 include ../../../Makefile.in
 
-.PHONY: istioctl
-istioctl:
-	@istioctl version >/dev/null 2>&1 || (echo "No istioctl in PATH, please make sure istioctl is available in PATH."; exit 1)
-
-.PHONY: istio
-istio: istioctl
-	@istioctl install -y --set profile=demo \
-		--set meshConfig.enableEnvoyAccessLogService=true `# @feature: als; enable Envoy access log service` \
-		`# @feature: als; be careful to only emit wanted metrics otherwise the traffic is HUGE` \
-		--set 'meshConfig.defaultConfig.proxyStatsMatcher.inclusionRegexps[0]=.*membership_healthy.*' \
-		--set 'meshConfig.defaultConfig.proxyStatsMatcher.inclusionRegexps[1]=.*upstream_cx_active.*' \
-		--set 'meshConfig.defaultConfig.proxyStatsMatcher.inclusionRegexps[2]=.*upstream_cx_total.*' \
-		--set 'meshConfig.defaultConfig.proxyStatsMatcher.inclusionRegexps[3]=.*upstream_rq_active.*' \
-		--set 'meshConfig.defaultConfig.proxyStatsMatcher.inclusionRegexps[4]=.*upstream_rq_total.*' \
-		--set 'meshConfig.defaultConfig.proxyStatsMatcher.inclusionRegexps[5]=.*upstream_rq_pending_active.*' \
-		--set 'meshConfig.defaultConfig.proxyStatsMatcher.inclusionRegexps[6]=.*lb_healthy_panic.*' \
-		--set 'meshConfig.defaultConfig.proxyStatsMatcher.inclusionRegexps[7]=.*upstream_cx_none_healthy.*' \
-		--set meshConfig.defaultConfig.envoyMetricsService.address=$(BACKEND_SERVICE).$(NAMESPACE):11800 `# @feature: als; set MetricsService address to Backend Service so Envoy emits metrics to Backend Service` \
-		--set meshConfig.defaultConfig.envoyAccessLogService.address=$(BACKEND_SERVICE).$(NAMESPACE):11800 `# @feature: als; set AccessLogService address to Backend Service so Envoy emits logs to Backend Service` \
-		--set meshConfig.defaultConfig.tracing.sampling=100 \
-		--set meshConfig.defaultConfig.tracing.zipkin.address=oap.$(NAMESPACE).svc.cluster.local:9411 \
-		--set meshConfig.enableTracing=true
-
 .PHONY: namespace
 namespace:
 	@kubectl get namespace $(NAMESPACE)-agentless > /dev/null 2>&1 || kubectl create namespace $(NAMESPACE)-agentless
 	@kubectl label namespace --overwrite $(NAMESPACE)-agentless istio-injection=enabled # @feature: als; label the namespace to allow Istio sidecar injection
 
 .PHONY: prerequisites
-prerequisites: istio namespace
-
-feature-als:
+prerequisites: namespace
 
 .PHONY: deploy.feature-als
 deploy.feature-als: prerequisites
@@ -69,7 +44,7 @@ undeploy.feature-als: istioctl
 feature-mesh-with-agent:
 
 .PHONY: deploy.feature-mesh-with-agent
-deploy.feature-mesh-with-agent: prerequisites install-cert-manager
+deploy.feature-mesh-with-agent:
 	@curl -Ls https://archive.apache.org/dist/skywalking/swck/${SWCK_OPERATOR_VERSION}/skywalking-swck-${SWCK_OPERATOR_VERSION}-bin.tgz | tar -zxf - -O ./config/operator-bundle.yaml | kubectl apply -f -
 	@kubectl label namespace --overwrite $(NAMESPACE) swck-injection=enabled
 	@kubectl get configmap skywalking-swck-java-agent-configmap -n skywalking-swck-system -oyaml | sed "s/127.0.0.1/$(NAMESPACE)-$(BACKEND_SERVICE).$(NAMESPACE)/" | kubectl apply -f -
@@ -83,39 +58,9 @@ undeploy.feature-mesh-with-agent: istioctl
 	$(MAKE) undeploy FEATURE_FLAGS=agent TAG=$(TAG) NAMESPACE=$(NAMESPACE) AGENTLESS=true
 	istioctl x uninstall --purge -y
 
-# @feature: kubernetes-monitor; extra resources to install for kubernetes monitoring, standard kube-state-metrics
-.PHONY: feature-kubernetes-monitor
-feature-kubernetes-monitor:
-
-.PHONY: deploy.feature-kubernetes-monitor
-deploy.feature-kubernetes-monitor:
-	@kubectl apply -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/v2.2.4/examples/standard/service-account.yaml
-	@kubectl apply -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/v2.2.4/examples/standard/cluster-role.yaml
-	@kubectl apply -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/v2.2.4/examples/standard/cluster-role-binding.yaml
-	@kubectl apply -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/v2.2.4/examples/standard/service.yaml
-	@kubectl apply -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/v2.2.4/examples/standard/deployment.yaml
-
-.PHONY: undeploy.feature-kubernetes-monitor
-undeploy.feature-kubernetes-monitor:
-	@kubectl delete --ignore-not-found -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/v2.2.4/examples/standard/service-account.yaml
-	@kubectl delete --ignore-not-found -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/v2.2.4/examples/standard/cluster-role.yaml
-	@kubectl delete --ignore-not-found -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/v2.2.4/examples/standard/cluster-role-binding.yaml
-	@kubectl delete --ignore-not-found -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/v2.2.4/examples/standard/service.yaml
-	@kubectl delete --ignore-not-found -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/v2.2.4/examples/standard/deployment.yaml
-
-# @feature: java-agent-injector; use the java agent injector to inject the java agent more natively
-.PHONY: feature-java-agent-injector
-feature-java-agent-injector:
-
-# @feature: java-agent-injector; the swck operator depends on the certificate management of the cert-manager
-.PHONY: install-cert-manager
-install-cert-manager:
-	@kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml
-	@sh ../../../scripts/wait-cert-manager-ready.sh
-
 # @feature: java-agent-injector; the java agent injector is a component of the swck operator, so we need to deploy the swck operator firstly
 .PHONY: deploy.feature-java-agent-injector
-deploy.feature-java-agent-injector: install-cert-manager
+deploy.feature-java-agent-injector:
 	@curl -Ls https://archive.apache.org/dist/skywalking/swck/${SWCK_OPERATOR_VERSION}/skywalking-swck-${SWCK_OPERATOR_VERSION}-bin.tgz | tar -zxf - -O ./config/operator-bundle.yaml | kubectl apply -f -
 	@kubectl label namespace --overwrite $(NAMESPACE) swck-injection=enabled
 	# @feature: java-agent-injector; we can update the agent's backend address in a single-node cluster firstly so that we don't need to add the same backend env for every java agent
@@ -128,46 +73,3 @@ undeploy.feature-java-agent-injector:
 	@curl -Ls https://archive.apache.org/dist/skywalking/swck/${SWCK_OPERATOR_VERSION}/skywalking-swck-${SWCK_OPERATOR_VERSION}-bin.tgz | tar -zxf - -O ./config/operator-bundle.yaml | kubectl delete --ignore-not-found -f -
 	@kubectl delete --ignore-not-found -f https://github.com/jetstack/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml
 	$(MAKE) undeploy FEATURE_FLAGS=agent AGENTLESS=false SHOW_TIPS=false BACKEND_SERVICE=$(BACKEND_SERVICE)
-
-.PHONY: helm
-helm:
-	@helm version >/dev/null 2>&1 || (echo "No helm in PATH, please make sure helm is available in PATH."; exit 1)
-
-.PHONY: open-function
-open-function: helm
-	@helm repo add openfunction https://openfunction.github.io/charts/
-	@helm repo update
-	@helm upgrade openfunction openfunction/openfunction -n openfunction --version 0.3.1 --install --create-namespace \
-		--set global.ShipwrightBuild.enabled=false \
-		--set global.TektonPipelines.enabled=false \
-		--set global.Keda.enabled=false \
-		--set global.Dapr.enabled=false \
-		--set contour.envoy.useHostPort=false \
-		--set contour.envoy.service.type=ClusterIP \
-		--set contour.envoy.service.externalTrafficPolicy="" \
-		--wait
-
-# @feature: function; install open function resources
-.PHONY: deploy.feature-function
-deploy.feature-function: open-function
-	@echo "deploy.feature-function"
-
-.PHONY: feature-function
-feature-function:
-
-.PHONY: undeploy.feature-function
-undeploy.feature-function: helm
-	@helm uninstall openfunction -n openfunction --timeout 20m || kubectl delete namespace openfunction --ignore-not-found --timeout 20m || true
-
-# @feature: promql; extra configmaps to create for grafana dashboards
-.PHONY: feature-promql
-feature-promql:
-dashboards := $(wildcard ../config/promql/dashboards/*.json)
-
-.PHONY: deploy.feature-promql
-deploy.feature-promql:
-	@$(foreach d, $(dashboards), kubectl create configmap grafana-dashboards-$(basename $(notdir $d)) --from-file=$d;)
-
-.PHONY: undeploy.feature-promql
-undeploy.feature-promql:
-	@$(foreach d, $(dashboards), kubectl delete configmap grafana-dashboards-$(basename $(notdir $d)) --ignore-not-found;)
diff --git a/deploy/platform/kubernetes/templates/NOTES.txt b/deploy/platform/kubernetes/templates/NOTES.txt
new file mode 100644
index 0000000..7c13563
--- /dev/null
+++ b/deploy/platform/kubernetes/templates/NOTES.txt
@@ -0,0 +1,56 @@
+{{/*
+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.
+*/}}
+
+*************************************************************************
+*                                                                       *
+*                          SkyWalking Showcase                          *
+*                                                                       *
+*************************************************************************
+
+Thank you for installing {{ .Chart.Name }}.
+
+Your release is named {{ .Release.Name }}.
+
+Get the UI URL by running these commands:
+{{- if index .Values "skywalking-helm" "ui" "ingress" "enabled" }}
+{{- range index .Values "skywalking-helm" "ui" "ingress" "hosts" }}
+  http{{ if index $.Values "ui" "ingress" "tls" }}s{{ end }}://{{ . }}{{ index $.Values "ui" "ingress" "path" }}
+{{- end }}
+{{- else if contains "NodePort" (index .Values "skywalking-helm" "ui" "service" "type") }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "skywalking.ui.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" (index .Values "skywalking-helm" "ui" "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 svc -w {{ include "skywalking.ui.fullname" . }} -n {{ .Release.Namespace }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "skywalking.ui.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ index .Values "skywalking-helm" "ui" "service" "externalPort" }}
+{{- else if contains "ClusterIP" (index .Values "skywalking-helm" "ui" "service" "type") }}
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward svc/{{ printf "%s-skywalking-helm-ui" .Release.Name }} 8080:{{ index .Values "skywalking-helm" "ui" "service" "externalPort" }} --namespace {{ .Release.Namespace }}
+{{- end }}
+
+{{- if index .Values "skywalking-helm" "elasticsearch" "enabled" }}
+{{- if index .Values "skywalking-helm" "elasticsearch" "persistence" "enabled" }}
+{{- else }}
+#################################################################################
+######   WARNING: Persistence is disabled!!! You will lose your data when   #####
+######            the SkyWalking's storage ES pod is terminated.            #####
+#################################################################################
+
+{{- end }}
+{{- end }}
diff --git a/deploy/platform/kubernetes/templates/_helpers.tpl b/deploy/platform/kubernetes/templates/_helpers.tpl
new file mode 100644
index 0000000..6e64b34
--- /dev/null
+++ b/deploy/platform/kubernetes/templates/_helpers.tpl
@@ -0,0 +1,35 @@
+{{/*
+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.
+*/}}
+
+{{/*
+The collector address, might be OAP or Satellite
+*/}}
+{{- define "skywalking.collector.address" -}}
+{{- if index .Values "skywalking-helm" "satellite" "enabled" }}
+{{- printf "%s-satellite.%s.svc.cluster.local:%d" (index .Values "skywalking-helm" "fullnameOverride") .Release.Namespace 11800 }}
+{{- else }}
+{{- printf "%s-oap.%s.svc.cluster.local:%d" (index .Values "skywalking-helm" "fullnameOverride") .Release.Namespace 11800 }}
+{{- end -}}
+{{- end -}}
+
+{{- define "skywalking.oap.address.grpc" -}}
+{{- printf "%s-oap.%s.svc.cluster.local:%d" (index .Values "skywalking-helm" "fullnameOverride") .Release.Namespace 11800 }}
+{{- end -}}
+
+{{- define "skywalking.oap.address.http" -}}
+{{- printf "http://%s-oap.%s.svc.cluster.local:%d" (index .Values "skywalking-helm" "fullnameOverride") .Release.Namespace 12800 }}
+{{- end -}}
diff --git a/deploy/platform/kubernetes/feature-agent/resources.yaml b/deploy/platform/kubernetes/templates/feature-agent/resources.yaml
similarity index 69%
rename from deploy/platform/kubernetes/feature-agent/resources.yaml
rename to deploy/platform/kubernetes/templates/feature-agent/resources.yaml
index f62f5bc..aaa2791 100644
--- a/deploy/platform/kubernetes/feature-agent/resources.yaml
+++ b/deploy/platform/kubernetes/templates/feature-agent/resources.yaml
@@ -16,11 +16,25 @@
 # under the License.
 #
 
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: {{ .Values.sampleServices.namespace }}
+  labels:
+  {{- if .Values.agentInjector.enabled }}
+    swck-injection: enabled
+  {{- end }}
+  {{- if or .Values.features.als.enabled .Values.features.istiodMonitor.enabled .Values.features.meshWithAgent }}
+    istio-injection: enabled
+  {{- end }}
+
 ---
 apiVersion: v1
 kind: Service
 metadata:
   name: gateway
+  namespace: {{ .Values.sampleServices.namespace }}
 spec:
   selector:
     app: gateway
@@ -34,6 +48,7 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: gateway-deployment
+  namespace: {{ .Values.sampleServices.namespace }}
   labels:
     app: gateway
 spec:
@@ -48,17 +63,17 @@ spec:
         swck-java-agent-injected: "true"
         app: gateway
       annotations:
-        sidecar.istio.io/inject: "${AGENTLESS}"
+        sidecar.istio.io/inject: "{{ or .Values.features.als.enabled .Values.features.istiodMonitor.enabled .Values.features.meshWithAgent }}"
         # @feature: java-agent-injector; set the java agent configuration
         strategy.skywalking.apache.org/inject.Container: "gateway"
         strategy.skywalking.apache.org/agent.Overlay: "true"
         agent.skywalking.apache.org/agent.service_name: "agent::gateway"
         optional.skywalking.apache.org: "spring-cloud-gateway-3.x"
-        sidecar.skywalking.apache.org/initcontainer.Image: "${SW_AGENT_JAVA_IMAGE}"
+        sidecar.skywalking.apache.org/initcontainer.Image: "{{ .Values.agentInjector.javaImage }}"
     spec:
       containers:
         - name: gateway
-          image: ${HUB}/gateway-service:${TAG}
+          image: "{{ .Values.sampleServices.hub }}/gateway-service:{{ .Values.sampleServices.tag }}"
           imagePullPolicy: IfNotPresent
           ports:
             - containerPort: 80
@@ -67,13 +82,14 @@ spec:
             - name: SW_AGENT_NAME
               value: agent::gateway
             - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
-              value: ${BACKEND_SERVICE}:11800
+              value: {{ template "skywalking.collector.address" . }}
 
 ---
 apiVersion: v1
 kind: Service
 metadata:
   name: songs
+  namespace: {{ .Values.sampleServices.namespace }}
 spec:
   selector:
     app: songs
@@ -87,6 +103,7 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: songs-deployment
+  namespace: {{ .Values.sampleServices.namespace }}
   labels:
     app: songs
 spec:
@@ -101,17 +118,17 @@ spec:
         swck-java-agent-injected: "true"
         app: songs
       annotations:
-        sidecar.istio.io/inject: "${AGENTLESS}"
+        sidecar.istio.io/inject: "{{ or .Values.features.als.enabled .Values.features.istiodMonitor.enabled .Values.features.meshWithAgent }}"
         # @feature: java-agent-injector; set the java agent configuration
         strategy.skywalking.apache.org/inject.Container: "songs"
         strategy.skywalking.apache.org/agent.Overlay: "true"
         agent.skywalking.apache.org/agent.service_name: "agent::songs"
         optional.skywalking.apache.org: "guava-cache-plugin"
-        sidecar.skywalking.apache.org/initcontainer.Image: "${SW_AGENT_JAVA_IMAGE}"
+        sidecar.skywalking.apache.org/initcontainer.Image: "{{ .Values.agentInjector.javaImage }}"
     spec:
       containers:
         - name: songs
-          image: ${HUB}/songs-service:${TAG}
+          image: "{{ .Values.sampleServices.hub }}/songs-service:{{ .Values.sampleServices.tag }}"
           imagePullPolicy: IfNotPresent
           ports:
             - containerPort: 80
@@ -120,17 +137,18 @@ spec:
             - name: SW_AGENT_NAME
               value: agent::songs
             - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
-              value: ${BACKEND_SERVICE}:11800
+              value: {{ template "skywalking.collector.address" . }}
             - name: ACTIVE_MQ_URL
               value: tcp://activemq:61616
             - name: ACTIVE_MQ_QUEUE
-              value: queue-songs-ping              
+              value: queue-songs-ping
 
 ---
 apiVersion: v1
 kind: Service
 metadata:
   name: rcmd
+  namespace: {{ .Values.sampleServices.namespace }}
 spec:
   selector:
     app: recommendation
@@ -144,6 +162,7 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: recommendation-deployment
+  namespace: {{ .Values.sampleServices.namespace }}
   labels:
     app: recommendation
 spec:
@@ -156,11 +175,11 @@ spec:
       labels:
         app: recommendation
       annotations:
-        sidecar.istio.io/inject: "${AGENTLESS}"
+        sidecar.istio.io/inject: "{{ or .Values.features.als.enabled .Values.features.istiodMonitor.enabled .Values.features.meshWithAgent }}"
     spec:
       containers:
         - name: recommendation
-          image: ${HUB}/recommendation-service:${TAG}
+          image: "{{ .Values.sampleServices.hub }}/recommendation-service:{{ .Values.sampleServices.tag }}"
           imagePullPolicy: IfNotPresent
           ports:
             - containerPort: 80
@@ -168,13 +187,14 @@ spec:
             - name: SW_AGENT_NAME
               value: agent::recommendation
             - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
-              value: ${BACKEND_SERVICE}:11800
+              value: {{ template "skywalking.collector.address" . }}
 
 ---
 apiVersion: v1
 kind: Service
 metadata:
   name: app
+  namespace: {{ .Values.sampleServices.namespace }}
 spec:
   selector:
     app: app
@@ -188,6 +208,7 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: app-deployment
+  namespace: {{ .Values.sampleServices.namespace }}
   labels:
     app: app
 spec:
@@ -200,11 +221,11 @@ spec:
       labels:
         app: app
       annotations:
-        sidecar.istio.io/inject: "${AGENTLESS}"
+        sidecar.istio.io/inject: "{{ or .Values.features.als.enabled .Values.features.istiodMonitor.enabled .Values.features.meshWithAgent }}"
     spec:
       containers:
         - name: app
-          image: ${HUB}/app:${TAG}
+          image: "{{ .Values.sampleServices.hub }}/app:{{ .Values.sampleServices.tag }}"
           imagePullPolicy: IfNotPresent
           ports:
             - containerPort: 80
@@ -214,13 +235,14 @@ spec:
             - name: REACT_APP_SW_AGENT_NAME_UI
               value: agent::ui
             - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
-              value: ${BACKEND_SERVICE}:11800
+              value: {{ template "skywalking.collector.address" . }}
 
 ---
 apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: loadgen-deployment
+  namespace: {{ .Values.sampleServices.namespace }}
   labels:
     app: loadgen
 spec:
@@ -233,11 +255,11 @@ spec:
       labels:
         app: loadgen
       annotations:
-        sidecar.istio.io/inject: "${AGENTLESS}"
+        sidecar.istio.io/inject: "{{ or .Values.features.als.enabled .Values.features.istiodMonitor.enabled .Values.features.meshWithAgent }}"
     spec:
       containers:
         - name: app
-          image: ${HUB}/load-gen:${TAG}
+          image: "{{ .Values.sampleServices.hub }}/load-gen:{{ .Values.sampleServices.tag }}"
           imagePullPolicy: IfNotPresent
 ---
 
@@ -245,6 +267,7 @@ apiVersion: v1
 kind: ConfigMap
 metadata:
   name: apisix-config
+  namespace: {{ .Values.sampleServices.namespace }}
   labels:
     app: apisix-config
 data:
@@ -258,16 +281,16 @@ data:
         service_id: 2
         plugins:
           skywalking:
-            service_name: "${{SW_AGENT_SERVICE}}"
-            service_instance_name: "${{SW_AGENT_SERVICE_INSTANCE}}"
-            endpoint_addr: http://oap:12800
+            service_name: ${{ "{{" }}}SW_AGENT_SERVICE{{ "}}" }}
+            service_instance_name: ${{ "{{" }}SW_AGENT_SERVICE_INSTANCE{{ "}}" }}
+            endpoint_addr: {{ template "skywalking.oap.address.http" . }}
       - uri: /test
         service_id: 2
         plugins:
           skywalking:
-            service_name: "${{SW_AGENT_SERVICE}}"
-            service_instance_name: "${{SW_AGENT_SERVICE_INSTANCE}}"
-            endpoint_addr: http://oap:12800
+            service_name: ${{"{{"}}SW_AGENT_SERVICE{{"}}"}}
+            service_instance_name: ${{"{{"}}SW_AGENT_SERVICE_INSTANCE{{"}}"}}
+            endpoint_addr: {{ template "skywalking.oap.address.http" . }}
       services:
       - id: 1
         upstream_id: 1
@@ -304,9 +327,9 @@ data:
           ip: "0.0.0.0"
           port: 9091
       skywalking:
-        service_name: "${{SW_AGENT_SERVICE}}"
-        service_instance_name: "${{SW_AGENT_SERVICE_INSTANCE}}"
-        endpoint_addr: http://oap:12800
+        service_name: ${{"{{"}}SW_AGENT_SERVICE{{"}}"}}
+        service_instance_name: ${{"{{"}}SW_AGENT_SERVICE_INSTANCE{{"}}"}}
+        endpoint_addr: {{ template "skywalking.oap.address.http" . }}
     plugins:
       - prometheus
       - skywalking
@@ -321,6 +344,7 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: frontend-deployment
+  namespace: {{ .Values.sampleServices.namespace }}
   labels:
     app: frontend
 spec:
@@ -333,11 +357,11 @@ spec:
       labels:
         app: frontend
       annotations:
-        sidecar.istio.io/inject: "${AGENTLESS}"
+        sidecar.istio.io/inject: "{{ or .Values.features.als.enabled .Values.features.istiodMonitor.enabled .Values.features.meshWithAgent }}"
     spec:
       containers:
         - name: frontend
-          image: ${HUB}/frontend:${TAG}
+          image: "{{ .Values.sampleServices.hub }}/frontend:{{ .Values.sampleServices.tag }}"
           imagePullPolicy: IfNotPresent
           resources:
             limits:
@@ -353,7 +377,7 @@ spec:
               name: metrics
           env:
             - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
-              value: ${BACKEND_SERVICE}:11800
+              value: {{ template "skywalking.collector.address" . }}
             - name: SW_SERVICE_INSTANCE
               valueFrom:
                 fieldRef:
@@ -374,6 +398,7 @@ apiVersion: v1
 kind: Service
 metadata:
   name: frontend
+  namespace: {{ .Values.sampleServices.namespace }}
 spec:
   selector:
     app: frontend
@@ -387,6 +412,7 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: activemq-deployment
+  namespace: {{ .Values.sampleServices.namespace }}
   labels:
     app: activemq
 spec:
@@ -418,10 +444,11 @@ apiVersion: v1
 kind: Service
 metadata:
   name: activemq
+  namespace: {{ .Values.sampleServices.namespace }}
 spec:
   selector:
     app: activemq
   ports:
     - protocol: TCP
       port: 61616
-      targetPort: 61616              
\ No newline at end of file
+      targetPort: 61616              
diff --git a/deploy/platform/kubernetes/feature-apisix-monitor/permissions.yaml b/deploy/platform/kubernetes/templates/feature-apisix-monitor/permissions.yaml
similarity index 92%
rename from deploy/platform/kubernetes/feature-apisix-monitor/permissions.yaml
rename to deploy/platform/kubernetes/templates/feature-apisix-monitor/permissions.yaml
index ac17148..2881866 100644
--- a/deploy/platform/kubernetes/feature-apisix-monitor/permissions.yaml
+++ b/deploy/platform/kubernetes/templates/feature-apisix-monitor/permissions.yaml
@@ -15,6 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.apisixMonitor.enabled }}
+
 ---
 apiVersion: v1
 kind: ServiceAccount
@@ -44,4 +46,6 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: otel-sa-apisix
-    namespace: ${NAMESPACE}
+    namespace: {{ .Release.Namespace }}
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-apisix-monitor/resources.yaml b/deploy/platform/kubernetes/templates/feature-apisix-monitor/resources.yaml
similarity index 98%
rename from deploy/platform/kubernetes/feature-apisix-monitor/resources.yaml
rename to deploy/platform/kubernetes/templates/feature-apisix-monitor/resources.yaml
index 9c82bca..fef831d 100644
--- a/deploy/platform/kubernetes/feature-apisix-monitor/resources.yaml
+++ b/deploy/platform/kubernetes/templates/feature-apisix-monitor/resources.yaml
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-
+{{- if .Values.features.apisixMonitor.enabled }}
 
 apiVersion: v1
 kind: ConfigMap
@@ -102,3 +102,5 @@ spec:
             items:
               - key: otel-collector-config
                 path: otel-collector-config.yaml
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-event/permissions.yaml b/deploy/platform/kubernetes/templates/feature-event/permissions.yaml
similarity index 92%
rename from deploy/platform/kubernetes/feature-event/permissions.yaml
rename to deploy/platform/kubernetes/templates/feature-event/permissions.yaml
index 616661f..c06e465 100644
--- a/deploy/platform/kubernetes/feature-event/permissions.yaml
+++ b/deploy/platform/kubernetes/templates/feature-event/permissions.yaml
@@ -15,6 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+
+{{- if .Values.features.event.enabled }}
 ---
 apiVersion: v1
 kind: ServiceAccount
@@ -32,5 +34,6 @@ roleRef:
   name: view
 subjects:
   - kind: ServiceAccount
-    namespace: ${NAMESPACE}
+    namespace: {{ .Release.Namespace }}
     name: skywalking-event-exporter-sa
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-event/resources.yaml b/deploy/platform/kubernetes/templates/feature-event/resources.yaml
similarity index 60%
rename from deploy/platform/kubernetes/feature-event/resources.yaml
rename to deploy/platform/kubernetes/templates/feature-event/resources.yaml
index c7e5065..287f33c 100644
--- a/deploy/platform/kubernetes/feature-event/resources.yaml
+++ b/deploy/platform/kubernetes/templates/feature-event/resources.yaml
@@ -15,35 +15,17 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-#
-# 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 .Values.features.event.enabled }}
 
 ---
 apiVersion: v1
 kind: ConfigMap
 metadata:
   name: skywalking-event-exporter-cm
-  namespace: ${NAMESPACE}
 data:
   config.yaml: |
     filters:
-      - namespace: ${NAMESPACE}
+      - namespace: {{ .Release.Namespace }}
         exporters:
           - skywalking
 
@@ -51,18 +33,17 @@ data:
       skywalking:
         template:
           source:
-            service: "agent::{{ .Service.Name }}"
-            serviceInstance: "{{ .Pod.Name }}"
+            service: "agent::{{"{{"}} .Service.Name {{"}}"}}"
+            serviceInstance: "{{"{{"}} .Pod.Name {{"}}"}}"
             endpoint: ""
-          message: "{{ .Event.Message }}"
-        address: "oap:11800"
+          message: "{{"{{"}} .Event.Message {{"}}"}}"
+        address: "{{ .Release.Name }}-skywalking-helm:11800"
 
 ---
 apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: skywalking-event-exporter-deployment
-  namespace: ${NAMESPACE}
 spec:
   replicas: 1
   template:
@@ -73,8 +54,8 @@ spec:
       serviceAccountName: skywalking-event-exporter-sa
       containers:
         - name: skywalking-event-exporter
-          image: ${SW_EVENT_EXPORTER_IMAGE}
-          imagePullPolicy: Always
+          image: "{{ .Values.eventExporter.image }}"
+          imagePullPolicy: IfNotPresent
           args:
             - start
             - -v=debug
@@ -89,3 +70,4 @@ spec:
   selector:
     matchLabels:
       app: skywalking-event-exporter
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-event/scaler.yaml b/deploy/platform/kubernetes/templates/feature-event/scaler.yaml
similarity index 80%
rename from deploy/platform/kubernetes/feature-event/scaler.yaml
rename to deploy/platform/kubernetes/templates/feature-event/scaler.yaml
index 03cd3a3..b991aa4 100644
--- a/deploy/platform/kubernetes/feature-event/scaler.yaml
+++ b/deploy/platform/kubernetes/templates/feature-event/scaler.yaml
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.event.enabled }}
 
 ---
 # @feature: event; a cron job to mimic the restart of Pods
@@ -22,6 +23,7 @@ kind: Role
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: event-role
+  namespace: {{ .Values.sampleServices.namespace }}
 rules:
   - apiGroups:
       - ""
@@ -37,6 +39,7 @@ kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: event-role-binding
+  namespace: {{ .Values.sampleServices.namespace }}
 subjects:
   - kind: ServiceAccount
     name: event-scaler-sa
@@ -50,12 +53,14 @@ apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: event-scaler-sa
+  namespace: {{ .Values.sampleServices.namespace }}
 
 ---
 apiVersion: batch/v1
 kind: CronJob
 metadata:
   name: event-scale-up
+  namespace: {{ .Values.sampleServices.namespace }}
 spec:
   schedule: "0,10,20,30,40,50 * * * *"
   successfulJobsHistoryLimit: 1
@@ -74,7 +79,7 @@ spec:
               command:
                 - sh
                 - -c
-                - kubectl -n ${NAMESPACE} scale deployment songs-deployment gateway-deployment app-deployment --replicas=2
+                - kubectl -n {{ .Values.sampleServices.namespace }} scale deployment songs-deployment gateway-deployment app-deployment --replicas=2
           restartPolicy: Never
 
 ---
@@ -82,6 +87,7 @@ apiVersion: batch/v1
 kind: CronJob
 metadata:
   name: event-scale-down
+  namespace: {{ .Values.sampleServices.namespace }}
 spec:
   schedule: "5,15,25,35,45,55 * * * *"
   successfulJobsHistoryLimit: 1
@@ -100,5 +106,6 @@ spec:
               command:
                 - sh
                 - -c
-                - kubectl -n ${NAMESPACE} scale deployment songs-deployment gateway-deployment app-deployment --replicas=1
+                - kubectl -n {{ .Values.sampleServices.namespace }} scale deployment songs-deployment gateway-deployment app-deployment --replicas=1
           restartPolicy: Never
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-function/resource.yaml b/deploy/platform/kubernetes/templates/feature-function/resource.yaml
similarity index 81%
rename from deploy/platform/kubernetes/feature-function/resource.yaml
rename to deploy/platform/kubernetes/templates/feature-function/resource.yaml
index c70b13c..af182b4 100644
--- a/deploy/platform/kubernetes/feature-function/resource.yaml
+++ b/deploy/platform/kubernetes/templates/feature-function/resource.yaml
@@ -15,6 +15,9 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+
+{{- if .Values.features.function.enabled }}
+
 ---
 apiVersion: apps/v1
 kind: Deployment
@@ -34,11 +37,11 @@ spec:
     spec:
       containers:
         - name: app
-          image: ${HUB}/function-load-gen:${TAG}
+          image: "{{ .Values.sampleServices.hub }}/function-load-gen:{{ .Values.sampleServices.tag }}"
           imagePullPolicy: IfNotPresent
           env:
             - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
-              value: ${BACKEND_SERVICE}:11800
+              value: {{ template "skywalking.collector.address" . }}
             - name: URL
               value: http://function.default.svc.cluster.local/World
             - name: SW_AGENT_LAYER
@@ -53,10 +56,10 @@ metadata:
       enabled: true
       provider:
         name: "skywalking"
-        oapServer: ${BACKEND_SERVICE}:11800
+        oapServer: {{ template "skywalking.collector.address" . }}
 spec:
   version: "v2.0.0"
-  image: ${HUB}/function:${TAG}
+  image: {{ .Values.sampleServices.hub }}/function:{{ .Values.sampleServices.tag }}
   port: 8080
   serving:
     template:
@@ -64,3 +67,5 @@ spec:
         - name: function
           imagePullPolicy: IfNotPresent
     runtime: "knative"
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-istiod-monitor/open-telemetry.yaml b/deploy/platform/kubernetes/templates/feature-istiod-monitor/open-telemetry.yaml
similarity index 95%
rename from deploy/platform/kubernetes/feature-istiod-monitor/open-telemetry.yaml
rename to deploy/platform/kubernetes/templates/feature-istiod-monitor/open-telemetry.yaml
index db98d5d..743a9df 100644
--- a/deploy/platform/kubernetes/feature-istiod-monitor/open-telemetry.yaml
+++ b/deploy/platform/kubernetes/templates/feature-istiod-monitor/open-telemetry.yaml
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.istiodMonitor.enabled }}
 
 # @feature: istiod-monitor; set OpenTelemetry config to scrape the Istio control plane metrics
 ---
@@ -33,7 +34,7 @@ data:
           exporters: [ logging, otlp ]
     exporters:
       otlp:
-        endpoint: "oap:11800"
+        endpoint: "{{ include "skywalking.oap.address.grpc" . }}"
         tls:
           insecure: true
       logging:
@@ -92,3 +93,4 @@ spec:
             items:
               - key: otel-collector-config
                 path: otel-collector-config.yaml
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-istiod-monitor/permissions.yaml b/deploy/platform/kubernetes/templates/feature-istiod-monitor/permissions.yaml
similarity index 93%
rename from deploy/platform/kubernetes/feature-istiod-monitor/permissions.yaml
rename to deploy/platform/kubernetes/templates/feature-istiod-monitor/permissions.yaml
index 34924f4..4dfb9a7 100644
--- a/deploy/platform/kubernetes/feature-istiod-monitor/permissions.yaml
+++ b/deploy/platform/kubernetes/templates/feature-istiod-monitor/permissions.yaml
@@ -15,6 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.istiodMonitor.enabled }}
+
 ---
 apiVersion: v1
 kind: ServiceAccount
@@ -47,4 +49,6 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: otel-sa-istio-monitor
-    namespace: ${NAMESPACE}
+    namespace: {{ .Release.Namespace }}
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-kubernetes-monitor/open-telemetry.yaml b/deploy/platform/kubernetes/templates/feature-kubernetes-monitor/open-telemetry.yaml
similarity index 96%
rename from deploy/platform/kubernetes/feature-kubernetes-monitor/open-telemetry.yaml
rename to deploy/platform/kubernetes/templates/feature-kubernetes-monitor/open-telemetry.yaml
index e352eb9..b2e5e43 100644
--- a/deploy/platform/kubernetes/feature-kubernetes-monitor/open-telemetry.yaml
+++ b/deploy/platform/kubernetes/templates/feature-kubernetes-monitor/open-telemetry.yaml
@@ -16,6 +16,8 @@
 # under the License.
 #
 
+{{- if .Values.features.kubernetesMonitor.enabled }}
+
 # @feature: kubernetes-monitor; set OpenTelemetry config to scrape the Kubernetes metrics
 ---
 apiVersion: v1
@@ -33,7 +35,7 @@ data:
           exporters: [ logging, otlp ]
     exporters:
       otlp:
-        endpoint: "oap:11800"
+        endpoint: "{{ include "skywalking.oap.address.grpc" . }}"
         tls:
           insecure: true
       logging:
@@ -120,3 +122,5 @@ spec:
             items:
               - key: otel-collector-config
                 path: otel-collector-config.yaml
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-kubernetes-monitor/permissions.yaml b/deploy/platform/kubernetes/templates/feature-kubernetes-monitor/permissions.yaml
similarity index 93%
rename from deploy/platform/kubernetes/feature-kubernetes-monitor/permissions.yaml
rename to deploy/platform/kubernetes/templates/feature-kubernetes-monitor/permissions.yaml
index 80f9e93..a5f8af7 100644
--- a/deploy/platform/kubernetes/feature-kubernetes-monitor/permissions.yaml
+++ b/deploy/platform/kubernetes/templates/feature-kubernetes-monitor/permissions.yaml
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.kubernetesMonitor.enabled }}
 ---
 apiVersion: v1
 kind: ServiceAccount
@@ -50,4 +51,6 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: otel-sa-kubernetes-monitor
-    namespace: ${NAMESPACE}
+    namespace: {{ .Release.Namespace }}
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-mysql/fluent-bit.yaml b/deploy/platform/kubernetes/templates/feature-mysql-monitor/fluent-bit.yaml
similarity index 97%
rename from deploy/platform/kubernetes/feature-mysql/fluent-bit.yaml
rename to deploy/platform/kubernetes/templates/feature-mysql-monitor/fluent-bit.yaml
index 6a48c40..adc2685 100644
--- a/deploy/platform/kubernetes/feature-mysql/fluent-bit.yaml
+++ b/deploy/platform/kubernetes/templates/feature-mysql-monitor/fluent-bit.yaml
@@ -16,6 +16,8 @@
 # under the License.
 #
 
+{{- if .Values.features.mysqlMonitor.enabled }}
+
 # @feature: slowsql-mysql; fluent bit log configurations
 ---
 apiVersion: v1
@@ -69,7 +71,7 @@ data:
         log = record["log"]
         record["log"] = nil
         record["date"] = nil
-        record["tags"] = {data={{key="LOG_KIND", value="SLOW_SQL"}}}
+        record["tags"] = { data={ { key="LOG_KIND", value="SLOW_SQL" } } }
         arr = split(log,"\n")
         re1 = {}
 
@@ -170,3 +172,5 @@ data:
         rule      "second_state"  "^(# User@Host.*)"  "third_state"
         rule      "third_state"   "^(# Query_time: .*)"    "statement"
         rule      "statement"     "^\w+.*"             "statement"
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-mysql/mysql.yaml b/deploy/platform/kubernetes/templates/feature-mysql-monitor/mysql.yaml
similarity index 98%
rename from deploy/platform/kubernetes/feature-mysql/mysql.yaml
rename to deploy/platform/kubernetes/templates/feature-mysql-monitor/mysql.yaml
index 795cdca..b5f15f5 100644
--- a/deploy/platform/kubernetes/feature-mysql/mysql.yaml
+++ b/deploy/platform/kubernetes/templates/feature-mysql-monitor/mysql.yaml
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.mysqlMonitor.enabled }}
 
 apiVersion: v1
 kind: ConfigMap
@@ -197,3 +198,4 @@ spec:
             items:
               - key: mock-sql
                 path: mock.sql
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-mysql/open-telemetry.yaml b/deploy/platform/kubernetes/templates/feature-mysql-monitor/open-telemetry.yaml
similarity index 98%
rename from deploy/platform/kubernetes/feature-mysql/open-telemetry.yaml
rename to deploy/platform/kubernetes/templates/feature-mysql-monitor/open-telemetry.yaml
index 8ec063c..00fc27e 100644
--- a/deploy/platform/kubernetes/feature-mysql/open-telemetry.yaml
+++ b/deploy/platform/kubernetes/templates/feature-mysql-monitor/open-telemetry.yaml
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.mysqlMonitor.enabled }}
 
 # @feature: mysql; set OpenTelemetry config to scrape the mysql metrics
 ---
@@ -100,3 +101,4 @@ spec:
             items:
               - key: otel-collector-config
                 path: otel-collector-config.yaml
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-mysql/permissions.yaml b/deploy/platform/kubernetes/templates/feature-mysql-monitor/permissions.yaml
similarity index 92%
rename from deploy/platform/kubernetes/feature-mysql/permissions.yaml
rename to deploy/platform/kubernetes/templates/feature-mysql-monitor/permissions.yaml
index d5ed9d4..651a720 100644
--- a/deploy/platform/kubernetes/feature-mysql/permissions.yaml
+++ b/deploy/platform/kubernetes/templates/feature-mysql-monitor/permissions.yaml
@@ -15,6 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.mysqlMonitor.enabled }}
+
 ---
 apiVersion: v1
 kind: ServiceAccount
@@ -44,4 +46,6 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: otel-sa-mysql
-    namespace: ${NAMESPACE}
+    namespace: {{ .Release.Namespace }}
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-postgresql/fluent-bit.yaml b/deploy/platform/kubernetes/templates/feature-postgresql-monitor/fluent-bit.yaml
similarity index 97%
rename from deploy/platform/kubernetes/feature-postgresql/fluent-bit.yaml
rename to deploy/platform/kubernetes/templates/feature-postgresql-monitor/fluent-bit.yaml
index f69acae..b58f0a0 100644
--- a/deploy/platform/kubernetes/feature-postgresql/fluent-bit.yaml
+++ b/deploy/platform/kubernetes/templates/feature-postgresql-monitor/fluent-bit.yaml
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.postgresqlMonitor.enabled }}
 
 # @feature: slowsql-psql; fluent bit log configurations
 ---
@@ -60,7 +61,7 @@ data:
         log = record["log"]
         record["log"] = nil
         record["date"] = nil
-        record["tags"] = {data={{key="LOG_KIND", value="SLOW_SQL"}}}
+        record["tags"] = { data={ { key="LOG_KIND", value="SLOW_SQL" } } }
         arr = split(log,"\n")
         re1 = {}
 
@@ -145,3 +146,5 @@ data:
         name   my-log-format
         format regex
         regex  \w*-\w*-\w* \w*:\w*:\w*.\w* UTCLOG:  duration: \w*.\w* ms  statement.*
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-postgresql/open-telemetry.yaml b/deploy/platform/kubernetes/templates/feature-postgresql-monitor/open-telemetry.yaml
similarity index 97%
rename from deploy/platform/kubernetes/feature-postgresql/open-telemetry.yaml
rename to deploy/platform/kubernetes/templates/feature-postgresql-monitor/open-telemetry.yaml
index 3a55902..8601343 100644
--- a/deploy/platform/kubernetes/feature-postgresql/open-telemetry.yaml
+++ b/deploy/platform/kubernetes/templates/feature-postgresql-monitor/open-telemetry.yaml
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.postgresqlMonitor.enabled }}
 
 # @feature: postgresql; set OpenTelemetry config to scrape the psql metrics
 ---
@@ -102,3 +103,5 @@ spec:
             items:
               - key: otel-collector-config
                 path: otel-collector-config.yaml
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-postgresql/permissions.yaml b/deploy/platform/kubernetes/templates/feature-postgresql-monitor/permissions.yaml
similarity index 92%
rename from deploy/platform/kubernetes/feature-postgresql/permissions.yaml
rename to deploy/platform/kubernetes/templates/feature-postgresql-monitor/permissions.yaml
index 79d6b41..781ea41 100644
--- a/deploy/platform/kubernetes/feature-postgresql/permissions.yaml
+++ b/deploy/platform/kubernetes/templates/feature-postgresql-monitor/permissions.yaml
@@ -15,6 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.postgresqlMonitor.enabled }}
+
 ---
 apiVersion: v1
 kind: ServiceAccount
@@ -44,4 +46,6 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: otel-sa-psql
-    namespace: ${NAMESPACE}
+    namespace: {{ .Release.Namespace }}
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-postgresql/psql.yaml b/deploy/platform/kubernetes/templates/feature-postgresql-monitor/psql.yaml
similarity index 98%
rename from deploy/platform/kubernetes/feature-postgresql/psql.yaml
rename to deploy/platform/kubernetes/templates/feature-postgresql-monitor/psql.yaml
index 047f173..122b796 100644
--- a/deploy/platform/kubernetes/feature-postgresql/psql.yaml
+++ b/deploy/platform/kubernetes/templates/feature-postgresql-monitor/psql.yaml
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.postgresqlMonitor.enabled }}
 
 ---
 apiVersion: v1
@@ -220,3 +221,5 @@ spec:
                 items:
                   - key: mock-sql
                     path: mock.sql
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/Makefile.in b/deploy/platform/kubernetes/templates/feature-promql/configmaps.yaml
similarity index 71%
copy from deploy/platform/kubernetes/Makefile.in
copy to deploy/platform/kubernetes/templates/feature-promql/configmaps.yaml
index 6ddc6e6..d12d9c1 100644
--- a/deploy/platform/kubernetes/Makefile.in
+++ b/deploy/platform/kubernetes/templates/feature-promql/configmaps.yaml
@@ -15,11 +15,16 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.promql.enabled }}
 
-.EXPORT_ALL_VARIABLES:
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: promql-configs
+data:
+{{ range $path, $bytes := .Files.Glob "generated/promql-configs/*.json" }}
+{{- $path | replace "generated/promql-configs/" "" | indent 2 }}: |
+{{ $.Files.Get $path | indent 4 }}
+{{ end }}
 
-NAMESPACE ?= default
-AGENTLESS ?= false
-BACKEND_SERVICE ?= oap
-
-FEATURE_FLAGS ?= java-agent-injector,cluster,elasticsearch,kubernetes-monitor,so11y,vm,als,event,istiod-monitor,satellite,rover,trace-profiling,mysql,apisix-monitor,promql
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-promql/resources.yaml b/deploy/platform/kubernetes/templates/feature-promql/resources.yaml
similarity index 87%
rename from deploy/platform/kubernetes/feature-promql/resources.yaml
rename to deploy/platform/kubernetes/templates/feature-promql/resources.yaml
index 6c66cf3..df74201 100644
--- a/deploy/platform/kubernetes/feature-promql/resources.yaml
+++ b/deploy/platform/kubernetes/templates/feature-promql/resources.yaml
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.promql.enabled }}
 
 #This config is for the showcase, when deploy your own environment fell free to modify it.
 ---
@@ -84,7 +85,7 @@ spec:
     spec:
       containers:
         - name: grafana
-          image: ${GRAFANA_IMAGE}
+          image: {{ .Values.grafana.image }}
           imagePullPolicy: IfNotPresent
           ports:
             - name: http-grafana
@@ -99,28 +100,22 @@ spec:
             - name: grafana-config
               mountPath: /etc/grafana/provisioning/dashboards/providers.yaml
               subPath: providers.yaml
-            - name: dashboards-general-service
+            - name: promql-configs
               mountPath: /var/lib/grafana/dashboards/skywalking/general-service.json
               subPath: general-service.json
-            - name: dashboards-service-mesh
+            - name: promql-configs
               mountPath: /var/lib/grafana/dashboards/skywalking/service-mesh.json
               subPath: service-mesh.json
-            - name: dashboards-virtual-database
+            - name: promql-configs
               mountPath: /var/lib/grafana/dashboards/skywalking/virtual-database.json
               subPath: virtual-database.json
       volumes: # require create configmap from deploy/platform/config/promql/dashboards
         - name: grafana-config
           configMap:
             name: grafana-config
-        - name: dashboards-general-service
+        - name: promql-configs
           configMap:
-            name: grafana-dashboards-general-service
-        - name: dashboards-service-mesh
-          configMap:
-            name: grafana-dashboards-service-mesh
-        - name: dashboards-virtual-database
-          configMap:
-            name: grafana-dashboards-virtual-database
+            name: promql-configs
 
 ---
 apiVersion: v1
@@ -134,3 +129,5 @@ spec:
     - port: 3000
       protocol: TCP
       targetPort: http-grafana
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-rover/permissions.yaml b/deploy/platform/kubernetes/templates/feature-rover/permissions.yaml
similarity index 93%
rename from deploy/platform/kubernetes/feature-rover/permissions.yaml
rename to deploy/platform/kubernetes/templates/feature-rover/permissions.yaml
index 8b1da58..6542cd5 100644
--- a/deploy/platform/kubernetes/feature-rover/permissions.yaml
+++ b/deploy/platform/kubernetes/templates/feature-rover/permissions.yaml
@@ -15,12 +15,12 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.rover.enabled}}
 
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: skywalking-rover-sa
-  namespace: ${NAMESPACE}
 ---
 kind: ClusterRole
 apiVersion: rbac.authorization.k8s.io/v1
@@ -42,4 +42,6 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: skywalking-rover-sa
-    namespace: ${NAMESPACE}
+    namespace: {{ .Release.Namespace }}
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-rover/profiling.yaml b/deploy/platform/kubernetes/templates/feature-rover/profiling.yaml
similarity index 68%
rename from deploy/platform/kubernetes/feature-rover/profiling.yaml
rename to deploy/platform/kubernetes/templates/feature-rover/profiling.yaml
index 9a1d005..de1a862 100644
--- a/deploy/platform/kubernetes/feature-rover/profiling.yaml
+++ b/deploy/platform/kubernetes/templates/feature-rover/profiling.yaml
@@ -15,11 +15,13 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.rover.enabled}}
 
 apiVersion: v1
 kind: ConfigMap
 metadata:
   name: profiling-config
+  namespace: {{ .Values.sampleServices.namespace }}
   labels:
     app: profiling-config
 data:
@@ -37,6 +39,7 @@ apiVersion: batch/v1
 kind: CronJob
 metadata:
   name: ebpf-profiling-trgigger
+  namespace: {{ .Values.sampleServices.namespace }}
 spec:
   schedule: "10 */2 * * *"
   successfulJobsHistoryLimit: 1
@@ -50,28 +53,29 @@ spec:
         spec:
           containers:
             - name: ebpf-profiling-trigger
-              image: ${SW_CLI_IMAGE}
+              image: "{{ .Values.swctl.image }}"
+              imagePullPolicy: IfNotPresent
               command:
                 - /bin/sh
                 - -c
                 - >
-                  /swctl --base-url=http://oap:12800/graphql profiling ebpf create fixed \
+                  /swctl --base-url={{ template "skywalking.oap.address.http" . }}/graphql profiling ebpf create fixed \
                     --service-name mesh-svr::recommendation --labels mesh-envoy --duration=9m --target-type ON_CPU;
-                  /swctl --base-url=http://oap:12800/graphql profiling ebpf create fixed \
+                  /swctl --base-url={{ template "skywalking.oap.address.http" . }}/graphql profiling ebpf create fixed \
                     --service-name mesh-svr::app --labels mesh-envoy --duration=9m --target-type ON_CPU;
-                  /swctl --base-url=http://oap:12800/graphql profiling ebpf create fixed \
+                  /swctl --base-url={{ template "skywalking.oap.address.http" . }}/graphql profiling ebpf create fixed \
                     --service-name mesh-svr::songs --labels mesh-envoy --duration=9m --target-type ON_CPU;
-                  /swctl --base-url=http://oap:12800/graphql profiling ebpf create fixed \
+                  /swctl --base-url={{ template "skywalking.oap.address.http" . }}/graphql profiling ebpf create fixed \
                     --service-name mesh-svr::gateway --labels mesh-envoy --duration=9m --target-type ON_CPU;
 
-                  /swctl --base-url=http://oap:12800/graphql profiling ebpf create fixed \
+                  /swctl --base-url={{ template "skywalking.oap.address.http" . }}/graphql profiling ebpf create fixed \
                     --service-name mesh-svr::songs --labels mesh-envoy --duration=9m --target-type OFF_CPU;
 
                   apk update && apk add yq;
-                  /swctl --base-url=http://oap:12800/graphql profiling ebpf create network \
+                  /swctl --base-url={{ template "skywalking.oap.address.http" . }}/graphql profiling ebpf create network \
                     --sampling-config=/profiling/network-profiling-sampling.yaml \
                     --service-name=mesh-svr::recommendation \
-                    --instance-name=$(/swctl --base-url=http://oap:12800/graphql instance ls --service-name mesh-svr::recommendation|yq e '.[0].name' -);
+                    --instance-name=$(/swctl --base-url={{ template "skywalking.oap.address.http" . }}/graphql instance ls --service-name mesh-svr::recommendation|yq e '.[0].name' -);
               volumeMounts:
                 - name: profiling-config
                   mountPath: /profiling
@@ -80,3 +84,4 @@ spec:
             - name: profiling-config
               configMap:
                 name: profiling-config
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-rover/resources.yaml b/deploy/platform/kubernetes/templates/feature-rover/resources.yaml
similarity index 78%
rename from deploy/platform/kubernetes/feature-rover/resources.yaml
rename to deploy/platform/kubernetes/templates/feature-rover/resources.yaml
index a7fa9f8..ce4d75e 100644
--- a/deploy/platform/kubernetes/feature-rover/resources.yaml
+++ b/deploy/platform/kubernetes/templates/feature-rover/resources.yaml
@@ -15,6 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.rover.enabled}}
+
 apiVersion: apps/v1
 kind: DaemonSet
 metadata:
@@ -33,8 +35,8 @@ spec:
       serviceAccountName: skywalking-rover-sa
       containers:
         - name: rover
-          image: ${SW_ROVER_IMAGE}
-          imagePullPolicy: Always
+          image: {{ .Values.rover.image }}
+          imagePullPolicy: IfNotPresent
           securityContext:
             capabilities:
               add:
@@ -53,13 +55,13 @@ spec:
                 fieldRef:
                   fieldPath: spec.nodeName
             - name: ROVER_BACKEND_ADDR
-              value: ${BACKEND_SERVICE}:11800
+              value: {{ template "skywalking.collector.address" . }}
             - name: ROVER_PROCESS_DISCOVERY_KUBERNETES_ANALYZER_ISTIO_ENVOY_SERVICE_NAME
-              value: mesh-svr::{{.Pod.LabelValue "service.istio.io/canonical-name,app.kubernetes.io/name,app"}}
+              value: mesh-svr::{{"{{"}}.Pod.LabelValue "service.istio.io/canonical-name,app.kubernetes.io/name,app"{{"}}"}}
             - name: ROVER_PROCESS_DISCOVERY_KUBERNETES_ANALYZER_ISTIO_APPLICATION_SERVICE_NAME
-              value: mesh-svr::{{.Pod.LabelValue "service.istio.io/canonical-name,app.kubernetes.io/name,app"}}
+              value: mesh-svr::{{"{{"}}.Pod.LabelValue "service.istio.io/canonical-name,app.kubernetes.io/name,app"{{"}}"}}
             - name: ROVER_PROCESS_DISCOVERY_KUBERNETES_ANALYZER_K8S_SERVICE_NAME
-              value: skywalking-showcase::{{.Pod.ServiceName}}.{{.Pod.Namespace}}
+              value: skywalking-showcase::{{"{{"}}.Pod.ServiceName{{"}}"}}.{{"{{"}}.Pod.Namespace{{"}}"}}
             - name: ROVER_HOST_MAPPING
               value: /host
       hostPID: true
@@ -69,4 +71,6 @@ spec:
         - name: host
           hostPath:
             path: /
-            type: Directory
\ No newline at end of file
+            type: Directory
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-so11y/open-telemetry.yaml b/deploy/platform/kubernetes/templates/feature-so11y/open-telemetry.yaml
similarity index 98%
rename from deploy/platform/kubernetes/feature-so11y/open-telemetry.yaml
rename to deploy/platform/kubernetes/templates/feature-so11y/open-telemetry.yaml
index afa7832..d3c336f 100644
--- a/deploy/platform/kubernetes/feature-so11y/open-telemetry.yaml
+++ b/deploy/platform/kubernetes/templates/feature-so11y/open-telemetry.yaml
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.so11y.enabled }}
 
 # @feature: so11y; in Kubernetes, it's better to set service discovery so the OAP instances are not always "localhost:1234"
 
@@ -97,3 +98,5 @@ spec:
             items:
               - key: otel-collector-config
                 path: otel-collector-config.yaml
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-so11y/permissions.yaml b/deploy/platform/kubernetes/templates/feature-so11y/permissions.yaml
similarity index 93%
rename from deploy/platform/kubernetes/feature-so11y/permissions.yaml
rename to deploy/platform/kubernetes/templates/feature-so11y/permissions.yaml
index bfdc6e5..7df3a3b 100644
--- a/deploy/platform/kubernetes/feature-so11y/permissions.yaml
+++ b/deploy/platform/kubernetes/templates/feature-so11y/permissions.yaml
@@ -15,6 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.so11y.enabled }}
+
 ---
 apiVersion: v1
 kind: ServiceAccount
@@ -44,4 +46,6 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: otel-sa-so11y
-    namespace: ${NAMESPACE}
+    namespace: {{ .Release.Namespace }}
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-trace-profiling/profiling.yaml b/deploy/platform/kubernetes/templates/feature-trace-profiling/profiling.yaml
similarity index 82%
rename from deploy/platform/kubernetes/feature-trace-profiling/profiling.yaml
rename to deploy/platform/kubernetes/templates/feature-trace-profiling/profiling.yaml
index 797da6c..f065988 100644
--- a/deploy/platform/kubernetes/feature-trace-profiling/profiling.yaml
+++ b/deploy/platform/kubernetes/templates/feature-trace-profiling/profiling.yaml
@@ -16,10 +16,13 @@
 # under the License.
 #
 
+{{- if .Values.features.traceProfiling.enabled }}
+
 apiVersion: batch/v1
 kind: CronJob
 metadata:
   name: trace-profiling-trgigger
+  namespace: {{ .Values.sampleServices.namespace }}
 spec:
   schedule: "8 0 * * *"
   successfulJobsHistoryLimit: 1
@@ -33,11 +36,13 @@ spec:
         spec:
           containers:
             - name: trace-profiling-trigger
-              image: ${SW_CLI_IMAGE}
+              image: "{{ .Values.swctl.image }}"
               command:
                 - /bin/sh
                 - -c
                 - >
-                  /swctl --base-url=http://oap:12800/graphql profiling trace create --service-name agent::songs \
+                  /swctl --base-url={{ template "skywalking.oap.address.http" . }}/graphql profiling trace create --service-name agent::songs \
                     --endpoint-name GET:/songs --duration=15 --min-duration-threshold=0 --dump-period=10 --max-sampling-count=9
           restartPolicy: Never
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-vm/open-telemetry.yaml b/deploy/platform/kubernetes/templates/feature-vm-monitor/open-telemetry.yaml
similarity index 98%
rename from deploy/platform/kubernetes/feature-vm/open-telemetry.yaml
rename to deploy/platform/kubernetes/templates/feature-vm-monitor/open-telemetry.yaml
index a1996da..06126e0 100644
--- a/deploy/platform/kubernetes/feature-vm/open-telemetry.yaml
+++ b/deploy/platform/kubernetes/templates/feature-vm-monitor/open-telemetry.yaml
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.vmMonitor.enabled }}
 
 # @feature: vm; set OpenTelemetry config to scrape the VM metrics
 ---
@@ -94,3 +95,5 @@ spec:
             items:
               - key: otel-collector-config
                 path: otel-collector-config.yaml
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-vm/permissions.yaml b/deploy/platform/kubernetes/templates/feature-vm-monitor/permissions.yaml
similarity index 93%
rename from deploy/platform/kubernetes/feature-vm/permissions.yaml
rename to deploy/platform/kubernetes/templates/feature-vm-monitor/permissions.yaml
index 02fb039..bae8a37 100644
--- a/deploy/platform/kubernetes/feature-vm/permissions.yaml
+++ b/deploy/platform/kubernetes/templates/feature-vm-monitor/permissions.yaml
@@ -15,6 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.vmMonitor.enabled }}
+
 ---
 apiVersion: v1
 kind: ServiceAccount
@@ -44,4 +46,6 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: otel-sa-vm
-    namespace: ${NAMESPACE}
+    namespace: {{ .Release.Namespace }}
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/feature-vm/vm.yaml b/deploy/platform/kubernetes/templates/feature-vm-monitor/vm.yaml
similarity index 96%
rename from deploy/platform/kubernetes/feature-vm/vm.yaml
rename to deploy/platform/kubernetes/templates/feature-vm-monitor/vm.yaml
index b7844e1..c5b2f05 100644
--- a/deploy/platform/kubernetes/feature-vm/vm.yaml
+++ b/deploy/platform/kubernetes/templates/feature-vm-monitor/vm.yaml
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+{{- if .Values.features.vmMonitor.enabled }}
 
 # @feature: pretend these Pods are virtual machines
 
@@ -59,3 +60,5 @@ spec:
           ports:
             - containerPort: 9100
               name: metrics
+
+{{- end }}
diff --git a/deploy/platform/kubernetes/values.yaml b/deploy/platform/kubernetes/values.yaml
new file mode 100644
index 0000000..e77ea11
--- /dev/null
+++ b/deploy/platform/kubernetes/values.yaml
@@ -0,0 +1,259 @@
+# 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.
+
+skywalking-helm:
+  fullnameOverride: "sw-demo"
+  oap:
+    name: oap
+    image:
+      repository: ghcr.io/apache/skywalking/oap
+      tag: af657356ed61c2595d70dd18eae5a6e5dbc39a82
+      pullPolicy: IfNotPresent
+    replicas: 1
+    storageType: ~
+    env:
+      SW_HEALTH_CHECKER: default
+      SW_OTEL_RECEIVER: default # @feature: so11y;,mysql;kubernetes-monitor enable OpenTelemetry receiver to receive OpenTelemetry metrics
+      # @feature: vm; enable vm rules to analyze VM metrics
+      # @feature: so11y; enable oap rules to analyze OAP metrics
+      # @feature: kubernetes-monitor; enable rules to analyze Kubernetes Cluster/Node/Service metrics
+      # @feature: istiod-monitor; enable rules to analyze Istio control plane metrics
+      # @feature: mysql; enable mysql rules to analyze MySQL metrics
+      # @feature: apisix-monitor; enable APISIX rules to analyze APISIX metrics
+      SW_OTEL_RECEIVER_ENABLED_OTEL_RULES: vm,oap,k8s/*,istio-controlplane,mysql/*,postgresql/*,apisix
+      SW_TELEMETRY: prometheus # @feature: so11y; expose the metrics of self o11y through prometheus
+      SW_ENVOY_METRIC_ALS_HTTP_ANALYSIS: "mx-mesh,persistence" # @feature: als; enable mesh analyzer (mx-mesh) to analyze ALS logs
+      K8S_SERVICE_NAME_RULE: "mesh-svr::${service.metadata.name}"
+      SW_CONFIGURATION: k8s-configmap
+      SW_ENVOY_METRIC_ALS_TCP_ANALYSIS: "mx-mesh"
+      SW_ENABLE_UPDATE_UI_TEMPLATE: "false"
+      SW_SLOW_DB_THRESHOLD: default:0,mongodb:100
+      SW_ENABLE_ON_DEMAND_POD_LOG: "true"
+      SW_METER_ANALYZER_ACTIVE_FILES: datasource,threadpool,satellite,network-profiling,spring-sleuth
+      SW_STORAGE_ES_RESPONSE_TIMEOUT: "50000"
+      SW_STORAGE_ES_INDEX_SHARDS_NUMBER: "6"
+      SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR: "2"
+      SW_RECEIVER_ZIPKIN: default
+      SW_QUERY_ZIPKIN: default
+
+    config:
+      metadata-service-mapping.yaml: |
+        serviceName: mesh-svr::${LABELS."service.istio.io/canonical-name",LABELS."app.kubernetes.io/name",LABELS.app}
+        serviceInstanceName: ${NAME}
+      alarm-settings.yml: |
+        rules:
+          service_resp_time_rule:
+            metrics-name: service_resp_time
+            threshold: 20 # 20ms is just for demo
+            op: ">"
+            period: 5
+            count: 1
+            message: Response time of service {name} is more than 20ms.
+      core.default.log4j-xml: |-
+        <Configuration status="WARN">
+           <Appenders>
+             <Console name="Console" target="SYSTEM_OUT">
+               <PatternLayout charset="UTF-8" pattern="%d - %c - %L [%t] %-5p %x - %m%n"/>
+             </Console>
+           </Appenders>
+           <Loggers>
+             <logger name="io.grpc.netty" level="INFO"/>
+             <logger name="org.apache.skywalking.oap.server.configuration.api" level="TRACE"/>
+             <logger name="org.apache.skywalking.oap.server.configuration.configmap" level="DEBUG"/>
+             <logger name="org.apache.skywalking.oap.server.storage.plugin.jdbc" level="DEBUG"/>
+             <Root level="INFO">
+               <AppenderRef ref="Console"/>
+             </Root>
+            </Loggers>
+        </Configuration>
+  ui:
+    name: ui
+    replicas: 1
+    image:
+      repository: ghcr.io/apache/skywalking/ui
+      tag: af657356ed61c2595d70dd18eae5a6e5dbc39a82
+      pullPolicy: IfNotPresent
+
+  elasticsearch:
+    enabled: false
+
+  postgresql:
+    enabled: false # Whether to start a demo postgresql deployment, don't use this for production.
+    config:
+      # The hostname of your own postgresql service, this only takes effect when postgresql.enabled is false.
+      host: postgresql-service.your-awesome-company.com
+    auth:
+      username: postgres
+      password: "123456"
+      postgresPassword: "123456"
+      database: skywalking
+    containerPorts:
+      postgresql: 5432
+    primary:
+      persistence:
+        enabled: false
+    readReplicas:
+      persistence:
+        enabled: false
+
+  satellite:
+    name: satellite
+    replicas: 1
+    enabled: true
+    image:
+      repository: ghcr.io/apache/skywalking-satellite/skywalking-satellite
+      tag: v672ec32414c38f3589124c6131b0b4473cda0de5
+      pullPolicy: IfNotPresent
+    ports:
+      grpc: 11800
+      prometheus: 1234
+    env:
+      SATELLITE_TELEMETRY_EXPORT_TYPE: metrics_service
+    podAnnotations:
+      sidecar.istio.io/inject: "false"
+
+rover:
+  image: ghcr.io/apache/skywalking-rover/skywalking-rover:668abb2fbc38250d2bd825e62ec5678bb8017864
+
+eventExporter:
+  image: ghcr.io/apache/skywalking-kubernetes-event-exporter/skywalking-kubernetes-event-exporter:8a012a3f968cb139f817189afb9b3748841bba22
+
+swctl:
+  image: ghcr.io/apache/skywalking-cli/skywalking-cli:0883266bfaa36612927b69e35781b64ea181758d
+
+sampleServices:
+  hub: ~
+  tag: ~
+  namespace: sample-services
+
+grafana:
+  image: grafana/grafana:9.1.0
+
+# @feature: java-agent-injector; enable java agent injector and set the java agent image
+agentInjector:
+  enabled: false
+  javaImage: ghcr.io/apache/skywalking-java/skywalking-java:51161ae6a5b8e266eef39162cc4e23440d36ab38-java8
+
+# @feature: java-agent-injector; the java agent injector is a component of the swck operator, so we need to deploy the swck operator firstly
+skywalking-helm-swck-operator:
+  image:
+    repository: docker.io/apache/skywalking-swck
+    tag: v0.7.0
+  # @feature: java-agent-injector; the swck operator depends on the certificate management of the cert-manager
+  cert-manager:
+    enabled: true
+  fullnameOverride: "swck-demo"
+
+# @feature: function; install open function resources
+openfunction:
+  enabled: false
+  global:
+    ShipwrightBuild:
+      enabled: false
+    TektonPipelines:
+      enabled: false
+    Keda:
+      enabled: false
+    Dapr:
+      enabled: false
+  contour:
+    envoy:
+      useHostPort: false
+      service:
+        type: ClusterIP
+        externalTrafficPolicy: ""
+
+istio:
+  enabled: false
+
+base:
+  global:
+    istioNamespace: demo
+
+istiod:
+  global:
+    istioNamespace: demo
+  meshConfig:
+    enableEnvoyAccessLogService: false
+    enableTracing: false
+    defaultConfig:
+      tracing:
+        sampling: 100
+        zipkin:
+          address: ~
+      envoyMetricsService:
+        address: ~
+      envoyAccessLogService:
+        address: ~
+      proxyStatsMatcher:
+        inclusionRegexps:
+          - ".*membership_healthy.*"
+          - ".*upstream_cx_active.*"
+          - ".*upstream_cx_total.*"
+          - ".*upstream_rq_active.*"
+          - ".*upstream_rq_total.*"
+          - ".*upstream_rq_pending_active.*"
+          - ".*lb_healthy_panic.*"
+          - ".*upstream_cx_none_healthy.*"
+
+# @feature: kubernetes-monitor; extra resources to install for kubernetes monitoring, standard kube-state-metrics
+kube-state-metrics:
+  enabled: false
+
+features:
+  kubernetesMonitor:
+    enabled: false
+
+  mysqlMonitor:
+    enabled: false
+
+  postgresqlMonitor:
+    enabled: false
+
+  event:
+    enabled: false
+
+  istiodMonitor:
+    enabled: false
+
+  apisixMonitor:
+    enabled: false
+
+  traceProfiling:
+    enabled: false
+
+  rover:
+    enabled: false
+
+  vmMonitor:
+    enabled: false
+
+  promql:
+    enabled: false
+
+  function:
+    enabled: false
+
+  so11y:
+    enabled: false
+
+  als:
+    enabled: false
+
+  meshWithAgent:
+    enabled: false
+
+  agent:
+    enabled: false
diff --git a/docs/readme.md b/docs/readme.md
index cd99032..83a346c 100644
--- a/docs/readme.md
+++ b/docs/readme.md
@@ -92,7 +92,7 @@ Currently, the features supported are:
 | `single-node`         | Deploy only one single node of SkyWalking OAP, and SkyWalking UI, ElasticSearch as storage.                                                                                            | Only one of `cluster` or `single-node` can be enabled.                                                                                |
 | `elasticsearch`       | Deploy a single-node ElasticSearch as storage, you may want to disable this if you want to use your own ElasticSearch deployments.                                                     |                                                                                                                                       |
 | `so11y`               | Enable SkyWalking self observability.                                                                                                                                                  | This is enabled by default for platform [Docker Compose](#docker-compose).                                                            |
-| `vm`                  | Start 2 virtual machines and export their metrics to SkyWalking.                                                                                                                       | The "virtual machines" are mimicked by Docker containers or Pods.                                                                     |
+| `vm-monitor`          | Start 2 virtual machines and export their metrics to SkyWalking.                                                                                                                       | The "virtual machines" are mimicked by Docker containers or Pods.                                                                     |
 | `als`                 | Start microservices WITHOUT SkyWalking agent enabled, and configure SkyWalking to analyze the topology and metrics from their access logs.                                             | Command `istioctl` is required to run this feature. The agentless microservices will be running at namespace `${NAMESPACE}-agentless` |
 | `kubernetes-monitor`  | Deploy OpenTelemetry and export Kubernetes monitoring metrics to SkyWalking for analysis and display on UI.                                                                            |                                                                                                                                       |
 | `istiod-monitor`      | Deploy OpenTelemetry and export Istio control plane metrics to SkyWalking for analysis and display on UI.                                                                              |                                                                                                                                       |
@@ -101,11 +101,11 @@ Currently, the features supported are:
 | `function`            | Deploy [OpenFunction](https://openfunction.dev/) and export trace to SkyWalking.                                                                                                       | Command `helm` is required to run this feature.                                                                                       |
 | `trace-profiling`     | Deploy tools to submit trace profiling tasks.                                                                                                                                          | Only support deployment with SkyWalking agents installed, currently Java agent and Python agent support trace profiling.              |
 | `rover`               | Deploy SkyWalking Rover and detect the processes in the Kubernetes environment.                                                                                                        | Only support deployment in the Kubernetes environment, docker is not supported.                                                       |
-| `mysql`               | Start a MySQL server and load generator to execute the sample SQLs periodically, set up fluent bit to fetch slow logs and export to OAP, and export their metrics to SkyWalking.       |                                                                                                                                       |
-| `postgresql`          | Start a PostgreSQL server, and load generator to execute the sample SQLs periodically, set up fluent bit to fetch slow logs and export to OAP, and export their metrics to SkyWalking. |                                                                                                                                       |
+| `mysql-monitor`       | Start a MySQL server and load generator to execute the sample SQLs periodically, set up fluent bit to fetch slow logs and export to OAP, and export their metrics to SkyWalking.       |                                                                                                                                       |
+| `postgresql-monitor`  | Start a PostgreSQL server, and load generator to execute the sample SQLs periodically, set up fluent bit to fetch slow logs and export to OAP, and export their metrics to SkyWalking. |                                                                                                                                       |
 | `apisix-monitor`      | Deploy OpenTelemetry and export APISIX metrics to SkyWalking for analysis and display on UI                                                                                            |                                                                                                                                       |
 | `mesh-with-agent`     | Deploy services with java agent in the service mesh environment.                                                                                                                       | Only support deployment in the Kubernetes environment, docker is not supported.                                                       |
-| `promql`              | Deploy a Grafana to use promql service and show SkyWalking UI on the Grafana.                                                                                                          | Feel free to modify the Grafana config when deploy your own environment.                                                                                    |
+| `promql`              | Deploy a Grafana to use promql service and show SkyWalking UI on the Grafana.                                                                                                          | Feel free to modify the Grafana config when deploy your own environment.                                                              |
 
 ### Kubernetes
 
diff --git a/scripts/wait-cert-manager-ready.sh b/scripts/wait-cert-manager-ready.sh
deleted file mode 100644
index 2067170..0000000
--- a/scripts/wait-cert-manager-ready.sh
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/bash
-
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-TIMEOUT=120
-
-MANIFEST=$(mktemp)
-
-cat << EOF > $MANIFEST
-apiVersion: cert-manager.io/v1
-kind: Issuer
-metadata:
-  name: test-selfsigned
-  namespace: default
-spec:
-  selfSigned: {}
----
-apiVersion: cert-manager.io/v1
-kind: Certificate
-metadata:
-  name: selfsigned-cert
-  namespace: default
-spec:
-  dnsNames:
-    - example.com
-  secretName: selfsigned-cert-tls
-  issuerRef:
-    name: test-selfsigned
-EOF
-
-( bash -c -- "\
-    while ! kubectl apply -f $MANIFEST 2> /dev/null; \
-    do \
-      sleep 0.1; \
-    done" ) & pid=$!
-( sleep $TIMEOUT && pkill -HUP $pid ) 2>/dev/null & watcher=$!
-if wait $pid 2>/dev/null; then
-    pkill -HUP -P $watcher
-    wait $watcher
-fi
-
-# make sure the dummy Issuer and Certificate will be deleted
-trap "kubectl delete -f $MANIFEST; rm $MANIFEST" 0 2 3 15