Skip to content

Commit 37c8b43

Browse files
committed
auto detect okg and agones
Signed-off-by: roc <[email protected]>
1 parent ff0f7ec commit 37c8b43

File tree

7 files changed

+139
-22
lines changed

7 files changed

+139
-22
lines changed

cmd/app/discovery.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package app
2+
3+
import (
4+
agonesv1 "agones.dev/agones/pkg/apis/agones/v1"
5+
"github.com/imroc/tke-extend-network-controller/pkg/clusterinfo"
6+
gamekruiseiov1alpha1 "github.com/openkruise/kruise-game/apis/v1alpha1"
7+
"github.com/pkg/errors"
8+
"k8s.io/apimachinery/pkg/api/meta"
9+
"k8s.io/apimachinery/pkg/runtime/schema"
10+
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
11+
"k8s.io/client-go/discovery"
12+
memory "k8s.io/client-go/discovery/cached"
13+
"k8s.io/client-go/rest"
14+
"k8s.io/client-go/restmapper"
15+
)
16+
17+
// 手动创建 RESTMapper
18+
func createRESTMapper(config *rest.Config) (meta.RESTMapper, error) {
19+
// 1. 创建 Discovery 客户端
20+
dc, err := discovery.NewDiscoveryClientForConfig(config)
21+
if err != nil {
22+
return nil, err
23+
}
24+
25+
// 2. 创建带内存缓存的 Discovery 客户端(提高性能)
26+
cachedClient := memory.NewMemCacheClient(dc)
27+
28+
// 3. 创建延迟加载的 RESTMapper
29+
mapper := restmapper.NewDeferredDiscoveryRESTMapper(cachedClient)
30+
31+
return mapper, nil
32+
}
33+
34+
func InitOptionalScheme(config *rest.Config) error {
35+
restMapper, err := createRESTMapper(config)
36+
if err != nil {
37+
return errors.WithStack(err)
38+
}
39+
if err := initAgonesScheme(restMapper); err != nil {
40+
return errors.WithStack(err)
41+
}
42+
if err := initOKGScheme(restMapper); err != nil {
43+
return errors.WithStack(err)
44+
}
45+
return nil
46+
}
47+
48+
func initAgonesScheme(restMapper meta.RESTMapper) error {
49+
agonesGVK := schema.GroupVersionKind{
50+
Group: "agones.dev",
51+
Version: "v1",
52+
Kind: "GameServer",
53+
}
54+
// 检查 CRD 是否存在
55+
if installed, err := isCRDInstalled(restMapper, agonesGVK); err != nil {
56+
return errors.WithStack(err)
57+
} else if installed {
58+
utilruntime.Must(agonesv1.AddToScheme(scheme))
59+
clusterinfo.AgonesSupported = true
60+
setupLog.Info("agones CRD discovered, will enable agones support")
61+
}
62+
return nil
63+
}
64+
65+
func initOKGScheme(restMapper meta.RESTMapper) error {
66+
okgGVK := schema.GroupVersionKind{
67+
Group: "game.kruise.io",
68+
Version: "v1alpha1",
69+
Kind: "GameServerSet",
70+
}
71+
// 检查 CRD 是否存在
72+
if installed, err := isCRDInstalled(restMapper, okgGVK); err != nil {
73+
return errors.WithStack(err)
74+
} else if installed {
75+
utilruntime.Must(gamekruiseiov1alpha1.AddToScheme(scheme))
76+
clusterinfo.OKGSupported = true
77+
setupLog.Info("OpenKruiseGame CRD discovered, will enable OpenKruiseGame support")
78+
}
79+
return nil
80+
}
81+
82+
// 检查 CRD 是否存在的函数
83+
func isCRDInstalled(restMapper meta.RESTMapper, gvk schema.GroupVersionKind) (bool, error) {
84+
_, err := restMapper.RESTMapping(gvk.GroupKind(), gvk.Version)
85+
if err != nil {
86+
if meta.IsNoMatchError(err) {
87+
return false, nil
88+
}
89+
return false, errors.WithStack(err)
90+
}
91+
return true, nil
92+
}

