Merge branch 'apache:master' into master
diff --git a/pkg/plugins/runtime/k8s/controllers/metadata_controller.go b/pkg/plugins/runtime/k8s/controllers/metadata_controller.go
new file mode 100644
index 0000000..a6771c7
--- /dev/null
+++ b/pkg/plugins/runtime/k8s/controllers/metadata_controller.go
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package controllers
+
+import (
+	"context"
+	k8s_common "github.com/apache/dubbo-kubernetes/pkg/plugins/common/k8s"
+	"github.com/apache/dubbo-kubernetes/pkg/plugins/resources/k8s/native/api/v1alpha1"
+	"github.com/go-logr/logr"
+	kube_runtime "k8s.io/apimachinery/pkg/runtime"
+	kube_record "k8s.io/client-go/tools/record"
+	kube_ctrl "sigs.k8s.io/controller-runtime"
+	kube_client "sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/controller"
+)
+
+type MedataReconciler struct {
+	kube_client.Client
+	kube_record.EventRecorder
+	Schema            *kube_runtime.Scheme
+	Log               logr.Logger
+	ResourceConverter k8s_common.Converter
+	SystemNamespace   string
+}
+
+func (m *MedataReconciler) Reconcile(ctx context.Context, req kube_ctrl.Request) (kube_ctrl.Result, error) {
+	return kube_ctrl.Result{}, nil
+}
+
+func (m *MedataReconciler) SetupWithManager(mgr kube_ctrl.Manager, maxConcurrentReconciles int) error {
+	return kube_ctrl.NewControllerManagedBy(mgr).
+		WithOptions(controller.Options{MaxConcurrentReconciles: maxConcurrentReconciles}).
+		For(&v1alpha1.MetaData{}).
+		Complete(m)
+}
diff --git a/pkg/plugins/runtime/k8s/plugin.go b/pkg/plugins/runtime/k8s/plugin.go
index 095d7d8..19214a0 100644
--- a/pkg/plugins/runtime/k8s/plugin.go
+++ b/pkg/plugins/runtime/k8s/plugin.go
@@ -85,9 +85,24 @@
 	if err := addPodReconciler(mgr, rt, converter); err != nil {
 		return err
 	}
+	if err := addMetadataReconciler(mgr, rt, converter); err != nil {
+		return err
+	}
 	return nil
 }
 
+func addMetadataReconciler(mgr kube_ctrl.Manager, rt core_runtime.Runtime, converter k8s_common.Converter) error {
+	reconciler := &k8s_controllers.MedataReconciler{
+		Client:            mgr.GetClient(),
+		EventRecorder:     mgr.GetEventRecorderFor("k8s.dubbo.io/dataplane-generator"),
+		Schema:            mgr.GetScheme(),
+		Log:               core.Log.WithName("controllers").WithName("Metadata"),
+		ResourceConverter: converter,
+		SystemNamespace:   rt.Config().Store.Kubernetes.SystemNamespace,
+	}
+	return reconciler.SetupWithManager(mgr, rt.Config().Runtime.Kubernetes.ControllersConcurrency.PodController)
+}
+
 func addPodReconciler(mgr kube_ctrl.Manager, rt core_runtime.Runtime, converter k8s_common.Converter) error {
 	reconciler := &k8s_controllers.PodReconciler{
 		Client:        mgr.GetClient(),