Repository: apecloud/kubeblocks

Issue:
[BUG] Modifying a static parameter caused the pod to lose with the primary role.
**Describe the bug**
After modifying a static parameter like MySQL's "performance_schema", the operation was successful, but both replicas in the cluster became secondary.

Using KubeBlocks v1.0.0-beta.30.


**To Reproduce**
Steps to reproduce the behavior:

1. Below is an example configuration for deploying a MySQL cluster with 2 nodes (1 primary, 1 replicas) in semi-synchronous mode. Deploy the cluster using the following YAML manifest:

```yaml
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
  name: example-mysql-cluster
  namespace: demo
spec:
  clusterDef: mysql
  topology: semisync
  terminationPolicy: Delete
  componentSpecs:
    - name: mysql
      serviceVersion: 8.0.35
      replicas: 2
      resources:
        limits:
          cpu: '0.5'
          memory: 0.5Gi
        requests:
          cpu: '0.5'
          memory: 0.5Gi
      volumeClaimTemplates:
        - name: data
          spec:
            storageClassName: ""
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 20Gi
EOF
```

2.  After the cluster is deployed, verify its status using the following command:

```bash
$ kubectl get cluster example-mysql-cluster -n demo -w
NAME                     CLUSTER-DEFINITION   TERMINATION-POLICY   STATUS    AGE
example-mysql-cluster   mysql                Delete               Creating   12s
example-mysql-cluster   mysql                Delete               Running   46s
```


3. Create a Reconfigure OpsRequest. Apply the following OpsRequest YAML to update the 'performance_schema':

```yaml
kubectl apply -f - <<EOF
apiVersion: operations.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: mysql-reconfigure-static
  namespace: demo
spec:
  clusterName: example-mysql-cluster
  force: false
  reconfigures:
  - componentName: mysql
    configurations:
    - keys:
      - key: my.cnf
        parameters:
        - key: performance_schema
          value: 'ON'
      name: mysql-replication-config
  preConditionDeadlineSeconds: 0
  type: Reconfiguring
EOF
```

4.  Check the status of the OpsRequest，until succeeded.
```bash
kubectl get ops mysql-reconfigure-static -n demo -w
```
Example output:
```bash
mysql-reconfigure-static   Reconfiguring   example-mysql-cluster   Running   -/-        9s
mysql-reconfigure-static   Reconfiguring   example-mysql-cluster   Running   1/2        28s
mysql-reconfigure-static   Reconfiguring   example-mysql-cluster   Succeed   2/2        57s
mysql-reconfigure-static   Reconfiguring   example-mysql-cluster   Succeed   2/2        57s
```


5. Verify roles
```bash
$ kubectl get pods -n demo -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.labels.kubeblocks\.io/role}{"\n"}{end}'
example-mysql-cluster-mysql-0	secondary
example-mysql-cluster-mysql-1	secondary
```

6. Verify paramter value

In both pods, the value of "performance_schema" changed to "ON"





Discussion:
@weicao: v1.0.0-beta.32 is fine.@weicao: In v1.0.0-beta.32:


1. Create a Reconfigure OpsRequest. Apply the following OpsRequest YAML to update the 'performance_schema':

```yaml
kubectl apply -f - <<EOF
apiVersion: operations.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: mysql-reconfigure-static
  namespace: demo
spec:
  clusterName: example-mysql-cluster
  force: false
  reconfigures:
  - componentName: mysql
    parameters:
    - key: performance_schema
      value: 'ON'
  preConditionDeadlineSeconds: 0
  type: Reconfiguring
EOF
```


2. Verify parameter update. It seems it did not take effect.

mysql> SHOW VARIABLES LIKE 'performance_schema';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| performance_schema | OFF   |
+--------------------+-------+
1 row in set (0.00 sec)@xuriwuyun: In version 1.0.0-beta.32, the pod does not restart for the static parameter 'performance_schema', so it does not take effect. This is unexpected.@sophon-zt: related bug: https://github.com/apecloud/kubeblocks/issues/9012@JashBook: in KB v1.0.0-beta.33 still does not take effect
1. create cluster
```
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
  name: mysql-cluster
  namespace: demo
spec:
  clusterDef: mysql
  topology: semisync
  terminationPolicy: Delete
  componentSpecs:
    - name: mysql
      serviceVersion: 8.0.35
      replicas: 2
      resources:
        limits:
          cpu: '0.5'
          memory: 0.5Gi
        requests:
          cpu: '0.5'
          memory: 0.5Gi
      volumeClaimTemplates:
        - name: data
          spec:
            storageClassName: ""
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 20Gi
EOF
```
2. config
```
kubectl apply -f - <<EOF
apiVersion: operations.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: mysql-reconfigure-static2
  namespace: demo
spec:
  clusterName: mysql-cluster
  force: false
  reconfigures:
  - componentName: mysql
    parameters:
    - key: performance_schema
      value: 'ON'
  preConditionDeadlineSeconds: 0
  type: Reconfiguring
EOF
```
```
kubectl get ops -n demo 
NAME                        TYPE            CLUSTER         STATUS    PROGRESS   AGE
mysql-reconfigure-static2   Reconfiguring   mysql-cluster   Succeed   -/-        4m51s
```
3. see error
```
kubectl exec -it mysql-cluster-mysql-0 -n demo -- bash
Defaulted container "mysql" out of: mysql, mysql-exporter, kbagent, config-manager, init-data (init), init-xtrabackup (init), init-jemalloc (init), init-syncer (init), init-kbagent (init), kbagent-worker (init)
bash-4.4# mysql -h127.0.0.1 -uroot -P3306 -p'3Ug32V1yZ0'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 8.0.35 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW VARIABLES LIKE 'performance_schema';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| performance_schema | OFF   |
+--------------------+-------+
1 row in set (0.00 sec)

mysql> 


```
```
kubectl exec -it mysql-cluster-mysql-1 -n demo -- bash
Defaulted container "mysql" out of: mysql, mysql-exporter, kbagent, config-manager, init-data (init), init-xtrabackup (init), init-jemalloc (init), init-syncer (init), init-kbagent (init), kbagent-worker (init)
bash-4.4# mysql -h127.0.0.1 -uroot -P3306 -p'3Ug32V1yZ0'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.35 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW VARIABLES LIKE 'performance_schema';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| performance_schema | OFF   |
+--------------------+-------+
1 row in set (0.00 sec)

mysql> 
```


Solution patch:
diff --git a/apis/workloads/v1/instanceset_types.go b/apis/workloads/v1/instanceset_types.go
index fcea1e5fc..cbb63e8c0 100644
--- a/apis/workloads/v1/instanceset_types.go
+++ b/apis/workloads/v1/instanceset_types.go
@@ -28,6 +28,10 @@ import (
 	kbappsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 )
 
+const (
+	defaultInstanceTemplateReplicas = 1
+)
+
 // +genclient
 // +kubebuilder:object:root=true
 // +kubebuilder:subresource:status