cmd/app/manager.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919

2020
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
2121
// to ensure that exec-entrypoint and run can make use of them.
22+
2223
_ "k8s.io/client-go/plugin/pkg/client/auth"
2324
)
2425

@@ -61,17 +62,24 @@ func runManager() {
6162
probeAddr := viper.GetString(healthProbeBindAddressFlag)
6263
enableLeaderElection := viper.GetBool(leaderElectFlag)
6364

65+
cfg := ctrl.GetConfigOrDie()
66+
if err := InitOptionalScheme(cfg); err != nil {
67+
setupLog.Error(err, "unable to init optional scheme")
68+
os.Exit(1)
69+
}
70+
71+
opts := manager.GetOptions(scheme, metricsAddr, probeAddr, enableLeaderElection)
6472
mgr, err := ctrl.NewManager(
6573
ctrl.GetConfigOrDie(),
66-
manager.GetOptions(scheme, metricsAddr, probeAddr, enableLeaderElection),
74+
opts,
6775
)
6876
if err != nil {
6977
setupLog.Error(err, "unable to create manager")
7078
os.Exit(1)
7179
}
7280

7381
// setup manager
74-
SetupManager(mgr)
82+
SetupManager(mgr, opts)
7583

7684
// TODO: remove the tricky code in the future
7785
networkingv1alpha1.Init(mgr)

cmd/app/setup_controller.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/imroc/tke-extend-network-controller/internal/clbbinding"
77
"github.com/imroc/tke-extend-network-controller/internal/controller"
8+
"github.com/imroc/tke-extend-network-controller/pkg/clusterinfo"
89
"github.com/imroc/tke-extend-network-controller/pkg/util"
910
ctrl "sigs.k8s.io/controller-runtime"
1011
)
@@ -68,11 +69,13 @@ func SetupControllers(mgr ctrl.Manager) {
6869
}
6970

7071
// GameServerSet controller
71-
if err := (&controller.GameServerSetReconciler{
72-
Client: mgr.GetClient(),
73-
Scheme: mgr.GetScheme(),
74-
}).SetupWithManager(mgr); err != nil {
75-
setupLog.Error(err, "unable to create controller", "controller", "GameServerSet")
76-
os.Exit(1)
72+
if clusterinfo.OKGSupported {
73+
if err := (&controller.GameServerSetReconciler{
74+
Client: mgr.GetClient(),
75+
Scheme: mgr.GetScheme(),
76+
}).SetupWithManager(mgr); err != nil {
77+
setupLog.Error(err, "unable to create controller", "controller", "GameServerSet")
78+
os.Exit(1)
79+
}
7780
}
7881
}

cmd/app/setup_manager.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,16 @@ import (
44
"context"
55
"os"
66

7-
agonesv1 "agones.dev/agones/pkg/apis/agones/v1"
87
networkingv1alpha1 "github.com/imroc/tke-extend-network-controller/api/v1alpha1"
98
"github.com/imroc/tke-extend-network-controller/internal/portpool"
10-
kruisegamev1alpha1 "github.com/openkruise/kruise-game/apis/v1alpha1"
119
"k8s.io/apimachinery/pkg/runtime"
1210
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1311
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
1412
"k8s.io/client-go/tools/record"
1513
ctrl "sigs.k8s.io/controller-runtime"
1614
"sigs.k8s.io/controller-runtime/pkg/client"
1715
"sigs.k8s.io/controller-runtime/pkg/healthz"
16+
"sigs.k8s.io/controller-runtime/pkg/manager"
1817
)
1918

2019
var scheme = runtime.NewScheme()
@@ -23,11 +22,11 @@ func init() {
2322
// Add API to schema
2423
utilruntime.Must(clientgoscheme.AddToScheme(scheme)) // k8s native resources
2524
utilruntime.Must(networkingv1alpha1.AddToScheme(scheme)) // tke-extend-network-controller CRDs
26-
utilruntime.Must(kruisegamev1alpha1.AddToScheme(scheme)) // OKG CRDs
27-
utilruntime.Must(agonesv1.AddToScheme(scheme)) // Agones CRDs
25+
// utilruntime.Must(kruisegamev1alpha1.AddToScheme(scheme)) // OKG CRDs
26+
// utilruntime.Must(agonesv1.AddToScheme(scheme)) // Agones CRDs
2827
}
2928

