diff --git a/cmd/ks-apiserver/app/server.go b/cmd/ks-apiserver/app/server.go index 91b7f64bc..3619783cd 100644 --- a/cmd/ks-apiserver/app/server.go +++ b/cmd/ks-apiserver/app/server.go @@ -177,6 +177,25 @@ func CreateClientSet(conf *apiserverconfig.Config, stopCh <-chan struct{}) error func WaitForResourceSync(stopCh <-chan struct{}) error { klog.V(0).Info("Start cache objects") + discoveryClient := client.ClientSets().K8s().Discovery() + apiResourcesList, err := discoveryClient.ServerResources() + if err != nil { + return err + } + + isResourceExists := func(resource schema.GroupVersionResource) bool { + for _, apiResource := range apiResourcesList { + if apiResource.GroupVersion == resource.GroupVersion().String() { + for _, rsc := range apiResource.APIResources { + if rsc.Name == resource.Resource { + return true + } + } + } + } + return false + } + informerFactory := informers.SharedInformerFactory() // resources we have to create informer first @@ -212,10 +231,14 @@ func WaitForResourceSync(stopCh <-chan struct{}) error { } for _, gvr := range k8sGVRs { - _, err := informerFactory.ForResource(gvr) - if err != nil { - klog.Errorf("cannot create informer for %s", gvr) - return err + if !isResourceExists(gvr) { + klog.Warningf("resource %s not exists in the cluster", gvr) + } else { + _, err := informerFactory.ForResource(gvr) + if err != nil { + klog.Errorf("cannot create informer for %s", gvr) + return err + } } } @@ -231,9 +254,13 @@ func WaitForResourceSync(stopCh <-chan struct{}) error { } for _, gvr := range s2iGVRs { - _, err := s2iInformerFactory.ForResource(gvr) - if err != nil { - return err + if !isResourceExists(gvr) { + klog.Warningf("resource %s not exists in the cluster", gvr) + } else { + _, err := s2iInformerFactory.ForResource(gvr) + if err != nil { + return err + } } } @@ -251,9 +278,13 @@ func WaitForResourceSync(stopCh <-chan struct{}) error { } for _, gvr := range ksGVRs { - _, err := ksInformerFactory.ForResource(gvr) - if err != nil { - return err + if !isResourceExists(gvr) { + klog.Warningf("resource %s not exists in the cluster", gvr) + } else { + _, err := ksInformerFactory.ForResource(gvr) + if err != nil { + return err + } } } diff --git a/pkg/simple/client/k8s/kubernetes.go b/pkg/simple/client/k8s/kubernetes.go index 2b5e1dbc8..eebf9d854 100644 --- a/pkg/simple/client/k8s/kubernetes.go +++ b/pkg/simple/client/k8s/kubernetes.go @@ -2,6 +2,7 @@ package k8s import ( s2i "github.com/kubesphere/s2ioperator/pkg/client/clientset/versioned" + "k8s.io/client-go/discovery" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" @@ -12,6 +13,9 @@ type KubernetesClient struct { // kubernetes client interface k8s *kubernetes.Clientset + // discovery client + discoveryClient *discovery.DiscoveryClient + // generated clientset ks *kubesphere.Clientset @@ -33,11 +37,12 @@ func NewKubernetesClientOrDie(options *KubernetesOptions) *KubernetesClient { config.Burst = options.Burst k := &KubernetesClient{ - k8s: kubernetes.NewForConfigOrDie(config), - ks: kubesphere.NewForConfigOrDie(config), - s2i: s2i.NewForConfigOrDie(config), - master: config.Host, - config: config, + k8s: kubernetes.NewForConfigOrDie(config), + discoveryClient: discovery.NewDiscoveryClientForConfigOrDie(config), + ks: kubesphere.NewForConfigOrDie(config), + s2i: s2i.NewForConfigOrDie(config), + master: config.Host, + config: config, } if options.Master != "" { @@ -83,6 +88,10 @@ func (k *KubernetesClient) Kubernetes() kubernetes.Interface { return k.k8s } +func (k *KubernetesClient) Discovery() discovery.DiscoveryInterface { + return k.discoveryClient +} + func (k *KubernetesClient) KubeSphere() kubesphere.Interface { return k.ks }