You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by ro...@apache.org on 2025/07/05 04:34:57 UTC

(apisix-ingress-controller) branch master updated: fix: adc backend server on different mode (#2455)

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

ronething pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git


The following commit(s) were added to refs/heads/master by this push:
     new 59af65e1 fix: adc backend server on different mode (#2455)
59af65e1 is described below

commit 59af65e1bcfeb605f1e416fc6b603f17241cba16
Author: 悟空 <ra...@163.com>
AuthorDate: Sat Jul 5 12:34:51 2025 +0800

    fix: adc backend server on different mode (#2455)
---
 internal/provider/adc/config.go      | 53 +++++++++++++++++++++---------------
 test/e2e/crds/gatewayproxy.go        | 18 ++++++++++++
 test/e2e/framework/k8s.go            |  6 ++--
 test/e2e/gatewayapi/httproute.go     | 34 ++++-------------------
 test/e2e/scaffold/apisix_deployer.go | 24 ++++++++--------
 test/e2e/scaffold/scaffold.go        | 24 ++++++++++------
 6 files changed, 87 insertions(+), 72 deletions(-)

diff --git a/internal/provider/adc/config.go b/internal/provider/adc/config.go
index ec6d94fc..7eb55fc5 100644
--- a/internal/provider/adc/config.go
+++ b/internal/provider/adc/config.go
@@ -92,31 +92,40 @@ func (d *adcClient) getConfigsForGatewayProxy(tctx *provider.TranslateContext, g
 		if !ok {
 			return nil, fmt.Errorf("no service found for service reference: %s", namespacedName)
 		}
-		endpoint := tctx.EndpointSlices[namespacedName]
-		if endpoint == nil {
-			return nil, nil
-		}
-		upstreamNodes, err := d.translator.TranslateBackendRefWithFilter(tctx, gatewayv1.BackendRef{
-			BackendObjectReference: gatewayv1.BackendObjectReference{
-				Name:      gatewayv1.ObjectName(provider.ControlPlane.Service.Name),
-				Namespace: (*gatewayv1.Namespace)(&gatewayProxy.Namespace),
-				Port:      ptr.To(gatewayv1.PortNumber(provider.ControlPlane.Service.Port)),
-			},
-		}, func(endpoint *discoveryv1.Endpoint) bool {
-			if endpoint.Conditions.Terminating != nil && *endpoint.Conditions.Terminating {
-				log.Debugw("skip terminating endpoint", zap.Any("endpoint", endpoint))
-				return false
+
+		// APISIXStandalone, configurations need to be sent to each data plane instance;
+		// In other cases, the service is directly accessed as the adc backend server address.
+		if d.BackendMode == BackendModeAPISIXStandalone {
+			endpoint := tctx.EndpointSlices[namespacedName]
+			if endpoint == nil {
+				return nil, nil
+			}
+			upstreamNodes, err := d.translator.TranslateBackendRefWithFilter(tctx, gatewayv1.BackendRef{
+				BackendObjectReference: gatewayv1.BackendObjectReference{
+					Name:      gatewayv1.ObjectName(provider.ControlPlane.Service.Name),
+					Namespace: (*gatewayv1.Namespace)(&gatewayProxy.Namespace),
+					Port:      ptr.To(gatewayv1.PortNumber(provider.ControlPlane.Service.Port)),
+				},
+			}, func(endpoint *discoveryv1.Endpoint) bool {
+				if endpoint.Conditions.Terminating != nil && *endpoint.Conditions.Terminating {
+					log.Debugw("skip terminating endpoint", zap.Any("endpoint", endpoint))
+					return false
+				}
+				return true
+			})
+			if err != nil {
+				return nil, err
+			}
+			for _, node := range upstreamNodes {
+				config.ServerAddrs = append(config.ServerAddrs, "http://"+net.JoinHostPort(node.Host, strconv.Itoa(node.Port)))
+			}
+		} else {
+			config.ServerAddrs = []string{
+				fmt.Sprintf("http://%s.%s:%d", provider.ControlPlane.Service.Name, gatewayProxy.Namespace, provider.ControlPlane.Service.Port),
 			}
-			return true
-		})
-		if err != nil {
-			return nil, err
-		}
-		for _, node := range upstreamNodes {
-			config.ServerAddrs = append(config.ServerAddrs, "http://"+net.JoinHostPort(node.Host, strconv.Itoa(node.Port)))
 		}
 
-		log.Debugf("add server address to config.ServiceAddrs: %v", config.ServerAddrs)
+		log.Debugw("add server address to config.ServiceAddrs", zap.Strings("config.ServerAddrs", config.ServerAddrs))
 	}
 
 	return &config, nil
diff --git a/test/e2e/crds/gatewayproxy.go b/test/e2e/crds/gatewayproxy.go
index 57098df4..70773f6f 100644
--- a/test/e2e/crds/gatewayproxy.go
+++ b/test/e2e/crds/gatewayproxy.go
@@ -30,6 +30,7 @@ import (
 	"k8s.io/apimachinery/pkg/util/wait"
 	"k8s.io/utils/ptr"
 
+	"github.com/apache/apisix-ingress-controller/internal/provider/adc"
 	"github.com/apache/apisix-ingress-controller/test/e2e/framework"
 	"github.com/apache/apisix-ingress-controller/test/e2e/scaffold"
 )
@@ -173,4 +174,21 @@ spec:
 			}
 		})
 	})