30-
func SetupManager(mgr ctrl.Manager) {
29+
func SetupManager(mgr ctrl.Manager, opts manager.Options) {
3130
if err := mgr.Add(&initCache{mgr.GetClient(), mgr.GetEventRecorderFor("clbportpool-controller")}); err != nil {
3231
setupLog.Error(err, "problem add init cache")
3332
os.Exit(1)

internal/controller/clbbinding.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/imroc/tke-extend-network-controller/internal/clbbinding"
2929
"github.com/imroc/tke-extend-network-controller/internal/portpool"
3030
"github.com/imroc/tke-extend-network-controller/pkg/clb"
31+
"github.com/imroc/tke-extend-network-controller/pkg/clusterinfo"
3132
"github.com/imroc/tke-extend-network-controller/pkg/kube"
3233
"github.com/imroc/tke-extend-network-controller/pkg/util"
3334
"github.com/pkg/errors"
@@ -561,6 +562,11 @@ func patchResult(ctx context.Context, c client.Client, obj client.Object, result
561562
}
562563
log.FromContext(ctx).V(3).Info("patch clb port mapping result success", "value", string(result))
563564
}
565+
566+
if !clusterinfo.AgonesSupported { // 没安装 agones,不做后续处理
567+
return nil
568+
}
569+
564570
// 如果关联了 agones 的 gameserver,也给把 result 注解 patch 到 gameserver 上
565571
labels := obj.GetLabels()
566572
if labels == nil {

pkg/clusterinfo/clusterinfo.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
package clusterinfo
22

33
var Region, VpcId, ClusterId string
4+
5+
var (
6+
AgonesSupported bool
7+
OKGSupported bool
8+
)

pkg/manager/options.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ import (
66
"sigs.k8s.io/controller-runtime/pkg/cache"
77
"sigs.k8s.io/controller-runtime/pkg/client"
88

9-
agonesv1 "agones.dev/agones/pkg/apis/agones/v1"
109
corev1 "k8s.io/api/core/v1"
1110

11+
agonesv1 "agones.dev/agones/pkg/apis/agones/v1"
12+
"github.com/imroc/tke-extend-network-controller/pkg/clusterinfo"
1213
"github.com/imroc/tke-extend-network-controller/pkg/kube"
1314
"k8s.io/apimachinery/pkg/runtime"
1415
"sigs.k8s.io/controller-runtime/pkg/manager"
@@ -24,16 +25,19 @@ func GetOptions(scheme *runtime.Scheme, metricsAddr, probeAddr string, enableLea
2425
TLSOpts: tlsOpts,
2526
})
2627

28+
byObject := map[client.Object]cache.ByObject{}
29+
byObject[&corev1.Pod{}] = cache.ByObject{
30+
Transform: kube.StripPodUnusedFields,
31+
}
32+
if clusterinfo.AgonesSupported {
33+
byObject[&agonesv1.GameServer{}] = cache.ByObject{
34+
Transform: kube.StripAgonesGameServerUnusedFields,
35+
}
36+
}
37+
2738
return manager.Options{
2839
Cache: cache.Options{
29-
ByObject: map[client.Object]cache.ByObject{
30-
&corev1.Pod{}: {
31-
Transform: kube.StripPodUnusedFields,
32-
},
33-
&agonesv1.GameServer{}: {
34-
Transform: kube.StripAgonesGameServerUnusedFields,
35-
},
36-
},
40+
ByObject: byObject,
3741
},
3842
Scheme: scheme,
3943
// Metrics endpoint is enabled in 'config/default/kustomization.yaml'. The Metrics options configure the server.

0 commit comments

Comments
 (0)