You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by zh...@apache.org on 2022/12/12 06:11:39 UTC

[apisix-ingress-controller] branch master updated: fix: many namespace lead to provider stuck (#1386)

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

zhangjintao 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 7e8f0763 fix: many namespace lead to provider stuck (#1386)
7e8f0763 is described below

commit 7e8f0763a595d566804ec397cfcb03214f2477df
Author: 林靖 <56...@qq.com>
AuthorDate: Mon Dec 12 14:11:34 2022 +0800

    fix: many namespace lead to provider stuck (#1386)
---
 pkg/providers/apisix/provider.go      |  4 +++
 pkg/providers/apisix/provider_init.go | 51 +++++++++++++++++++++--------------
 2 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/pkg/providers/apisix/provider.go b/pkg/providers/apisix/provider.go
index a184cb39..9a8d2a2a 100644
--- a/pkg/providers/apisix/provider.go
+++ b/pkg/providers/apisix/provider.go
@@ -25,6 +25,7 @@ import (
 
 	"github.com/apache/apisix-ingress-controller/pkg/config"
 	"github.com/apache/apisix-ingress-controller/pkg/kube"
+	"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/client/informers/externalversions"
 	apisixtranslation "github.com/apache/apisix-ingress-controller/pkg/providers/apisix/translation"
 	"github.com/apache/apisix-ingress-controller/pkg/providers/k8s/namespace"
 	"github.com/apache/apisix-ingress-controller/pkg/providers/translation"
@@ -75,6 +76,8 @@ type apisixProvider struct {
 	apisixConsumerInformer      cache.SharedIndexInformer
 	apisixPluginConfigInformer  cache.SharedIndexInformer
 	apisixTlsInformer           cache.SharedIndexInformer
+
+	apisixSharedInformerFactory externalversions.SharedInformerFactory
 }
 
 func NewProvider(common *providertypes.Common, namespaceProvider namespace.WatchingNamespaceProvider,
@@ -86,6 +89,7 @@ func NewProvider(common *providertypes.Common, namespaceProvider namespace.Watch
 	}
 
 	apisixFactory := common.KubeClient.NewAPISIXSharedIndexInformerFactory()
+	p.apisixSharedInformerFactory = apisixFactory
 
 	p.apisixTranslator = apisixtranslation.NewApisixTranslator(&apisixtranslation.TranslatorOptions{
 		Apisix:      common.APISIX,
diff --git a/pkg/providers/apisix/provider_init.go b/pkg/providers/apisix/provider_init.go
index 9e7782c9..bbcf9989 100644
--- a/pkg/providers/apisix/provider_init.go
+++ b/pkg/providers/apisix/provider_init.go
@@ -16,10 +16,11 @@ package apisix
 
 import (
 	"context"
+	"fmt"
 	"sync"
 
 	"go.uber.org/zap"
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/labels"
 
 	"github.com/apache/apisix-ingress-controller/pkg/config"
 	"github.com/apache/apisix-ingress-controller/pkg/log"
@@ -48,23 +49,33 @@ func (p *apisixProvider) Init(ctx context.Context) error {
 		pluginConfigMapA6 = make(map[string]string)
 	)
 
+	p.apisixSharedInformerFactory.Start(ctx.Done())
+	synced := p.apisixSharedInformerFactory.WaitForCacheSync(ctx.Done())
+	for v, ok := range synced {
+		if !ok {
+			err := fmt.Errorf("%s cache failed to sync", v.Name())
+			log.Error(err.Error())
+			return err
+		}
+	}
+
 	namespaces := p.namespaceProvider.WatchingNamespaces()
+
 	for _, key := range namespaces {
 		log.Debugf("start to watch namespace: %s", key)
 		wg.Add(1)
 		go func(ns string) {
 			defer wg.Done()
 			// ApisixRoute
-			opts := v1.ListOptions{}
 			switch p.common.Config.Kubernetes.APIVersion {
 			case config.ApisixV2beta3:
-				retRoutes, err := p.common.KubeClient.APISIXClient.ApisixV2beta3().ApisixRoutes(ns).List(ctx, opts)
+				retRoutes, err := p.apisixSharedInformerFactory.Apisix().V2beta3().ApisixRoutes().Lister().ApisixRoutes(ns).List(labels.Everything())
 				if err != nil {
 					log.Error(err.Error())
 					ctx.Done()
 				} else {
-					for _, r := range retRoutes.Items {
-						tc, err := p.apisixTranslator.TranslateRouteV2beta3NotStrictly(&r)
+					for _, r := range retRoutes {
+						tc, err := p.apisixTranslator.TranslateRouteV2beta3NotStrictly(r)
 						if err != nil {
 							log.Error(err.Error())
 							ctx.Done()
@@ -93,13 +104,13 @@ func (p *apisixProvider) Init(ctx context.Context) error {
 					}
 				}
 			case config.ApisixV2:
-				retRoutes, err := p.common.KubeClient.APISIXClient.ApisixV2().ApisixRoutes(ns).List(ctx, opts)
+				retRoutes, err := p.apisixSharedInformerFactory.Apisix().V2().ApisixRoutes().Lister().ApisixRoutes(ns).List(labels.Everything())
 				if err != nil {
 					log.Error(err.Error())
 					ctx.Done()
 				} else {
-					for _, r := range retRoutes.Items {
-						tc, err := p.apisixTranslator.TranslateRouteV2NotStrictly(&r)
+					for _, r := range retRoutes {
+						tc, err := p.apisixTranslator.TranslateRouteV2NotStrictly(r)
 						if err != nil {
 							log.Error(err.Error())
 							ctx.Done()
@@ -138,13 +149,13 @@ func (p *apisixProvider) Init(ctx context.Context) error {
 			switch p.common.Config.Kubernetes.APIVersion {
 			case config.ApisixV2beta3:
 				// ApisixConsumer
-				retConsumer, err := p.common.KubeClient.APISIXClient.ApisixV2beta3().ApisixConsumers(ns).List(ctx, opts)
+				retConsumer, err := p.apisixSharedInformerFactory.Apisix().V2beta3().ApisixConsumers().Lister().ApisixConsumers(ns).List(labels.Everything())
 				if err != nil {
 					log.Error(err.Error())
 					ctx.Done()
 				} else {
-					for _, con := range retConsumer.Items {
-						consumer, err := p.apisixTranslator.TranslateApisixConsumerV2beta3(&con)
+					for _, con := range retConsumer {
+						consumer, err := p.apisixTranslator.TranslateApisixConsumerV2beta3(con)
 						if err != nil {
 							log.Error(err.Error())
 							ctx.Done()
@@ -154,13 +165,13 @@ func (p *apisixProvider) Init(ctx context.Context) error {
 					}
 				}
 				// ApisixTls
-				retSSL, err := p.common.KubeClient.APISIXClient.ApisixV2beta3().ApisixTlses(ns).List(ctx, opts)
+				retSSL, err := p.apisixSharedInformerFactory.Apisix().V2beta3().ApisixTlses().Lister().ApisixTlses(ns).List(labels.Everything())
 				if err != nil {
 					log.Error(err.Error())
 					ctx.Done()
 				} else {
-					for _, s := range retSSL.Items {
-						ssl, err := p.apisixTranslator.TranslateSSLV2Beta3(&s)
+					for _, s := range retSSL {
+						ssl, err := p.apisixTranslator.TranslateSSLV2Beta3(s)
 						if err != nil {
 							log.Error(err.Error())
 							ctx.Done()
@@ -171,13 +182,13 @@ func (p *apisixProvider) Init(ctx context.Context) error {
 				}
 			case config.ApisixV2:
 				// ApisixConsumer
-				retConsumer, err := p.common.KubeClient.APISIXClient.ApisixV2().ApisixConsumers(ns).List(ctx, opts)
+				retConsumer, err := p.apisixSharedInformerFactory.Apisix().V2().ApisixConsumers().Lister().ApisixConsumers(ns).List(labels.Everything())
 				if err != nil {
 					log.Error(err.Error())
 					ctx.Done()
 				} else {
-					for _, con := range retConsumer.Items {
-						consumer, err := p.apisixTranslator.TranslateApisixConsumerV2(&con)
+					for _, con := range retConsumer {
+						consumer, err := p.apisixTranslator.TranslateApisixConsumerV2(con)
 						if err != nil {
 							log.Error(err.Error())
 							ctx.Done()
@@ -187,13 +198,13 @@ func (p *apisixProvider) Init(ctx context.Context) error {
 					}
 				}
 				// ApisixTls
-				retSSL, err := p.common.KubeClient.APISIXClient.ApisixV2().ApisixTlses(ns).List(ctx, opts)
+				retSSL, err := p.apisixSharedInformerFactory.Apisix().V2().ApisixTlses().Lister().ApisixTlses(ns).List(labels.Everything())
 				if err != nil {
 					log.Error(err.Error())
 					ctx.Done()
 				} else {
-					for _, s := range retSSL.Items {
-						ssl, err := p.apisixTranslator.TranslateSSLV2(&s)
+					for _, s := range retSSL {
+						ssl, err := p.apisixTranslator.TranslateSSLV2(s)
 						if err != nil {
 							log.Error(err.Error())
 							ctx.Done()