Skip to content

Commit 273906e

Browse files
committed
fix namespaced kruise-controller panic due to multiNamespaceCache
Signed-off-by: joey <[email protected]>
1 parent fcc9c1b commit 273906e

File tree

5 files changed

+62
-19
lines changed

5 files changed

+62
-19
lines changed

main.go

+12-6
Original file line numberDiff line numberDiff line change
@@ -247,19 +247,25 @@ func main() {
247247
setupLog.Error(err, "unable to wait webhook ready")
248248
os.Exit(1)
249249
}
250-
251-
setupLog.Info("setup controllers")
252-
if err = controller.SetupWithManager(mgr); err != nil {
253-
setupLog.Error(err, "unable to setup controllers")
254-
os.Exit(1)
255-
}
256250
}()
257251

252+
setupLog.Info("setup controllers")
253+
if err = controller.SetupWithManager(mgr); err != nil {
254+
setupLog.Error(err, "unable to setup controllers")
255+
os.Exit(1)
256+
}
257+
258258
setupLog.Info("starting manager")
259259
if err := mgr.Start(ctx); err != nil {
260260
setupLog.Error(err, "problem running manager")
261261
os.Exit(1)
262262
}
263+
264+
setupLog.Info("setup controllers that need manager started")
265+
if err = controller.SetupAfterStart(mgr); err != nil {
266+
setupLog.Error(err, "unable to setup controllers after manager start")
267+
os.Exit(1)
268+
}
263269
}
264270

