You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by zh...@apache.org on 2026/02/11 14:40:43 UTC

(dubbo-kubernetes) branch master updated: Fixed pixiu proxy request 502 (#864)

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

zhongxjian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-kubernetes.git


The following commit(s) were added to refs/heads/master by this push:
     new 397c927b Fixed pixiu proxy request 502 (#864)
397c927b is described below

commit 397c927bdeb05c227b85fc1fab98fc71e2f631b9
Author: mfordjody <11...@qq.com>
AuthorDate: Wed Feb 11 22:40:37 2026 +0800

    Fixed pixiu proxy request 502 (#864)
---
 .asf.yaml                                          |   2 +-
 dubbod/discovery/docker/dockerfile.discovery       |  28 +-
 dubbod/discovery/docker/dockerfile.proxy           |  38 +-
 .../pkg/config/kube/gateway/controller.go          |  20 +-
 .../config/kube/gateway/deployment_controller.go   |  26 +-
 .../pkg/config/kube/gateway/gateway_collection.go  |  29 --
 .../config/kube/gateway/gatewayclass_collection.go |  21 +-
 .../pkg/config/kube/gateway/gateways_collection.go | 117 +++++
 go.mod                                             |   2 +-
 .../dubbo-discovery/files/kube-gateway.yaml        |   2 +-
 .../dubbo-discovery/templates/deployment.yaml      |   2 +-
 .../dubbo-control/dubbo-discovery/values.yaml      |   4 -
 pkg/dubboagent/agent.go                            |   6 +-
 pkg/kube/inject/inject.go                          |   2 +-
 pkg/pixiu/proxy.go                                 |   2 +-
 samples/addons/README.md                           |  13 -
 samples/addons/grafana.yaml                        | 259 ----------
 samples/addons/jaeger.yaml                         | 135 -----
 samples/addons/prometheus.yaml                     | 575 ---------------------
 samples/grpc-app/grpc-app.yaml                     |   6 +-
 samples/httpbin/README.md                          |  58 +++
 samples/httpbin/httpbin.yaml                       |  43 ++
 22 files changed, 346 insertions(+), 1044 deletions(-)

diff --git a/.asf.yaml b/.asf.yaml
index 614a9987..8f925bb9 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -20,7 +20,7 @@ notifications:
     jira_options: link label
 
 github:
-  homepage: https://dubbo.apache.org
+  homepage: ""
   description: "Dubbo Service Mesh for Kubernetes."
   features:
     # Enable wiki for documentation
diff --git a/dubbod/discovery/docker/dockerfile.discovery b/dubbod/discovery/docker/dockerfile.discovery
index de35f0f8..7ad55c8b 100644
--- a/dubbod/discovery/docker/dockerfile.discovery
+++ b/dubbod/discovery/docker/dockerfile.discovery
@@ -13,7 +13,29 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-FROM gcr.io/distroless/static:debug
-COPY bin/dubbo-discovery /usr/local/bin/dubbo-discovery
-USER 9999:9999
+FROM golang:1.25 AS builder
+
+ARG TARGETOS
+ARG TARGETARCH
+
+WORKDIR /src
+
+ENV CGO_ENABLED=0 \
+    GOOS=${TARGETOS} \
+    GOARCH=${TARGETARCH}
+
+COPY go.mod go.sum ./
+RUN go mod download
+
+COPY . .
+
+RUN go build -v -trimpath -ldflags="-s -w" \
+    -o /out/dubbo-discovery \
+    ./dubbod/discovery/cmd/dubbo-discover/main.go
+
+FROM scratch
+
+COPY --from=builder /out/dubbo-discovery /usr/local/bin/dubbo-discovery
+
+USER 65532:65532
 ENTRYPOINT ["/usr/local/bin/dubbo-discovery"]
diff --git a/dubbod/discovery/docker/dockerfile.proxy b/dubbod/discovery/docker/dockerfile.proxy
index bab30727..d934724b 100644
--- a/dubbod/discovery/docker/dockerfile.proxy
+++ b/dubbod/discovery/docker/dockerfile.proxy
@@ -13,8 +13,36 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-FROM gcr.io/distroless/static:debug
-COPY bin/dubbo-agent /usr/local/bin/dubbo-agent
-COPY bin/pixiu-gateway /usr/local/bin/pixiu-gateway
-USER 9999:9999
-ENTRYPOINT ["/usr/local/bin/dubbo-agent"]
+FROM golang:1.25 AS builder
+
+ARG TARGETOS
+ARG TARGETARCH
+
+WORKDIR /src
+
+ENV CGO_ENABLED=0 \
+    GOOS=${TARGETOS} \
+    GOARCH=${TARGETARCH}
+
+COPY go.mod go.sum ./
+RUN go mod download
+
+COPY . .
+
+RUN go build -v -trimpath -ldflags="-s -w" \
+    -o /out/dubbo-agent \
+    ./dubbod/discovery/cmd/dubbo-agent/main.go
+
+RUN git clone --depth=1 https://github.com/apache/dubbo-go-pixiu.git && \
+    cd dubbo-go-pixiu && \
+    go build -v -trimpath -ldflags="-s -w" \
+    -o /out/pixiu-proxy \
+    ./cmd/pixiu/pixiu.go
+
+FROM scratch
+
+COPY --from=builder /out/dubbo-agent /usr/local/bin/dubbo-agent
+COPY --from=builder /out/pixiu-proxy /usr/local/bin/pixiu-proxy
+
+USER 65532:65532
+ENTRYPOINT ["/usr/local/bin/dubbo-agent"]
\ No newline at end of file
diff --git a/dubbod/discovery/pkg/config/kube/gateway/controller.go b/dubbod/discovery/pkg/config/kube/gateway/controller.go
index b55348a0..36eb733a 100644
--- a/dubbod/discovery/pkg/config/kube/gateway/controller.go
+++ b/dubbod/discovery/pkg/config/kube/gateway/controller.go
@@ -62,7 +62,9 @@ type Controller struct {
 	inputs         Inputs
 }
 
-type Outputs struct{}
+type Outputs struct {
+	Gateways krt.Collection[Gateway]
+}
 
 type Inputs struct {
 	Services   krt.Collection[*corev1.Service]
@@ -99,11 +101,23 @@ func NewController(kc kube.Client, waitForCRD func(class schema.GroupVersionReso
 		HTTPRoutes:     buildClient[*gateway.HTTPRoute](c, kc, gvr.HTTPRoute, opts, "informer/HTTPRoutes"),
 	}
 
-	GatewayClassStatus, _ := GatewayClassesCollection(inputs.GatewayClasses, opts)
+	GatewayClassStatus, GatewayClasses := GatewayClassesCollection(inputs.GatewayClasses, opts)
 	status.RegisterStatus(c.status, GatewayClassStatus, GetStatus)
 
+	GatewaysStatus, Gateways := GatewaysCollection(
+		inputs.Gateways,
+		GatewayClasses,
+		opts,
+	)
+
+	GatewayFinalStatus := FinalGatewayStatusCollection(GatewaysStatus, opts)
+	status.RegisterStatus(c.status, GatewayFinalStatus, GetStatus)
+
 	handlers := []krt.HandlerRegistration{}
-	outputs := Outputs{}
+	outputs := Outputs{
+		Gateways: Gateways,
+	}
+
 	c.outputs = outputs
 	c.handlers = handlers
 	c.inputs = inputs
diff --git a/dubbod/discovery/pkg/config/kube/gateway/deployment_controller.go b/dubbod/discovery/pkg/config/kube/gateway/deployment_controller.go
index 7628344b..9872e085 100644
--- a/dubbod/discovery/pkg/config/kube/gateway/deployment_controller.go
+++ b/dubbod/discovery/pkg/config/kube/gateway/deployment_controller.go
@@ -727,7 +727,6 @@ func (d *DeploymentController) generatePixiuConfig(gw *gateway.Gateway, httpRout
 						Name: "dgp.filter.httpconnectionmanager",
 						Config: map[string]interface{}{
 							"route_config": map[string]interface{}{
-								"name":   fmt.Sprintf("route-%s", listener.Name),
 								"routes": d.convertHTTPRoutesToPixiuRoutes(httpRoutes, listener),
 							},
 							"http_filters": []map[string]interface{}{
@@ -759,6 +758,24 @@ func (d *DeploymentController) generatePixiuConfig(gw *gateway.Gateway, httpRout
 					backendPort = int(*backendRef.Port)
 				}
 
+				// Prefer Service ClusterIP to avoid DNS dependency inside the gateway pod.
+				backendAddr := fmt.Sprintf("%s.%s.svc.cluster.local", backendName, backendNamespace)
+				if d.services != nil {
+					if svc := d.services.Get(backendName, backendNamespace); svc != nil {
+						if ip := svc.Spec.ClusterIP; ip != "" && ip != corev1.ClusterIPNone {
+							backendAddr = ip
+						}
+					}
+				}
+				// Fallback: if informer filtering prevented us from seeing the Service, read it directly.
+				if backendAddr == fmt.Sprintf("%s.%s.svc.cluster.local", backendName, backendNamespace) && d.client != nil {
+					if svc, err := d.client.Kube().CoreV1().Services(backendNamespace).Get(context.Background(), backendName, metav1.GetOptions{}); err == nil {
+						if ip := svc.Spec.ClusterIP; ip != "" && ip != corev1.ClusterIPNone {
+							backendAddr = ip
+						}
+					}
+				}
+
 				clusterName := fmt.Sprintf("%s-%s-%d", backendNamespace, backendName, backendPort)
 				if _, exists := clusterMap[clusterName]; !exists {
 					clusterMap[clusterName] = &PixiuCluster{
@@ -769,7 +786,7 @@ func (d *DeploymentController) generatePixiuConfig(gw *gateway.Gateway, httpRout
 							{
 								ID: 1,
 								SocketAddress: PixiuSocketAddress{
-									Address: fmt.Sprintf("%s.%s.svc.cluster.local", backendName, backendNamespace),
+									Address: backendAddr,
 									Port:    backendPort,
 								},
 							},
@@ -844,6 +861,11 @@ func (d *DeploymentController) convertHTTPRoutesToPixiuRoutes(httpRoutes []*gate
 							pathMatch["regex"] = match.Path.Value
 						}
 					}
+
+					if match.Method == nil {
+						pathMatch["methods"] = []string{}
+					}
+
 					route["match"] = pathMatch
 				}
 
diff --git a/dubbod/discovery/pkg/config/kube/gateway/gateway_collection.go b/dubbod/discovery/pkg/config/kube/gateway/gateway_collection.go
deleted file mode 100644
index e5a67a6f..00000000
--- a/dubbod/discovery/pkg/config/kube/gateway/gateway_collection.go
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package gateway
-
-import (
-	"github.com/apache/dubbo-kubernetes/pkg/config"
-)
-
-type Gateway struct {
-	*config.Config `json:"config"`
-}
-
-func (g Gateway) ResourceName() string {
-	return config.NamespacedName(g.Config).String()
-}
diff --git a/dubbod/discovery/pkg/config/kube/gateway/gatewayclass_collection.go b/dubbod/discovery/pkg/config/kube/gateway/gatewayclass_collection.go
index 78c2907f..a03c415e 100644
--- a/dubbod/discovery/pkg/config/kube/gateway/gatewayclass_collection.go
+++ b/dubbod/discovery/pkg/config/kube/gateway/gatewayclass_collection.go
@@ -39,10 +39,7 @@ func getKnownControllerNames() []string {
 	return names
 }
 
-func GatewayClassesCollection(
-	gatewayClasses krt.Collection[*gateway.GatewayClass],
-	opts krt.OptionsBuilder,
-) (
+func GatewayClassesCollection(gatewayClasses krt.Collection[*gateway.GatewayClass], opts krt.OptionsBuilder) (
 	krt.StatusCollection[*gateway.GatewayClass, gatewayv1.GatewayClassStatus],
 	krt.Collection[GatewayClass],
 ) {
@@ -67,3 +64,19 @@ func GatewayClassesCollection(
 		}
 	}, opts.WithName("GatewayClasses")...)
 }
+
+func fetchClass(ctx krt.HandlerContext, gatewayClasses krt.Collection[GatewayClass], gc gatewayv1.ObjectName) *GatewayClass {
+	class := krt.FetchOne(ctx, gatewayClasses, krt.FilterKey(string(gc)))
+	if class == nil {
+		if bc, f := builtinClasses[gc]; f {
+			// We allow some classes to exist without being in the cluster
+			return &GatewayClass{
+				Name:       string(gc),
+				Controller: bc,
+			}
+		}
+		// No gateway class found, this may be meant for another controller; should be skipped.
+		return nil
+	}
+	return class
+}
diff --git a/dubbod/discovery/pkg/config/kube/gateway/gateways_collection.go b/dubbod/discovery/pkg/config/kube/gateway/gateways_collection.go
new file mode 100644
index 00000000..2b29a00d
--- /dev/null
+++ b/dubbod/discovery/pkg/config/kube/gateway/gateways_collection.go
@@ -0,0 +1,117 @@
+//
+// 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 gateway
+
+import (
+	"github.com/apache/dubbo-kubernetes/pkg/config"
+	"github.com/apache/dubbo-kubernetes/pkg/kube/krt"
+	"github.com/apache/dubbo-kubernetes/dubbod/discovery/pkg/model/kstatus"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	gateway "sigs.k8s.io/gateway-api/apis/v1"
+)
+
+type Gateway struct {
+	*config.Config `json:"config"`
+}
+
+func (g Gateway) ResourceName() string {
+	return config.NamespacedName(g.Config).String()
+}
+
+func GatewaysCollection(
+	gateways krt.Collection[*gateway.Gateway],
+	gatewayClasses krt.Collection[GatewayClass],
+	opts krt.OptionsBuilder,
+) (
+	krt.StatusCollection[*gateway.Gateway, gateway.GatewayStatus],
+	krt.Collection[Gateway],
+) {
+	statusCol, gw := krt.NewStatusManyCollection(gateways, func(ctx krt.HandlerContext, obj *gateway.Gateway) (*gateway.GatewayStatus, []Gateway) {
+		result := []Gateway{}
+		kgw := obj.Spec
+		status := obj.Status.DeepCopy()
+		class := fetchClass(ctx, gatewayClasses, kgw.GatewayClassName)
+		if class == nil {
+			return nil, nil
+		}
+		controllerName := class.Controller
+		classInfo, f := classInfos[controllerName]
+		if !f {
+			return nil, nil
+		}
+		if classInfo.disableRouteGeneration {
+			// For now we still mark the Gateway as accepted, but let higher layers control route generation.
+			status = setGatewayConditions(status, obj.Generation, true, true)
+			return status, result
+		}
+
+		// Default behavior: GatewayClass is known and managed by this controller.
+		// Mark Accepted/Programmed to ensure status no longer stays at "Waiting for controller".
+		status = setGatewayConditions(status, obj.Generation, true, true)
+		return status, result
+	}, opts.WithName("KubernetesGateway")...)
+
+	return statusCol, gw
+}
+
+func setGatewayConditions(
+	existing *gateway.GatewayStatus,
+	gen int64,
+	accepted, programmed bool,
+) *gateway.GatewayStatus {
+	boolToConditionStatus := func(b bool) metav1.ConditionStatus {
+		if b {
+			return metav1.ConditionTrue
+		}
+		return metav1.ConditionFalse
+	}
+
+	msg := "Handled by Dubbo controller"
+	conds := kstatus.UpdateConditionIfChanged(existing.Conditions, metav1.Condition{
+		Type:               string(gateway.GatewayConditionAccepted),
+		Status:             boolToConditionStatus(accepted),
+		ObservedGeneration: gen,
+		LastTransitionTime: metav1.Now(),
+		Reason:             "Accepted",
+		Message:            msg,
+	})
+	conds = kstatus.UpdateConditionIfChanged(conds, metav1.Condition{
+		Type:               string(gateway.GatewayConditionProgrammed),
+		Status:             boolToConditionStatus(programmed),
+		ObservedGeneration: gen,
+		LastTransitionTime: metav1.Now(),
+		Reason:             "Programmed",
+		Message:            msg,
+	})
+	existing.Conditions = conds
+	return existing
+}
+
+func FinalGatewayStatusCollection(
+	gatewayStatuses krt.StatusCollection[*gateway.Gateway, gateway.GatewayStatus],
+	opts krt.OptionsBuilder,
+) krt.StatusCollection[*gateway.Gateway, gateway.GatewayStatus] {
+	return krt.NewCollection(
+		gatewayStatuses,
+		func(ctx krt.HandlerContext, i krt.ObjectWithStatus[*gateway.Gateway, gateway.GatewayStatus]) *krt.ObjectWithStatus[*gateway.Gateway, gateway.GatewayStatus] {
+			status := i.Status.DeepCopy()
+			return &krt.ObjectWithStatus[*gateway.Gateway, gateway.GatewayStatus]{
+				Obj:    i.Obj,
+				Status: *status,
+			}
+		}, opts.WithName("GatewayFinalStatus")...)
+}
diff --git a/go.mod b/go.mod
index 44a22eab..0c3d700f 100644
--- a/go.mod
+++ b/go.mod
@@ -15,7 +15,7 @@
 
 module github.com/apache/dubbo-kubernetes
 
-go 1.24.0
+go 1.25.0
 
 require (
 	k8s.io/apimachinery v0.34.1
diff --git a/manifests/charts/dubbo-control/dubbo-discovery/files/kube-gateway.yaml b/manifests/charts/dubbo-control/dubbo-discovery/files/kube-gateway.yaml
index 49c29982..00a2b9f9 100644
--- a/manifests/charts/dubbo-control/dubbo-discovery/files/kube-gateway.yaml
+++ b/manifests/charts/dubbo-control/dubbo-discovery/files/kube-gateway.yaml
@@ -46,7 +46,7 @@ spec:
       serviceAccountName: {{ .ServiceAccount }}
       containers:
       - name: dubbo-proxy
-        image: mfordjody/dubbo-proxy:0.3.5
+        image: dubboregistry/dubbo-proxy:0.3.5
         imagePullPolicy: Always
         ports:
         - containerPort: 15020
diff --git a/manifests/charts/dubbo-control/dubbo-discovery/templates/deployment.yaml b/manifests/charts/dubbo-control/dubbo-discovery/templates/deployment.yaml
index 21948b2f..8320cc71 100644
--- a/manifests/charts/dubbo-control/dubbo-discovery/templates/deployment.yaml
+++ b/manifests/charts/dubbo-control/dubbo-discovery/templates/deployment.yaml
@@ -19,7 +19,7 @@ spec:
       serviceAccountName: dubbod
       containers:
         - name: discovery
-          image: "mfordjody/dubbo-discovery:0.3.5"
+          image: "dubboregistry/dubbo-discovery:0.3.5"
           imagePullPolicy: Always
           args:
             - "discovery"
diff --git a/manifests/charts/dubbo-control/dubbo-discovery/values.yaml b/manifests/charts/dubbo-control/dubbo-discovery/values.yaml
index aee348aa..2ec941ca 100644
--- a/manifests/charts/dubbo-control/dubbo-discovery/values.yaml
+++ b/manifests/charts/dubbo-control/dubbo-discovery/values.yaml
@@ -14,10 +14,6 @@
 # limitations under the License.
 
 _internal_default_values_not_set:
-  hub: ""
-  tag: 0.3.5
-  image: planet
-
   resources:
     requests:
       cpu: 500m
diff --git a/pkg/dubboagent/agent.go b/pkg/dubboagent/agent.go
index eccec379..5749656f 100644
--- a/pkg/dubboagent/agent.go
+++ b/pkg/dubboagent/agent.go
@@ -656,8 +656,8 @@ func (a *Agent) initializePixiuAgent(_ context.Context) error {
 	binaryPath := os.Getenv("PROXY_BINARY_PATH")
 	if binaryPath == "" {
 		possiblePaths := []string{
-			"/usr/local/bin/pixiu-gateway",
-			"pixiu-gateway",
+			"/usr/local/bin/pixiu-proxy",
+			"pixiu-proxy",
 		}
 
 		found := false
@@ -678,7 +678,7 @@ func (a *Agent) initializePixiuAgent(_ context.Context) error {
 		}
 
 		if !found {
-			return fmt.Errorf("gateway binary pixiu not found. Please set PROXY_BINARY_PATH environment variable or ensure pixiu binary is installed at /usr/local/bin/pixiu-gateway")
+			return fmt.Errorf("gateway binary pixiu not found.")
 		}
 	}
 
diff --git a/pkg/kube/inject/inject.go b/pkg/kube/inject/inject.go
index a0c6845e..b72b0790 100644
--- a/pkg/kube/inject/inject.go
+++ b/pkg/kube/inject/inject.go
@@ -114,7 +114,7 @@ func RunTemplate(params InjectionParameters) (mergedPod *corev1.Pod, templatePod
 		MeshGlobalConfig: meshGlobalConfig,
 		Values:           params.valuesConfig.asMap,
 		Revision:         params.revision,
-		ProxyImage:       getProxyImage(params.valuesConfig.asMap, "mfordjody/dubbo-proxy:0.3.5"),
+		ProxyImage:       getProxyImage(params.valuesConfig.asMap, "dubboregistry/dubbo-proxy:0.3.5"),
 		CompliancePolicy: common_features.CompliancePolicy,
 	}
 
diff --git a/pkg/pixiu/proxy.go b/pkg/pixiu/proxy.go
index 23037b28..7e3647f3 100644
--- a/pkg/pixiu/proxy.go
+++ b/pkg/pixiu/proxy.go
@@ -24,7 +24,7 @@ import (
 	"path/filepath"
 )
 
-var pixiulog = dubbolog.RegisterScope("gateway", "pixiu gateway debugging")
+var pixiulog = dubbolog.RegisterScope("gateway", "pixiu proxy debugging")
 
 type Proxy interface {
 	Run(<-chan error) error
diff --git a/samples/addons/README.md b/samples/addons/README.md
deleted file mode 100644
index 70c25b6d..00000000
--- a/samples/addons/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# Addons
-
-Example deployments of various plugins that integrate with Dubbo.
-
-The deployments here are intended to get up and running quickly and may not be suitable for production environments.
-
-## Getting started
-
-To quickly deploy all addons:
-
-```shell script
-kubectl apply -f samples/addons
-```
\ No newline at end of file
diff --git a/samples/addons/grafana.yaml b/samples/addons/grafana.yaml
deleted file mode 100644
index 60b82fed..00000000
--- a/samples/addons/grafana.yaml
+++ /dev/null
@@ -1,259 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
----
-# Source: grafana/templates/serviceaccount.yaml
-apiVersion: v1
-kind: ServiceAccount
-automountServiceAccountToken: false
-metadata:
-  labels:
-    helm.sh/chart: grafana-8.6.3
-    app.kubernetes.io/name: grafana
-    app.kubernetes.io/instance: grafana
-    app.kubernetes.io/version: "11.3.1"
-  name: grafana
-  namespace: dubbo-system
----
-# Source: grafana/templates/configmap.yaml
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: grafana
-  namespace: dubbo-system
-  labels:
-    helm.sh/chart: grafana-8.6.3
-    app.kubernetes.io/name: grafana
-    app.kubernetes.io/instance: grafana
-    app.kubernetes.io/version: "11.3.1"
-data:
-  grafana.ini: |
-    [analytics]
-    check_for_updates = true
-    [grafana_net]
-    url = https://grafana.net
-    [log]
-    mode = console
-    [paths]
-    data = /var/lib/grafana/
-    logs = /var/log/grafana
-    plugins = /var/lib/grafana/plugins
-    provisioning = /etc/grafana/provisioning
-    [server]
-    domain = ''
-  datasources.yaml: |
-    apiVersion: 1
-    datasources:
-      - access: proxy
-        editable: true
-        isDefault: true
-        jsonData:
-          timeInterval: 15s
-        name: Prometheus
-        orgId: 1
-        type: prometheus
-        url: http://prometheus:9090
-      - access: proxy
-        editable: true
-        isDefault: false
-        jsonData:
-          timeInterval: 15s
-        name: Jaeger
-        orgId: 1
-        type: jaeger
-        url: http://tracing:16686
-  dashboardproviders.yaml: |
-    apiVersion: 1
-    providers:
-      - disableDeletion: false
-        name: dashboards-dubbo-metrics
-        folder: dubbo/metrics
-        options:
-          path: /var/lib/grafana/dashboards/dubbo/metrics
-        orgId: 1
-        type: file
-      - disableDeletion: false
-        name: dashboards-dubbo-traces
-        folder: dubbo/traces
-        options:
-          path: /var/lib/grafana/dashboards/dubbo/traces
-        orgId: 1
-        type: file
----
-# Source: grafana/templates/service.yaml
-apiVersion: v1
-kind: Service
-metadata:
-  name: grafana
-  namespace: dubbo-system
-  labels:
-    helm.sh/chart: grafana-8.6.3
-    app.kubernetes.io/name: grafana
-    app.kubernetes.io/instance: grafana
-    app.kubernetes.io/version: "11.3.1"
-spec:
-  type: NodePort
-  ports:
-    - name: service
-      port: 3000
-      protocol: TCP
-      targetPort: 3000
-  selector:
-    app.kubernetes.io/name: grafana
-    app.kubernetes.io/instance: grafana
----
-# Source: grafana/templates/deployment.yaml
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: grafana
-  namespace: dubbo-system
-  labels:
-    helm.sh/chart: grafana-8.6.3
-    app.kubernetes.io/name: grafana
-    app.kubernetes.io/instance: grafana
-    app.kubernetes.io/version: "11.3.1"
-spec:
-  replicas: 1
-  revisionHistoryLimit: 10
-  selector:
-    matchLabels:
-      app.kubernetes.io/name: grafana
-      app.kubernetes.io/instance: grafana
-  strategy:
-    type: RollingUpdate
-  template:
-    metadata:
-      labels:
-        helm.sh/chart: grafana-8.6.3
-        app.kubernetes.io/name: grafana
-        app.kubernetes.io/instance: grafana
-        app.kubernetes.io/version: "11.3.1"
-    spec:
-      serviceAccountName: grafana
-      automountServiceAccountToken: true
-      enableServiceLinks: true
-      containers:
-        - name: grafana
-          image: "sca-registry.cn-hangzhou.cr.aliyuncs.com/dubbo/grafana:11.3.1"
-          imagePullPolicy: IfNotPresent
-          securityContext:
-            allowPrivilegeEscalation: false
-            capabilities:
-              drop:
-                - ALL
-            seccompProfile:
-              type: RuntimeDefault
-          volumeMounts:
-            - name: storage
-              mountPath: "/var/lib/grafana"
-            - name: config
-              mountPath: "/etc/grafana/grafana.ini"
-              subPath: grafana.ini
-            - name: config
-              mountPath: "/etc/grafana/provisioning/dashboards/dashboardproviders.yaml"
-              subPath: "dashboardproviders.yaml"
-            - name: config
-              mountPath: "/etc/grafana/provisioning/datasources/datasources.yaml"
-              subPath: "datasources.yaml"
-            - mountPath: "/var/lib/grafana/dashboards/dubbo/metrics"
-              name: dashboards-dubbo-metrics
-            - mountPath: "/var/lib/grafana/dashboards/dubbo/traces"
-              name: dashboards-dubbo-traces
-          ports:
-            - name: grafana
-              containerPort: 3000
-              protocol: TCP
-            - name: gossip-tcp
-              containerPort: 9094
-              protocol: TCP
-            - name: gossip-udp
-              containerPort: 9094
-              protocol: UDP
-          env:
-            - name: POD_IP
-              valueFrom:
-                fieldRef:
-                  fieldPath: status.podIP
-            - name: GF_PATHS_DATA
-              value: /var/lib/grafana/
-            - name: GF_PATHS_LOGS
-              value: /var/log/grafana
-            - name: GF_PATHS_PLUGINS
-              value: /var/lib/grafana/plugins
-            - name: GF_PATHS_PROVISIONING
-              value: /etc/grafana/provisioning
-            - name: "GF_AUTH_ANONYMOUS_ENABLED"
-              value: "true"
-            - name: "GF_AUTH_ANONYMOUS_ORG_ROLE"
-              value: "Admin"
-            - name: "GF_AUTH_BASIC_ENABLED"
-              value: "false"
-            - name: "GF_SECURITY_ADMIN_PASSWORD"
-              value: "admin"
-            - name: "GF_SECURITY_ADMIN_USER"
-              value: "admin"
-          livenessProbe:
-            failureThreshold: 10
-            httpGet:
-              path: /api/health
-              port: 3000
-            initialDelaySeconds: 60
-            timeoutSeconds: 30
-          readinessProbe:
-            httpGet:
-              path: /api/health
-              port: 3000
-      volumes:
-        - name: config
-          configMap:
-            name: grafana
-        - configMap:
-            name: dubbo-metrics-grafana-dashboards
-          name: dashboards-dubbo-metrics
-        - configMap:
-            name: dubbo-traces-grafana-dashboards
-          name: dashboards-dubbo-traces
-        - name: storage
-          emptyDir: {}
----
-
-apiVersion: v1
-data:
-  dubbo-metrics-application-dashboard.json: |
-    {"annotations":{"list":[{"builtIn":1,"datasource":{"type":"grafana","uid":"-- Grafana --"},"enable":true,"hide":true,"iconColor":"rgba(0, 211, 255, 1)","name":"Annotations & Alerts","type":"dashboard"}]},"editable":true,"fiscalYearStartMonth":0,"graphTooltip":0,"id":39,"links":[],"panels":[{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":0},"id":14,"panels":[],"title":"应用概览","type":"row"},{"datasource":{"type":"prometheus","uid":"${datasource}"},"fieldConfig":{"defaults":{"color" [...]
-  dubbo-metrics-instance-dashboard.json: |
-    {"annotations":{"list":[{"builtIn":1,"datasource":{"type":"grafana","uid":"-- Grafana --"},"enable":true,"hide":true,"iconColor":"rgba(0, 211, 255, 1)","name":"Annotations & Alerts","type":"dashboard"}]},"editable":true,"fiscalYearStartMonth":0,"graphTooltip":0,"id":41,"links":[],"panels":[{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":0},"id":1,"panels":[],"title":"实例概览","type":"row"},{"datasource":{"type":"prometheus","uid":"${datasource}"},"fieldConfig":{"defaults":{"color": [...]
-  dubbo-metrics-service-dashboard.json: |
-    {"annotations":{"list":[{"builtIn":1,"datasource":{"type":"grafana","uid":"-- Grafana --"},"enable":true,"hide":true,"iconColor":"rgba(0, 211, 255, 1)","name":"Annotations & Alerts","type":"dashboard"}]},"editable":true,"fiscalYearStartMonth":0,"graphTooltip":0,"id":42,"links":[],"panels":[{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":0},"id":5,"panels":[],"title":"接口总览","type":"row"},{"datasource":{"type":"prometheus","uid":"${datasource}"},"fieldConfig":{"defaults":{"color": [...]
-kind: ConfigMap
-metadata:
-  creationTimestamp: null
-  name: dubbo-metrics-grafana-dashboards
-  namespace: dubbo-system
----        
-apiVersion: v1
-data:
-  dubbo-traces-application-dashboard.json: |
-    {"annotations":{"list":[{"builtIn":1,"datasource":{"type":"grafana","uid":"-- Grafana --"},"enable":true,"hide":true,"iconColor":"rgba(0, 211, 255, 1)","name":"Annotations & Alerts","type":"dashboard"}]},"editable":true,"fiscalYearStartMonth":0,"graphTooltip":0,"id":34,"links":[],"panels":[{"datasource":{"type":"jaeger","uid":"${datasource}"},"fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"custom":{"align":"auto","cellOptions":{"type":"auto"},"inspect":false},"mappings":[], [...]
-  dubbo-traces-instance-dashboard.json: |
-    {"annotations":{"list":[{"builtIn":1,"datasource":{"type":"grafana","uid":"-- Grafana --"},"enable":true,"hide":true,"iconColor":"rgba(0, 211, 255, 1)","name":"Annotations & Alerts","type":"dashboard"}]},"editable":true,"fiscalYearStartMonth":0,"graphTooltip":0,"id":35,"links":[],"panels":[{"datasource":{"type":"jaeger","uid":"${datasource}"},"fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"custom":{"align":"auto","cellOptions":{"type":"auto"},"inspect":false},"mappings":[], [...]
-  dubbo-traces-service-dashboard.json: |
-    {"annotations":{"list":[{"builtIn":1,"datasource":{"type":"grafana","uid":"-- Grafana --"},"enable":true,"hide":true,"iconColor":"rgba(0, 211, 255, 1)","name":"Annotations & Alerts","type":"dashboard"}]},"editable":true,"fiscalYearStartMonth":0,"graphTooltip":0,"id":36,"links":[],"panels":[{"datasource":{"type":"jaeger","uid":"${datasource}"},"fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"custom":{"align":"auto","cellOptions":{"type":"auto"},"inspect":false},"mappings":[], [...]
-kind: ConfigMap
-metadata:
-  creationTimestamp: null
-  name: dubbo-traces-grafana-dashboards
-  namespace: dubbo-system
\ No newline at end of file
diff --git a/samples/addons/jaeger.yaml b/samples/addons/jaeger.yaml
deleted file mode 100644
index cb871859..00000000
--- a/samples/addons/jaeger.yaml
+++ /dev/null
@@ -1,135 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: jaeger
-  namespace: dubbo-system
-  labels:
-    app: jaeger
-spec:
-  selector:
-    matchLabels:
-      app: jaeger
-  template:
-    metadata:
-      labels:
-        app: jaeger
-      annotations:
-        prometheus.io/scrape: "true"
-        prometheus.io/port: "14269"
-    spec:
-      containers:
-        - name: jaeger
-          image: "sca-registry.cn-hangzhou.cr.aliyuncs.com/dubbo/jager-all-in-one:1.67.0"
-          env:
-            - name: BADGER_EPHEMERAL
-              value: "false"
-            - name: SPAN_STORAGE_TYPE
-              value: "badger"
-            - name: BADGER_DIRECTORY_VALUE
-              value: "/badger/data"
-            - name: BADGER_DIRECTORY_KEY
-              value: "/badger/key"
-            - name: COLLECTOR_ZIPKIN_HOST_PORT
-              value: ":9411"
-            - name: MEMORY_MAX_TRACES
-              value: "50000"
-            - name: QUERY_BASE_PATH
-              value: /jaeger
-          livenessProbe:
-            httpGet:
-              path: /
-              port: 14269
-          readinessProbe:
-            httpGet:
-              path: /
-              port: 14269
-          volumeMounts:
-            - name: data
-              mountPath: /badger
-          resources:
-            requests:
-              cpu: 10m
-      volumes:
-        - name: data
-          emptyDir: {}
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: tracing
-  namespace: dubbo-system
-  labels:
-    app: jaeger
-spec:
-  type: ClusterIP
-  ports:
-    - name: http-query
-      port: 80
-      protocol: TCP
-      targetPort: 16686
-    # Note: Change port name if you add '--query.grpc.tls.enabled=true'
-    - name: grpc-query
-      port: 16685
-      protocol: TCP
-      targetPort: 16685
-  selector:
-    app: jaeger
----
-# Jaeger implements the Zipkin API. To support swapping out the tracing backend, we use a Service named Zipkin.
-apiVersion: v1
-kind: Service
-metadata:
-  labels:
-    name: zipkin
-  name: zipkin
-  namespace: dubbo-system
-spec:
-  ports:
-    - port: 9411
-      targetPort: 9411
-      name: http-query
-  selector:
-    app: jaeger
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: jaeger-collector
-  namespace: dubbo-system
-  labels:
-    app: jaeger
-spec:
-  type: ClusterIP
-  ports:
-  - name: jaeger-collector-http
-    port: 14268
-    targetPort: 14268
-    protocol: TCP
-  - name: jaeger-collector-grpc
-    port: 14250
-    targetPort: 14250
-    protocol: TCP
-  - port: 9411
-    targetPort: 9411
-    name: http-zipkin
-  - port: 4317
-    name: grpc-otel
-  - port: 4318
-    name: http-otel
-  selector:
-    app: jaeger
diff --git a/samples/addons/prometheus.yaml b/samples/addons/prometheus.yaml
deleted file mode 100644
index 08293b82..00000000
--- a/samples/addons/prometheus.yaml
+++ /dev/null
@@ -1,575 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
----
-# Source: prometheus/templates/serviceaccount.yaml
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  labels:
-    app.kubernetes.io/component: server
-    app.kubernetes.io/name: prometheus
-    app.kubernetes.io/instance: prometheus
-    app.kubernetes.io/version: v3.2.1
-    helm.sh/chart: prometheus-27.8.0
-    app.kubernetes.io/part-of: prometheus
-  name: prometheus
-  namespace: dubbo-system
-  annotations:
-    {}
----
-# Source: prometheus/templates/cm.yaml
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  labels:
-    app.kubernetes.io/component: server
-    app.kubernetes.io/name: prometheus
-    app.kubernetes.io/instance: prometheus
-    app.kubernetes.io/version: v3.2.1
-    helm.sh/chart: prometheus-27.8.0
-    app.kubernetes.io/part-of: prometheus
-  name: prometheus
-  namespace: dubbo-system
-data:
-  allow-snippet-annotations: "false"
-  alerting_rules.yml: |
-    {}
-  alerts: |
-    {}
-  prometheus.yml: |
-    global:
-      evaluation_interval: 1m
-      scrape_interval: 15s
-      scrape_timeout: 10s
-    rule_files:
-    - /etc/config/recording_rules.yml
-    - /etc/config/alerting_rules.yml
-    - /etc/config/rules
-    - /etc/config/alerts
-    scrape_configs:
-    - job_name: prometheus
-      static_configs:
-      - targets:
-        - localhost:9090
-    - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
-      job_name: kubernetes-apiservers
-      kubernetes_sd_configs:
-      - role: endpoints
-      relabel_configs:
-      - action: keep
-        regex: default;kubernetes;https
-        source_labels:
-        - __meta_kubernetes_namespace
-        - __meta_kubernetes_service_name
-        - __meta_kubernetes_endpoint_port_name
-      scheme: https
-      tls_config:
-        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
-    - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
-      job_name: kubernetes-nodes
-      kubernetes_sd_configs:
-      - role: node
-      relabel_configs:
-      - action: labelmap
-        regex: __meta_kubernetes_node_label_(.+)
-      - replacement: kubernetes.default.svc:443
-        target_label: __address__
-      - regex: (.+)
-        replacement: /api/v1/nodes/$1/proxy/metrics
-        source_labels:
-        - __meta_kubernetes_node_name
-        target_label: __metrics_path__
-      scheme: https
-      tls_config:
-        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
-    - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
-      job_name: kubernetes-nodes-cadvisor
-      kubernetes_sd_configs:
-      - role: node
-      relabel_configs:
-      - action: labelmap
-        regex: __meta_kubernetes_node_label_(.+)
-      - replacement: kubernetes.default.svc:443
-        target_label: __address__
-      - regex: (.+)
-        replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor
-        source_labels:
-        - __meta_kubernetes_node_name
-        target_label: __metrics_path__
-      scheme: https
-      tls_config:
-        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
-    - honor_labels: true
-      job_name: kubernetes-service-endpoints
-      kubernetes_sd_configs:
-      - role: endpoints
-      relabel_configs:
-      - action: keep
-        regex: true
-        source_labels:
-        - __meta_kubernetes_service_annotation_prometheus_io_scrape
-      - action: drop
-        regex: true
-        source_labels:
-        - __meta_kubernetes_service_annotation_prometheus_io_scrape_slow
-      - action: replace
-        regex: (https?)
-        source_labels:
-        - __meta_kubernetes_service_annotation_prometheus_io_scheme
-        target_label: __scheme__
-      - action: replace
-        regex: (.+)
-        source_labels:
-        - __meta_kubernetes_service_annotation_prometheus_io_path
-        target_label: __metrics_path__
-      - action: replace
-        regex: (.+?)(?::\d+)?;(\d+)
-        replacement: $1:$2
-        source_labels:
-        - __address__
-        - __meta_kubernetes_service_annotation_prometheus_io_port
-        target_label: __address__
-      - action: labelmap
-        regex: __meta_kubernetes_service_annotation_prometheus_io_param_(.+)
-        replacement: __param_$1
-      - action: labelmap
-        regex: __meta_kubernetes_service_label_(.+)
-      - action: replace
-        source_labels:
-        - __meta_kubernetes_namespace
-        target_label: namespace
-      - action: replace
-        source_labels:
-        - __meta_kubernetes_service_name
-        target_label: service
-      - action: replace
-        source_labels:
-        - __meta_kubernetes_pod_node_name
-        target_label: node
-    - honor_labels: true
-      job_name: kubernetes-service-endpoints-slow
-      kubernetes_sd_configs:
-      - role: endpoints
-      relabel_configs:
-      - action: keep
-        regex: true
-        source_labels:
-        - __meta_kubernetes_service_annotation_prometheus_io_scrape_slow
-      - action: replace
-        regex: (https?)
-        source_labels:
-        - __meta_kubernetes_service_annotation_prometheus_io_scheme
-        target_label: __scheme__
-      - action: replace
-        regex: (.+)
-        source_labels:
-        - __meta_kubernetes_service_annotation_prometheus_io_path
-        target_label: __metrics_path__
-      - action: replace
-        regex: (.+?)(?::\d+)?;(\d+)
-        replacement: $1:$2
-        source_labels:
-        - __address__
-        - __meta_kubernetes_service_annotation_prometheus_io_port
-        target_label: __address__
-      - action: labelmap
-        regex: __meta_kubernetes_service_annotation_prometheus_io_param_(.+)
-        replacement: __param_$1
-      - action: labelmap
-        regex: __meta_kubernetes_service_label_(.+)
-      - action: replace
-        source_labels:
-        - __meta_kubernetes_namespace
-        target_label: namespace
-      - action: replace
-        source_labels:
-        - __meta_kubernetes_service_name
-        target_label: service
-      - action: replace
-        source_labels:
-        - __meta_kubernetes_pod_node_name
-        target_label: node
-      scrape_interval: 5m
-      scrape_timeout: 30s
-    - honor_labels: true
-      job_name: prometheus-pushgateway
-      kubernetes_sd_configs:
-      - role: service
-      relabel_configs:
-      - action: keep
-        regex: pushgateway
-        source_labels:
-        - __meta_kubernetes_service_annotation_prometheus_io_probe
-    - honor_labels: true
-      job_name: kubernetes-services
-      kubernetes_sd_configs:
-      - role: service
-      metrics_path: /probe
-      params:
-        module:
-        - http_2xx
-      relabel_configs:
-      - action: keep
-        regex: true
-        source_labels:
-        - __meta_kubernetes_service_annotation_prometheus_io_probe
-      - source_labels:
-        - __address__
-        target_label: __param_target
-      - replacement: blackbox
-        target_label: __address__
-      - source_labels:
-        - __param_target
-        target_label: instance
-      - action: labelmap
-        regex: __meta_kubernetes_service_label_(.+)
-      - source_labels:
-        - __meta_kubernetes_namespace
-        target_label: namespace
-      - source_labels:
-        - __meta_kubernetes_service_name
-        target_label: service
-    - honor_labels: true
-      job_name: kubernetes-pods
-      kubernetes_sd_configs:
-      - role: pod
-      relabel_configs:
-      - action: keep
-        regex: true
-        source_labels:
-        - __meta_kubernetes_pod_annotation_prometheus_io_scrape
-      - action: drop
-        regex: true
-        source_labels:
-        - __meta_kubernetes_pod_annotation_prometheus_io_scrape_slow
-      - action: replace
-        regex: (https?)
-        source_labels:
-        - __meta_kubernetes_pod_annotation_prometheus_io_scheme
-        target_label: __scheme__
-      - action: replace
-        regex: (.+)
-        source_labels:
-        - __meta_kubernetes_pod_annotation_prometheus_io_path
-        target_label: __metrics_path__
-      - action: replace
-        regex: (\d+);(([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})
-        replacement: '[$2]:$1'
-        source_labels:
-        - __meta_kubernetes_pod_annotation_prometheus_io_port
-        - __meta_kubernetes_pod_ip
-        target_label: __address__
-      - action: replace
-        regex: (\d+);((([0-9]+?)(\.|$)){4})
-        replacement: $2:$1
-        source_labels:
-        - __meta_kubernetes_pod_annotation_prometheus_io_port
-        - __meta_kubernetes_pod_ip
-        target_label: __address__
-      - action: labelmap
-        regex: __meta_kubernetes_pod_annotation_prometheus_io_param_(.+)
-        replacement: __param_$1
-      - action: labelmap
-        regex: __meta_kubernetes_pod_label_(.+)
-      - action: replace
-        source_labels:
-        - __meta_kubernetes_namespace
-        target_label: namespace
-      - action: replace
-        source_labels:
-        - __meta_kubernetes_pod_name
-        target_label: pod
-      - action: drop
-        regex: Pending|Succeeded|Failed|Completed
-        source_labels:
-        - __meta_kubernetes_pod_phase
-      - action: replace
-        source_labels:
-        - __meta_kubernetes_pod_node_name
-        target_label: node
-    - honor_labels: true
-      job_name: kubernetes-pods-slow
-      kubernetes_sd_configs:
-      - role: pod
-      relabel_configs:
-      - action: keep
-        regex: true
-        source_labels:
-        - __meta_kubernetes_pod_annotation_prometheus_io_scrape_slow
-      - action: replace
-        regex: (https?)
-        source_labels:
-        - __meta_kubernetes_pod_annotation_prometheus_io_scheme
-        target_label: __scheme__
-      - action: replace
-        regex: (.+)
-        source_labels:
-        - __meta_kubernetes_pod_annotation_prometheus_io_path
-        target_label: __metrics_path__
-      - action: replace
-        regex: (\d+);(([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})
-        replacement: '[$2]:$1'
-        source_labels:
-        - __meta_kubernetes_pod_annotation_prometheus_io_port
-        - __meta_kubernetes_pod_ip
-        target_label: __address__
-      - action: replace
-        regex: (\d+);((([0-9]+?)(\.|$)){4})
-        replacement: $2:$1
-        source_labels:
-        - __meta_kubernetes_pod_annotation_prometheus_io_port
-        - __meta_kubernetes_pod_ip
-        target_label: __address__
-      - action: labelmap
-        regex: __meta_kubernetes_pod_annotation_prometheus_io_param_(.+)
-        replacement: __param_$1
-      - action: labelmap
-        regex: __meta_kubernetes_pod_label_(.+)
-      - action: replace
-        source_labels:
-        - __meta_kubernetes_namespace
-        target_label: namespace
-      - action: replace
-        source_labels:
-        - __meta_kubernetes_pod_name
-        target_label: pod
-      - action: drop
-        regex: Pending|Succeeded|Failed|Completed
-        source_labels:
-        - __meta_kubernetes_pod_phase
-      - action: replace
-        source_labels:
-        - __meta_kubernetes_pod_node_name
-        target_label: node
-      scrape_interval: 5m
-      scrape_timeout: 30s
-  recording_rules.yml: |
-    {}
-  rules: |
-    {}
----
-# Source: prometheus/templates/clusterrole.yaml
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRole
-metadata:
-  labels:
-    app.kubernetes.io/component: server
-    app.kubernetes.io/name: prometheus
-    app.kubernetes.io/instance: prometheus
-    app.kubernetes.io/version: v3.2.1
-    helm.sh/chart: prometheus-27.8.0
-    app.kubernetes.io/part-of: prometheus
-  name: prometheus
-rules:
-  - apiGroups:
-      - ""
-    resources:
-      - nodes
-      - nodes/proxy
-      - nodes/metrics
-      - services
-      - endpoints
-      - pods
-      - ingresses
-      - configmaps
-    verbs:
-      - get
-      - list
-      - watch
-  - apiGroups:
-      - "extensions"
-      - "networking.k8s.io"
-    resources:
-      - ingresses/status
-      - ingresses
-    verbs:
-      - get
-      - list
-      - watch
-  - apiGroups:
-      - "discovery.k8s.io"
-    resources:
-      - endpointslices
-    verbs:
-      - get
-      - list
-      - watch
-  - nonResourceURLs:
-      - "/metrics"
-    verbs:
-      - get
----
-# Source: prometheus/templates/clusterrolebinding.yaml
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
-  labels:
-    app.kubernetes.io/component: server
-    app.kubernetes.io/name: prometheus
-    app.kubernetes.io/instance: prometheus
-    app.kubernetes.io/version: v3.2.1
-    helm.sh/chart: prometheus-27.8.0
-    app.kubernetes.io/part-of: prometheus
-  name: prometheus
-subjects:
-  - kind: ServiceAccount
-    name: prometheus
-    namespace: dubbo-system
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: ClusterRole
-  name: prometheus
----
-# Source: prometheus/templates/service.yaml
-apiVersion: v1
-kind: Service
-metadata:
-  labels:
-    app.kubernetes.io/component: server
-    app.kubernetes.io/name: prometheus
-    app.kubernetes.io/instance: prometheus
-    app.kubernetes.io/version: v3.2.1
-    helm.sh/chart: prometheus-27.8.0
-    app.kubernetes.io/part-of: prometheus
-  name: prometheus
-  namespace: dubbo-system
-spec:
-  ports:
-    - name: http
-      port: 9090
-      protocol: TCP
-      targetPort: 9090
-  selector:
-    app.kubernetes.io/component: server
-    app.kubernetes.io/name: prometheus
-    app.kubernetes.io/instance: prometheus
-  sessionAffinity: None
-  type: "ClusterIP"
----
-# Source: prometheus/templates/deploy.yaml
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  labels:
-    app.kubernetes.io/component: server
-    app.kubernetes.io/name: prometheus
-    app.kubernetes.io/instance: prometheus
-    app.kubernetes.io/version: v3.2.1
-    helm.sh/chart: prometheus-27.8.0
-    app.kubernetes.io/part-of: prometheus
-  name: prometheus
-  namespace: dubbo-system
-spec:
-  selector:
-    matchLabels:
-      app.kubernetes.io/component: server
-      app.kubernetes.io/name: prometheus
-      app.kubernetes.io/instance: prometheus
-  replicas: 1
-  revisionHistoryLimit: 10
-  strategy:
-    type: Recreate
-    rollingUpdate: null
-  template:
-    metadata:
-      labels:
-        app.kubernetes.io/component: server
-        app.kubernetes.io/name: prometheus
-        app.kubernetes.io/instance: prometheus
-        app.kubernetes.io/version: v3.2.1
-        helm.sh/chart: prometheus-27.8.0
-        app.kubernetes.io/part-of: prometheus
-        
-        sidecar.dubbo.apache.org/inject: "false"
-    spec:
-      enableServiceLinks: true
-      serviceAccountName: prometheus
-      containers:
-        - name: prometheus-server-configmap-reload
-          image: "sca-registry.cn-hangzhou.cr.aliyuncs.com/dubbo/prometheus-config-reloader:v0.81.0"
-          imagePullPolicy: "IfNotPresent"
-          args:
-            - --watched-dir=/etc/config
-            - --listen-address=0.0.0.0:8080
-            - --reload-url=http://127.0.0.1:9090/-/reload
-          ports:
-            - containerPort: 8080
-              name: metrics
-          livenessProbe:
-            httpGet:
-              path: /healthz
-              port: metrics
-              scheme: HTTP
-            initialDelaySeconds: 2
-            periodSeconds: 10
-          readinessProbe:
-            httpGet:
-              path: /healthz
-              port: metrics
-              scheme: HTTP
-            periodSeconds: 10
-          volumeMounts:
-            - name: config-volume
-              mountPath: /etc/config
-              readOnly: true
-
-        - name: prometheus-server
-          image: "sca-registry.cn-hangzhou.cr.aliyuncs.com/dubbo/prometheus:v3.2.1"
-          imagePullPolicy: "IfNotPresent"
-          args:
-            - --storage.tsdb.retention.time=15d
-            - --config.file=/etc/config/prometheus.yml
-            - --storage.tsdb.path=/data
-            - --web.console.libraries=/etc/prometheus/console_libraries
-            - --web.console.templates=/etc/prometheus/consoles
-            - --web.enable-lifecycle
-          ports:
-            - containerPort: 9090
-          readinessProbe:
-            httpGet:
-              path: /-/ready
-              port: 9090
-              scheme: HTTP
-            initialDelaySeconds: 0
-            periodSeconds: 5
-            timeoutSeconds: 4
-            failureThreshold: 3
-            successThreshold: 1
-          livenessProbe:
-            httpGet:
-              path: /-/healthy
-              port: 9090
-              scheme: HTTP
-            initialDelaySeconds: 30
-            periodSeconds: 15
-            timeoutSeconds: 10
-            failureThreshold: 3
-            successThreshold: 1
-          volumeMounts:
-            - name: config-volume
-              mountPath: /etc/config
-            - name: storage-volume
-              mountPath: /data
-              subPath: ""
-      dnsPolicy: ClusterFirst
-      terminationGracePeriodSeconds: 300
-      volumes:
-        - name: config-volume
-          configMap:
-            name: prometheus
-        - name: storage-volume
-          emptyDir:
-            {}
diff --git a/samples/grpc-app/grpc-app.yaml b/samples/grpc-app/grpc-app.yaml
index 06d0c5db..f02a7507 100644
--- a/samples/grpc-app/grpc-app.yaml
+++ b/samples/grpc-app/grpc-app.yaml
@@ -51,7 +51,7 @@ spec:
     spec:
       containers:
         - name: app
-          image: mfordjody/grpc-provider:dev-debug
+          image: dubboregistry/grpc-provider:master
           imagePullPolicy: Always
           ports:
             - containerPort: 17070
@@ -120,7 +120,7 @@ spec:
     spec:
       containers:
         - name: app
-          image: mfordjody/grpc-provider:dev-debug
+          image: dubboregistry/grpc-provider:master
           imagePullPolicy: Always
           ports:
             - containerPort: 17070
@@ -188,7 +188,7 @@ spec:
       containers:
         - name: app
           # Replace with your own image containing the consumer binary
-          image: mfordjody/grpc-consumer:dev-debug
+          image: dubboregistry/grpc-consumer:master
           imagePullPolicy: Always
           ports:
             - containerPort: 17171
diff --git a/samples/httpbin/README.md b/samples/httpbin/README.md
new file mode 100644
index 00000000..e49ea78e
--- /dev/null
+++ b/samples/httpbin/README.md
@@ -0,0 +1,58 @@
+# Httpbin Service
+
+```bash
+kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
+{ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v1.4.0" | kubectl apply -f -; }
+```
+
+```yaml
+kubectl create namespace dubbo-ingress
+kubectl apply -f - <<EOF
+apiVersion: gateway.networking.k8s.io/v1
+kind: Gateway
+metadata:
+  name: gateway
+  namespace: dubbo-ingress
+spec:
+  gatewayClassName: dubbo
+  listeners:
+  - name: default
+    hostname: "*.example.com"
+    port: 80
+    protocol: HTTP
+    allowedRoutes:
+      namespaces:
+        from: All
+---
+apiVersion: gateway.networking.k8s.io/v1
+kind: HTTPRoute
+metadata:
+  name: http
+  namespace: default
+spec:
+  parentRefs:
+  - name: gateway
+    namespace: dubbo-ingress
+  hostnames: ["httpbin.example.com"]
+  rules:
+  - matches:
+    - path:
+        type: PathPrefix
+        value: /get
+    backendRefs:
+    - name: httpbin
+      port: 8000
+EOF
+```
+
+```bash
+NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')
+SVC_PORT=$(kubectl get svc gateway-dubbo -n dubbo-ingress -o jsonpath='{.spec.ports[?(@.port==80)].nodePort}')
+curl -s -I -HHost:httpbin.example.com "http://$NODE_IP:$SVC_PORT/get"
+```
+
+```bash
+kubectl delete httproute http
+kubectl delete gateways.gateway.networking.k8s.io gateway -n dubbo-ingress
+kubectl delete ns dubbo-ingress
+```
\ No newline at end of file
diff --git a/samples/httpbin/httpbin.yaml b/samples/httpbin/httpbin.yaml
new file mode 100644
index 00000000..941fc383
--- /dev/null
+++ b/samples/httpbin/httpbin.yaml
@@ -0,0 +1,43 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: httpbin
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: httpbin
+  labels:
+    app: httpbin
+    service: httpbin
+spec:
+  ports:
+    - name: http
+      port: 8000
+      targetPort: 8080
+  selector:
+    app: httpbin
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: httpbin
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: httpbin
+      version: v1
+  template:
+    metadata:
+      labels:
+        app: httpbin
+        version: v1
+    spec:
+      serviceAccountName: httpbin
+      containers:
+        - image: docker.io/mccutchen/go-httpbin:2.19.0
+          imagePullPolicy: IfNotPresent
+          name: httpbin
+          ports:
+            - containerPort: 8080
\ No newline at end of file