Repository: apecloud/kubeblocks

Issue:
[BUG] Create Cluster with Multiple Components, failed to locate configs
e.g. create apecloud-mysql with proxy and external etcd component.

We found:
- etcd created as expected
- apecloiud-mysql cmp stucks with error:  

<img width="1413" alt="Image" src="https://github.com/user-attachments/assets/040137ac-b8c9-4836-80db-5b6cf6c97658" />

```yaml
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
  name: acmysql-proxy-cluster
  namespace: default
spec:
  terminationPolicy: Delete
  clusterDef: apecloud-mysql
  topology: apecloud-mysql-proxy-etcd
  componentSpecs:
    - name: mysql
      serviceVersion: 8.0.30
      configs:
        - name: mysql-consensusset-config
          externalManaged: true
        - name: vttablet-config
          externalManaged: true
      env:
        - name: KB_PROXY_ENABLED
          value: "on"
      replicas: 3
      resources:
        limits:
          cpu: "0.5"
          memory: "0.5Gi"
        requests:
          cpu: "0.5"
          memory: "0.5Gi"
      volumeClaimTemplates:
        - name: data
          spec:
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 20Gi
    - name: wescale-ctrl
      volumeClaimTemplates:
        - name: data
          spec:
            storageClassName: ""
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 20Gi
      replicas: 1
      resources:
        limits:
          cpu: 500m
          memory: 128Mi
    - name: wescale
      configs:
        - name: vtgate-config
          externalManaged: true
      replicas: 1
      resources:
        requests:
          cpu: "0.5"
          memory: 500Mi
        limits:
          cpu: "0.5"
          memory: 500Mi
    - name: etcd
      serviceVersion: "3.5.6"
      replicas: 1
      resources:
        requests:
          cpu: 500m
          memory: 500Mi
        limits:
          cpu: 500m
          memory: 500Mi
      volumeClaimTemplates:
        - name: data
          spec:
            storageClassName: ""
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 20Gi
```

Discussion:
@shanshanying: same issue for kafka and clickhouse, e.g.
```yaml
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
  name: kafka-separated-cluster
  namespace: default
spec:
  # Specifies the behavior when a Cluster is deleted.
  # Valid options are: [DoNotTerminate, Delete, WipeOut] (`Halt` is deprecated since KB 0.9)
  # - `DoNotTerminate`: Prevents deletion of the Cluster. This policy ensures that all resources remain intact.
  # - `Delete`: Extends the `Halt` policy by also removing PVCs, leading to a thorough cleanup while removing all persistent data.
  # - `WipeOut`: An aggressive policy that deletes all Cluster resources, including volume snapshots and backups in external storage. This results in complete data removal and should be used cautiously, primarily in non-production environments to avoid irreversible data loss.
  terminationPolicy: Delete
  # Specifies the name of the ClusterDefinition to use when creating a Cluster.
  # Note: DO NOT UPDATE THIS FIELD
  # The value must be `kafaka` to create a Kafka Cluster
  clusterDef: kafka
  # Specifies the name of the ClusterTopology to be used when creating the
  # Cluster.
  # - combined: combined Kafka controller (KRaft) and broker in one Component
  # - combined_monitor: combined mode with monitor component
  # - separated: separated KRaft and Broker Components.
  # - separated_monitor: separated mode with monitor component
  # Valid options are: [combined,combined_monitor,separated,separated_monitor]
  topology: separated_monitor
  # Specifies a list of ClusterComponentSpec objects used to define the
  # individual Components that make up a Cluster.
  # This field allows for detailed configuration of each Component within the Cluster
  componentSpecs:
    - name: kafka-broker
      configs:
        - name: kafka-configuration-tpl
          externalManaged: true
      replicas: 1
      resources:
        limits:
          cpu: "0.5"
          memory: "0.5Gi"
        requests:
          cpu: "0.5"
          memory: "0.5Gi"
      env:
        - name: KB_KAFKA_BROKER_HEAP
          value: "-XshowSettings:vm -XX:MaxRAMPercentage=100 -Ddepth=64"
        - name: KB_KAFKA_CONTROLLER_HEAP
          value: "-XshowSettings:vm -XX:MaxRAMPercentage=100 -Ddepth=64"
        - name: KB_BROKER_DIRECT_POD_ACCESS
          value: "true"
      volumeClaimTemplates:
        - name: data
          spec:
            storageClassName: ""
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 20Gi
        - name: metadata
          spec:
            storageClassName: ""
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 1Gi
    - name: kafka-controller
      configs:
        - name: kafka-configuration-tpl
          externalManaged: true
      replicas: 1
      resources:
        limits:
          cpu: "0.5"
          memory: "0.5Gi"
        requests:
          cpu: "0.5"
          memory: "0.5Gi"
      volumeClaimTemplates:
        - name: metadata
          spec:
            storageClassName: ""
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 1Gi
    - name: kafka-exporter
      replicas: 1
      resources:
        limits:
          cpu: "0.5"
          memory: "1Gi"
        requests:
          cpu: "0.1"
          memory: "0.2Gi"
```

<img width="1432" alt="Image" src="https://github.com/user-attachments/assets/87384032-7963-4727-8a0b-49d47fdc9514" />


Solution patch:
diff --git a/.github/workflows/e2e-fault.yml b/.github/workflows/e2e-fault.yml
index 82ce893a3..539b110f4 100644
--- a/.github/workflows/e2e-fault.yml
+++ b/.github/workflows/e2e-fault.yml
@@ -22,9 +22,11 @@ on:
       CLUSTER_VERSION:
         description: 'k8s cluster version'
         required: false
-        default: "1.30"
+        default: "1.32"
         type: choice
         options:
+          - "1.32"
+          - "1.31"
           - "1.30"
           - "1.29"
           - "1.28"
diff --git a/.github/workflows/e2e-kbcli-k3s.yml b/.github/workflows/e2e-kbcli-k3s.yml
index 14e6d3567..a221792f9 100644
--- a/.github/workflows/e2e-kbcli-k3s.yml
+++ b/.github/workflows/e2e-kbcli-k3s.yml
@@ -13,17 +13,19 @@ on:
         default: ''
       TEST_TYPE:
         description: 'test type (e.g. apecloud-mysql|postgresql|redis|mongodb|kafka|asmysql|elasticsearch|zookeeper|
-        rabbitmq|pulsar|mysqlscale|weaviate|qdrant|smartengine|greptimedb|nebula|risingwave|starrocks|etcd|
-        orioledb|vanilla-pg|polardbx|opensearch|tdengine|milvus|clickhouse|mariadb|tidb|influxdb|doris|mogdb|
+        rabbitmq|mysqlscale|weaviate|qdrant|smartengine|greptimedb|nebula|risingwave|starrocks|etcd|
+        orioledb|vanilla-pg|polardbx|opensearch|tdengine|milvus|clickhouse|mariadb|tidb|influxdb|mogdb|
         apecloud-postgresql|yashandb|redis-cluster|minio|orchestrator)'
         required: false
         default: ''
       CLUSTER_VERSION:
         description: 'k8s cluster version'
         required: false
-        default: "1.30"
+        default: "1.32"
         type: choice
         options:
+          - "1.32"
+          - "1.31"
           - "1.30"
           - "1.29"
           - "1.28"
diff --git a/.github/workflows/e2e-kbcli.yml b/.github/workflows/e2e-kbcli.yml
index 7e7e4c643..1bb08aa8c 100644
--- a/.github/workflows/e2e-kbcli.yml
+++ b/.github/workflows/e2e-kbcli.yml
@@ -13,8 +13,8 @@ on:
         default: ''
       TEST_TYPE:
         description: 'test type (e.g.  apecloud-mysql|postgresql|redis|mongodb|kafka|asmysql|elasticsearch|zookeeper|
-        rabbitmq|pulsar|mysqlscale|weaviate|qdrant|smartengine|greptimedb|nebula|risingwave|starrocks|etcd|oceanbase|
-        orioledb|vanilla-pg|polardbx|opensearch|tdengine|milvus|clickhouse|mariadb|tidb|influxdb|doris|mogdb|
+        rabbitmq|mysqlscale|weaviate|qdrant|smartengine|greptimedb|nebula|risingwave|starrocks|etcd|oceanbase|
+        orioledb|vanilla-pg|polardbx|opensearch|tdengine|milvus|clickhouse|mariadb|tidb|influxdb|mogdb|
         apecloud-postgresql|yashandb|redis-cluster|minio|orchestrator)'
         required: false
         default: ''
@@ -32,9 +32,11 @@ on:
       CLUSTER_VERSION:
         description: 'k8s cluster version'
         required: false
-        default: "1.30"
+        default: "1.32"
         type: choice
         options:
+          - "1.32"
+          - "1.31"
           - "1.30"
           - "1.29"
           - "1.28"
diff --git a/.github/workflows/e2e-performance.yml b/.github/workflows/e2e-performance.yml
index c3e8422b9..0e0271acf 100644
--- a/.github/workflows/e2e-performance.yml
+++ b/.github/workflows/e2e-performance.yml
@@ -35,9 +35,11 @@ on:
       K8S_VERSION:
         description: 'eks version'
         required: false
-        default: "1.30"
+        default: "1.32"
         type: choice
         options:
+          - "1.32"
+          - "1.31"
           - "1.30"
           - "1.29"
           - "1.28"
diff --git a/.github/workflows/e2e-smoke.yml b/.github/workflows/e2e-smoke.yml
index ff2bb4ef3..dd4932ee2 100644
--- a/.github/workflows/e2e-smoke.yml
+++ b/.github/workflows/e2e-smoke.yml
@@ -26,9 +26,11 @@ on:
       CLUSTER_VERSION:
         description: 'k8s cluster version'
         required: false
-        default: "1.30"
+        default: "1.32"
         type: choice
         options:
+          - "1.32"
+          - "1.31"
           - "1.30"
           - "1.29"
           - "1.28"
diff --git a/.github/workflows/release-image.yml b/.github/workflows/release-image.yml
index 766f3b880..da31444b2 100644
--- a/.github/workflows/release-image.yml
+++ b/.github/workflows/release-image.yml
@@ -207,9 +207,9 @@ jobs:
       fail-fast: false
       matrix:
         test-type: [ apecloud-mysql|postgresql|redis|mongodb|kafka|asmysql|elasticsearch|zookeeper|rabbitmq,
-                     pulsar|mysqlscale|weaviate|qdrant|smartengine|greptimedb|nebula|risingwave|starrocks,
+                     mysqlscale|weaviate|qdrant|smartengine|greptimedb|nebula|risingwave|starrocks,
                      etcd|oceanbase|orioledb|vanilla-pg|polardbx|opensearch|tdengine|milvus|clickhouse|mariadb,
-                     tidb|influxdb|doris|mogdb|apecloud-postgresql|yashandb|redis-cluster|minio|orchestrator ]
+                     tidb|influxdb|mogdb|apecloud-postgresql|yashandb|redis-cluster|minio|orchestrator ]
     with:
       GITHUB_REPO: "apecloud/kubeblocks"
       BRANCH_NAME: "main"