265271
func setRestConfig(c *rest.Config) {

pkg/controller/controllers.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import (
4444
)
4545

4646
var controllerAddFuncs []func(manager.Manager) error
47+
var controllerAddAfterStarts []func(manager.Manager) error
4748

4849
func init() {
4950
controllerAddFuncs = append(controllerAddFuncs, advancedcronjob.Add)
@@ -58,15 +59,16 @@ func init() {
5859
controllerAddFuncs = append(controllerAddFuncs, statefulset.Add)
5960
controllerAddFuncs = append(controllerAddFuncs, uniteddeployment.Add)
6061
controllerAddFuncs = append(controllerAddFuncs, podunavailablebudget.Add)
61-
controllerAddFuncs = append(controllerAddFuncs, workloadspread.Add)
6262
controllerAddFuncs = append(controllerAddFuncs, resourcedistribution.Add)
6363
controllerAddFuncs = append(controllerAddFuncs, ephemeraljob.Add)
6464
controllerAddFuncs = append(controllerAddFuncs, containerlauchpriority.Add)
65-
controllerAddFuncs = append(controllerAddFuncs, persistentpodstate.Add)
6665
controllerAddFuncs = append(controllerAddFuncs, sidecarterminator.Add)
6766
controllerAddFuncs = append(controllerAddFuncs, podprobemarker.Add)
6867
controllerAddFuncs = append(controllerAddFuncs, nodepodprobe.Add)
6968
controllerAddFuncs = append(controllerAddFuncs, imagelistpulljob.Add)
69+
70+
controllerAddAfterStarts = append(controllerAddAfterStarts, workloadspread.Add)
71+
controllerAddAfterStarts = append(controllerAddAfterStarts, persistentpodstate.Add)
7072
}
7173

7274
func SetupWithManager(m manager.Manager) error {
@@ -81,3 +83,16 @@ func SetupWithManager(m manager.Manager) error {
8183
}
8284
return nil
8385
}
86+
87+
func SetupAfterStart(m manager.Manager) error {
88+
for _, f := range controllerAddAfterStarts {
89+
if err := f(m); err != nil {
90+
if kindMatchErr, ok := err.(*meta.NoKindMatchError); ok {
91+
klog.InfoS("CRD is not installed, its controller will perform noops!", "CRD", kindMatchErr.GroupKind)
92+
continue
93+
}
94+
return err
95+
}
96+
}
97+
return nil
98+
}

pkg/controller/daemonset/daemonset_controller.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import (
4040
v1core "k8s.io/client-go/kubernetes/typed/core/v1"
4141
appslisters "k8s.io/client-go/listers/apps/v1"
4242
corelisters "k8s.io/client-go/listers/core/v1"
43-
"k8s.io/client-go/tools/cache"
4443
"k8s.io/client-go/tools/record"
4544
"k8s.io/client-go/util/flowcontrol"
4645
"k8s.io/client-go/util/retry"
@@ -66,6 +65,7 @@ import (
6665
kruiseclientset "github.com/openkruise/kruise/pkg/client/clientset/versioned"
6766
"github.com/openkruise/kruise/pkg/client/clientset/versioned/scheme"
6867
kruiseappslisters "github.com/openkruise/kruise/pkg/client/listers/apps/v1alpha1"
68+
controllerutil "github.com/openkruise/kruise/pkg/controller/util"
6969
"github.com/openkruise/kruise/pkg/features"
7070
kruiseutil "github.com/openkruise/kruise/pkg/util"
7171
utilclient "github.com/openkruise/kruise/pkg/util/client"
@@ -172,10 +172,10 @@ func newReconciler(mgr manager.Manager) (reconcile.Reconciler, error) {
172172
return nil, err
173173
}
174174

175-
dsLister := kruiseappslisters.NewDaemonSetLister(dsInformer.(cache.SharedIndexInformer).GetIndexer())
176-
historyLister := appslisters.NewControllerRevisionLister(revInformer.(cache.SharedIndexInformer).GetIndexer())
177-
podLister := corelisters.NewPodLister(podInformer.(cache.SharedIndexInformer).GetIndexer())
178-
nodeLister := corelisters.NewNodeLister(nodeInformer.(cache.SharedIndexInformer).GetIndexer())
175+
dsLister := kruiseappslisters.NewDaemonSetLister(controllerutil.GetCacheIndexer(dsInformer))
176+
historyLister := appslisters.NewControllerRevisionLister(controllerutil.GetCacheIndexer(revInformer))
177+
podLister := corelisters.NewPodLister(controllerutil.GetCacheIndexer(podInformer))
178+
nodeLister := corelisters.NewNodeLister(controllerutil.GetCacheIndexer(nodeInformer))
179179
failedPodsBackoff := flowcontrol.NewBackOff(1*time.Second, 15*time.Minute)
180180
revisionAdapter := revisionadapter.NewDefaultImpl()
181181

pkg/controller/statefulset/statefulset_controller.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import (
3535
appslisters "k8s.io/client-go/listers/apps/v1"
3636
corelisters "k8s.io/client-go/listers/core/v1"
3737
storagelisters "k8s.io/client-go/listers/storage/v1"
38-
toolscache "k8s.io/client-go/tools/cache"
3938
"k8s.io/client-go/tools/record"
4039
"k8s.io/klog/v2"
4140
kubecontroller "k8s.io/kubernetes/pkg/controller"
@@ -54,6 +53,7 @@ import (
5453
"github.com/openkruise/kruise/pkg/client"
5554
kruiseclientset "github.com/openkruise/kruise/pkg/client/clientset/versioned"
5655
kruiseappslisters "github.com/openkruise/kruise/pkg/client/listers/apps/v1beta1"
56+
controllerutil "github.com/openkruise/kruise/pkg/controller/util"
5757
"github.com/openkruise/kruise/pkg/features"
5858
"github.com/openkruise/kruise/pkg/util"
5959
utilclient "github.com/openkruise/kruise/pkg/util/client"
@@ -133,10 +133,10 @@ func newReconciler(mgr manager.Manager) (reconcile.Reconciler, error) {
133133
return nil, err
134134
}
135135

136-
statefulSetLister := kruiseappslisters.NewStatefulSetLister(statefulSetInformer.(toolscache.SharedIndexInformer).GetIndexer())
137-
podLister := corelisters.NewPodLister(podInformer.(toolscache.SharedIndexInformer).GetIndexer())
138-
pvcLister := corelisters.NewPersistentVolumeClaimLister(pvcInformer.(toolscache.SharedIndexInformer).GetIndexer())
139-
scLister := storagelisters.NewStorageClassLister(scInformer.(toolscache.SharedIndexInformer).GetIndexer())
136+
statefulSetLister := kruiseappslisters.NewStatefulSetLister(controllerutil.GetCacheIndexer(statefulSetInformer))
137+
podLister := corelisters.NewPodLister(controllerutil.GetCacheIndexer(podInformer))
138+
pvcLister := corelisters.NewPersistentVolumeClaimLister(controllerutil.GetCacheIndexer(pvcInformer))
139+
scLister := storagelisters.NewStorageClassLister(controllerutil.GetCacheIndexer(scInformer))
140140

141141
genericClient := client.GetGenericClientWithName("statefulset-controller")
142142
eventBroadcaster := record.NewBroadcaster()
@@ -159,7 +159,7 @@ func newReconciler(mgr manager.Manager) (reconcile.Reconciler, error) {
159159
inplaceupdate.New(utilclient.NewClientFromManager(mgr, "statefulset-controller"), revisionadapter.NewDefaultImpl()),
160160
lifecycle.New(utilclient.NewClientFromManager(mgr, "statefulset-controller")),
161161
NewRealStatefulSetStatusUpdater(genericClient.KruiseClient, statefulSetLister),
162-
history.NewHistory(genericClient.KubeClient, appslisters.NewControllerRevisionLister(revInformer.(toolscache.SharedIndexInformer).GetIndexer())),
162+
history.NewHistory(genericClient.KubeClient, appslisters.NewControllerRevisionLister(controllerutil.GetCacheIndexer(revInformer))),
163163
recorder,
164164
),
165165
podControl: kubecontroller.RealPodControl{KubeClient: genericClient.KubeClient, Recorder: recorder},

pkg/controller/util/cache.go

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package util
2+
3+
import (
4+
"k8s.io/client-go/tools/cache"
5+
toolscache "sigs.k8s.io/controller-runtime/pkg/cache"
6+
)
7+
8+
func GetCacheIndexer(informer toolscache.Informer) cache.Indexer {
9+
switch informer.(type) {
10+
case cache.SharedIndexInformer:
11+
return informer.(cache.SharedIndexInformer).GetIndexer()
12+
case toolscache.Informer:
13+
indexers := cache.Indexers{}
14+
err := informer.(toolscache.Informer).AddIndexers(indexers)
15+
if err != nil {
16+
panic(err)
17+
}
18+
return cache.NewIndexer(cache.DeletionHandlingMetaNamespaceKeyFunc, indexers)
19+
default:
20+
panic("unknown informer type")
21+
}
22+
}

0 commit comments

Comments
 (0)