@@ -5,7 +5,10 @@ import (
5
5
"fmt"
6
6
7
7
"github.com/pkg/errors"
8
+ kubeinformers "k8s.io/client-go/informers"
9
+ "k8s.io/client-go/kubernetes"
8
10
"k8s.io/client-go/rest"
11
+ "k8s.io/client-go/tools/cache"
9
12
klogv2 "k8s.io/klog/v2"
10
13
11
14
"github.com/kosmos.io/kosmos/cmd/knode-manager/app/config"
@@ -14,51 +17,82 @@ import (
14
17
k8sadapter "github.com/kosmos.io/kosmos/pkg/knode-manager/adapters/k8s"
15
18
"github.com/kosmos.io/kosmos/pkg/knode-manager/controllers"
16
19
"github.com/kosmos.io/kosmos/pkg/knode-manager/utils"
20
+ "github.com/kosmos.io/kosmos/pkg/knode-manager/utils/manager"
17
21
)
18
22
19
23
type Knode struct {
24
+ client kubernetes.Interface
25
+ master kubernetes.Interface
26
+
20
27
podController * controllers.PodController
21
28
nodeController * controllers.NodeController
29
+
30
+ informerFactory kubeinformers.SharedInformerFactory
31
+
32
+ ac * k8sadapter.AdapterConfig
22
33
}
23
34
24
- func NewKnode (ctx context.Context , knode * kosmosv1alpha1.Knode , c * config.Opts ) (* Knode , error ) {
35
+ func NewKnode (ctx context.Context , knode * kosmosv1alpha1.Knode , cmdConfig * config.Opts ) (* Knode , error ) {
25
36
if len (knode .Spec .Kubeconfig ) == 0 {
26
37
return nil , fmt .Errorf ("kubeconfig of knode %s is empty" , knode .Name )
27
38
}
28
39
29
- mClient , err := utils .NewClientFromConfigPath (c .KubeConfigPath , func (config * rest.Config ) {
30
- config .QPS = c .KubeAPIQPS
31
- config .Burst = c .KubeAPIBurst
40
+ master , err := utils .NewClientFromConfigPath (cmdConfig .KubeConfigPath , func (config * rest.Config ) {
41
+ config .QPS = cmdConfig .KubeAPIQPS
42
+ config .Burst = cmdConfig .KubeAPIBurst
32
43
})
33
44
if err != nil {
34
45
return nil , fmt .Errorf ("could not build clientset for master cluster: %v" , err )
35
46
}
36
47
37
- wClient , err := utils .NewClientFromBytes (knode .Spec .Kubeconfig , func (config * rest.Config ) {
48
+ client , err := utils .NewClientFromBytes (knode .Spec .Kubeconfig , func (config * rest.Config ) {
38
49
config .QPS = knode .Spec .KubeAPIQPS
39
50
config .Burst = knode .Spec .KubeAPIBurst
40
51
})
41
52
if err != nil {
42
53
return nil , fmt .Errorf ("could not build clientset for worker cluster %s: %v" , knode .Name , err )
43
54
}
44
55
56
+ informer := kubeinformers .NewSharedInformerFactory (client , 0 )
57
+ podInformer := informer .Core ().V1 ().Pods ()
58
+ nsInformer := informer .Core ().V1 ().Namespaces ()
59
+ nodeInformer := informer .Core ().V1 ().Nodes ()
60
+ cmInformer := informer .Core ().V1 ().ConfigMaps ()
61
+ secretInformer := informer .Core ().V1 ().Secrets ()
62
+ serviceInformer := informer .Core ().V1 ().Services ()
63
+
64
+ rm , err := manager .NewResourceManager (podInformer .Lister (), secretInformer .Lister (), cmInformer .Lister (), serviceInformer .Lister ())
65
+ if err != nil {
66
+ return nil , errors .Wrap (err , "could not create resource manager" )
67
+ }
68
+
69
+ ac := & k8sadapter.AdapterConfig {
70
+ Client : client ,
71
+ Master : master ,
72
+ PodInformer : podInformer ,
73
+ NamespaceInformer : nsInformer ,
74
+ NodeInformer : nodeInformer ,
75
+ ConfigmapInformer : cmInformer ,
76
+ SecretInformer : secretInformer ,
77
+ ServiceInformer : serviceInformer ,
78
+ ResourceManager : rm ,
79
+ }
80
+
45
81
var podAdapter adapters.PodHandler
46
82
var nodeAdapter adapters.NodeHandler
47
83
if knode .Spec .Type == kosmosv1alpha1 .K8sAdapter {
48
- initConfig := k8sadapter.PodAdapterConfig {}
49
- podAdapter , err = k8sadapter .NewPodAdapter (initConfig , "" , & k8sadapter.ClientConfig {}, true )
84
+ podAdapter , err = k8sadapter .NewPodAdapter (ctx , ac , "" , & k8sadapter.ClientConfig {}, true )
50
85
if err != nil {
51
86
return nil , err
52
87
}
53
-
54
- nodeAdapter , err = k8sadapter .NewNodeAdapter (ctx , knode , wClient , mClient , c )
88
+ nodeAdapter , err = k8sadapter .NewNodeAdapter (ctx , knode , ac , cmdConfig )
55
89
if err != nil {
56
90
return nil , err
57
91
}
58
92
}
59
93
60
94
dummyNode := controllers .BuildDummyNode (ctx , knode , nodeAdapter )
61
- nc , err := controllers .NewNodeController (nodeAdapter , mClient , dummyNode )
95
+ nc , err := controllers .NewNodeController (nodeAdapter , master , dummyNode )
62
96
if err != nil {
63
97
return nil , err
64
98
}
@@ -71,15 +105,39 @@ func NewKnode(ctx context.Context, knode *kosmosv1alpha1.Knode, c *config.Opts)
71
105
}
72
106
73
107
return & Knode {
74
- podController : pc ,
75
- nodeController : nc ,
108
+ client : client ,
109
+ master : master ,
110
+ informerFactory : informer ,
111
+ ac : ac ,
112
+ podController : pc ,
113
+ nodeController : nc ,
76
114
}, nil
77
115
}
78
116
79
117
func (kn * Knode ) Run (ctx context.Context , c * config.Opts ) {
118
+ kn .informerFactory .Start (ctx .Done ())
119
+
120
+ if ! cache .WaitForCacheSync (ctx .Done (),
121
+ kn .ac .NodeInformer .Informer ().HasSynced ,
122
+ kn .ac .PodInformer .Informer ().HasSynced ,
123
+ kn .ac .ConfigmapInformer .Informer ().HasSynced ,
124
+ kn .ac .NamespaceInformer .Informer ().HasSynced ,
125
+ kn .ac .SecretInformer .Informer ().HasSynced ,
126
+ ) {
127
+ klogv2 .Fatal ("nodesInformer waitForCacheSync failed" )
128
+ }
129
+
80
130
go func () {
81
- if err := kn .podController .Run (ctx , c .PodSyncWorkers ); err != nil && errors .Cause (err ) != context .Canceled {
131
+ if err := kn .podController .Run (ctx , c .PodSyncWorkers ); err != nil && ! errors .Is ( errors . Cause (err ), context .Canceled ) {
82
132
klogv2 .Fatal (err )
83
133
}
84
134
}()
135
+
136
+ go func () {
137
+ if err := kn .nodeController .Run (ctx ); err != nil {
138
+ klogv2 .Fatal (err )
139
+ }
140
+ }()
141
+
142
+ <- ctx .Done ()
85
143
}
0 commit comments