@@ -327,10 +331,90 @@ type InstanceSetStatus struct {
 // +kubebuilder:object:generate=false
 type PersistentVolumeClaimRetentionPolicy = kbappsv1.PersistentVolumeClaimRetentionPolicy
 
-// InstanceTemplate allows customization of individual replica configurations in a Component.
+// Ordinals represents a combination of continuous segments and individual values.
 //
 // +kubebuilder:object:generate=false
-type InstanceTemplate = kbappsv1.InstanceTemplate
+type Ordinals = kbappsv1.Ordinals
+
+// SchedulingPolicy defines the scheduling policy for instances.
+//
+// +kubebuilder:object:generate=false
+type SchedulingPolicy = kbappsv1.SchedulingPolicy
+
+// InstanceTemplate allows customization of individual replica configurations in a Component.
+type InstanceTemplate struct {
+	// Name specifies the unique name of the instance Pod created using this InstanceTemplate.
+	// This name is constructed by concatenating the Component's name, the template's name, and the instance's ordinal
+	// using the pattern: $(cluster.name)-$(component.name)-$(template.name)-$(ordinal). Ordinals start from 0.
+	// The specified name overrides any default naming conventions or patterns.
+	//
+	// +kubebuilder:validation:MaxLength=54
+	// +kubebuilder:validation:Pattern:=`^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$`
+	// +kubebuilder:validation:Required
+	Name string `json:"name"`
+
+	// Specifies the number of instances (Pods) to create from this InstanceTemplate.
+	// This field allows setting how many replicated instances of the Component,
+	// with the specific overrides in the InstanceTemplate, are created.
+	// The default value is 1. A value of 0 disables instance creation.
+	//
+	// +kubebuilder:default=1
+	// +kubebuilder:validation:Minimum=0
+	// +optional
+	Replicas *int32 `json:"replicas,omitempty"`
+
+	// Specifies the desired Ordinals of this InstanceTemplate.
+	// The Ordinals used to specify the ordinal of the instance (pod) names to be generated under this InstanceTemplate.
+	//
+	// For example, if Ordinals is {ranges: [{start: 0, end: 1}], discrete: [7]},
+	// then the instance names generated under this InstanceTemplate would be
+	// $(cluster.name)-$(component.name)-$(template.name)-0、$(cluster.name)-$(component.name)-$(template.name)-1 and
+	// $(cluster.name)-$(component.name)-$(template.name)-7
+	Ordinals Ordinals `json:"ordinals,omitempty"`
+
+	// Specifies a map of key-value pairs to be merged into the Pod's existing annotations.
+	// Existing keys will have their values overwritten, while new keys will be added to the annotations.
+	//
+	// +optional
+	Annotations map[string]string `json:"annotations,omitempty"`
+
+	// Specifies a map of key-value pairs that will be merged into the Pod's existing labels.
+	// Values for existing keys will be overwritten, and new keys will be added.
+	//
+	// +optional
+	Labels map[string]string `json:"labels,omitempty"`
+
+	// Specifies the scheduling policy for the Component.
+	//
+	// +optional
+	SchedulingPolicy *SchedulingPolicy `json:"schedulingPolicy,omitempty"`
+
+	// Specifies an override for the resource requirements of the first container in the Pod.
+	// This field allows for customizing resource allocation (CPU, memory, etc.) for the container.
+	//
+	// +optional
+	Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
+
+	// Defines Env to override.
+	// Add new or override existing envs.
+	// +optional
+	Env []corev1.EnvVar `json:"env,omitempty"`
+}
+
+func (t *InstanceTemplate) GetName() string {
+	return t.Name
+}
+
+func (t *InstanceTemplate) GetReplicas() int32 {
+	if t.Replicas != nil {
+		return *t.Replicas
+	}
+	return defaultInstanceTemplateReplicas
+}
+
+func (t *InstanceTemplate) GetOrdinals() Ordinals {
+	return t.Ordinals
+}
 
 // PodUpdatePolicyType indicates how pods should be updated
 //
diff --git a/apis/workloads/v1/zz_generated.deepcopy.go b/apis/workloads/v1/zz_generated.deepcopy.go
index 2589097ff..f9bd12bc5 100644
--- a/apis/workloads/v1/zz_generated.deepcopy.go
+++ b/apis/workloads/v1/zz_generated.deepcopy.go
@@ -149,7 +149,7 @@ func (in *InstanceSetSpec) DeepCopyInto(out *InstanceSetSpec) {
 	in.Template.DeepCopyInto(&out.Template)
 	if in.Instances != nil {
 		in, out := &in.Instances, &out.Instances
-		*out = make([]appsv1.InstanceTemplate, len(*in))
+		*out = make([]InstanceTemplate, len(*in))
 		for i := range *in {
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
@@ -297,6 +297,58 @@ func (in *InstanceStatus) DeepCopy() *InstanceStatus {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *InstanceTemplate) DeepCopyInto(out *InstanceTemplate) {
+	*out = *in
+	if in.Replicas != nil {
+		in, out := &in.Replicas, &out.Replicas
+		*out = new(int32)
+		**out = **in
+	}
+	in.Ordinals.DeepCopyInto(&out.Ordinals)
+	if in.Annotations != nil {
+		in, out := &in.Annotations, &out.Annotations
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	if in.Labels != nil {
+		in, out := &in.Labels, &out.Labels
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	if in.SchedulingPolicy != nil {
+		in, out := &in.SchedulingPolicy, &out.SchedulingPolicy
+		*out = new(appsv1.SchedulingPolicy)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Resources != nil {
+		in, out := &in.Resources, &out.Resources
+		*out = new(corev1.ResourceRequirements)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Env != nil {
+		in, out := &in.Env, &out.Env
+		*out = make([]corev1.EnvVar, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InstanceTemplate.
+func (in *InstanceTemplate) DeepCopy() *InstanceTemplate {
+	if in == nil {
+		return nil
+	}
+	out := new(InstanceTemplate)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *InstanceTemplateStatus) DeepCopyInto(out *InstanceTemplateStatus) {
 	*out = *in
diff --git a/controllers/apps/cluster/cluster_controller.go b/controllers/apps/cluster/cluster_controller.go
index c0f68fd1a..12b03a723 100644
--- a/controllers/apps/cluster/cluster_controller.go
+++ b/controllers/apps/cluster/cluster_controller.go
@@ -135,12 +135,12 @@ func (r *ClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
 			&clusterMetaTransformer{},
 			// validate the cluster spec
 			&clusterValidationTransformer{},
-			// handle cluster shared account
-			&clusterShardingAccountTransformer{},
 			// normalize the cluster spec
 			&clusterNormalizationTransformer{},
 			// placement replicas across data-plane k8s clusters
 			&clusterPlacementTransformer{multiClusterMgr: r.MultiClusterMgr},
+			// handle cluster shared account
+			&clusterShardingAccountTransformer{},
 			// handle cluster services
 			&clusterServiceTransformer{},
 			// handle the restore for cluster
diff --git a/controllers/apps/cluster/transformer_cluster_normalization.go b/controllers/apps/cluster/transformer_cluster_normalization.go
index 865c9ffb2..136d7881b 100644
--- a/controllers/apps/cluster/transformer_cluster_normalization.go
+++ b/controllers/apps/cluster/transformer_cluster_normalization.go
@@ -257,6 +257,9 @@ func (t *clusterNormalizationTransformer) resolveShardingNCompDefinition(transCt
 		if err != nil {
 			return nil, nil, "", err
 		}
+		if len(sharding.Template.ComponentDef) == 0 {
+			sharding.Template.ComponentDef = shardingDef.Spec.Template.CompDef
+		}
 	}
 
 	spec := sharding.Template
diff --git a/controllers/apps/cluster/transformer_cluster_sharding_account.go b/controllers/apps/cluster/transformer_cluster_sharding_account.go
index 5b7b3002d..1260875fb 100644
--- a/controllers/apps/cluster/transformer_cluster_sharding_account.go
+++ b/controllers/apps/cluster/transformer_cluster_sharding_account.go
@@ -90,7 +90,7 @@ func (t *clusterShardingAccountTransformer) reconcileShardingAccount(transCtx *c
 
 	// TODO: update
 
-	t.rewriteSystemAccount(transCtx, sharding, accountName)
+	t.rewriteSystemAccount(transCtx, sharding.Name, accountName)
 
 	return nil
 }
@@ -204,26 +204,44 @@ func (t *clusterShardingAccountTransformer) newAccountSecretWithPassword(transCt
 	return secret, nil
 }
 
-func (t *clusterShardingAccountTransformer) rewriteSystemAccount(transCtx *clusterTransformContext,
-	sharding *appsv1.ClusterSharding, accountName string) {
+func (t *clusterShardingAccountTransformer) rewriteSystemAccount(transCtx *clusterTransformContext, shardingName, accountName string) {
 	var (
 		cluster = transCtx.Cluster
 	)
 	newAccount := appsv1.ComponentSystemAccount{
 		Name: accountName,
 		SecretRef: &appsv1.ProvisionSecretRef{
-			Name:      shardingAccountSecretName(cluster.Name, sharding.Name, accountName),
+			Name:      shardingAccountSecretName(cluster.Name, shardingName, accountName),
 			Namespace: cluster.Namespace,
 		},
 	}
-	for i, account := range sharding.Template.SystemAccounts {
-		if account.Name == accountName {
-			newAccount.Disabled = account.Disabled
-			sharding.Template.SystemAccounts[i] = newAccount
-			return
+
+	// update sharding
+	for i, sharding := range transCtx.shardings {
+		if sharding.Name == shardingName {
+			exist := false
+			for j, account := range sharding.Template.SystemAccounts {
+				if account.Name == accountName {
+					newAccount.Disabled = account.Disabled
+					transCtx.shardings[i].Template.SystemAccounts[j] = newAccount
+					exist = true
+					break
+				}
+			}
+			if !exist {
+				transCtx.shardings[i].Template.SystemAccounts =
+					append(transCtx.shardings[i].Template.SystemAccounts, newAccount)
+			}
+			break
 		}
 	}
-	sharding.Template.SystemAccounts = []appsv1.ComponentSystemAccount{newAccount}
+
+	// update sharding components
+	shardingComps := transCtx.shardingComps[shardingName]
+	for i := range shardingComps {
+		shardingComps[i].SystemAccounts = append(shardingComps[i].SystemAccounts, newAccount)
+	}
+	transCtx.shardingComps[shardingName] = shardingComps
 }
 
 func shardingAccountSecretName(cluster, sharding, account string) string {
diff --git a/controllers/apps/component/transformer_component_reload_sidecar.go b/controllers/apps/component/transformer_component_reload_sidecar.go
index 67030aa1d..b9db5aacb 100644
--- a/controllers/apps/component/transformer_component_reload_sidecar.go
+++ b/controllers/apps/component/transformer_component_reload_sidecar.go
@@ -20,8 +20,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package component
 
 import (
-	"context"
-
 	"github.com/pkg/errors"
 	corev1 "k8s.io/api/core/v1"
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -29,7 +27,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsutil "github.com/apecloud/kubeblocks/controllers/apps/util"
 	"github.com/apecloud/kubeblocks/pkg/common"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
@@ -62,6 +59,13 @@ func (t *componentReloadActionSidecarTransformer) Transform(ctx graph.TransformC
 			"component", client.ObjectKeyFromObject(transCtx.ComponentOrig))
 		return nil
 	}
+	if len(builtinComp.ConfigTemplates) == 0 {
+		return nil
+	}
+
+	if err := updatePodVolumes(builtinComp.PodSpec, builtinComp); err != nil {
+		return err
+	}
 
 	clusterKey := types.NamespacedName{
 		Namespace: builtinComp.Namespace,
@@ -82,58 +86,7 @@ func (t *componentReloadActionSidecarTransformer) Transform(ctx graph.TransformC
 		ClusterName:   builtinComp.ClusterName,
 		ComponentName: builtinComp.Name,
 	}
-
-	var configmaps []*corev1.ConfigMap
-	cachedObjs := resolveRerenderDependOnObjects(dag)
-	for _, tpls := range [][]appsv1.ComponentTemplateSpec{builtinComp.ConfigTemplates} {
-		objects, err := render.RenderTemplate(reconcileCtx, cluster, builtinComp, comp, cachedObjs, tpls)
-		if err != nil {
-			return err
-		}
-		configmaps = append(configmaps, objects...)
-	}
-
-	graphCli, _ := transCtx.Client.(model.GraphClient)
-	if err := ensureConfigMapsPresence(transCtx, graphCli, dag, configmaps...); err != nil {
-		return err
-	}
-	if err := updatePodVolumes(builtinComp.PodSpec, builtinComp); err != nil {
-		return err
-	}
-	if len(builtinComp.ConfigTemplates) == 0 {
-		return nil
-	}
-
-	return configctrl.BuildReloadActionContainer(reconcileCtx, cluster, builtinComp, transCtx.CompDef, configmaps)
-}
-
-func ensureConfigMapsPresence(ctx context.Context, cli model.GraphClient, dag *graph.DAG, configmaps ...*corev1.ConfigMap) error {
-	for _, configmap := range configmaps {
-		var cm = &corev1.ConfigMap{}
-		if err := cli.Get(ctx, client.ObjectKeyFromObject(configmap), cm); err != nil {
-			if !apierrors.IsNotFound(err) {
-				return err
-			}
-			cli.Create(dag, configmap, appsutil.InDataContext4G())
-		}
-	}
-	return nil
-}
-
-func resolveRerenderDependOnObjects(dag *graph.DAG) []client.Object {
-	var dependOnObjs []client.Object
-	for _, vertex := range dag.Vertices() {
-		v, _ := vertex.(*model.ObjectVertex)
-		if cm, ok := v.Obj.(*corev1.ConfigMap); ok {
-			dependOnObjs = append(dependOnObjs, cm)
-			continue
-		}
-		if secret, ok := v.Obj.(*corev1.Secret); ok {
-			dependOnObjs = append(dependOnObjs, secret)
-			continue
-		}
-	}
-	return dependOnObjs
+	return configctrl.BuildReloadActionContainer(reconcileCtx, cluster, builtinComp, transCtx.CompDef)
 }
 
 func updatePodVolumes(podSpec *corev1.PodSpec, component *component.SynthesizedComponent) error {
diff --git a/controllers/operations/opsrequest_controller.go b/controllers/operations/opsrequest_controller.go
index 14f3574dc..0cd2e95f1 100644
--- a/controllers/operations/opsrequest_controller.go
+++ b/controllers/operations/opsrequest_controller.go
@@ -42,6 +42,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/log"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/operations"
 	opsutil "github.com/apecloud/kubeblocks/pkg/operations/util"
 
@@ -102,6 +103,7 @@ func (r *OpsRequestReconciler) SetupWithManager(mgr ctrl.Manager) error {
 		Watches(&corev1.Pod{}, handler.EnqueueRequestsFromMapFunc(r.parsePod)).
 		Owns(&batchv1.Job{}).
 		Owns(&dpv1alpha1.Restore{}).
+		Owns(&parametersv1alpha1.Parameter{}).
 		Complete(r)
 }
 
diff --git a/controllers/parameters/config_reconcile_wrapper.go b/controllers/parameters/config_reconcile_wrapper.go
index 18f20ed25..b606ddfe5 100644
--- a/controllers/parameters/config_reconcile_wrapper.go
+++ b/controllers/parameters/config_reconcile_wrapper.go
@@ -23,6 +23,7 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
+	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
@@ -51,9 +52,13 @@ type ReconcileContext struct {
 func newParameterReconcileContext(reqCtx intctrlutil.RequestCtx,
 	resourceCtx *render.ResourceCtx,
 	cm *corev1.ConfigMap,
+	cluster *appsv1.Cluster,
 	configSpecName string,
 	matchingLabels client.MatchingLabels) *ReconcileContext {
 	configContext := ReconcileContext{
+		ResourceFetcher: configctrl.ResourceFetcher[ReconcileContext]{
+			ClusterObj: cluster,
+		},
 		RequestCtx:     reqCtx,
 		ConfigMap:      cm,
 		Name:           configSpecName,
diff --git a/controllers/parameters/parameter_controller.go b/controllers/parameters/parameter_controller.go
index 649bfc508..dae582b5b 100644
--- a/controllers/parameters/parameter_controller.go
+++ b/controllers/parameters/parameter_controller.go
@@ -21,6 +21,7 @@ package parameters
 
 import (
 	"context"
+	"errors"
 
 	corev1 "k8s.io/api/core/v1"
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -36,8 +37,10 @@ import (
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/constant"
+	"github.com/apecloud/kubeblocks/pkg/controller/component"
 	"github.com/apecloud/kubeblocks/pkg/controller/render"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
+	"github.com/apecloud/kubeblocks/pkg/generics"
 )
 
 // ParameterReconciler reconciles a Parameter object
@@ -110,7 +113,17 @@ func (r *ParameterReconciler) handleComponent(rctx *ReconcileContext, updatedPar
 }
 
 func (r *ParameterReconciler) reconcile(reqCtx intctrlutil.RequestCtx, parameter *parametersv1alpha1.Parameter) (ctrl.Result, error) {
-	res, err := handleClusterDeleted(reqCtx, r.Client, parameter)
+	var cluster appsv1.Cluster
+
+	clusterKey := client.ObjectKey{
+		Namespace: parameter.GetNamespace(),
+		Name:      parameter.Spec.ClusterName,
+	}
+	if err := r.Client.Get(reqCtx.Ctx, clusterKey, &cluster); err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
+	}
+
+	res, err := handleClusterDeleted(reqCtx, r.Client, parameter, &cluster)
 	if res != nil {
 		return *res, err
 	}
@@ -124,8 +137,12 @@ func (r *ParameterReconciler) reconcile(reqCtx intctrlutil.RequestCtx, parameter
 	if err := r.validate(parameter, reqCtx.Ctx); err != nil {
 		return r.fail(reqCtx, parameter, err)
 	}
+
 	patch := parameter.DeepCopy()
-	rctxs, params := r.generateParameterTaskContext(reqCtx, parameter)
+	rctxs, params, err := r.generateParameterTaskContext(reqCtx, parameter, &cluster)
+	if err != nil {
+		return r.fail(reqCtx, parameter, err)
+	}
 	for i, rctx := range rctxs {
 		if err := r.handleComponent(rctx, params[i], parameter); err != nil {
 			return r.fail(reqCtx, parameter, err)
@@ -135,21 +152,30 @@ func (r *ParameterReconciler) reconcile(reqCtx intctrlutil.RequestCtx, parameter
 	return updateParameterStatus(reqCtx, r.Client, parameter, patch, finished)
 }
 
-func (r *ParameterReconciler) generateParameterTaskContext(reqCtx intctrlutil.RequestCtx, parameter *parametersv1alpha1.Parameter) ([]*ReconcileContext, []parametersv1alpha1.ComponentParameters) {
+func (r *ParameterReconciler) generateParameterTaskContext(
+	reqCtx intctrlutil.RequestCtx,
+	parameter *parametersv1alpha1.Parameter,
+	cluster *appsv1.Cluster) ([]*ReconcileContext, []parametersv1alpha1.ComponentParameters, error) {
 	var rctxs []*ReconcileContext
 	var params []parametersv1alpha1.ComponentParameters
-	for _, component := range parameter.Spec.ComponentParameters {
-		params = append(params, component.Parameters)
-		rctxs = append(rctxs, newParameterReconcileContext(reqCtx,
-			&render.ResourceCtx{
-				Context:       reqCtx.Ctx,
-				Client:        r.Client,
-				Namespace:     parameter.Namespace,
-				ClusterName:   parameter.Spec.ClusterName,
-				ComponentName: component.ComponentName,
-			}, nil, "", nil))
+	for _, compParameter := range parameter.Spec.ComponentParameters {
+		comps, err := resolveComponents(reqCtx.Ctx, r.Client, cluster, compParameter.ComponentName)
+		if err != nil {
+			return nil, nil, err
+		}
+		for _, compName := range comps {
+			params = append(params, compParameter.Parameters)
+			rctxs = append(rctxs, newParameterReconcileContext(reqCtx,
+				&render.ResourceCtx{
+					Context:       reqCtx.Ctx,
+					Client:        r.Client,
+					Namespace:     parameter.Namespace,
+					ClusterName:   parameter.Spec.ClusterName,
+					ComponentName: compName,
+				}, nil, cluster, "", nil))
+		}
 	}
-	return rctxs, params
+	return rctxs, params, nil
 }
 
 func (r *ParameterReconciler) validate(parameter *parametersv1alpha1.Parameter, ctx context.Context) error {
@@ -157,11 +183,11 @@ func (r *ParameterReconciler) validate(parameter *parametersv1alpha1.Parameter,
 		return intctrlutil.NewFatalError("required component parameters")
 	}
 
-	for _, component := range parameter.Spec.ComponentParameters {
-		if len(component.Parameters) == 0 && len(component.CustomTemplates) == 0 {
-			return intctrlutil.NewErrorf(intctrlutil.ErrorTypeFatal, "required parameters or custom templates for component[%s]", component.ComponentName)
+	for _, compParameter := range parameter.Spec.ComponentParameters {
+		if len(compParameter.Parameters) == 0 && len(compParameter.CustomTemplates) == 0 {
+			return intctrlutil.NewErrorf(intctrlutil.ErrorTypeFatal, "required parameters or custom templates for component[%s]", compParameter.ComponentName)
 		}
-		if err := validateCustomTemplate(ctx, r.Client, component.CustomTemplates); err != nil {
+		if err := validateCustomTemplate(ctx, r.Client, compParameter.CustomTemplates); err != nil {
 			return err
 		}
 	}
@@ -260,3 +286,34 @@ func syncParameterStatus(parameterStatus *parametersv1alpha1.ParameterStatus) bo
 	}
 	return finished
 }
+
+func resolveComponents(ctx context.Context, reader client.Reader, cluster *appsv1.Cluster, componentName string) ([]string, error) {
+	clusterSpec := cluster.Spec
+	compSpec := clusterSpec.GetComponentByName(componentName)
+	if compSpec != nil {
+		return []string{compSpec.Name}, nil
+	}
+
+	shardingComp := clusterSpec.GetShardingByName(componentName)
+	if shardingComp == nil {
+		return nil, intctrlutil.NewErrorf(intctrlutil.ErrorTypeFatal, `component not found: %s`, componentName)
+	}
+	components, err := intctrlutil.ListShardingComponents(ctx, reader, cluster, componentName)
+	if err != nil {
+		return nil, err
+	}
+
+	var errs []error
+	transform := func(comp appsv1.Component) string {
+		compName, err := component.ShortName(cluster.Name, comp.Name)
+		if err != nil {
+			errs = append(errs, err)
+		}
+		return compName
+	}
+	compNames := generics.Map(components, transform)
+	if len(errs) != 0 {
+		return nil, errors.Join(errs...)
+	}
+	return compNames, nil
+}
diff --git a/controllers/parameters/parameter_util.go b/controllers/parameters/parameter_util.go
index 1aa29eac4..4c775a25e 100644
--- a/controllers/parameters/parameter_util.go
+++ b/controllers/parameters/parameter_util.go
@@ -237,8 +237,7 @@ func resolveComponentRefConfigMap(rctx *ReconcileContext) (map[string]*corev1.Co
 }
 
 func prepareResources(rctx *ReconcileContext, _ *parametersv1alpha1.Parameter) error {
-	return rctx.Cluster().
-		ComponentAndComponentDef().
+	return rctx.ComponentAndComponentDef().
 		SynthesizedComponent().
 		ComponentParameter().
 		ParametersDefinitions().
@@ -261,18 +260,9 @@ func syncComponentParameterStatus(rctx *ReconcileContext, parameter *parametersv
 	return nil
 }
 
-func handleClusterDeleted(reqCtx intctrlutil.RequestCtx, cli client.Client, parameter *parametersv1alpha1.Parameter) (*ctrl.Result, error) {
-	var cluster appsv1.Cluster
-
-	clusterKey := client.ObjectKey{
-		Namespace: parameter.GetNamespace(),
-		Name:      parameter.Spec.ClusterName,
-	}
-	if err := cli.Get(reqCtx.Ctx, clusterKey, &cluster); err != nil {
-		return intctrlutil.ResultToP(intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, ""))
-	}
+func handleClusterDeleted(reqCtx intctrlutil.RequestCtx, cli client.Client, parameter *parametersv1alpha1.Parameter, cluster *appsv1.Cluster) (*ctrl.Result, error) {
 	if !cluster.IsDeleting() {
-		return updateOwnerReference(reqCtx, cli, &cluster, parameter)
+		return updateOwnerReference(reqCtx, cli, cluster, parameter)
 	}
 	reqCtx.Log.Info("cluster is deleting, delete parameter", "parameters", client.ObjectKeyFromObject(parameter))
 	if err := cli.Delete(reqCtx.Ctx, parameter); err != nil {
diff --git a/controllers/parameters/policy_util.go b/controllers/parameters/policy_util.go
index a90628ab0..1e72e0343 100644
--- a/controllers/parameters/policy_util.go
+++ b/controllers/parameters/policy_util.go
@@ -278,8 +278,10 @@ func resolveReloadActionPolicy(jsonPatch string,
 
 	// make decision
 	switch {
-	case !dynamicUpdate && intctrlutil.NeedDynamicReloadAction(pd): // static parameters update
+	case !dynamicUpdate && intctrlutil.NeedDynamicReloadAction(pd): // static parameters update and need to do hot update
 		policy = parametersv1alpha1.DynamicReloadAndRestartPolicy
+	case !dynamicUpdate: // static parameters update and only need to restart
+		policy = parametersv1alpha1.RestartPolicy
 	case cfgcm.IsAutoReload(pd.ReloadAction): // if core support hot update, don't need to do anything
 		policy = parametersv1alpha1.AsyncDynamicReloadPolicy
 	case enableSyncTrigger(pd.ReloadAction): // sync config-manager exec hot update
diff --git a/controllers/parameters/reconcile_task.go b/controllers/parameters/reconcile_task.go
index a3803b1be..2dabdd31c 100644
--- a/controllers/parameters/reconcile_task.go
+++ b/controllers/parameters/reconcile_task.go
@@ -29,6 +29,7 @@ import (
 	"k8s.io/utils/pointer"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
+	"sigs.k8s.io/controller-runtime/pkg/log"
 
 	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
@@ -159,6 +160,16 @@ func syncImpl(taskCtx *TaskContext,
 	var baseConfig = configMap
 	var updatedConfig *corev1.ConfigMap
 	if intctrlutil.IsRerender(configMap, item) {
+		log.FromContext(taskCtx.ctx).
+			WithName("ParameterReconcileTask").
+			WithValues("cluster", taskCtx.component.ClusterName,
+				"component", taskCtx.component.Name,
+				"parameterTpl", item.Name).
+			Info("rerender parameter template",
+				"appliedConfigMeta", resolveLastConfigMeta(configMap),
+				"revision", revision,
+				"configMeta", item,
+			)
 		if baseConfig, err = configctrl.RerenderParametersTemplate(reconcileCtx, item, taskCtx.configRender, taskCtx.paramsDefs); err != nil {
 			return failStatus(err)
 		}
@@ -179,6 +190,16 @@ func syncImpl(taskCtx *TaskContext,
 	return nil
 }
 
+func resolveLastConfigMeta(configMap *corev1.ConfigMap) any {
+	if configMap == nil || len(configMap.Annotations) == 0 {
+		return nil
+	}
+	return map[string]string{
+		"revision":   configMap.Annotations[constant.ConfigurationRevision],
+		"configMeta": configMap.Annotations[constant.ConfigAppliedVersionAnnotationKey],
+	}
+}
+
 func mergeAndApplyConfig(resourceCtx *render.ResourceCtx,
 	expected *corev1.ConfigMap,
 	running *corev1.ConfigMap,
diff --git a/controllers/parameters/reconfigure_controller.go b/controllers/parameters/reconfigure_controller.go
index c5c1f85c9..b9924fe8f 100644
--- a/controllers/parameters/reconfigure_controller.go
+++ b/controllers/parameters/reconfigure_controller.go
@@ -177,6 +177,7 @@ func (r *ReconfigureReconciler) sync(reqCtx intctrlutil.RequestCtx, configMap *c
 			ComponentName: resources.componentName,
 		},
 		configMap,
+		nil,
 		resources.configSpec.Name,
 		resources.componentMatchLabels())
 	if err := rctx.GetRelatedObjects(); err != nil {
diff --git a/docs/developer_docs/api-reference/cluster.md b/docs/developer_docs/api-reference/cluster.md
index d8a409636..13b8e906b 100644
--- a/docs/developer_docs/api-reference/cluster.md
+++ b/docs/developer_docs/api-reference/cluster.md
@@ -7932,7 +7932,7 @@ ContainerVars
 <h3 id="apps.kubeblocks.io/v1.InstanceTemplate">InstanceTemplate
 </h3>
 <p>
-(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ClusterComponentSpec">ClusterComponentSpec</a>, <a href="#apps.kubeblocks.io/v1.ComponentSpec">ComponentSpec</a>, <a href="#workloads.kubeblocks.io/v1.InstanceSetSpec">InstanceSetSpec</a>)
+(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ClusterComponentSpec">ClusterComponentSpec</a>, <a href="#apps.kubeblocks.io/v1.ComponentSpec">ComponentSpec</a>)
 </p>
 <div>
 <p>InstanceTemplate allows customization of individual replica configurations in a Component.</p>
@@ -8535,7 +8535,7 @@ VarOption
 <h3 id="apps.kubeblocks.io/v1.Ordinals">Ordinals
 </h3>
 <p>
-(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.InstanceTemplate">InstanceTemplate</a>, <a href="#workloads.kubeblocks.io/v1.InstanceSetSpec">InstanceSetSpec</a>)
+(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.InstanceTemplate">InstanceTemplate</a>, <a href="#workloads.kubeblocks.io/v1.InstanceSetSpec">InstanceSetSpec</a>, <a href="#workloads.kubeblocks.io/v1.InstanceTemplate">InstanceTemplate</a>)
 </p>
 <div>
 <p>Ordinals represents a combination of continuous segments and individual values.</p>
@@ -9347,9 +9347,10 @@ it will be counted towards MaxUnavailable.</p>
 <h3 id="apps.kubeblocks.io/v1.SchedulingPolicy">SchedulingPolicy
 </h3>
 <p>
-(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ClusterComponentSpec">ClusterComponentSpec</a>, <a href="#apps.kubeblocks.io/v1.ClusterSpec">ClusterSpec</a>, <a href="#apps.kubeblocks.io/v1.ComponentSpec">ComponentSpec</a>, <a href="#apps.kubeblocks.io/v1.InstanceTemplate">InstanceTemplate</a>)
+(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ClusterComponentSpec">ClusterComponentSpec</a>, <a href="#apps.kubeblocks.io/v1.ClusterSpec">ClusterSpec</a>, <a href="#apps.kubeblocks.io/v1.ComponentSpec">ComponentSpec</a>, <a href="#apps.kubeblocks.io/v1.InstanceTemplate">InstanceTemplate</a>, <a href="#workloads.kubeblocks.io/v1.InstanceTemplate">InstanceTemplate</a>)
 </p>
 <div>
+<p>SchedulingPolicy defines the scheduling policy for instances.</p>
 </div>
 <table>
 <thead>
@@ -29328,7 +29329,7 @@ Kubernetes core/v1.PodTemplateSpec
 <td>
 <code>instances</code><br/>
 <em>
-<a href="#apps.kubeblocks.io/v1.InstanceTemplate">
+<a href="#workloads.kubeblocks.io/v1.InstanceTemplate">
 []InstanceTemplate
 </a>
 </em>
@@ -29823,7 +29824,7 @@ Kubernetes core/v1.PodTemplateSpec
 <td>
 <code>instances</code><br/>
 <em>
-<a href="#apps.kubeblocks.io/v1.InstanceTemplate">
+<a href="#workloads.kubeblocks.io/v1.InstanceTemplate">
 []InstanceTemplate
 </a>
 </em>
@@ -30330,6 +30331,141 @@ string
 </tr>
 </tbody>
 </table>
+<h3 id="workloads.kubeblocks.io/v1.InstanceTemplate">InstanceTemplate
+</h3>
+<p>
+(<em>Appears on:</em><a href="#workloads.kubeblocks.io/v1.InstanceSetSpec">InstanceSetSpec</a>)
+</p>
+<div>
+<p>InstanceTemplate allows customization of individual replica configurations in a Component.</p>
+</div>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Name specifies the unique name of the instance Pod created using this InstanceTemplate.
+This name is constructed by concatenating the Component&rsquo;s name, the template&rsquo;s name, and the instance&rsquo;s ordinal
+using the pattern: $(cluster.name)-$(component.name)-$(template.name)-$(ordinal). Ordinals start from 0.
+The specified name overrides any default naming conventions or patterns.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>replicas</code><br/>
+<em>
+int32
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Specifies the number of instances (Pods) to create from this InstanceTemplate.
+This field allows setting how many replicated instances of the Component,
+with the specific overrides in the InstanceTemplate, are created.
+The default value is 1. A value of 0 disables instance creation.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ordinals</code><br/>
+<em>
+<a href="#apps.kubeblocks.io/v1.Ordinals">
+Ordinals
+</a>
+</em>
+</td>
+<td>
+<p>Specifies the desired Ordinals of this InstanceTemplate.
+The Ordinals used to specify the ordinal of the instance (pod) names to be generated under this InstanceTemplate.</p>
+<p>For example, if Ordinals is &#123;ranges: [&#123;start: 0, end: 1&#125;], discrete: [7]&#125;,
+then the instance names generated under this InstanceTemplate would be
+$(cluster.name)-$(component.name)-$(template.name)-0、$(cluster.name)-$(component.name)-$(template.name)-1 and
+$(cluster.name)-$(component.name)-$(template.name)-7</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>annotations</code><br/>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Specifies a map of key-value pairs to be merged into the Pod&rsquo;s existing annotations.
+Existing keys will have their values overwritten, while new keys will be added to the annotations.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>labels</code><br/>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Specifies a map of key-value pairs that will be merged into the Pod&rsquo;s existing labels.
+Values for existing keys will be overwritten, and new keys will be added.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>schedulingPolicy</code><br/>
+<em>
+<a href="#apps.kubeblocks.io/v1.SchedulingPolicy">
+SchedulingPolicy
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Specifies the scheduling policy for the Component.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>resources</code><br/>
+<em>
+<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#resourcerequirements-v1-core">
+Kubernetes core/v1.ResourceRequirements
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Specifies an override for the resource requirements of the first container in the Pod.
+This field allows for customizing resource allocation (CPU, memory, etc.) for the container.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>env</code><br/>
+<em>
+<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#envvar-v1-core">
+[]Kubernetes core/v1.EnvVar
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Defines Env to override.
+Add new or override existing envs.</p>
+</td>
+</tr>
+</tbody>
+</table>
 <h3 id="workloads.kubeblocks.io/v1.InstanceTemplateStatus">InstanceTemplateStatus
 </h3>
 <p>
diff --git a/go.mod b/go.mod
index 64459e0b1..9b543c4d2 100644
--- a/go.mod
+++ b/go.mod
@@ -18,7 +18,7 @@ require (
 	github.com/evanphx/json-patch/v5 v5.8.0
 	github.com/fasthttp/router v1.4.20
 	github.com/fsnotify/fsnotify v1.7.0
-	github.com/go-logr/logr v1.4.1
+	github.com/go-logr/logr v1.4.2
 	github.com/go-logr/zapr v1.3.0
 	github.com/go-sql-driver/mysql v1.7.1
 	github.com/golang/mock v1.6.0
@@ -57,7 +57,7 @@ require (
 	golang.org/x/net v0.33.0
 	golang.org/x/text v0.21.0
 	google.golang.org/grpc v1.63.2
-	google.golang.org/protobuf v1.33.0
+	google.golang.org/protobuf v1.35.2
 	gopkg.in/ini.v1 v1.67.0
 	gopkg.in/yaml.v2 v2.4.0
 	helm.sh/helm/v3 v3.14.2
@@ -87,8 +87,7 @@ require (
 	github.com/MakeNowJust/heredoc v1.0.0 // indirect
 	github.com/Masterminds/goutils v1.1.1 // indirect
 	github.com/Masterminds/squirrel v1.5.4 // indirect
-	github.com/Microsoft/go-winio v0.6.1 // indirect
-	github.com/Microsoft/hcsshim v0.11.4 // indirect
+	github.com/Microsoft/go-winio v0.6.2 // indirect
 	github.com/andybalholm/brotli v1.0.5 // indirect
 	github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect
 	github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
@@ -101,8 +100,10 @@ require (
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/chai2010/gettext-go v1.0.2 // indirect
 	github.com/cockroachdb/apd/v3 v3.2.1 // indirect
-	github.com/containerd/containerd v1.7.11 // indirect
+	github.com/containerd/containerd v1.7.27 // indirect
+	github.com/containerd/errdefs v0.3.0 // indirect
 	github.com/containerd/log v0.1.0 // indirect
+	github.com/containerd/platforms v0.2.1 // indirect
 	github.com/cyphar/filepath-securejoin v0.2.4 // indirect
 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 	github.com/docker/cli v25.0.1+incompatible // indirect
diff --git a/go.sum b/go.sum
index d288b48c8..4f8fe571d 100644
--- a/go.sum
+++ b/go.sum
@@ -73,10 +73,10 @@ github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj
 github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM=
 github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM=
 github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
-github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
-github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
-github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8=
-github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w=
+github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
+github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
+github.com/Microsoft/hcsshim v0.11.7 h1:vl/nj3Bar/CvJSYo7gIQPyRWc9f3c6IeSNavBTSZNZQ=
+github.com/Microsoft/hcsshim v0.11.7/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
@@ -139,12 +139,16 @@ github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEa
 github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc=
 github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
 github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw=
-github.com/containerd/containerd v1.7.11 h1:lfGKw3eU35sjV0aG2eYZTiwFEY1pCzxdzicHP3SZILw=
-github.com/containerd/containerd v1.7.11/go.mod h1:5UluHxHTX2rdvYuZ5OJTC5m/KJNs0Zs9wVoJm9zf5ZE=
-github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM=
-github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ=
+github.com/containerd/containerd v1.7.27 h1:yFyEyojddO3MIGVER2xJLWoCIn+Up4GaHFquP7hsFII=
+github.com/containerd/containerd v1.7.27/go.mod h1:xZmPnl75Vc+BLGt4MIfu6bp+fy03gdHAn9bz+FreFR0=
+github.com/containerd/continuity v0.4.4 h1:/fNVfTJ7wIl/YPMHjf+5H32uFhl63JucB34PlCpMKII=
+github.com/containerd/continuity v0.4.4/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE=
+github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4=
+github.com/containerd/errdefs v0.3.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
 github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
 github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
+github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A=
+github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw=
 github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
 github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
 github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
@@ -235,8 +239,8 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
 github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
-github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
@@ -525,6 +529,8 @@ github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8
 github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
 github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78=
 github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI=
+github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
+github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
 github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
 github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -1126,8 +1132,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
-google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
+google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/pkg/controller/configuration/config_utils.go b/pkg/controller/configuration/config_utils.go
index 834792084..4fd5cbe2d 100644
--- a/pkg/controller/configuration/config_utils.go
+++ b/pkg/controller/configuration/config_utils.go
@@ -46,7 +46,7 @@ import (
 
 // BuildReloadActionContainer build the configmgr sidecar container and update it
 // into PodSpec if configuration reload option is on
-func BuildReloadActionContainer(resourceCtx *render.ResourceCtx, cluster *appsv1.Cluster, synthesizedComp *component.SynthesizedComponent, cmpd *appsv1.ComponentDefinition, configmaps []*corev1.ConfigMap) error {
+func BuildReloadActionContainer(resourceCtx *render.ResourceCtx, cluster *appsv1.Cluster, synthesizedComp *component.SynthesizedComponent, cmpd *appsv1.ComponentDefinition) error {
 	var (
 		err         error
 		buildParams *cfgcm.CfgManagerBuildParams
diff --git a/pkg/controller/factory/builder.go b/pkg/controller/factory/builder.go
index 99e794c64..0da889979 100644
--- a/pkg/controller/factory/builder.go
+++ b/pkg/controller/factory/builder.go
@@ -72,7 +72,7 @@ func BuildInstanceSet(synthesizedComp *component.SynthesizedComponent, component
 		SetVolumeClaimTemplates(getVolumeClaimTemplates(synthesizedComp)...).
 		SetPVCRetentionPolicy(&synthesizedComp.PVCRetentionPolicy).
 		SetMinReadySeconds(synthesizedComp.MinReadySeconds).
-		SetInstances(synthesizedComp.Instances).
+		SetInstances(getInstanceTemplates(synthesizedComp.Instances)).
 		SetOfflineInstances(synthesizedComp.OfflineInstances).
 		SetRoles(synthesizedComp.Roles).
 		SetPodManagementPolicy(getPodManagementPolicy(synthesizedComp)).
@@ -138,6 +138,26 @@ func getVolumeClaimTemplates(synthesizedComp *component.SynthesizedComponent) []
 	return vcts
 }
 
+func getInstanceTemplates(instances []kbappsv1.InstanceTemplate) []workloads.InstanceTemplate {
+	if instances == nil {
+		return nil
+	}
+	instanceTemplates := make([]workloads.InstanceTemplate, 0, len(instances))
+	for i := range instances {
+		instanceTemplates[i] = workloads.InstanceTemplate{
+			Name:             instances[i].Name,
+			Replicas:         instances[i].Replicas,
+			Ordinals:         instances[i].Ordinals,
+			Annotations:      instances[i].Annotations,
+			Labels:           instances[i].Labels,
+			SchedulingPolicy: instances[i].SchedulingPolicy,
+			Resources:        instances[i].Resources,
+			Env:              instances[i].Env,
+		}
+	}
+	return instanceTemplates
+}
+
 func getPodManagementPolicy(synthesizedComp *component.SynthesizedComponent) appsv1.PodManagementPolicyType {
 	if synthesizedComp.PodManagementPolicy != nil {
 		return *synthesizedComp.PodManagementPolicy
diff --git a/pkg/operations/reconfigure.go b/pkg/operations/reconfigure.go
index 6ae8c50a5..a5ef93d80 100644
--- a/pkg/operations/reconfigure.go
+++ b/pkg/operations/reconfigure.go
@@ -28,6 +28,7 @@ import (
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
 	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/builder"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 )
@@ -49,6 +50,8 @@ func init() {
 	opsManager.RegisterOps(opsv1alpha1.ReconfiguringType, reconfigureBehaviour)
 }
 
+var noRequeueAfter time.Duration = 0
+
 // ActionStartedCondition the started condition when handle the reconfiguring request.
 func (r *reconfigureAction) ActionStartedCondition(reqCtx intctrlutil.RequestCtx, cli client.Client, opsRes *OpsResource) (*metav1.Condition, error) {
 	return opsv1alpha1.NewReconfigureCondition(opsRes.OpsRequest), nil
@@ -60,9 +63,9 @@ func (r *reconfigureAction) SaveLastConfiguration(reqCtx intctrlutil.RequestCtx,
 
 func (r *reconfigureAction) ReconcileAction(reqCtx intctrlutil.RequestCtx, cli client.Client, resource *OpsResource) (opsv1alpha1.OpsPhase, time.Duration, error) {
 
-	var parameters = &parametersv1alpha1.Parameter{}
-	if err := cli.Get(reqCtx.Ctx, client.ObjectKeyFromObject(resource.OpsRequest), parameters); err != nil {
-		return "", 30 * time.Second, err
+	var parameters = parametersv1alpha1.Parameter{}
+	if err := cli.Get(reqCtx.Ctx, client.ObjectKeyFromObject(resource.OpsRequest), &parameters); err != nil {
+		return "", noRequeueAfter, err
 	}
 
 	opsDeepCopy := resource.OpsRequest.DeepCopy()
@@ -79,19 +82,23 @@ func (r *reconfigureAction) ReconcileAction(reqCtx intctrlutil.RequestCtx, cli c
 
 func syncReconfigureForOps(reqCtx intctrlutil.RequestCtx, cli client.Client, resource *OpsResource, opsDeepCopy *opsv1alpha1.OpsRequest, phase opsv1alpha1.OpsPhase) (opsv1alpha1.OpsPhase, time.Duration, error) {
 	if err := PatchOpsStatusWithOpsDeepCopy(reqCtx.Ctx, cli, resource, opsDeepCopy, phase); err != nil {
-		return "", 30 * time.Second, err
+		return "", noRequeueAfter, err
 	}
-	return phase, 30 * time.Second, nil
+	return phase, noRequeueAfter, nil
 }
 
 func (r *reconfigureAction) Action(reqCtx intctrlutil.RequestCtx, cli client.Client, resource *OpsResource) (err error) {
-	parameter, err := buildReconfigureParameter(resource.OpsRequest)
-	if err != nil {
+	if len(resource.OpsRequest.Spec.Reconfigures) == 0 {
+		return intctrlutil.NewErrorf(intctrlutil.ErrorTypeFatal, `invalid reconfigure request: %s`, resource.OpsRequest.GetName())
+	}
+
+	parameter := buildReconfigureParameter(resource.OpsRequest)
+	if err = intctrlutil.SetControllerReference(resource.OpsRequest, parameter); err != nil {
 		return err
 	}
 
-	var param = &parametersv1alpha1.Parameter{}
-	if err = cli.Get(reqCtx.Ctx, client.ObjectKeyFromObject(parameter), param); err != nil {
+	var checkObj = parametersv1alpha1.Parameter{}
+	if err = cli.Get(reqCtx.Ctx, client.ObjectKeyFromObject(parameter), &checkObj); err != nil {
 		if client.IgnoreNotFound(err) == nil {
 			return cli.Create(reqCtx.Ctx, parameter)
 		}
@@ -100,18 +107,15 @@ func (r *reconfigureAction) Action(reqCtx intctrlutil.RequestCtx, cli client.Cli
 	return nil
 }
 
-func buildReconfigureParameter(ops *opsv1alpha1.OpsRequest) (*parametersv1alpha1.Parameter, error) {
-	if len(ops.Spec.Reconfigures) == 0 {
-		return nil, intctrlutil.NewErrorf(intctrlutil.ErrorTypeFatal, `invalid reconfigure request: %s`, ops.GetName())
-	}
-
+func buildReconfigureParameter(ops *opsv1alpha1.OpsRequest) *parametersv1alpha1.Parameter {
 	paramBuilder := builder.NewParameterBuilder(ops.Namespace, ops.GetName()).
+		AddLabels(constant.AppInstanceLabelKey, ops.Spec.ClusterName).
+		AddLabels(constant.OpsRequestNameLabelKey, ops.Name).
 		ClusterRef(ops.Spec.ClusterName)
 	for _, reconfigure := range ops.Spec.Reconfigures {
 		if len(reconfigure.Parameters) != 0 {
 			paramBuilder.SetComponentParameters(reconfigure.ComponentName, intctrlutil.TransformComponentParameters(reconfigure.Parameters))
 		}
 	}
-
-	return paramBuilder.GetObject(), nil
+	return paramBuilder.GetObject()
 }



Test patch:
diff --git a/controllers/apps/component/component_controller_test.go b/controllers/apps/component/component_controller_test.go
index 52cc019ed..fad95cc02 100644
--- a/controllers/apps/component/component_controller_test.go
+++ b/controllers/apps/component/component_controller_test.go
@@ -1587,7 +1587,7 @@ var _ = Describe("Component Controller", func() {
 		})).Should(Succeed())
 	}
 
-	testReconfigureVolumes := func(compName, compDefName, fileTemplate string) {
+	testFileTemplateVolumes := func(compName, compDefName, fileTemplate string) {
 		createCompObj(compName, compDefName, nil)
 
 		By("mock a file template object that not defined in the cmpd")
@@ -1603,13 +1603,25 @@ var _ = Describe("Component Controller", func() {
 		}
 		Expect(testCtx.CreateObj(testCtx.Ctx, cm)).Should(Succeed())
 
+		// trigger the component to reconcile
+		By("update the config template variables")
+		Expect(testapps.GetAndChangeObj(&testCtx, compKey, func(comp *kbappsv1.Component) {
+			comp.Spec.Configs = []kbappsv1.ClusterComponentConfig{
+				{
+					Name: ptr.To(fileTemplate),
+					Variables: map[string]string{
+						"LOG_LEVEL": "debug",
+					},
+				},
+			}
+		})()).Should(Succeed())
+
+		By("check the pod volumes")
+		itsKey := compKey
 		fileTemplateCMKey := types.NamespacedName{
 			Namespace: testCtx.DefaultNamespace,
 			Name:      fileTemplateObjectName(&component.SynthesizedComponent{FullCompName: compKey.Name}, fileTemplate),
 		}
-
-		By("check the pod volumes")
-		itsKey := compKey
 		Eventually(testapps.CheckObj(&testCtx, itsKey, func(g Gomega, its *workloads.InstanceSet) {
 			expectVolume := corev1.Volume{
 				Name: fileTemplate,
@@ -1626,7 +1638,10 @@ var _ = Describe("Component Controller", func() {
 		})).Should(Succeed())
 
 		By("check the file template objects")
-		Eventually(testapps.CheckObjExists(&testCtx, fileTemplateCMKey, &corev1.ConfigMap{}, true)).Should(Succeed())
+		Eventually(testapps.CheckObj(&testCtx, fileTemplateCMKey, func(g Gomega, cm *corev1.ConfigMap) {
+			g.Expect(cm.Data).Should(HaveKeyWithValue("level", "debug")) // updated
+		})).Should(Succeed())
+		// deleted
 		Eventually(testapps.CheckObjExists(&testCtx, client.ObjectKeyFromObject(cm), &corev1.ConfigMap{}, false)).Should(Succeed())
 	}
 
@@ -2252,7 +2267,7 @@ var _ = Describe("Component Controller", func() {
 		})
 	})
 
-	Context("reconfigure file (config/script) template", func() {
+	Context("file (config/script) template", func() {
 		var (
 			fileTemplate = "log-conf"
 		)
@@ -2302,7 +2317,7 @@ var _ = Describe("Component Controller", func() {
 		})
 
 		It("add/delete volumes", func() {
-			testReconfigureVolumes(defaultCompName, compDefObj.Name, fileTemplate)
+			testFileTemplateVolumes(defaultCompName, compDefObj.Name, fileTemplate)
 		})
 
 		It("reconfigure", func() {
diff --git a/controllers/parameters/configuration_test.go b/controllers/parameters/configuration_test.go
index 2e20afb6b..594421419 100644
--- a/controllers/parameters/configuration_test.go
+++ b/controllers/parameters/configuration_test.go
@@ -45,6 +45,7 @@ const (
 	compDefName      = "test-compdef"
 	clusterName      = "test-cluster"
 	defaultCompName  = "mysql"
+	shardingCompName = "sharding-test"
 	defaultITSName   = "mysql-statefulset"
 	configSpecName   = "mysql-config-tpl"
 	configVolumeName = "mysql-config"
@@ -119,6 +120,8 @@ func mockReconcileResource() (*corev1.ConfigMap, *parametersv1alpha1.ParametersD
 	By("Creating a cluster")
 	clusterObj := testapps.NewClusterFactory(testCtx.DefaultNamespace, clusterName, "").
 		AddComponent(defaultCompName, compDefObj.GetName()).
+		AddSharding(shardingCompName, "", compDefObj.GetName()).
+		SetShards(5).
 		Create(&testCtx).
 		GetObject()
 
diff --git a/controllers/parameters/parameter_controller_test.go b/controllers/parameters/parameter_controller_test.go
index 75ee46860..3f3e75926 100644
--- a/controllers/parameters/parameter_controller_test.go
+++ b/controllers/parameters/parameter_controller_test.go
@@ -28,9 +28,12 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
+	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	configcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
+	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
 	testparameters "github.com/apecloud/kubeblocks/pkg/testutil/parameters"
 )
@@ -39,13 +42,14 @@ var _ = Describe("Parameter Controller", func() {
 
 	var compParamKey types.NamespacedName
 	var comp *component.SynthesizedComponent
+	var clusterObj *appsv1.Cluster
 
 	BeforeEach(cleanEnv)
 
 	AfterEach(cleanEnv)
 
 	prepareTestEnv := func() {
-		_, _, _, _, comp = mockReconcileResource()
+		_, _, clusterObj, _, comp = mockReconcileResource()
 		compParamKey = types.NamespacedName{
 			Namespace: testCtx.DefaultNamespace,
 			Name:      configcore.GenerateComponentConfigurationName(comp.ClusterName, comp.Name),
@@ -143,4 +147,77 @@ var _ = Describe("Parameter Controller", func() {
 			})).Should(Succeed())
 		})
 	})
+
+	Context("sharding component parameter update", func() {
+		It("Should reconcile success", func() {
+			prepareTestEnv()
+
+			By("Create sharding component objs")
+			shardingCompSpecList, err := intctrlutil.GenShardingCompSpecList(testCtx.Ctx, k8sClient, clusterObj, &clusterObj.Spec.Shardings[0])
+			Expect(err).ShouldNot(HaveOccurred())
+			for _, spec := range shardingCompSpecList {
+				shardingLabels := map[string]string{
+					constant.AppInstanceLabelKey:       comp.ClusterName,
+					constant.KBAppShardingNameLabelKey: shardingCompName,
+				}
+				By("create a sharding component: " + spec.Name)
+				comp, err := component.BuildComponent(clusterObj, spec, shardingLabels, nil)
+				Expect(err).ShouldNot(HaveOccurred())
+				Expect(k8sClient.Create(testCtx.Ctx, comp)).Should(Succeed())
+
+				shardingCompParamKey := types.NamespacedName{
+					Namespace: testCtx.DefaultNamespace,
+					Name:      configcore.GenerateComponentConfigurationName(clusterObj.Name, spec.Name),
+				}
+
+				By("check ComponentParameters cr for sharding component : " + spec.Name)
+				Eventually(testapps.CheckObj(&testCtx, shardingCompParamKey, func(g Gomega, compParameter *parametersv1alpha1.ComponentParameter) {
+					g.Expect(compParameter.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.CFinishedPhase))
+					g.Expect(compParameter.Status.ObservedGeneration).Should(BeEquivalentTo(int64(1)))
+				})).Should(Succeed())
+			}
+
+			By("submit the parameter update request")
+			key := testapps.GetRandomizedKey(comp.Namespace, comp.FullCompName)
+			parameterObj := testparameters.NewParameterFactory(key.Name, key.Namespace, comp.ClusterName, shardingCompName).
+				AddParameters("innodb-buffer-pool-size", "1024M").
+				AddParameters("max_connections", "100").
+				Create(&testCtx).
+				GetObject()
+
+			for _, spec := range shardingCompSpecList {
+				shardingCompParamKey := types.NamespacedName{
+					Namespace: testCtx.DefaultNamespace,
+					Name:      configcore.GenerateComponentConfigurationName(clusterObj.Name, spec.Name),
+				}
+				By("check component parameter status")
+				Eventually(testapps.CheckObj(&testCtx, shardingCompParamKey, func(g Gomega, compParameter *parametersv1alpha1.ComponentParameter) {
+					g.Expect(compParameter.Status.ObservedGeneration).Should(BeEquivalentTo(int64(2)))
+					g.Expect(compParameter.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.CFinishedPhase))
+				}), time.Second*10).Should(Succeed())
+
+				By("check parameter status")
+				Eventually(testapps.CheckObj(&testCtx, client.ObjectKeyFromObject(parameterObj), func(g Gomega, parameter *parametersv1alpha1.Parameter) {
+					g.Expect(parameter.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.CFinishedPhase))
+				})).Should(Succeed())
+			}
+		})
+
+		It("component name validate fails", func() {
+			prepareTestEnv()
+
+			By("submit the parameter update request with invalid max_connection")
+			key := testapps.GetRandomizedKey(comp.Namespace, comp.FullCompName)
+			parameterObj := testparameters.NewParameterFactory(key.Name, key.Namespace, comp.ClusterName, "invalid component").
+				AddParameters("max_connections", "100").
+				Create(&testCtx).
+				GetObject()
+
+			By("check parameter status")
+			Eventually(testapps.CheckObj(&testCtx, client.ObjectKeyFromObject(parameterObj), func(g Gomega, parameter *parametersv1alpha1.Parameter) {
+				g.Expect(parameter.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.CMergeFailedPhase))
+			})).Should(Succeed())
+		})
+	})
+
 })
diff --git a/controllers/parameters/policy_util_test.go b/controllers/parameters/policy_util_test.go
index bf7f1148b..dc15b0981 100644
--- a/controllers/parameters/policy_util_test.go
+++ b/controllers/parameters/policy_util_test.go
@@ -21,15 +21,18 @@ package parameters
 
 import (
 	"fmt"
+	"testing"
 	"time"
 
 	"github.com/sethvargo/go-password/password"
+	"github.com/stretchr/testify/assert"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/tools/record"
+	"k8s.io/utils/pointer"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/log"
 
@@ -254,3 +257,127 @@ func newMockPod(podName string, podSpec *corev1.PodSpec) corev1.Pod {
 	pod.Spec = *podSpec.DeepCopy()
 	return pod
 }
+
+func Test_resolveReloadActionPolicy(t *testing.T) {
+	type args struct {
+		jsonPatch string
+		format    *parametersv1alpha1.FileFormatConfig
+		pd        *parametersv1alpha1.ParametersDefinitionSpec
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    parametersv1alpha1.ReloadPolicy
+		wantErr bool
+	}{{
+		name: "restart policy",
+		args: args{
+			jsonPatch: `{"static1": "value1"}`,
+			format: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.JSON,
+			},
+			pd: &parametersv1alpha1.ParametersDefinitionSpec{
+				StaticParameters: []string{
+					"static1",
+					"static2",
+				},
+				DynamicParameters: []string{
+					"dynamic1",
+					"dynamic2",
+				},
+				ReloadAction: &parametersv1alpha1.ReloadAction{
+					ShellTrigger: &parametersv1alpha1.ShellTrigger{
+						Command: []string{"/bin/true"},
+					},
+				},
+			},
+		},
+		want: parametersv1alpha1.RestartPolicy,
+	}, {
+		name: "restart and reload policy",
+		args: args{
+			jsonPatch: `{"static1": "value1"}`,
+			format: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.JSON,
+			},
+			pd: &parametersv1alpha1.ParametersDefinitionSpec{
+				ReloadAction: &parametersv1alpha1.ReloadAction{
+					ShellTrigger: &parametersv1alpha1.ShellTrigger{
+						Command: []string{"/bin/true"},
+					},
+				},
+				MergeReloadAndRestart: pointer.Bool(false),
+			},
+		},
+		want: parametersv1alpha1.DynamicReloadAndRestartPolicy,
+	}, {
+		name: "hot update policy",
+		args: args{
+			jsonPatch: `{"dynamic1": "value1"}`,
+			format: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.JSON,
+			},
+			pd: &parametersv1alpha1.ParametersDefinitionSpec{
+				ReloadAction: &parametersv1alpha1.ReloadAction{
+					AutoTrigger: &parametersv1alpha1.AutoTrigger{},
+				},
+				DynamicParameters: []string{
+					"dynamic1",
+					"dynamic2",
+				},
+			},
+		},
+		want: parametersv1alpha1.AsyncDynamicReloadPolicy,
+	}, {
+		name: "sync reload policy",
+		args: args{
+			jsonPatch: `{"dynamic1": "value1"}`,
+			format: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.JSON,
+			},
+			pd: &parametersv1alpha1.ParametersDefinitionSpec{
+				ReloadAction: &parametersv1alpha1.ReloadAction{
+					ShellTrigger: &parametersv1alpha1.ShellTrigger{
+						Command: []string{"/bin/true"},
+						Sync:    pointer.Bool(true),
+					},
+				},
+				DynamicParameters: []string{
+					"dynamic1",
+					"dynamic2",
+				},
+			},
+		},
+		want: parametersv1alpha1.SyncDynamicReloadPolicy,
+	}, {
+		name: "async reload policy",
+		args: args{
+			jsonPatch: `{"dynamic1": "value1"}`,
+			format: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.JSON,
+			},
+			pd: &parametersv1alpha1.ParametersDefinitionSpec{
+				ReloadAction: &parametersv1alpha1.ReloadAction{
+					ShellTrigger: &parametersv1alpha1.ShellTrigger{
+						Command: []string{"/bin/true"},
+						Sync:    pointer.Bool(false),
+					},
+				},
+				DynamicParameters: []string{
+					"dynamic1",
+					"dynamic2",
+				},
+			},
+		},
+		want: parametersv1alpha1.AsyncDynamicReloadPolicy,
+	}}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := resolveReloadActionPolicy(tt.args.jsonPatch, tt.args.format, tt.args.pd)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("resolveReloadActionPolicy(%v, %v, %v)", tt.args.jsonPatch, tt.args.format, tt.args.pd)
+			}
+			assert.Equalf(t, tt.want, got, "resolveReloadActionPolicy(%v, %v, %v)", tt.args.jsonPatch, tt.args.format, tt.args.pd)
+		})
+	}
+}