+
+	Context("Backend server", func() {
+		It("backend server on apisix/apisix-standalone mode", func() {
+			var (
+				keyword string
+			)
+
+			if framework.ProviderType == adc.BackendModeAPISIX {
+				keyword = fmt.Sprintf(`{"config.ServerAddrs": ["%s"]}`, s.Deployer.GetAdminEndpoint())
+			} else {
+				keyword = fmt.Sprintf(`{"config.ServerAddrs": ["http://%s:9180"]}`, s.GetPodIP(s.Namespace(), "app.kubernetes.io/name=apisix"))
+			}
+
+			By(fmt.Sprintf("wait for keyword: %s", keyword))
+			s.WaitControllerManagerLog(keyword, 60, time.Minute)
+		})
+	})
 })
diff --git a/test/e2e/framework/k8s.go b/test/e2e/framework/k8s.go
index 4848b62d..3fb71598 100644
--- a/test/e2e/framework/k8s.go
+++ b/test/e2e/framework/k8s.go
@@ -201,8 +201,9 @@ func (f *Framework) Scale(name string, replicas int32) {
 		fmt.Sprintf("ensure service %s/%s has %v endpoints failed", _namespace, name, replicas))
 }
 
-func (f *Framework) GetPodIP(selector string) string {
-	pods := f.GetPods("", selector)
+func (f *Framework) GetPodIP(namespace, selector string) string {
+	pods := f.GetPods(namespace, selector)
+	f.GomegaT.Expect(pods).ShouldNot(BeEmpty())
 	return pods[0].Status.PodIP
 }
 
@@ -211,7 +212,6 @@ func (f *Framework) GetPods(namespace, selector string) []corev1.Pod {
 		LabelSelector: selector,
 	})
 	f.GomegaT.Expect(err).ShouldNot(HaveOccurred())
-	f.GomegaT.Expect(podList.Items).ShouldNot(BeEmpty())
 	return podList.Items
 }
 
diff --git a/test/e2e/gatewayapi/httproute.go b/test/e2e/gatewayapi/httproute.go
index ae487e93..6ac6f262 100644
--- a/test/e2e/gatewayapi/httproute.go
+++ b/test/e2e/gatewayapi/httproute.go
@@ -34,7 +34,6 @@ import (
 	"sigs.k8s.io/gateway-api/apis/v1alpha2"
 
 	"github.com/apache/apisix-ingress-controller/api/v1alpha1"
-	"github.com/apache/apisix-ingress-controller/internal/provider/adc"
 	"github.com/apache/apisix-ingress-controller/test/e2e/framework"
 	"github.com/apache/apisix-ingress-controller/test/e2e/scaffold"
 )