diff --git a/apis/apps/v1/componentdefinition_types.go b/apis/apps/v1/componentdefinition_types.go
index ec1a81aaa..3c793a692 100644
--- a/apis/apps/v1/componentdefinition_types.go
+++ b/apis/apps/v1/componentdefinition_types.go
@@ -611,6 +611,10 @@ type VarSource struct {
 	// +optional
 	ServiceRefVarRef *ServiceRefVarSelector `json:"serviceRefVarRef,omitempty"`
 
+	// Selects a defined var of a kind of resource.
+	// +optional
+	ResourceVarRef *ResourceVarSelector `json:"resourceVarRef,omitempty"`
+
 	// Selects a defined var of a Component.
 	// +optional
 	ComponentVarRef *ComponentVarSelector `json:"componentVarRef,omitempty"`
@@ -724,6 +728,24 @@ type ServiceRefVars struct {
 	CredentialVars `json:",inline"`
 }
 
+// ResourceVars defines the vars that can be referenced from resources.
+type ResourceVars struct {
+	// +optional
+	CPU *VarOption `json:"cpu,omitempty"`
+
+	// +optional
+	CPULimit *VarOption `json:"cpuLimit,omitempty"`
+
+	// +optional
+	Memory *VarOption `json:"memory,omitempty"`
+
+	// +optional
+	MemoryLimit *VarOption `json:"memoryLimit,omitempty"`
+
+	// +optional
+	Storage *NamedVar `json:"storage,omitempty"`
+}
+
 // HostNetworkVarSelector selects a var from host-network resources.
 type HostNetworkVarSelector struct {
 	// The component to select from.
@@ -765,6 +787,14 @@ type ServiceRefVarSelector struct {
 	ServiceRefVars `json:",inline"`
 }
 
+// ResourceVarSelector selects a var from a kind of resource.
+type ResourceVarSelector struct {
+	// The Component to select from.
+	ClusterObjectReference `json:",inline"`
+
+	ResourceVars `json:",inline"`
+}
+
 // ComponentVarSelector selects a var from a Component.
 type ComponentVarSelector struct {
 	// The Component to select from.
@@ -1045,6 +1075,17 @@ type ComponentFileTemplate struct {
 	//
 	// +optional
 	DefaultMode *int32 `json:"defaultMode,omitempty"`
+
+	// ExternalManaged indicates whether the configuration is managed by an external system.
+	// When set to true, the controller will ignore the management of this configuration.
+	//
+	// +optional
+	ExternalManaged *bool `json:"externalManaged,omitempty"`
+
+	// Specifies whether to restart the pod when the file changes.
+	//
+	// +optional
+	RestartOnFileChange *bool `json:"restartOnFileChange,omitempty"`
 }
 
 type LogConfig struct {
diff --git a/apis/apps/v1/zz_generated.deepcopy.go b/apis/apps/v1/zz_generated.deepcopy.go
index ed7e4c7c9..133de7bd3 100644
--- a/apis/apps/v1/zz_generated.deepcopy.go
+++ b/apis/apps/v1/zz_generated.deepcopy.go
@@ -1265,6 +1265,16 @@ func (in *ComponentFileTemplate) DeepCopyInto(out *ComponentFileTemplate) {
 		*out = new(int32)
 		**out = **in
 	}
+	if in.ExternalManaged != nil {
+		in, out := &in.ExternalManaged, &out.ExternalManaged
+		*out = new(bool)
+		**out = **in
+	}
+	if in.RestartOnFileChange != nil {
+		in, out := &in.RestartOnFileChange, &out.RestartOnFileChange
+		*out = new(bool)
+		**out = **in
+	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentFileTemplate.
@@ -2464,6 +2474,63 @@ func (in *ReplicasLimit) DeepCopy() *ReplicasLimit {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ResourceVarSelector) DeepCopyInto(out *ResourceVarSelector) {
+	*out = *in
+	in.ClusterObjectReference.DeepCopyInto(&out.ClusterObjectReference)
+	in.ResourceVars.DeepCopyInto(&out.ResourceVars)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceVarSelector.
+func (in *ResourceVarSelector) DeepCopy() *ResourceVarSelector {
+	if in == nil {
+		return nil
+	}
+	out := new(ResourceVarSelector)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ResourceVars) DeepCopyInto(out *ResourceVars) {
+	*out = *in
+	if in.CPU != nil {
+		in, out := &in.CPU, &out.CPU
+		*out = new(VarOption)
+		**out = **in
+	}
+	if in.CPULimit != nil {
+		in, out := &in.CPULimit, &out.CPULimit
+		*out = new(VarOption)
+		**out = **in
+	}
+	if in.Memory != nil {
+		in, out := &in.Memory, &out.Memory
+		*out = new(VarOption)
+		**out = **in
+	}
+	if in.MemoryLimit != nil {
+		in, out := &in.MemoryLimit, &out.MemoryLimit
+		*out = new(VarOption)
+		**out = **in
+	}
+	if in.Storage != nil {
+		in, out := &in.Storage, &out.Storage
+		*out = new(NamedVar)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceVars.
+func (in *ResourceVars) DeepCopy() *ResourceVars {
+	if in == nil {
+		return nil
+	}
+	out := new(ResourceVars)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *RetryPolicy) DeepCopyInto(out *RetryPolicy) {
 	*out = *in
@@ -3492,6 +3559,11 @@ func (in *VarSource) DeepCopyInto(out *VarSource) {
 		*out = new(ServiceRefVarSelector)
 		(*in).DeepCopyInto(*out)
 	}
+	if in.ResourceVarRef != nil {
+		in, out := &in.ResourceVarRef, &out.ResourceVarRef
+		*out = new(ResourceVarSelector)
+		(*in).DeepCopyInto(*out)
+	}
 	if in.ComponentVarRef != nil {
 		in, out := &in.ComponentVarRef, &out.ComponentVarRef
 		*out = new(ComponentVarSelector)
diff --git a/apis/apps/v1alpha1/type.go b/apis/apps/v1alpha1/type.go
index a365f0cae..0bd165ed3 100644
--- a/apis/apps/v1alpha1/type.go
+++ b/apis/apps/v1alpha1/type.go
@@ -207,12 +207,13 @@ type ComponentConfigSpec struct {
 
 // RerenderResourceType defines the resource requirements for a component.
 // +enum
-// +kubebuilder:validation:Enum={vscale,hscale,tls}
+// +kubebuilder:validation:Enum={vscale,hscale,tls,shardingHScale}
 type RerenderResourceType string
 
 const (
-	ComponentVScaleType RerenderResourceType = "vscale"
-	ComponentHScaleType RerenderResourceType = "hscale"
+	ComponentVScaleType         RerenderResourceType = "vscale"
+	ComponentHScaleType         RerenderResourceType = "hscale"
+	ShardingComponentHScaleType RerenderResourceType = "shardingHScale"
 )
 
 // MergedPolicy defines how to merge external imported templates into component templates.
@@ -987,6 +988,12 @@ type ClusterObjectReference struct {
 
 // MultipleClusterObjectOption defines the options for handling multiple cluster objects matched.
 type MultipleClusterObjectOption struct {
+	// RequireAllComponentObjects controls whether all component objects must exist before resolving.
+	// If set to true, resolving will only proceed if all component objects are present.
+	//
+	// +optional
+	RequireAllComponentObjects *bool `json:"requireAllComponentObjects,omitempty"`
+
 	// Define the strategy for handling multiple cluster objects.
 	//
 	// +kubebuilder:validation:Required
diff --git a/apis/apps/v1alpha1/zz_generated.deepcopy.go b/apis/apps/v1alpha1/zz_generated.deepcopy.go
index ca32833d6..8186dce92 100644
--- a/apis/apps/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/apps/v1alpha1/zz_generated.deepcopy.go
@@ -3167,6 +3167,11 @@ func (in *MultipleClusterObjectCombinedOption) DeepCopy() *MultipleClusterObject
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *MultipleClusterObjectOption) DeepCopyInto(out *MultipleClusterObjectOption) {
 	*out = *in
+	if in.RequireAllComponentObjects != nil {
+		in, out := &in.RequireAllComponentObjects, &out.RequireAllComponentObjects
+		*out = new(bool)
+		**out = **in
+	}
 	if in.CombinedOption != nil {
 		in, out := &in.CombinedOption, &out.CombinedOption
 		*out = new(MultipleClusterObjectCombinedOption)
diff --git a/apis/parameters/v1alpha1/types.go b/apis/parameters/v1alpha1/types.go
index 7eeddb3fe..522816c42 100644
--- a/apis/parameters/v1alpha1/types.go
+++ b/apis/parameters/v1alpha1/types.go
@@ -120,14 +120,14 @@ const (
 
 // RerenderResourceType defines the resource requirements for a component.
 // +enum
-// +kubebuilder:validation:Enum={vscale,hscale,tls,shardingHVScale}
+// +kubebuilder:validation:Enum={vscale,hscale,tls,shardingHScale}
 type RerenderResourceType string
 
 const (
-	ComponentVScaleType          RerenderResourceType = "vscale"
-	ComponentHScaleType          RerenderResourceType = "hscale"
-	ComponentTLSType             RerenderResourceType = "tls"
-	ShardingComponentHVScaleType RerenderResourceType = "shardingHVScale"
+	ComponentVScaleType         RerenderResourceType = "vscale"
+	ComponentHScaleType         RerenderResourceType = "hscale"
+	ComponentTLSType            RerenderResourceType = "tls"
+	ShardingComponentHScaleType RerenderResourceType = "shardingHScale"
 )
 
 // ParameterPhase defines the Configuration FSM phase
diff --git a/config/crd/bases/apps.kubeblocks.io_clusterdefinitions.yaml b/config/crd/bases/apps.kubeblocks.io_clusterdefinitions.yaml
index 2e7ce3392..0d2e5a68a 100644
--- a/config/crd/bases/apps.kubeblocks.io_clusterdefinitions.yaml
+++ b/config/crd/bases/apps.kubeblocks.io_clusterdefinitions.yaml
@@ -589,6 +589,7 @@ spec:
                               - vscale
                               - hscale
                               - tls
+                              - shardingHScale
                               type: string
                             type: array
                             x-kubernetes-list-type: set
diff --git a/config/crd/bases/apps.kubeblocks.io_componentdefinitions.yaml b/config/crd/bases/apps.kubeblocks.io_componentdefinitions.yaml
index 557a50dd8..031f48ff1 100644
--- a/config/crd/bases/apps.kubeblocks.io_componentdefinitions.yaml
+++ b/config/crd/bases/apps.kubeblocks.io_componentdefinitions.yaml
@@ -4245,6 +4245,11 @@ spec:
                         Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.
                       format: int32
                       type: integer
+                    externalManaged:
+                      description: |-
+                        ExternalManaged indicates whether the configuration is managed by an external system.
+                        When set to true, the controller will ignore the management of this configuration.
+                      type: boolean
                     name:
                       description: Specifies the name of the template.
                       maxLength: 63
@@ -4257,6 +4262,10 @@ spec:
                       maxLength: 63
                       pattern: ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$
                       type: string
+                    restartOnFileChange:
+                      description: Specifies whether to restart the pod when the file
+                        changes.
+                      type: boolean
                     template:
                       description: Specifies the name of the referenced template ConfigMap
                         object.
@@ -15903,6 +15912,11 @@ spec:
                         Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.
                       format: int32
                       type: integer
+                    externalManaged:
+                      description: |-
+                        ExternalManaged indicates whether the configuration is managed by an external system.
+                        When set to true, the controller will ignore the management of this configuration.
+                      type: boolean
                     name:
                       description: Specifies the name of the template.
                       maxLength: 63
@@ -15915,6 +15929,10 @@ spec:
                       maxLength: 63
                       pattern: ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$
                       type: string
+                    restartOnFileChange:
+                      description: Specifies whether to restart the pod when the file
+                        changes.
+                      type: boolean
                     template:
                       description: Specifies the name of the referenced template ConfigMap
                         object.
@@ -17180,6 +17198,119 @@ spec:
                               description: Specify whether the object must be defined.
                               type: boolean
                           type: object
+                        resourceVarRef:
+                          description: Selects a defined var of a kind of resource.
+                          properties:
+                            compDef:
+                              description: |-
+                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition
+                                custom resource (CR) used by the component that the referent object resident in.
+
+
+                                If not specified, the component itself will be used.
+                              type: string
+                            cpu:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            cpuLimit:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            memory:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            memoryLimit:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            multipleClusterObjectOption:
+                              description: |-
+                                This option defines the behavior when multiple component objects match the specified @CompDef.
+                                If not provided, an error will be raised when handling multiple matches.
+                              properties:
+                                combinedOption:
+                                  description: |-
+                                    Define the options for handling combined variables.
+                                    Valid only when the strategy is set to "combined".
+                                  properties:
+                                    flattenFormat:
+                                      description: 'The flatten format, default is:
+                                        $(comp-name-1):value,$(comp-name-2):value.'
+                                      properties:
+                                        delimiter:
+                                          default: ','
+                                          description: Pair delimiter.
+                                          type: string
+                                        keyValueDelimiter:
+                                          default: ':'
+                                          description: Key-value delimiter.
+                                          type: string
+                                      required:
+                                      - delimiter
+                                      - keyValueDelimiter
+                                      type: object
+                                    newVarSuffix:
+                                      description: |-
+                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix
+                                        in pattern: $(var.name)_$(suffix).
+                                        The new variable will be auto-created and placed behind the existing one.
+                                        If not set, the existing variable will be reused with the value format defined below.
+                                      type: string
+                                    valueFormat:
+                                      default: Flatten
+                                      description: The format of the value that the
+                                        operator will use to compose values from multiple
+                                        components.
+                                      type: string
+                                  type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
+                                strategy:
+                                  description: Define the strategy for handling multiple
+                                    cluster objects.
+                                  enum:
+                                  - individual
+                                  - combined
+                                  type: string
+                              required:
+                              - strategy
+                              type: object
+                            name:
+                              description: Name of the referent object.
+                              type: string
+                            optional:
+                              description: Specify whether the object must be defined.
+                              type: boolean
+                            storage:
+                              properties:
+                                name:
+                                  type: string
+                                option:
+                                  description: VarOption defines whether a variable
+                                    is required or optional.
+                                  enum:
+                                  - Required
+                                  - Optional
+                                  type: string
+                              type: object
+                          type: object
                         secretKeyRef:
                           description: Selects a key of a Secret.
                           properties:
@@ -17858,6 +17989,7 @@ spec:
                         - vscale
                         - hscale
                         - tls
+                        - shardingHScale
                         type: string
                       type: array
                       x-kubernetes-list-type: set
@@ -32024,6 +32156,11 @@ spec:
                                         components.
                                       type: string
                                   type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
                                 strategy:
                                   description: Define the strategy for handling multiple
                                     cluster objects.
@@ -32126,6 +32263,11 @@ spec:
                                         components.
                                       type: string
                                   type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
                                 strategy:
                                   description: Define the strategy for handling multiple
                                     cluster objects.
@@ -32231,6 +32373,11 @@ spec:
                                         components.
                                       type: string
                                   type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
                                 strategy:
                                   description: Define the strategy for handling multiple
                                     cluster objects.
@@ -32334,6 +32481,11 @@ spec:
                                         components.
                                       type: string
                                   type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
                                 strategy:
                                   description: Define the strategy for handling multiple
                                     cluster objects.
@@ -32440,6 +32592,11 @@ spec:
                                         components.
                                       type: string
                                   type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
                                 strategy:
                                   description: Define the strategy for handling multiple
                                     cluster objects.
diff --git a/config/crd/bases/apps.kubeblocks.io_configurations.yaml b/config/crd/bases/apps.kubeblocks.io_configurations.yaml
index 903106569..869c96905 100644
--- a/config/crd/bases/apps.kubeblocks.io_configurations.yaml
+++ b/config/crd/bases/apps.kubeblocks.io_configurations.yaml
@@ -271,6 +271,7 @@ spec:
                             - vscale
                             - hscale
                             - tls
+                            - shardingHScale
                             type: string
                           type: array
                           x-kubernetes-list-type: set
diff --git a/config/crd/bases/apps.kubeblocks.io_sidecardefinitions.yaml b/config/crd/bases/apps.kubeblocks.io_sidecardefinitions.yaml
index b91eac451..d00f93b73 100644
--- a/config/crd/bases/apps.kubeblocks.io_sidecardefinitions.yaml
+++ b/config/crd/bases/apps.kubeblocks.io_sidecardefinitions.yaml
@@ -86,6 +86,11 @@ spec:
                         Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.
                       format: int32
                       type: integer
+                    externalManaged:
+                      description: |-
+                        ExternalManaged indicates whether the configuration is managed by an external system.
+                        When set to true, the controller will ignore the management of this configuration.
+                      type: boolean
                     name:
                       description: Specifies the name of the template.
                       maxLength: 63
@@ -98,6 +103,10 @@ spec:
                       maxLength: 63
                       pattern: ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$
                       type: string
+                    restartOnFileChange:
+                      description: Specifies whether to restart the pod when the file
+                        changes.
+                      type: boolean
                     template:
                       description: Specifies the name of the referenced template ConfigMap
                         object.
@@ -1497,6 +1506,11 @@ spec:
                         Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.
                       format: int32
                       type: integer
+                    externalManaged:
+                      description: |-
+                        ExternalManaged indicates whether the configuration is managed by an external system.
+                        When set to true, the controller will ignore the management of this configuration.
+                      type: boolean
                     name:
                       description: Specifies the name of the template.
                       maxLength: 63
@@ -1509,6 +1523,10 @@ spec:
                       maxLength: 63
                       pattern: ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$
                       type: string
+                    restartOnFileChange:
+                      description: Specifies whether to restart the pod when the file
+                        changes.
+                      type: boolean
                     template:
                       description: Specifies the name of the referenced template ConfigMap
                         object.
@@ -1955,6 +1973,119 @@ spec:
                               description: Specify whether the object must be defined.
                               type: boolean
                           type: object
+                        resourceVarRef:
+                          description: Selects a defined var of a kind of resource.
+                          properties:
+                            compDef:
+                              description: |-
+                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition
+                                custom resource (CR) used by the component that the referent object resident in.
+
+
+                                If not specified, the component itself will be used.
+                              type: string
+                            cpu:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            cpuLimit:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            memory:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            memoryLimit:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            multipleClusterObjectOption:
+                              description: |-
+                                This option defines the behavior when multiple component objects match the specified @CompDef.
+                                If not provided, an error will be raised when handling multiple matches.
+                              properties:
+                                combinedOption:
+                                  description: |-
+                                    Define the options for handling combined variables.
+                                    Valid only when the strategy is set to "combined".
+                                  properties:
+                                    flattenFormat:
+                                      description: 'The flatten format, default is:
+                                        $(comp-name-1):value,$(comp-name-2):value.'
+                                      properties:
+                                        delimiter:
+                                          default: ','
+                                          description: Pair delimiter.
+                                          type: string
+                                        keyValueDelimiter:
+                                          default: ':'
+                                          description: Key-value delimiter.
+                                          type: string
+                                      required:
+                                      - delimiter
+                                      - keyValueDelimiter
+                                      type: object
+                                    newVarSuffix:
+                                      description: |-
+                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix
+                                        in pattern: $(var.name)_$(suffix).
+                                        The new variable will be auto-created and placed behind the existing one.
+                                        If not set, the existing variable will be reused with the value format defined below.
+                                      type: string
+                                    valueFormat:
+                                      default: Flatten
+                                      description: The format of the value that the
+                                        operator will use to compose values from multiple
+                                        components.
+                                      type: string
+                                  type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
+                                strategy:
+                                  description: Define the strategy for handling multiple
+                                    cluster objects.
+                                  enum:
+                                  - individual
+                                  - combined
+                                  type: string
+                              required:
+                              - strategy
+                              type: object
+                            name:
+                              description: Name of the referent object.
+                              type: string
+                            optional:
+                              description: Specify whether the object must be defined.
+                              type: boolean
+                            storage:
+                              properties:
+                                name:
+                                  type: string
+                                option:
+                                  description: VarOption defines whether a variable
+                                    is required or optional.
+                                  enum:
+                                  - Required
+                                  - Optional
+                                  type: string
+                              type: object
+                          type: object
                         secretKeyRef:
                           description: Selects a key of a Secret.
                           properties:
diff --git a/config/crd/bases/parameters.kubeblocks.io_componentparameters.yaml b/config/crd/bases/parameters.kubeblocks.io_componentparameters.yaml
index 4472d54d2..74694ee7f 100644
--- a/config/crd/bases/parameters.kubeblocks.io_componentparameters.yaml
+++ b/config/crd/bases/parameters.kubeblocks.io_componentparameters.yaml
@@ -148,6 +148,11 @@ spec:
                             Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.
                           format: int32
                           type: integer
+                        externalManaged:
+                          description: |-
+                            ExternalManaged indicates whether the configuration is managed by an external system.
+                            When set to true, the controller will ignore the management of this configuration.
+                          type: boolean
                         name:
                           description: Specifies the name of the template.
                           maxLength: 63
@@ -160,6 +165,10 @@ spec:
                           maxLength: 63
                           pattern: ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$
                           type: string
+                        restartOnFileChange:
+                          description: Specifies whether to restart the pod when the
+                            file changes.
+                          type: boolean
                         template:
                           description: Specifies the name of the referenced template
                             ConfigMap object.
diff --git a/config/crd/bases/parameters.kubeblocks.io_paramconfigrenderers.yaml b/config/crd/bases/parameters.kubeblocks.io_paramconfigrenderers.yaml
index b15c96830..946926e69 100644
--- a/config/crd/bases/parameters.kubeblocks.io_paramconfigrenderers.yaml
+++ b/config/crd/bases/parameters.kubeblocks.io_paramconfigrenderers.yaml
@@ -143,7 +143,7 @@ spec:
                         - vscale
                         - hscale
                         - tls
-                        - shardingHVScale
+                        - shardingHScale
                         type: string
                       type: array
                       x-kubernetes-list-type: set
diff --git a/controllers/apps/component/component_controller.go b/controllers/apps/component/component_controller.go
index 3799d1ff7..605f9ae20 100644
--- a/controllers/apps/component/component_controller.go
+++ b/controllers/apps/component/component_controller.go
@@ -153,7 +153,7 @@ func (r *ComponentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
 			&componentServiceTransformer{},
 			// handle component system accounts
 			&componentAccountTransformer{},
-			// handle the TLS configuration
+			// handle the TLS
 			&componentTLSTransformer{},
 			// resolve and build vars for template and Env
 			&componentVarsTransformer{},
@@ -161,7 +161,7 @@ func (r *ComponentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
 			&componentAccountProvisionTransformer{},
 			// render config/script templates
 			&componentFileTemplateTransformer{},
-			// render component configurations
+			// HACK: the legacy reload sidecar
 			&componentReloadSidecarTransformer{Client: r.Client},
 			// handle restore before workloads transform
 			&componentRestoreTransformer{Client: r.Client},
diff --git a/controllers/apps/component/transformer_component_notifier.go b/controllers/apps/component/transformer_component_notifier.go
index e38a5bb16..aa9e1354b 100644
--- a/controllers/apps/component/transformer_component_notifier.go
+++ b/controllers/apps/component/transformer_component_notifier.go
@@ -92,6 +92,9 @@ func (t *componentNotifierTransformer) depended(transCtx *componentTransformCont
 			if v.ValueFrom.ServiceRefVarRef != nil {
 				return v.ValueFrom.ServiceRefVarRef.CompDef
 			}
+			if v.ValueFrom.ResourceVarRef != nil {
+				return v.ValueFrom.ResourceVarRef.CompDef
+			}
 			if v.ValueFrom.ComponentVarRef != nil {
 				return v.ValueFrom.ComponentVarRef.CompDef
 			}
diff --git a/controllers/apps/component/transformer_component_template.go b/controllers/apps/component/transformer_component_template.go
index 61f82cb71..8dbb33ea3 100644
--- a/controllers/apps/component/transformer_component_template.go
+++ b/controllers/apps/component/transformer_component_template.go
@@ -30,7 +30,6 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/apimachinery/pkg/util/sets"
-	"k8s.io/utils/pointer"
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
@@ -289,5 +288,5 @@ func fileTemplateNameFromObject(synthesizedComp *component.SynthesizedComponent,
 }
 
 func isExternalManaged(tpl component.SynthesizedFileTemplate) bool {
-	return pointer.BoolDeref(tpl.ExternalManaged, false)
+	return ptr.Deref(tpl.ExternalManaged, false)
 }
diff --git a/controllers/apps/component/transformer_component_tls.go b/controllers/apps/component/transformer_component_tls.go
index 13204cffd..80350db40 100644
--- a/controllers/apps/component/transformer_component_tls.go
+++ b/controllers/apps/component/transformer_component_tls.go
@@ -45,7 +45,7 @@ type tlsIssuer interface {
 	update(ctx context.Context, cli client.Reader, secret *corev1.Secret) (*corev1.Secret, error)
 }
 
-// componentTLSTransformer handles the TLS configuration for the component.
+// componentTLSTransformer handles the TLS for the component.
 type componentTLSTransformer struct{}
 
 var _ graph.Transformer = &componentTLSTransformer{}
diff --git a/controllers/apps/component/transformer_component_workload.go b/controllers/apps/component/transformer_component_workload.go
index 86829f70d..ba4d1e7a0 100644
--- a/controllers/apps/component/transformer_component_workload.go
+++ b/controllers/apps/component/transformer_component_workload.go
@@ -37,7 +37,6 @@ import (
 	appsutil "github.com/apecloud/kubeblocks/controllers/apps/util"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
-	"github.com/apecloud/kubeblocks/pkg/controller/configuration"
 	"github.com/apecloud/kubeblocks/pkg/controller/factory"
 	"github.com/apecloud/kubeblocks/pkg/controller/graph"
 	"github.com/apecloud/kubeblocks/pkg/controller/model"
@@ -132,9 +131,6 @@ func (t *componentWorkloadTransformer) reconcileWorkload(ctx context.Context, cl
 		return err
 	}
 
-	// build configuration template annotations to workload
-	configuration.BuildConfigTemplateAnnotations(protoITS, synthesizedComp)
-
 	return nil
 }
 
diff --git a/controllers/apps/component/transformer_component_workload_ops.go b/controllers/apps/component/transformer_component_workload_ops.go
index 09ed47ea9..0017443a8 100644
--- a/controllers/apps/component/transformer_component_workload_ops.go
+++ b/controllers/apps/component/transformer_component_workload_ops.go
@@ -33,6 +33,7 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/equality"
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/apimachinery/pkg/util/sets"
 	"k8s.io/utils/ptr"
@@ -646,6 +647,22 @@ func (r *componentWorkloadOps) handleReconfigure(transCtx *componentTransformCon
 		return nil
 	}
 
+	for objName := range toUpdate {
+		tplName := fileTemplateNameFromObject(transCtx.SynthesizeComponent, protoObjs[objName])
+		for _, tpl := range synthesizedComp.FileTemplates {
+			if tpl.Name == tplName {
+				if ptr.Deref(tpl.RestartOnFileChange, false) {
+					// restart
+					if r.protoITS.Spec.Template.Annotations == nil {
+						r.protoITS.Spec.Template.Annotations = map[string]string{}
+					}
+					r.protoITS.Spec.Template.Annotations[constant.RestartAnnotationKey] = metav1.NowMicro().Format(time.RFC3339)
+					return nil
+				}
+			}
+		}
+	}
+
 	reconfigure := func(tpl component.SynthesizedFileTemplate, changes fileTemplateChanges) {
 		var (
 			action     *appsv1.Action
diff --git a/controllers/apps/componentdefinition_controller.go b/controllers/apps/componentdefinition_controller.go
index f521c93d1..65912cdfa 100644
--- a/controllers/apps/componentdefinition_controller.go
+++ b/controllers/apps/componentdefinition_controller.go
@@ -243,6 +243,8 @@ func (r *ComponentDefinitionReconciler) validateVars(cli client.Client, rctx int
 			compDef = cVar.ValueFrom.ServiceVarRef.CompDef
 		case cVar.ValueFrom.ServiceRefVarRef != nil:
 			compDef = cVar.ValueFrom.ServiceRefVarRef.CompDef
+		case cVar.ValueFrom.ResourceVarRef != nil:
+			compDef = cVar.ValueFrom.ResourceVarRef.CompDef
 		case cVar.ValueFrom.ComponentVarRef != nil:
 			compDef = cVar.ValueFrom.ComponentVarRef.CompDef
 		case cVar.ValueFrom.CredentialVarRef != nil:
diff --git a/controllers/apps/shardingdefinition_controller.go b/controllers/apps/shardingdefinition_controller.go
index 3c89cfa7c..440efffdc 100644
--- a/controllers/apps/shardingdefinition_controller.go
+++ b/controllers/apps/shardingdefinition_controller.go
@@ -241,6 +241,9 @@ func (r *ShardingDefinitionReconciler) requireParallelProvision() bool {
 			if v.ValueFrom.ServiceRefVarRef != nil {
 				return requireAll(v.ValueFrom.ServiceRefVarRef.MultipleClusterObjectOption)
 			}
+			if v.ValueFrom.ResourceVarRef != nil {
+				return requireAll(v.ValueFrom.ResourceVarRef.MultipleClusterObjectOption)
+			}
 			if v.ValueFrom.ComponentVarRef != nil {
 				return requireAll(v.ValueFrom.ComponentVarRef.MultipleClusterObjectOption)
 			}
diff --git a/controllers/dataprotection/backup_controller.go b/controllers/dataprotection/backup_controller.go
index 6a917343c..721201d4d 100644
--- a/controllers/dataprotection/backup_controller.go
+++ b/controllers/dataprotection/backup_controller.go
@@ -103,6 +103,12 @@ func (r *BackupReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
 		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
 	}
 
+	// check whether to skip reconciliation
+	if val, ok := backup.Annotations[dptypes.SkipReconciliationAnnotationKey]; ok && strings.EqualFold(val, "true") {
+		reqCtx.Log.V(1).Info("skip reconciliation", "backup", req.NamespacedName)
+		return intctrlutil.Reconciled()
+	}
+
 	reqCtx.Log.V(1).Info("reconcile", "backup", req.NamespacedName, "phase", backup.Status.Phase)
 
 	// if backup is being deleted, set backup phase to Deleting. The backup
diff --git a/controllers/parameters/parametertemplateextension_controller.go b/controllers/parameters/parametertemplateextension_controller.go
index db341674c..70e91b592 100644
--- a/controllers/parameters/parametertemplateextension_controller.go
+++ b/controllers/parameters/parametertemplateextension_controller.go
@@ -127,7 +127,7 @@ func updateConfigsForParameterTemplate(reqCtx intctrlutil.RequestCtx, reader cli
 		}
 		cm := corev1.ConfigMap{}
 		if err := reader.Get(reqCtx.Ctx, cmKey, &cm); err != nil {
-			return err
+			return client.IgnoreNotFound(err)
 		}
 		config.ConfigMap = &corev1.ConfigMapVolumeSource{
 			LocalObjectReference: corev1.LocalObjectReference{Name: cm.Name},
@@ -140,7 +140,7 @@ func updateConfigsForParameterTemplate(reqCtx intctrlutil.RequestCtx, reader cli
 		}
 		parameterCR, err := resolveParameterCR(compName)
 		if err != nil {
-			if apierrors.IsNotFound(err) {
+			if !apierrors.IsNotFound(err) {
 				return err
 			}
 			return nil
diff --git a/controllers/parameters/policy_util.go b/controllers/parameters/policy_util.go
index aeb301bcb..7a6ba269c 100644
--- a/controllers/parameters/policy_util.go
+++ b/controllers/parameters/policy_util.go
@@ -66,7 +66,7 @@ func CheckReconfigureUpdateProgress(pods []corev1.Pod, configKey, version string
 
 	for _, pod := range pods {
 		annotations := pod.Annotations
-		if len(annotations) != 0 && annotations[cfgAnnotationKey] == version && intctrlutil.PodIsReady(&pod) {
+		if len(annotations) != 0 && annotations[cfgAnnotationKey] == version && intctrlutil.IsPodReady(&pod) {
 			readyPods++
 		}
 	}
diff --git a/controllers/parameters/rolling_upgrade_policy.go b/controllers/parameters/rolling_upgrade_policy.go
index 70afaa8bf..9709314ae 100644
--- a/controllers/parameters/rolling_upgrade_policy.go
+++ b/controllers/parameters/rolling_upgrade_policy.go
@@ -161,9 +161,9 @@ func classifyPodByStats(pods []corev1.Pod, targetReplicas int, minReadySeconds i
 	for i := 0; i < len(pods); i++ {
 		pod := &pods[i]
 		switch {
-		case podutil.IsAvailable(pod, minReadySeconds):
+		case podutil.IsPodAvailable(pod, minReadySeconds):
 			podsStats.available[pod.Name] = pod
-		case podutil.PodIsReady(pod):
+		case podutil.IsPodReady(pod):
 			podsStats.ready[pod.Name] = pod
 		default:
 		}
diff --git a/controllers/parameters/sync_upgrade_policy.go b/controllers/parameters/sync_upgrade_policy.go
index f71a708e5..e9dfccec8 100644
--- a/controllers/parameters/sync_upgrade_policy.go
+++ b/controllers/parameters/sync_upgrade_policy.go
@@ -108,7 +108,7 @@ func sync(rctx reconfigureContext, updatedParameters map[string]string, pods []c
 			progress++
 			continue
 		}
-		if !intctrlutil.PodIsReady(&pod) {
+		if !intctrlutil.IsPodReady(&pod) {
 			continue
 		}
 		if err = funcs.OnlineUpdatePodFunc(&pod, ctx, rctx.ReconfigureClientFactory, rctx.ConfigTemplate.Name, fileName, updatedParameters); err != nil {
diff --git a/deploy/helm/crds/apps.kubeblocks.io_clusterdefinitions.yaml b/deploy/helm/crds/apps.kubeblocks.io_clusterdefinitions.yaml
index 2e7ce3392..0d2e5a68a 100644
--- a/deploy/helm/crds/apps.kubeblocks.io_clusterdefinitions.yaml
+++ b/deploy/helm/crds/apps.kubeblocks.io_clusterdefinitions.yaml
@@ -589,6 +589,7 @@ spec:
                               - vscale
                               - hscale
                               - tls
+                              - shardingHScale
                               type: string
                             type: array
                             x-kubernetes-list-type: set
diff --git a/deploy/helm/crds/apps.kubeblocks.io_componentdefinitions.yaml b/deploy/helm/crds/apps.kubeblocks.io_componentdefinitions.yaml
index 557a50dd8..031f48ff1 100644
--- a/deploy/helm/crds/apps.kubeblocks.io_componentdefinitions.yaml
+++ b/deploy/helm/crds/apps.kubeblocks.io_componentdefinitions.yaml
@@ -4245,6 +4245,11 @@ spec:
                         Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.
                       format: int32
                       type: integer
+                    externalManaged:
+                      description: |-
+                        ExternalManaged indicates whether the configuration is managed by an external system.
+                        When set to true, the controller will ignore the management of this configuration.
+                      type: boolean
                     name:
                       description: Specifies the name of the template.
                       maxLength: 63
@@ -4257,6 +4262,10 @@ spec:
                       maxLength: 63
                       pattern: ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$
                       type: string
+                    restartOnFileChange:
+                      description: Specifies whether to restart the pod when the file
+                        changes.
+                      type: boolean
                     template:
                       description: Specifies the name of the referenced template ConfigMap
                         object.
@@ -15903,6 +15912,11 @@ spec:
                         Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.
                       format: int32
                       type: integer
+                    externalManaged:
+                      description: |-
+                        ExternalManaged indicates whether the configuration is managed by an external system.
+                        When set to true, the controller will ignore the management of this configuration.
+                      type: boolean
                     name:
                       description: Specifies the name of the template.
                       maxLength: 63
@@ -15915,6 +15929,10 @@ spec:
                       maxLength: 63
                       pattern: ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$
                       type: string
+                    restartOnFileChange:
+                      description: Specifies whether to restart the pod when the file
+                        changes.
+                      type: boolean
                     template:
                       description: Specifies the name of the referenced template ConfigMap
                         object.
@@ -17180,6 +17198,119 @@ spec:
                               description: Specify whether the object must be defined.
                               type: boolean
                           type: object
+                        resourceVarRef:
+                          description: Selects a defined var of a kind of resource.
+                          properties:
+                            compDef:
+                              description: |-
+                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition
+                                custom resource (CR) used by the component that the referent object resident in.
+
+
+                                If not specified, the component itself will be used.
+                              type: string
+                            cpu:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            cpuLimit:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            memory:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            memoryLimit:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            multipleClusterObjectOption:
+                              description: |-
+                                This option defines the behavior when multiple component objects match the specified @CompDef.
+                                If not provided, an error will be raised when handling multiple matches.
+                              properties:
+                                combinedOption:
+                                  description: |-
+                                    Define the options for handling combined variables.
+                                    Valid only when the strategy is set to "combined".
+                                  properties:
+                                    flattenFormat:
+                                      description: 'The flatten format, default is:
+                                        $(comp-name-1):value,$(comp-name-2):value.'
+                                      properties:
+                                        delimiter:
+                                          default: ','
+                                          description: Pair delimiter.
+                                          type: string
+                                        keyValueDelimiter:
+                                          default: ':'
+                                          description: Key-value delimiter.
+                                          type: string
+                                      required:
+                                      - delimiter
+                                      - keyValueDelimiter
+                                      type: object
+                                    newVarSuffix:
+                                      description: |-
+                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix
+                                        in pattern: $(var.name)_$(suffix).
+                                        The new variable will be auto-created and placed behind the existing one.
+                                        If not set, the existing variable will be reused with the value format defined below.
+                                      type: string
+                                    valueFormat:
+                                      default: Flatten
+                                      description: The format of the value that the
+                                        operator will use to compose values from multiple
+                                        components.
+                                      type: string
+                                  type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
+                                strategy:
+                                  description: Define the strategy for handling multiple
+                                    cluster objects.
+                                  enum:
+                                  - individual
+                                  - combined
+                                  type: string
+                              required:
+                              - strategy
+                              type: object
+                            name:
+                              description: Name of the referent object.
+                              type: string
+                            optional:
+                              description: Specify whether the object must be defined.
+                              type: boolean
+                            storage:
+                              properties:
+                                name:
+                                  type: string
+                                option:
+                                  description: VarOption defines whether a variable
+                                    is required or optional.
+                                  enum:
+                                  - Required
+                                  - Optional
+                                  type: string
+                              type: object
+                          type: object
                         secretKeyRef:
                           description: Selects a key of a Secret.
                           properties:
@@ -17858,6 +17989,7 @@ spec:
                         - vscale
                         - hscale
                         - tls
+                        - shardingHScale
                         type: string
                       type: array
                       x-kubernetes-list-type: set
@@ -32024,6 +32156,11 @@ spec:
                                         components.
                                       type: string
                                   type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
                                 strategy:
                                   description: Define the strategy for handling multiple
                                     cluster objects.
@@ -32126,6 +32263,11 @@ spec:
                                         components.
                                       type: string
                                   type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
                                 strategy:
                                   description: Define the strategy for handling multiple
                                     cluster objects.
@@ -32231,6 +32373,11 @@ spec:
                                         components.
                                       type: string
                                   type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
                                 strategy:
                                   description: Define the strategy for handling multiple
                                     cluster objects.
@@ -32334,6 +32481,11 @@ spec:
                                         components.
                                       type: string
                                   type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
                                 strategy:
                                   description: Define the strategy for handling multiple
                                     cluster objects.
@@ -32440,6 +32592,11 @@ spec:
                                         components.
                                       type: string
                                   type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
                                 strategy:
                                   description: Define the strategy for handling multiple
                                     cluster objects.
diff --git a/deploy/helm/crds/apps.kubeblocks.io_configurations.yaml b/deploy/helm/crds/apps.kubeblocks.io_configurations.yaml
index 903106569..869c96905 100644
--- a/deploy/helm/crds/apps.kubeblocks.io_configurations.yaml
+++ b/deploy/helm/crds/apps.kubeblocks.io_configurations.yaml
@@ -271,6 +271,7 @@ spec:
                             - vscale
                             - hscale
                             - tls
+                            - shardingHScale
                             type: string
                           type: array
                           x-kubernetes-list-type: set
diff --git a/deploy/helm/crds/apps.kubeblocks.io_sidecardefinitions.yaml b/deploy/helm/crds/apps.kubeblocks.io_sidecardefinitions.yaml
index b91eac451..d00f93b73 100644
--- a/deploy/helm/crds/apps.kubeblocks.io_sidecardefinitions.yaml
+++ b/deploy/helm/crds/apps.kubeblocks.io_sidecardefinitions.yaml
@@ -86,6 +86,11 @@ spec:
                         Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.
                       format: int32
                       type: integer
+                    externalManaged:
+                      description: |-
+                        ExternalManaged indicates whether the configuration is managed by an external system.
+                        When set to true, the controller will ignore the management of this configuration.
+                      type: boolean
                     name:
                       description: Specifies the name of the template.
                       maxLength: 63
@@ -98,6 +103,10 @@ spec:
                       maxLength: 63
                       pattern: ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$
                       type: string
+                    restartOnFileChange:
+                      description: Specifies whether to restart the pod when the file
+                        changes.
+                      type: boolean
                     template:
                       description: Specifies the name of the referenced template ConfigMap
                         object.
@@ -1497,6 +1506,11 @@ spec:
                         Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.
                       format: int32
                       type: integer
+                    externalManaged:
+                      description: |-
+                        ExternalManaged indicates whether the configuration is managed by an external system.
+                        When set to true, the controller will ignore the management of this configuration.
+                      type: boolean
                     name:
                       description: Specifies the name of the template.
                       maxLength: 63
@@ -1509,6 +1523,10 @@ spec:
                       maxLength: 63
                       pattern: ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$
                       type: string
+                    restartOnFileChange:
+                      description: Specifies whether to restart the pod when the file
+                        changes.
+                      type: boolean
                     template:
                       description: Specifies the name of the referenced template ConfigMap
                         object.
@@ -1955,6 +1973,119 @@ spec:
                               description: Specify whether the object must be defined.
                               type: boolean
                           type: object
+                        resourceVarRef:
+                          description: Selects a defined var of a kind of resource.
+                          properties:
+                            compDef:
+                              description: |-
+                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition
+                                custom resource (CR) used by the component that the referent object resident in.
+
+
+                                If not specified, the component itself will be used.
+                              type: string
+                            cpu:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            cpuLimit:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            memory:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            memoryLimit:
+                              description: VarOption defines whether a variable is
+                                required or optional.
+                              enum:
+                              - Required
+                              - Optional
+                              type: string
+                            multipleClusterObjectOption:
+                              description: |-
+                                This option defines the behavior when multiple component objects match the specified @CompDef.
+                                If not provided, an error will be raised when handling multiple matches.
+                              properties:
+                                combinedOption:
+                                  description: |-
+                                    Define the options for handling combined variables.
+                                    Valid only when the strategy is set to "combined".
+                                  properties:
+                                    flattenFormat:
+                                      description: 'The flatten format, default is:
+                                        $(comp-name-1):value,$(comp-name-2):value.'
+                                      properties:
+                                        delimiter:
+                                          default: ','
+                                          description: Pair delimiter.
+                                          type: string
+                                        keyValueDelimiter:
+                                          default: ':'
+                                          description: Key-value delimiter.
+                                          type: string
+                                      required:
+                                      - delimiter
+                                      - keyValueDelimiter
+                                      type: object
+                                    newVarSuffix:
+                                      description: |-
+                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix
+                                        in pattern: $(var.name)_$(suffix).
+                                        The new variable will be auto-created and placed behind the existing one.
+                                        If not set, the existing variable will be reused with the value format defined below.
+                                      type: string
+                                    valueFormat:
+                                      default: Flatten
+                                      description: The format of the value that the
+                                        operator will use to compose values from multiple
+                                        components.
+                                      type: string
+                                  type: object
+                                requireAllComponentObjects:
+                                  description: |-
+                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.
+                                    If set to true, resolving will only proceed if all component objects are present.
+                                  type: boolean
+                                strategy:
+                                  description: Define the strategy for handling multiple
+                                    cluster objects.
+                                  enum:
+                                  - individual
+                                  - combined
+                                  type: string
+                              required:
+                              - strategy
+                              type: object
+                            name:
+                              description: Name of the referent object.
+                              type: string
+                            optional:
+                              description: Specify whether the object must be defined.
+                              type: boolean
+                            storage:
+                              properties:
+                                name:
+                                  type: string
+                                option:
+                                  description: VarOption defines whether a variable
+                                    is required or optional.
+                                  enum:
+                                  - Required
+                                  - Optional
+                                  type: string
+                              type: object
+                          type: object
                         secretKeyRef:
                           description: Selects a key of a Secret.
                           properties:
diff --git a/deploy/helm/crds/parameters.kubeblocks.io_componentparameters.yaml b/deploy/helm/crds/parameters.kubeblocks.io_componentparameters.yaml
index 4472d54d2..74694ee7f 100644
--- a/deploy/helm/crds/parameters.kubeblocks.io_componentparameters.yaml
+++ b/deploy/helm/crds/parameters.kubeblocks.io_componentparameters.yaml
@@ -148,6 +148,11 @@ spec:
                             Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.
                           format: int32
                           type: integer
+                        externalManaged:
+                          description: |-
+                            ExternalManaged indicates whether the configuration is managed by an external system.
+                            When set to true, the controller will ignore the management of this configuration.
+                          type: boolean
                         name:
                           description: Specifies the name of the template.
                           maxLength: 63
@@ -160,6 +165,10 @@ spec:
                           maxLength: 63
                           pattern: ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$
                           type: string
+                        restartOnFileChange:
+                          description: Specifies whether to restart the pod when the
+                            file changes.
+                          type: boolean
                         template:
                           description: Specifies the name of the referenced template
                             ConfigMap object.
diff --git a/deploy/helm/crds/parameters.kubeblocks.io_paramconfigrenderers.yaml b/deploy/helm/crds/parameters.kubeblocks.io_paramconfigrenderers.yaml
index b15c96830..946926e69 100644
--- a/deploy/helm/crds/parameters.kubeblocks.io_paramconfigrenderers.yaml
+++ b/deploy/helm/crds/parameters.kubeblocks.io_paramconfigrenderers.yaml
@@ -143,7 +143,7 @@ spec:
                         - vscale
                         - hscale
                         - tls
-                        - shardingHVScale
+                        - shardingHScale
                         type: string
                       type: array
                       x-kubernetes-list-type: set
diff --git a/docs/developer_docs/api-reference/cluster.md b/docs/developer_docs/api-reference/cluster.md
index 249e4e1b6..20d2ac278 100644
--- a/docs/developer_docs/api-reference/cluster.md
+++ b/docs/developer_docs/api-reference/cluster.md
@@ -3571,7 +3571,7 @@ string
 <h3 id="apps.kubeblocks.io/v1.ClusterObjectReference">ClusterObjectReference
 </h3>
 <p>
-(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ComponentVarSelector">ComponentVarSelector</a>, <a href="#apps.kubeblocks.io/v1.CredentialVarSelector">CredentialVarSelector</a>, <a href="#apps.kubeblocks.io/v1.HostNetworkVarSelector">HostNetworkVarSelector</a>, <a href="#apps.kubeblocks.io/v1.ServiceRefVarSelector">ServiceRefVarSelector</a>, <a href="#apps.kubeblocks.io/v1.ServiceVarSelector">ServiceVarSelector</a>, <a href="#apps.kubeblocks.io/v1.TLSVarSelector">TLSVarSelector</a>)
+(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ComponentVarSelector">ComponentVarSelector</a>, <a href="#apps.kubeblocks.io/v1.CredentialVarSelector">CredentialVarSelector</a>, <a href="#apps.kubeblocks.io/v1.HostNetworkVarSelector">HostNetworkVarSelector</a>, <a href="#apps.kubeblocks.io/v1.ResourceVarSelector">ResourceVarSelector</a>, <a href="#apps.kubeblocks.io/v1.ServiceRefVarSelector">ServiceRefVarSelector</a>, <a href="#apps.kubeblocks.io/v1.ServiceVarSelector">ServiceVarSelector</a>, <a href="#apps.kubeblocks.io/v1.TLSVarSelector">TLSVarSelector</a>)
 </p>
 <div>
 <p>ClusterObjectReference defines information to let you locate the referenced object inside the same Cluster.</p>
@@ -5572,6 +5572,31 @@ In such cases, the resulting file mode may have additional bits set.
 Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.</p>
 </td>
 </tr>
+<tr>
+<td>
+<code>externalManaged</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ExternalManaged indicates whether the configuration is managed by an external system.
+When set to true, the controller will ignore the management of this configuration.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>restartOnFileChange</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Specifies whether to restart the pod when the file changes.</p>
+</td>
+</tr>
 </tbody>
 </table>
 <h3 id="apps.kubeblocks.io/v1.ComponentLifecycleActions">ComponentLifecycleActions
@@ -8364,7 +8389,7 @@ string
 <h3 id="apps.kubeblocks.io/v1.NamedVar">NamedVar
 </h3>
 <p>
-(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ContainerVars">ContainerVars</a>, <a href="#apps.kubeblocks.io/v1.ServiceVars">ServiceVars</a>)
+(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ContainerVars">ContainerVars</a>, <a href="#apps.kubeblocks.io/v1.ResourceVars">ResourceVars</a>, <a href="#apps.kubeblocks.io/v1.ServiceVars">ServiceVars</a>)
 </p>
 <div>
 </div>
@@ -9075,6 +9100,138 @@ int32
 </tr>
 </tbody>
 </table>
+<h3 id="apps.kubeblocks.io/v1.ResourceVarSelector">ResourceVarSelector
+</h3>
+<p>
+(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.VarSource">VarSource</a>)
+</p>
+<div>
+<p>ResourceVarSelector selects a var from a kind of resource.</p>
+</div>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>ClusterObjectReference</code><br/>
+<em>
+<a href="#apps.kubeblocks.io/v1.ClusterObjectReference">
+ClusterObjectReference
+</a>
+</em>
+</td>
+<td>
+<p>
+(Members of <code>ClusterObjectReference</code> are embedded into this type.)
+</p>
+<p>The Component to select from.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ResourceVars</code><br/>
+<em>
+<a href="#apps.kubeblocks.io/v1.ResourceVars">
+ResourceVars
+</a>
+</em>
+</td>
+<td>
+<p>
+(Members of <code>ResourceVars</code> are embedded into this type.)
+</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="apps.kubeblocks.io/v1.ResourceVars">ResourceVars
+</h3>
+<p>
+(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ResourceVarSelector">ResourceVarSelector</a>)
+</p>
+<div>
+<p>ResourceVars defines the vars that can be referenced from resources.</p>
+</div>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>cpu</code><br/>
+<em>
+<a href="#apps.kubeblocks.io/v1.VarOption">
+VarOption
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>cpuLimit</code><br/>
+<em>
+<a href="#apps.kubeblocks.io/v1.VarOption">
+VarOption
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>memory</code><br/>
+<em>
+<a href="#apps.kubeblocks.io/v1.VarOption">
+VarOption
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>memoryLimit</code><br/>
+<em>
+<a href="#apps.kubeblocks.io/v1.VarOption">
+VarOption
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>storage</code><br/>
+<em>
+<a href="#apps.kubeblocks.io/v1.NamedVar">
+NamedVar
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
 <h3 id="apps.kubeblocks.io/v1.RetryPolicy">RetryPolicy
 </h3>
 <p>
@@ -11866,7 +12023,7 @@ This ensures that only one replica is unavailable at a time during the update pr
 <h3 id="apps.kubeblocks.io/v1.VarOption">VarOption
 (<code>string</code> alias)</h3>
 <p>
-(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ClusterVars">ClusterVars</a>, <a href="#apps.kubeblocks.io/v1.ComponentVars">ComponentVars</a>, <a href="#apps.kubeblocks.io/v1.CredentialVars">CredentialVars</a>, <a href="#apps.kubeblocks.io/v1.NamedVar">NamedVar</a>, <a href="#apps.kubeblocks.io/v1.RoledVar">RoledVar</a>, <a href="#apps.kubeblocks.io/v1.ServiceRefVars">ServiceRefVars</a>, <a href="#apps.kubeblocks.io/v1.ServiceVars">ServiceVars</a>, <a href="#apps.kubeblocks.io/v1.TLSVars">TLSVars</a>)
+(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ClusterVars">ClusterVars</a>, <a href="#apps.kubeblocks.io/v1.ComponentVars">ComponentVars</a>, <a href="#apps.kubeblocks.io/v1.CredentialVars">CredentialVars</a>, <a href="#apps.kubeblocks.io/v1.NamedVar">NamedVar</a>, <a href="#apps.kubeblocks.io/v1.ResourceVars">ResourceVars</a>, <a href="#apps.kubeblocks.io/v1.RoledVar">RoledVar</a>, <a href="#apps.kubeblocks.io/v1.ServiceRefVars">ServiceRefVars</a>, <a href="#apps.kubeblocks.io/v1.ServiceVars">ServiceVars</a>, <a href="#apps.kubeblocks.io/v1.TLSVars">TLSVars</a>)
 </p>
 <div>
 <p>VarOption defines whether a variable is required or optional.</p>
@@ -11987,6 +12144,20 @@ ServiceRefVarSelector
 </tr>
 <tr>
 <td>
+<code>resourceVarRef</code><br/>
+<em>
+<a href="#apps.kubeblocks.io/v1.ResourceVarSelector">
+ResourceVarSelector
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Selects a defined var of a kind of resource.</p>
+</td>
+</tr>
+<tr>
+<td>
 <code>componentVarRef</code><br/>
 <em>
 <a href="#apps.kubeblocks.io/v1.ComponentVarSelector">
@@ -23448,6 +23619,19 @@ MultipleClusterObjectValueFormatFlatten
 <tbody>
 <tr>
 <td>
+<code>requireAllComponentObjects</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>RequireAllComponentObjects controls whether all component objects must exist before resolving.
+If set to true, resolving will only proceed if all component objects are present.</p>
+</td>
+</tr>
+<tr>
+<td>
 <code>strategy</code><br/>
 <em>
 <a href="#apps.kubeblocks.io/v1alpha1.MultipleClusterObjectStrategy">
@@ -24697,6 +24881,8 @@ StatefulSetSpec
 <td></td>
 </tr><tr><td><p>&#34;vscale&#34;</p></td>
 <td></td>
+</tr><tr><td><p>&#34;shardingHScale&#34;</p></td>
+<td></td>
 </tr></tbody>
 </table>
 <h3 id="apps.kubeblocks.io/v1alpha1.ResourceMeta">ResourceMeta
diff --git a/pkg/controller/component/synthesize_component.go b/pkg/controller/component/synthesize_component.go
index 627c4b7b5..4cd49cab7 100644
--- a/pkg/controller/component/synthesize_component.go
+++ b/pkg/controller/component/synthesize_component.go
@@ -450,7 +450,9 @@ func synthesizeFileTemplate(comp *appsv1.Component, tpl appsv1.ComponentFileTemp
 			tpl.Template = utpl.ConfigMap.Name
 		}
 		tpl.Reconfigure = utpl.Reconfigure // custom reconfigure action
-		tpl.ExternalManaged = utpl.ExternalManaged
+		if utpl.ExternalManaged != nil {
+			tpl.ExternalManaged = utpl.ExternalManaged
+		}
 
 		if tpl.ExternalManaged != nil && *tpl.ExternalManaged {
 			if utpl.ConfigMap == nil {
diff --git a/pkg/controller/component/type.go b/pkg/controller/component/type.go
index ebf8727a6..fa503bf4e 100644
--- a/pkg/controller/component/type.go
+++ b/pkg/controller/component/type.go
@@ -81,8 +81,7 @@ type SynthesizedComponent struct {
 
 type SynthesizedFileTemplate struct {
 	kbappsv1.ComponentFileTemplate
-	Config          bool
-	Variables       map[string]string
-	Reconfigure     *kbappsv1.Action
-	ExternalManaged *bool
+	Config      bool
+	Variables   map[string]string
+	Reconfigure *kbappsv1.Action
 }
diff --git a/pkg/controller/component/vars.go b/pkg/controller/component/vars.go
index 0f3388938..3cd90258f 100644
--- a/pkg/controller/component/vars.go
+++ b/pkg/controller/component/vars.go
@@ -32,6 +32,7 @@ import (
 	"golang.org/x/exp/maps"
 	corev1 "k8s.io/api/core/v1"
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/resource"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/apimachinery/pkg/types"
 	"sigs.k8s.io/controller-runtime/pkg/client"
@@ -346,6 +347,8 @@ func resolveClusterObjectVarRef(ctx context.Context, cli client.Reader, synthesi
 		return resolveTLSVarRef(ctx, cli, synthesizedComp, defineKey, *source.TLSVarRef)
 	case source.ServiceRefVarRef != nil:
 		return resolveServiceRefVarRef(ctx, cli, synthesizedComp, defineKey, *source.ServiceRefVarRef)
+	case source.ResourceVarRef != nil:
+		return resolveResourceVarRef(ctx, cli, synthesizedComp, defineKey, *source.ResourceVarRef)
 	case source.ComponentVarRef != nil:
 		return resolveComponentVarRef(ctx, cli, synthesizedComp, defineKey, *source.ComponentVarRef)
 	case source.ClusterVarRef != nil:
@@ -1045,6 +1048,91 @@ func resolveServiceRefVarRefLow(ctx context.Context, cli client.Reader, synthesi
 	return resolveClusterObjectVars("ServiceRef", selector.ClusterObjectReference, option, resolveObjs, resolveVar)
 }
 
+func resolveResourceVarRef(ctx context.Context, cli client.Reader, synthesizedComp *SynthesizedComponent,
+	defineKey string, selector appsv1.ResourceVarSelector) ([]corev1.EnvVar, []corev1.EnvVar, error) {
+	var resolveFunc func(context.Context, client.Reader, *SynthesizedComponent, string, appsv1.ResourceVarSelector) ([]*corev1.EnvVar, []*corev1.EnvVar, error)
+	switch {
+	case selector.CPU != nil || selector.CPULimit != nil:
+		resolveFunc = resolveResourceCPURef
+	case selector.Memory != nil || selector.MemoryLimit != nil:
+		resolveFunc = resolveResourceMemoryRef
+	case selector.Storage != nil:
+		resolveFunc = resolveResourceStorageRef
+	default:
+		return nil, nil, nil
+	}
+	return checkNBuildVars(resolveFunc(ctx, cli, synthesizedComp, defineKey, selector))
+}
+
+func resolveResourceCPURef(ctx context.Context, cli client.Reader, synthesizedComp *SynthesizedComponent,
+	defineKey string, selector appsv1.ResourceVarSelector) ([]*corev1.EnvVar, []*corev1.EnvVar, error) {
+	resolveCPU := func(obj any) (*corev1.EnvVar, *corev1.EnvVar, error) {
+		comp := obj.(*appsv1.Component)
+		var quantity *resource.Quantity
+		if selector.CPU != nil {
+			quantity = comp.Spec.Resources.Requests.Cpu()
+		} else {
+			quantity = comp.Spec.Resources.Limits.Cpu()
+		}
+		val := int64(0)
+		if quantity != nil {
+			val = quantity.Value()
+		}
+		return &corev1.EnvVar{Name: defineKey, Value: fmt.Sprintf("%d", val)}, nil, nil
+	}
+	cpuVar := selector.CPU
+	if cpuVar == nil {
+		cpuVar = selector.CPULimit
+	}
+	return resolveComponentVarRefLow(ctx, cli, synthesizedComp, selector.ClusterObjectReference, cpuVar, resolveCPU)
+}
+
+func resolveResourceMemoryRef(ctx context.Context, cli client.Reader, synthesizedComp *SynthesizedComponent,
+	defineKey string, selector appsv1.ResourceVarSelector) ([]*corev1.EnvVar, []*corev1.EnvVar, error) {
+	resolveMemory := func(obj any) (*corev1.EnvVar, *corev1.EnvVar, error) {
+		comp := obj.(*appsv1.Component)
+		var quantity *resource.Quantity
+		if selector.Memory != nil {
+			quantity = comp.Spec.Resources.Requests.Memory()
+		} else {
+			quantity = comp.Spec.Resources.Limits.Memory()
+		}
+		val := int64(0)
+		if quantity != nil {
+			val = quantity.Value()
+		}
+		return &corev1.EnvVar{Name: defineKey, Value: fmt.Sprintf("%d", val)}, nil, nil
+	}
+	memoryVar := selector.Memory
+	if memoryVar == nil {
+		memoryVar = selector.MemoryLimit
+	}
+	return resolveComponentVarRefLow(ctx, cli, synthesizedComp, selector.ClusterObjectReference, memoryVar, resolveMemory)
+}
+
+func resolveResourceStorageRef(ctx context.Context, cli client.Reader, synthesizedComp *SynthesizedComponent,
+	defineKey string, selector appsv1.ResourceVarSelector) ([]*corev1.EnvVar, []*corev1.EnvVar, error) {
+	resolveStorage := func(obj any) (*corev1.EnvVar, *corev1.EnvVar, error) {
+		comp := obj.(*appsv1.Component)
+		var quantity *resource.Quantity
+		for _, vct := range comp.Spec.VolumeClaimTemplates {
+			if vct.Name == selector.Storage.Name {
+				quantity = vct.Spec.Resources.Requests.Storage()
+				if quantity == nil {
+					quantity = vct.Spec.Resources.Limits.Storage() // back-off to limit
+				}
+				break
+			}
+		}
+		val := int64(0)
+		if quantity != nil {
+			val = quantity.Value()
+		}
+		return &corev1.EnvVar{Name: defineKey, Value: fmt.Sprintf("%d", val)}, nil, nil
+	}
+	return resolveComponentVarRefLow(ctx, cli, synthesizedComp, selector.ClusterObjectReference, selector.Storage.Option, resolveStorage)
+}
+
 func resolveComponentVarRef(ctx context.Context, cli client.Reader, synthesizedComp *SynthesizedComponent,
 	defineKey string, selector appsv1.ComponentVarSelector) ([]corev1.EnvVar, []corev1.EnvVar, error) {
 	var resolveFunc func(context.Context, client.Reader, *SynthesizedComponent, string, appsv1.ComponentVarSelector) ([]*corev1.EnvVar, []*corev1.EnvVar, error)
diff --git a/pkg/controller/configuration/config_utils.go b/pkg/controller/configuration/config_utils.go
index 79386ef79..8eb95f1ef 100644
--- a/pkg/controller/configuration/config_utils.go
+++ b/pkg/controller/configuration/config_utils.go
@@ -319,7 +319,7 @@ func enableTLSTrigger(configDescs []parametersv1alpha1.ComponentConfigDescriptio
 }
 
 func enableShardingHVScaleTrigger(configDescs []parametersv1alpha1.ComponentConfigDescription) bool {
-	return rerenderConfigEnabled(configDescs, parametersv1alpha1.ShardingComponentHVScaleType)
+	return rerenderConfigEnabled(configDescs, parametersv1alpha1.ShardingComponentHScaleType)
 }
 
 func ResolveComponentTemplate(ctx context.Context, reader client.Reader, cmpd *appsv1.ComponentDefinition) (map[string]*corev1.ConfigMap, error) {
diff --git a/pkg/controller/instanceset/instance_util.go b/pkg/controller/instanceset/instance_util.go
index 9d9f580ad..2326db25e 100644
--- a/pkg/controller/instanceset/instance_util.go
+++ b/pkg/controller/instanceset/instance_util.go
@@ -35,7 +35,6 @@ import (
 	"k8s.io/apimachinery/pkg/util/runtime"
 	"k8s.io/apimachinery/pkg/util/sets"
 	"k8s.io/klog/v2"
-	"k8s.io/kubectl/pkg/util/podutils"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
 
@@ -151,26 +150,13 @@ func baseSort(x any, getNameNOrdinalFunc func(i int) (string, int), getRolePrior
 	})
 }
 
-// isRunningAndReady returns true if pod is in the PodRunning Phase, if it has a condition of PodReady.
-func isRunningAndReady(pod *corev1.Pod) bool {
-	return pod.Status.Phase == corev1.PodRunning && podutils.IsPodReady(pod)
-}
-
-func isRunningAndAvailable(pod *corev1.Pod, minReadySeconds int32) bool {
-	return podutils.IsPodAvailable(pod, minReadySeconds, metav1.Now())
-}
-
-func isContainersRunning(pod *corev1.Pod) bool {
-	for _, status := range pod.Status.ContainerStatuses {
-		if status.State.Running == nil {
-			return false
-		}
+// isRoleReady returns true if pod has role label
+func isRoleReady(pod *corev1.Pod, roles []workloads.ReplicaRole) bool {
+	if len(roles) == 0 {
+		return true
 	}
-	return true
-}
-
-func isContainersReady(pod *corev1.Pod) bool {
-	return isImageMatched(pod) && isContainersRunning(pod)
+	_, ok := pod.Labels[constant.RoleLabelKey]
+	return ok
 }
 
 // isCreated returns true if pod has been created and is maintained by the API server
@@ -183,20 +169,6 @@ func isTerminating(pod *corev1.Pod) bool {
 	return pod.DeletionTimestamp != nil
 }
 
-// isHealthy returns true if pod is running and ready and has not been terminated
-func isHealthy(pod *corev1.Pod) bool {
-	return isRunningAndReady(pod) && !isTerminating(pod)
-}
-
-// isRoleReady returns true if pod has role label
-func isRoleReady(pod *corev1.Pod, roles []workloads.ReplicaRole) bool {
-	if len(roles) == 0 {
-		return true
-	}
-	_, ok := pod.Labels[constant.RoleLabelKey]
-	return ok
-}
-
 // isImageMatched returns true if all container statuses have same image as defined in pod spec
 func isImageMatched(pod *corev1.Pod) bool {
 	for _, container := range pod.Spec.Containers {
diff --git a/pkg/controller/instanceset/reconciler_instance_alignment.go b/pkg/controller/instanceset/reconciler_instance_alignment.go
index 81955186a..defa7dafe 100644
--- a/pkg/controller/instanceset/reconciler_instance_alignment.go
+++ b/pkg/controller/instanceset/reconciler_instance_alignment.go
@@ -29,6 +29,7 @@ import (
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/kubebuilderx"
 	"github.com/apecloud/kubeblocks/pkg/controller/model"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 )
 
 // instanceAlignmentReconciler is responsible for aligning the actual instances(pods) with the desired replicas specified in the spec,
@@ -113,7 +114,7 @@ func (r *instanceAlignmentReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (
 	if !isOrderedReady {
 		for _, name := range newNameList {
 			if _, ok := createNameSet[name]; !ok {
-				if !isHealthy(oldInstanceMap[name]) {
+				if !intctrlutil.IsPodAvailable(oldInstanceMap[name], its.Spec.MinReadySeconds) {
 					concurrency--
 				}
 			}
@@ -129,7 +130,7 @@ func (r *instanceAlignmentReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (
 			break
 		}
 		predecessor := getPredecessor(i)
-		if isOrderedReady && predecessor != nil && !isHealthy(predecessor) {
+		if isOrderedReady && predecessor != nil && !intctrlutil.IsPodAvailable(predecessor, its.Spec.MinReadySeconds) {
 			break
 		}
 		inst, err := buildInstanceByTemplate(name, nameToTemplateMap[name], its, "")
@@ -180,8 +181,8 @@ func (r *instanceAlignmentReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (
 		if !isOrderedReady && concurrency <= 0 {
 			break
 		}
-		if isOrderedReady && !isRunningAndReady(pod) {
-			tree.EventRecorder.Eventf(its, corev1.EventTypeWarning, "InstanceSet %s/%s is waiting for Pod %s to be Running and Ready",
+		if isOrderedReady && !intctrlutil.IsPodReady(pod) {
+			tree.EventRecorder.Eventf(its, corev1.EventTypeWarning, "InstanceSet %s/%s is waiting for Pod %s to be Ready",
 				its.Namespace,
 				its.Name,
 				pod.Name)
diff --git a/pkg/controller/instanceset/reconciler_status.go b/pkg/controller/instanceset/reconciler_status.go
index 6121cfad8..99e3e5e5a 100644
--- a/pkg/controller/instanceset/reconciler_status.go
+++ b/pkg/controller/instanceset/reconciler_status.go
@@ -105,11 +105,11 @@ func (r *statusReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuilder
 			replicas++
 			template2TemplatesStatus[templateName].Replicas++
 		}
-		if isContainersReady(pod) && isRunningAndReady(pod) && !isTerminating(pod) {
+		if isImageMatched(pod) && intctrlutil.IsPodReady(pod) {
 			readyReplicas++
 			template2TemplatesStatus[templateName].ReadyReplicas++
 			notReadyNames.Delete(pod.Name)
-			if isRunningAndAvailable(pod, its.Spec.MinReadySeconds) {
+			if intctrlutil.IsPodAvailable(pod, its.Spec.MinReadySeconds) {
 				availableReplicas++
 				template2TemplatesStatus[templateName].AvailableReplicas++
 			} else {
diff --git a/pkg/controller/instanceset/reconciler_update.go b/pkg/controller/instanceset/reconciler_update.go
index 48ed676e6..c4d042094 100644
--- a/pkg/controller/instanceset/reconciler_update.go
+++ b/pkg/controller/instanceset/reconciler_update.go
@@ -110,7 +110,7 @@ func (r *updateReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuilder
 	}
 	currentUnavailable := 0
 	for _, pod := range oldPodList {
-		if !isHealthy(pod) {
+		if !intctrlutil.IsPodAvailable(pod, its.Spec.MinReadySeconds) {
 			currentUnavailable++
 		}
 	}
@@ -141,18 +141,18 @@ func (r *updateReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuilder
 			break
 		}
 
-		if !isContainersReady(pod) {
-			tree.Logger.Info(fmt.Sprintf("InstanceSet %s/%s blocks on update as some the container(s) of pod %s are not ready", its.Namespace, its.Name, pod.Name))
-			// as no further event triggers the next reconciliation, we need a retry
-			needRetry = true
+		if !isImageMatched(pod) {
+			tree.Logger.Info(fmt.Sprintf("InstanceSet %s/%s blocks on update as the pod %s does not have the same image(s) in the status and in the spec", its.Namespace, its.Name, pod.Name))
 			break
 		}
-		if !isHealthy(pod) {
-			tree.Logger.Info(fmt.Sprintf("InstanceSet %s/%s blocks on update as the pod %s is not healthy", its.Namespace, its.Name, pod.Name))
+		if !intctrlutil.IsPodReady(pod) {
+			tree.Logger.Info(fmt.Sprintf("InstanceSet %s/%s blocks on update as the pod %s is not ready", its.Namespace, its.Name, pod.Name))
 			break
 		}
-		if !isRunningAndAvailable(pod, its.Spec.MinReadySeconds) {
+		if !intctrlutil.IsPodAvailable(pod, its.Spec.MinReadySeconds) {
 			tree.Logger.Info(fmt.Sprintf("InstanceSet %s/%s blocks on update as the pod %s is not available", its.Namespace, its.Name, pod.Name))
+			// no pod event will trigger the next reconciliation, so retry it
+			needRetry = true
 			break
 		}
 		if !isRoleReady(pod, its.Spec.Roles) {
@@ -216,7 +216,7 @@ func (r *updateReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuilder
 		meta.RemoveStatusCondition(&its.Status.Conditions, string(workloads.InstanceUpdateRestricted))
 	}
 	if needRetry {
-		return kubebuilderx.RetryAfter(2 * time.Second), nil
+		return kubebuilderx.RetryAfter(time.Second * time.Duration(its.Spec.MinReadySeconds)), nil
 	}
 	return kubebuilderx.Continue, nil
 }
diff --git a/pkg/controller/instanceset/update_plan.go b/pkg/controller/instanceset/update_plan.go
index 100cd49c2..5616151f8 100644
--- a/pkg/controller/instanceset/update_plan.go
+++ b/pkg/controller/instanceset/update_plan.go
@@ -86,7 +86,7 @@ func (p *realUpdatePlan) planWalkFunc(vertex graph.Vertex) error {
 	}
 	// if pod is the latest version, we do nothing
 	if isPodUpdated {
-		if !intctrlutil.PodIsReady(pod) {
+		if !intctrlutil.IsPodReady(pod) {
 			return ErrWait
 		}
 		isRoleful := func() bool { return len(p.its.Spec.Roles) > 0 }()
diff --git a/pkg/controllerutil/pod_utils.go b/pkg/controllerutil/pod_utils.go
index 973a16214..c163433b2 100644
--- a/pkg/controllerutil/pod_utils.go
+++ b/pkg/controllerutil/pod_utils.go
@@ -30,6 +30,7 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	metautil "k8s.io/apimachinery/pkg/util/intstr"
+	"k8s.io/kubectl/pkg/util/podutils"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
@@ -220,22 +221,21 @@ func GetStorageSizeFromPersistentVolume(pvc corev1.PersistentVolumeClaimTemplate
 	return -1
 }
 
-// PodIsReady checks if pod is ready
-func PodIsReady(pod *corev1.Pod) bool {
-	if pod.Status.Conditions == nil {
-		return false
-	}
+// isTerminating returns true if pod's DeletionTimestamp has been set
+func isTerminating(pod *corev1.Pod) bool {
+	return pod.DeletionTimestamp != nil
+}
 
-	if pod.DeletionTimestamp != nil {
-		return false
-	}
+// IsPodReady returns true if pod is ready
+// Currently, if pod is being deleted and have a grace period, k8s still considers it ready,
+// which is not what we expect. See https://github.com/kubernetes/kubernetes/issues/129552
+func IsPodReady(pod *corev1.Pod) bool {
+	return podutils.IsPodReady(pod) && !isTerminating(pod)
+}
 
-	for _, condition := range pod.Status.Conditions {
-		if condition.Type == corev1.PodReady && condition.Status == corev1.ConditionTrue {
-			return true
-		}
-	}
-	return false
+// IsPodAvailable returns true if pod is ready for at least minReadySeconds
+func IsPodAvailable(pod *corev1.Pod, minReadySeconds int32) bool {
+	return podutils.IsPodAvailable(pod, minReadySeconds, metav1.Now()) && !isTerminating(pod)
 }
 
 // GetContainerID gets the containerID from pod by name
@@ -252,33 +252,11 @@ func GetContainerID(pod *corev1.Pod, containerName string) string {
 	return ""
 }
 
-func isRunning(pod *corev1.Pod) bool {
-	return pod.Status.Phase == corev1.PodRunning && pod.DeletionTimestamp == nil
-}
-
-func IsAvailable(pod *corev1.Pod, minReadySeconds int32) bool {
-	if !isRunning(pod) {
-		return false
-	}
-
-	condition := GetPodCondition(&pod.Status, corev1.PodReady)
-	if condition == nil || condition.Status != corev1.ConditionTrue {
-		return false
-	}
-	if minReadySeconds == 0 {
-		return true
+func GetPodCondition(status *corev1.PodStatus, conditionType corev1.PodConditionType) *corev1.PodCondition {
+	if status == nil {
+		return nil
 	}
 
-	var (
-		now                = metav1.Now()
-		minDuration        = time.Duration(minReadySeconds) * time.Second
-		lastTransitionTime = condition.LastTransitionTime
-	)
-
-	return !lastTransitionTime.IsZero() && lastTransitionTime.Add(minDuration).Before(now.Time)
-}
-
-func GetPodCondition(status *corev1.PodStatus, conditionType corev1.PodConditionType) *corev1.PodCondition {
 	if len(status.Conditions) == 0 {
 		return nil
 	}
@@ -341,7 +319,7 @@ func PodIsReadyWithLabel(pod corev1.Pod) bool {
 		return false
 	}
 
-	return PodIsReady(&pod)
+	return IsPodReady(&pod)
 }
 
 // GetPodRevision gets the revision of Pod by inspecting the StatefulSetRevisionLabel. If pod has no revision empty
diff --git a/pkg/dataprotection/types/constant.go b/pkg/dataprotection/types/constant.go
index fc917ad77..3c3e28a25 100644
--- a/pkg/dataprotection/types/constant.go
+++ b/pkg/dataprotection/types/constant.go
@@ -64,6 +64,8 @@ const (
 	GeminiAcknowledgedAnnotationKey = "dataprotection.kubeblocks.io/gemini-acknowledged"
 	// LastAppliedConfigsAnnotationKey specifies last applied reconfigurations.
 	LastAppliedConfigsAnnotationKey = "dataprotection.kubeblocks.io/last-applied-configurations"
+	// SkipReconciliationAnnotationKey specifies whether to skip reconciliation.
+	SkipReconciliationAnnotationKey = "dataprotection.kubeblocks.io/skip-reconciliation"
 )
 
 // label keys
diff --git a/pkg/dataprotection/utils/utils.go b/pkg/dataprotection/utils/utils.go
index ce6e4af8f..69d9a19a4 100644
--- a/pkg/dataprotection/utils/utils.go
+++ b/pkg/dataprotection/utils/utils.go
@@ -297,7 +297,7 @@ func GetFirstIndexRunningPod(podList *corev1.PodList) *corev1.Pod {
 		return podList.Items[i].Name < podList.Items[j].Name
 	})
 	for _, v := range podList.Items {
-		if intctrlutil.IsAvailable(&v, 0) {
+		if intctrlutil.IsPodAvailable(&v, 0) {
 			return &v
 		}
 	}
diff --git a/pkg/operations/custom/utils.go b/pkg/operations/custom/utils.go
index 20943037c..028b17723 100644
--- a/pkg/operations/custom/utils.go
+++ b/pkg/operations/custom/utils.go
@@ -396,7 +396,7 @@ func getTargetPods(
 		pod := pods[i]
 		targetPods = append(targetPods, pod)
 		// Preferably select available pod.
-		if podSelector.MultiPodSelectionPolicy == opsv1alpha1.Any && intctrlutil.IsAvailable(pod, 0) {
+		if podSelector.MultiPodSelectionPolicy == opsv1alpha1.Any && intctrlutil.IsPodAvailable(pod, 0) {
 			return []*corev1.Pod{pod}, nil
 		}
 	}



Test patch:
diff --git a/controllers/apps/component/component_controller_test.go b/controllers/apps/component/component_controller_test.go
index 0bf7ae0b8..50fc2c09b 100644
--- a/controllers/apps/component/component_controller_test.go
+++ b/controllers/apps/component/component_controller_test.go
@@ -1645,7 +1645,7 @@ var _ = Describe("Component Controller", func() {
 		Eventually(testapps.CheckObjExists(&testCtx, client.ObjectKeyFromObject(cm), &corev1.ConfigMap{}, false)).Should(Succeed())
 	}
 
-	testReconfigure := func(compName, compDefName, fileTemplate string) {
+	testReconfigureAction := func(compName, compDefName, fileTemplate string) {
 		createCompObj(compName, compDefName, nil)
 
 		By("check the file template object")
@@ -1687,7 +1687,7 @@ var _ = Describe("Component Controller", func() {
 		})).Should(Succeed())
 	}
 
-	testReconfigureUDF := func(compName, compDefName, fileTemplate string) {
+	testReconfigureActionUDF := func(compName, compDefName, fileTemplate string) {
 		createCompObj(compName, compDefName, func(f *testapps.MockComponentFactory) {
 			f.SetConfigs([]kbappsv1.ClusterComponentConfig{
 				{
@@ -1735,7 +1735,7 @@ var _ = Describe("Component Controller", func() {
 	}
 
 	testReconfigureVolumeChanged := func(compName, compDefName, fileTemplate string) {
-		testReconfigure(compName, compDefName, fileTemplate)
+		testReconfigureAction(compName, compDefName, fileTemplate)
 
 		By("update the cmpd to add a new config template (volume)")
 		compDefKey := client.ObjectKeyFromObject(compDefObj)
@@ -1769,6 +1769,52 @@ var _ = Describe("Component Controller", func() {
 		})).Should(Succeed())
 	}
 
+	testReconfigureRestart := func(compName, compDefName, fileTemplate string) {
+		// mock the cmpd to set restartOnFileChange
+		compDefKey := types.NamespacedName{Name: compDefName}
+		Expect(testapps.GetAndChangeObj(&testCtx, compDefKey, func(cmpd *kbappsv1.ComponentDefinition) {
+			for i := range cmpd.Spec.Configs {
+				cmpd.Spec.Configs[i].RestartOnFileChange = ptr.To(true)
+			}
+		})()).ShouldNot(HaveOccurred())
+
+		createCompObj(compName, compDefName, nil)
+
+		By("check the file template object")
+		fileTemplateCMKey := types.NamespacedName{
+			Namespace: testCtx.DefaultNamespace,
+			Name:      fileTemplateObjectName(&component.SynthesizedComponent{FullCompName: compKey.Name}, fileTemplate),
+		}
+		Eventually(testapps.CheckObj(&testCtx, fileTemplateCMKey, func(g Gomega, cm *corev1.ConfigMap) {
+			g.Expect(cm.Data).Should(HaveKeyWithValue("level", "info"))
+		})).Should(Succeed())
+
+		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 file template object again")
+		Eventually(testapps.CheckObj(&testCtx, fileTemplateCMKey, func(g Gomega, cm *corev1.ConfigMap) {
+			g.Expect(cm.Data).Should(HaveKeyWithValue("level", "debug"))
+		})).Should(Succeed())
+
+		By("check the workload updated")
+		itsKey := compKey
+		Eventually(testapps.CheckObj(&testCtx, itsKey, func(g Gomega, its *workloads.InstanceSet) {
+			g.Expect(its.Spec.Configs).Should(BeNil())
+			g.Expect(its.Spec.Template.Annotations).ShouldNot(BeNil())
+			g.Expect(its.Spec.Template.Annotations).Should(HaveKey(constant.RestartAnnotationKey))
+		})).Should(Succeed())
+	}
+
 	Context("provisioning", func() {
 		BeforeEach(func() {
 			createDefinitionObjects()
@@ -2320,16 +2366,20 @@ var _ = Describe("Component Controller", func() {
 			testFileTemplateVolumes(defaultCompName, compDefObj.Name, fileTemplate)
 		})
 
-		It("reconfigure", func() {
-			testReconfigure(defaultCompName, compDefObj.Name, fileTemplate)
+		It("reconfigure - action", func() {
+			testReconfigureAction(defaultCompName, compDefObj.Name, fileTemplate)
 		})
 
-		It("reconfigure - udf", func() {
-			testReconfigureUDF(defaultCompName, compDefObj.Name, fileTemplate)
+		It("reconfigure - action udf", func() {
+			testReconfigureActionUDF(defaultCompName, compDefObj.Name, fileTemplate)
 		})
 
 		It("reconfigure - volume changed", func() {
 			testReconfigureVolumeChanged(defaultCompName, compDefObj.Name, fileTemplate)
 		})
+
+		It("reconfigure - restart", func() {
+			testReconfigureRestart(defaultCompName, compDefObj.Name, fileTemplate)
+		})
 	})
 })
diff --git a/controllers/dataprotection/backup_controller_test.go b/controllers/dataprotection/backup_controller_test.go
index a7582eadb..18207d8f4 100644
--- a/controllers/dataprotection/backup_controller_test.go
+++ b/controllers/dataprotection/backup_controller_test.go
@@ -35,6 +35,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/utils/pointer"
+	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	kbappsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
@@ -200,6 +201,25 @@ var _ = Describe("Backup Controller test", func() {
 					g.Expect(fetched.Status.Phase).To(Equal(dpv1alpha1.BackupPhaseFailed))
 				})).Should(Succeed())
 			})
+
+			It("should skip reconciliation if skipReconciliation annotation is set", func() {
+				By("set skipReconciliation annotation")
+				bp := testdp.NewBackupFactory(testCtx.DefaultNamespace, "skip-reconciliation").
+					WithRandomName().AddAnnotations(dptypes.SkipReconciliationAnnotationKey, "true").
+					SetBackupPolicyName(testdp.BackupPolicyName).
+					SetBackupMethod(testdp.BackupMethodName).
+					Create(&testCtx).GetObject()
+				By("check backup skip reconciliation")
+				_, err := (&BackupReconciler{
+					Client:   k8sClient,
+					Scheme:   k8sManager.GetScheme(),
+					Recorder: k8sManager.GetEventRecorderFor("backup-mock-controller"),
+				}).Reconcile(context.Background(), ctrl.Request{NamespacedName: client.ObjectKeyFromObject(bp)})
+				Expect(err).NotTo(HaveOccurred())
+				Eventually(testapps.CheckObj(&testCtx, client.ObjectKeyFromObject(bp), func(g Gomega, fetched *dpv1alpha1.Backup) {
+					g.Expect(fetched.Status.Phase).To(BeEmpty())
+				})).Should(Succeed())
+			})
 		})
 
 		Context("create an invalid backup", func() {
diff --git a/pkg/controller/component/kbagent_test.go b/pkg/controller/component/kbagent_test.go
index 5ed5f139c..1ada10870 100644
--- a/pkg/controller/component/kbagent_test.go
+++ b/pkg/controller/component/kbagent_test.go
@@ -381,8 +381,9 @@ var _ = Describe("kb-agent", func() {
 				},
 				{
 					ComponentFileTemplate: appsv1.ComponentFileTemplate{
-						Name:     "server.conf",
-						Template: "default",
+						Name:            "server.conf",
+						Template:        "default",
+						ExternalManaged: ptr.To(true),
 					},
 					Reconfigure: &appsv1.Action{
 						Exec: &appsv1.ExecAction{
@@ -395,7 +396,6 @@ var _ = Describe("kb-agent", func() {
 							Command: []string{"echo", "reconfigure"},
 						},
 					},
-					ExternalManaged: ptr.To(true),
 				},
 			}
 
diff --git a/pkg/controller/component/synthesize_component_test.go b/pkg/controller/component/synthesize_component_test.go
index 3e314c0e7..4e0b0b924 100644
--- a/pkg/controller/component/synthesize_component_test.go
+++ b/pkg/controller/component/synthesize_component_test.go
@@ -172,14 +172,14 @@ var _ = Describe("synthesized component", func() {
 			}))
 			Expect(synthesizedComp.FileTemplates).Should(ContainElement(SynthesizedFileTemplate{
 				ComponentFileTemplate: appsv1.ComponentFileTemplate{
-					Name:       compDef.Spec.Configs[1].Name,
-					Template:   comp.Spec.Configs[0].ConfigMap.Name,
-					Namespace:  comp.Namespace,
-					VolumeName: compDef.Spec.Configs[1].VolumeName,
+					Name:            compDef.Spec.Configs[1].Name,
+					Template:        comp.Spec.Configs[0].ConfigMap.Name,
+					Namespace:       comp.Namespace,
+					VolumeName:      compDef.Spec.Configs[1].VolumeName,
+					ExternalManaged: comp.Spec.Configs[0].ExternalManaged,
 				},
-				Config:          true,
-				Reconfigure:     comp.Spec.Configs[0].Reconfigure,
-				ExternalManaged: comp.Spec.Configs[0].ExternalManaged,
+				Config:      true,
+				Reconfigure: comp.Spec.Configs[0].Reconfigure,
 			}))
 		})
 
@@ -198,14 +198,14 @@ var _ = Describe("synthesized component", func() {
 			}))
 			Expect(synthesizedComp.FileTemplates).Should(ContainElement(SynthesizedFileTemplate{
 				ComponentFileTemplate: appsv1.ComponentFileTemplate{
-					Name:       compDef.Spec.Configs[1].Name,
-					Template:   "",
-					Namespace:  "",
-					VolumeName: compDef.Spec.Configs[1].VolumeName,
+					Name:            compDef.Spec.Configs[1].Name,
+					Template:        "",
+					Namespace:       "",
+					VolumeName:      compDef.Spec.Configs[1].VolumeName,
+					ExternalManaged: comp.Spec.Configs[0].ExternalManaged,
 				},
-				Config:          true,
-				Reconfigure:     comp.Spec.Configs[0].Reconfigure,
-				ExternalManaged: comp.Spec.Configs[0].ExternalManaged,
+				Config:      true,
+				Reconfigure: comp.Spec.Configs[0].Reconfigure,
 			}))
 		})
 	})
diff --git a/pkg/controller/component/vars_test.go b/pkg/controller/component/vars_test.go
index c99f6cd73..889434c1c 100644
--- a/pkg/controller/component/vars_test.go
+++ b/pkg/controller/component/vars_test.go
@@ -28,6 +28,7 @@ import (
 	. "github.com/onsi/gomega"
 
 	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/uuid"
 	"k8s.io/utils/ptr"
@@ -1558,6 +1559,151 @@ var _ = Describe("vars", func() {
 			})
 		})
 
+		Context("resource vars", func() {
+			It("ok", func() {
+				vars := []appsv1.EnvVar{
+					{
+						Name: "cpu",
+						ValueFrom: &appsv1.VarSource{
+							ResourceVarRef: &appsv1.ResourceVarSelector{
+								ClusterObjectReference: appsv1.ClusterObjectReference{
+									CompDef:  synthesizedComp.CompDefName,
+									Optional: required(),
+								},
+								ResourceVars: appsv1.ResourceVars{
+									CPU: &appsv1.VarRequired,
+								},
+							},
+						},
+					},
+					{
+						Name: "cpuLimit",
+						ValueFrom: &appsv1.VarSource{
+							ResourceVarRef: &appsv1.ResourceVarSelector{
+								ClusterObjectReference: appsv1.ClusterObjectReference{
+									CompDef:  synthesizedComp.CompDefName,
+									Optional: required(),
+								},
+								ResourceVars: appsv1.ResourceVars{
+									CPULimit: &appsv1.VarRequired,
+								},
+							},
+						},
+					},
+					{
+						Name: "memory",
+						ValueFrom: &appsv1.VarSource{
+							ResourceVarRef: &appsv1.ResourceVarSelector{
+								ClusterObjectReference: appsv1.ClusterObjectReference{
+									CompDef:  synthesizedComp.CompDefName,
+									Optional: required(),
+								},
+								ResourceVars: appsv1.ResourceVars{
+									Memory: &appsv1.VarRequired,
+								},
+							},
+						},
+					},
+					{
+						Name: "memoryLimit",
+						ValueFrom: &appsv1.VarSource{
+							ResourceVarRef: &appsv1.ResourceVarSelector{
+								ClusterObjectReference: appsv1.ClusterObjectReference{
+									CompDef:  synthesizedComp.CompDefName,
+									Optional: required(),
+								},
+								ResourceVars: appsv1.ResourceVars{
+									MemoryLimit: &appsv1.VarRequired,
+								},
+							},
+						},
+					},
+					{
+						Name: "storage",
+						ValueFrom: &appsv1.VarSource{
+							ResourceVarRef: &appsv1.ResourceVarSelector{
+								ClusterObjectReference: appsv1.ClusterObjectReference{
+									CompDef:  synthesizedComp.CompDefName,
+									Optional: required(),
+								},
+								ResourceVars: appsv1.ResourceVars{
+									Storage: &appsv1.NamedVar{
+										Name:   "data",
+										Option: &appsv1.VarRequired,
+									},
+								},
+							},
+						},
+					},
+					{
+						Name: "storageLog",
+						ValueFrom: &appsv1.VarSource{
+							ResourceVarRef: &appsv1.ResourceVarSelector{
+								ClusterObjectReference: appsv1.ClusterObjectReference{
+									CompDef:  synthesizedComp.CompDefName,
+									Optional: required(),
+								},
+								ResourceVars: appsv1.ResourceVars{
+									Storage: &appsv1.NamedVar{
+										Name:   "log", // not-exist, expect it as 0
+										Option: &appsv1.VarRequired,
+									},
+								},
+							},
+						},
+					},
+				}
+				reader := &mockReader{
+					cli: testCtx.Cli,
+					objs: []client.Object{
+						&appsv1.Component{
+							ObjectMeta: metav1.ObjectMeta{
+								Namespace: testCtx.DefaultNamespace,
+								Name:      constant.GenerateClusterComponentName(synthesizedComp.ClusterName, synthesizedComp.Name),
+							},
+							Spec: appsv1.ComponentSpec{
+								CompDef: synthesizedComp.CompDefName,
+								Resources: corev1.ResourceRequirements{
+									Requests: corev1.ResourceList{
+										corev1.ResourceCPU:    resource.MustParse("1"),
+										corev1.ResourceMemory: resource.MustParse("1Gi"),
+									},
+									Limits: corev1.ResourceList{
+										corev1.ResourceCPU:    resource.MustParse("2"),
+										corev1.ResourceMemory: resource.MustParse("2Gi"),
+									},
+								},
+								VolumeClaimTemplates: []appsv1.ClusterComponentVolumeClaimTemplate{
+									{
+										Name: "data",
+										Spec: appsv1.PersistentVolumeClaimSpec{
+											Resources: corev1.VolumeResourceRequirements{
+												Requests: corev1.ResourceList{
+													corev1.ResourceStorage: resource.MustParse("10Gi"),
+												},
+											},
+										},
+									},
+								},
+							},
+						},
+					},
+				}
+				_, envVars, err := ResolveTemplateNEnvVars(testCtx.Ctx, reader, synthesizedComp, vars)
+				Expect(err).Should(Succeed())
+				quantity := func(val string) string {
+					q := resource.MustParse(val)
+					return fmt.Sprintf("%d", q.Value())
+				}
+				checkEnvVarWithValue(envVars, "cpu", quantity("1"))
+				checkEnvVarWithValue(envVars, "cpuLimit", quantity("2"))
+				checkEnvVarWithValue(envVars, "memory", quantity("1Gi"))
+				checkEnvVarWithValue(envVars, "memoryLimit", quantity("2Gi"))
+				checkEnvVarWithValue(envVars, "storage", quantity("10Gi"))
+				checkEnvVarWithValue(envVars, "storageLog", "0")
+			})
+		})
+
 		Context("component vars", func() {
 			It("non-exist component with optional", func() {
 				vars := []appsv1.EnvVar{
diff --git a/pkg/controller/instanceset/instance_util_test.go b/pkg/controller/instanceset/instance_util_test.go
index d4034d147..d45377e93 100644
--- a/pkg/controller/instanceset/instance_util_test.go
+++ b/pkg/controller/instanceset/instance_util_test.go
@@ -74,23 +74,6 @@ var _ = Describe("instance util test", func() {
 		})
 	})
 
-	Context("isRunningAndReady", func() {
-		It("should work well", func() {
-			By("creating a new pod")
-			pod := builder.NewPodBuilder(namespace, name).GetObject()
-			Expect(isRunningAndReady(pod)).Should(BeFalse())
-
-			By("set phase to running")
-			pod.Status.Phase = corev1.PodRunning
-			Expect(isRunningAndReady(pod)).Should(BeFalse())
-
-			By("set ready condition")
-			condition := corev1.PodCondition{Type: corev1.PodReady, Status: corev1.ConditionTrue}
-			pod.Status.Conditions = append(pod.Status.Conditions, condition)
-			Expect(isRunningAndReady(pod)).Should(BeTrue())
-		})
-	})
-
 	Context("getPodRevision", func() {
 		It("should work well", func() {
 			pod := builder.NewPodBuilder(namespace, name).GetObject()
diff --git a/pkg/controller/instanceset/reconciler_status_test.go b/pkg/controller/instanceset/reconciler_status_test.go
index b888d9464..aae959cf0 100644
--- a/pkg/controller/instanceset/reconciler_status_test.go
+++ b/pkg/controller/instanceset/reconciler_status_test.go
@@ -34,6 +34,7 @@ import (
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/builder"
 	"github.com/apecloud/kubeblocks/pkg/controller/kubebuilderx"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 )
 
 var _ = Describe("status reconciler test", func() {
@@ -222,11 +223,13 @@ var _ = Describe("status reconciler test", func() {
 			Expect(its.Status.Conditions[1].Type).Should(BeEquivalentTo(workloads.InstanceAvailable))
 			Expect(its.Status.Conditions[1].Status).Should(BeEquivalentTo(corev1.ConditionTrue))
 
-			By("make all pods failed")
+			By("make all pods not ready")
 			for _, object := range pods {
 				pod, ok := object.(*corev1.Pod)
 				Expect(ok).Should(BeTrue())
-				pod.Status.Phase = corev1.PodFailed
+				condition := intctrlutil.GetPodCondition(&pod.Status, corev1.PodReady)
+				Expect(condition).ShouldNot(BeNil())
+				condition.Status = corev1.ConditionFalse
 			}
 			res, err = reconciler.Reconcile(tree)
 			Expect(err).Should(BeNil())
@@ -251,6 +254,16 @@ var _ = Describe("status reconciler test", func() {
 				Expect(templateStatus.AvailableReplicas).Should(BeEquivalentTo(0))
 			}
 			Expect(its.Status.CurrentRevisions).Should(Equal(its.Status.UpdateRevisions))
+
+			By("make all pods failed")
+			for _, object := range pods {
+				pod, ok := object.(*corev1.Pod)
+				Expect(ok).Should(BeTrue())
+				pod.Status.Phase = corev1.PodFailed
+			}
+			res, err = reconciler.Reconcile(tree)
+			Expect(err).Should(BeNil())
+			Expect(res).Should(Equal(kubebuilderx.Continue))
 			Expect(its.Status.Conditions).Should(HaveLen(3))
 			failureNames := []string{"bar-0", "bar-1", "bar-2", "bar-3", "bar-foo-0", "bar-foo-1", "bar-hello-0"}
 			message, err := json.Marshal(failureNames)