feat(sshgate): reduce informer memory usage (#6347)

This commit is contained in:
zijiren
2025-12-16 17:07:12 +08:00
committed by GitHub
parent 1830013fc4
commit c09eeb0e80
+68 -4
View File
@@ -8,6 +8,7 @@ import (
"github.com/labring/sealos/service/sshgate/registry"
log "github.com/sirupsen/logrus"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/cache"
@@ -55,12 +56,23 @@ func (m *Manager) Start(ctx context.Context) error {
// Create a cancellable context for the informer lifecycle
ctx, m.cancel = context.WithCancel(ctx)
// Create informer factory
m.factory = informers.NewSharedInformerFactory(m.clientset, m.resyncPeriod)
// Create informer factory with label selector to only watch devbox resources
m.factory = informers.NewSharedInformerFactoryWithOptions(
m.clientset,
m.resyncPeriod,
informers.WithTweakListOptions(func(opts *metav1.ListOptions) {
opts.LabelSelector = registry.DevboxPartOfLabel + "=" + registry.DevboxPartOfValue
}),
)
// Setup secret informer
// Setup secret informer with transform to minimize memory usage
secretInformer := m.factory.Core().V1().Secrets().Informer()
// Transform secret to only keep required fields
if err := secretInformer.SetTransform(transformSecret); err != nil {
return fmt.Errorf("failed to set secret transform: %w", err)
}
_, err := secretInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: m.handleSecretAdd,
UpdateFunc: m.handleSecretUpdate,
@@ -70,9 +82,14 @@ func (m *Manager) Start(ctx context.Context) error {
return err
}
// Setup pod informer
// Setup pod informer with transform to minimize memory usage
podInformer := m.factory.Core().V1().Pods().Informer()
// Transform pod to only keep required fields
if err := podInformer.SetTransform(transformPod); err != nil {
return fmt.Errorf("failed to set pod transform: %w", err)
}
_, err = podInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: m.handlePodAdd,
UpdateFunc: m.handlePodUpdate,
@@ -224,3 +241,50 @@ func (m *Manager) handlePodDelete(obj any) {
m.registry.DeletePod(pod)
}
// transformSecret transforms a Secret to only keep required fields, reducing memory usage
func transformSecret(obj any) (any, error) {
secret, ok := obj.(*corev1.Secret)
if !ok {
return nil, fmt.Errorf("expected *corev1.Secret, got %T", obj)
}
// Only keep required data fields
minData := make(map[string][]byte, 2)
if v, ok := secret.Data[registry.DevboxPublicKeyField]; ok {
minData[registry.DevboxPublicKeyField] = v
}
if v, ok := secret.Data[registry.DevboxPrivateKeyField]; ok {
minData[registry.DevboxPrivateKeyField] = v
}
return &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: secret.Name,
Namespace: secret.Namespace,
Labels: secret.Labels,
OwnerReferences: secret.OwnerReferences,
},
Data: minData,
}, nil
}
// transformPod transforms a Pod to only keep required fields, reducing memory usage
func transformPod(obj any) (any, error) {
pod, ok := obj.(*corev1.Pod)
if !ok {
return nil, fmt.Errorf("expected *corev1.Pod, got %T", obj)
}
return &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: pod.Name,
Namespace: pod.Namespace,
Labels: pod.Labels,
OwnerReferences: pod.OwnerReferences,
},
Status: corev1.PodStatus{
PodIP: pod.Status.PodIP,
},
}, nil
}