@@ -42,9 +41,7 @@ import (
 var _ = Describe("Test HTTPRoute", Label("networking.k8s.io", "httproute"), func() {
 	s := scaffold.NewDefaultScaffold()
 
-	getGatewayProxySpec := func(endpoint, adminKey string) string {
-		if framework.ProviderType == adc.BackendModeAPISIXStandalone {
-			var gatewayProxyYaml = `
+	var gatewayProxyYaml = `
 apiVersion: apisix.apache.org/v1alpha1
 kind: GatewayProxy
 metadata:
@@ -54,32 +51,15 @@ spec:
     type: ControlPlane
     controlPlane:
       service:
-        name: apisix-standalone
+        name: %s
         port: 9180
       auth:
         type: AdminKey
         adminKey:
           value: "%s"
 `
-			return fmt.Sprintf(gatewayProxyYaml, adminKey)
-		}
-		var gatewayProxyYaml = `
-apiVersion: apisix.apache.org/v1alpha1
-kind: GatewayProxy
-metadata:
-  name: apisix-proxy-config
-spec:
-  provider:
-    type: ControlPlane
-    controlPlane:
-      endpoints:
-      - %s
-      auth:
-        type: AdminKey
-        adminKey:
-          value: "%s"
-`
-		return fmt.Sprintf(gatewayProxyYaml, endpoint, adminKey)
+	getGatewayProxySpec := func() string {
+		return fmt.Sprintf(gatewayProxyYaml, framework.ProviderType, s.AdminKey())
 	}
 
 	var gatewayClassYaml = `
@@ -153,8 +133,7 @@ spec:
 
 	var beforeEachHTTP = func() {
 		By("create GatewayProxy")
-		gatewayProxy := getGatewayProxySpec(s.Deployer.GetAdminEndpoint(), s.AdminKey())
-		err := s.CreateResourceFromString(gatewayProxy)
+		err := s.CreateResourceFromString(getGatewayProxySpec())
 		Expect(err).NotTo(HaveOccurred(), "creating GatewayProxy")
 		time.Sleep(5 * time.Second)
 
@@ -184,8 +163,7 @@ spec:
 
 	var beforeEachHTTPS = func() {
 		By("create GatewayProxy")
-		gatewayProxy := getGatewayProxySpec(s.Deployer.GetAdminEndpoint(), s.AdminKey())
-		err := s.CreateResourceFromString(gatewayProxy)
+		err := s.CreateResourceFromString(getGatewayProxySpec())
 		Expect(err).NotTo(HaveOccurred(), "creating GatewayProxy")
 		time.Sleep(5 * time.Second)
 
diff --git a/test/e2e/scaffold/apisix_deployer.go b/test/e2e/scaffold/apisix_deployer.go
index a0e2d531..67f20a86 100644
--- a/test/e2e/scaffold/apisix_deployer.go
+++ b/test/e2e/scaffold/apisix_deployer.go
@@ -168,14 +168,12 @@ func (s *APISIXDeployer) DeployDataplane(deployOpts DeployDataplaneOptions) {
 		opts.Replicas = deployOpts.Replicas
 	}
 
-	for _, tunnel := range []*k8s.Tunnel{
-		s.adminTunnel,
-		s.apisixHttpTunnel,
-		s.apisixHttpsTunnel,
+	for _, close := range []func(){
+		s.closeAdminTunnel,
+		s.closeApisixHttpTunnel,
+		s.closeApisixHttpsTunnel,
 	} {
-		if tunnel != nil {
-			tunnel.Close()
-		}
+		close()
 	}
 
 	svc := s.deployDataplane(&opts)
@@ -302,14 +300,18 @@ func (s *APISIXDeployer) createAdminTunnel(svc *corev1.Service) (*k8s.Tunnel, er
 	if err := adminTunnel.ForwardPortE(s.t); err != nil {
 		return nil, err
 	}
-	s.addFinalizers(func() {
-		adminTunnel.Close()
-		s.adminTunnel = nil
-	})
+	s.addFinalizers(s.closeAdminTunnel)
 
 	return adminTunnel, nil
 }
 
+func (s *APISIXDeployer) closeAdminTunnel() {
+	if s.adminTunnel != nil {
+		s.adminTunnel.Close()
+		s.adminTunnel = nil
+	}
+}
+
 func (s *APISIXDeployer) CreateAdditionalGateway(namePrefix string) (string, *corev1.Service, error) {
 	// Create a new namespace for this additional gateway
 	additionalNS := fmt.Sprintf("%s-%d", namePrefix, time.Now().Unix())
diff --git a/test/e2e/scaffold/scaffold.go b/test/e2e/scaffold/scaffold.go
index f2f97a2d..fe533a82 100644
--- a/test/e2e/scaffold/scaffold.go
+++ b/test/e2e/scaffold/scaffold.go
@@ -313,23 +313,31 @@ func (s *Scaffold) createDataplaneTunnels(
 	if err := httpTunnel.ForwardPortE(s.t); err != nil {
 		return nil, nil, err
 	}
-	s.addFinalizers(func() {
-		httpTunnel.Close()
-		s.apisixHttpTunnel = nil
-	})
+	s.addFinalizers(s.closeApisixHttpTunnel)
 
 	if err := httpsTunnel.ForwardPortE(s.t); err != nil {
 		httpTunnel.Close()
 		return nil, nil, err
 	}
-	s.addFinalizers(func() {
-		httpsTunnel.Close()
-		s.apisixHttpsTunnel = nil
-	})
+	s.addFinalizers(s.closeApisixHttpsTunnel)
 
 	return httpTunnel, httpsTunnel, nil
 }
 
+func (s *Scaffold) closeApisixHttpTunnel() {
+	if s.apisixHttpTunnel != nil {
+		s.apisixHttpTunnel.Close()
+		s.apisixHttpTunnel = nil
+	}
+}
+
+func (s *Scaffold) closeApisixHttpsTunnel() {
+	if s.apisixHttpsTunnel != nil {
+		s.apisixHttpsTunnel.Close()
+		s.apisixHttpsTunnel = nil
+	}
+}
+
 // GetAdditionalGateway returns resources associated with a specific gateway
 func (s *Scaffold) GetAdditionalGateway(identifier string) (*GatewayResources, bool) {
 	resources, exists := s.additionalGateways[identifier]