From 25274b26d92b847df5eeb7c00281b16af8488c51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Wanzenb=C3=B6ck?= Date: Tue, 15 Oct 2024 15:34:01 +0200 Subject: [PATCH] lower memory usage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We keep track of of all Pods in the cluster, while only caring about a small subset of them. Since we only need very basic information from the Pod, we can lower memory usage by ensuring we only store information we actually care about. Signed-off-by: Moritz Wanzenböck --- CHANGELOG.md | 4 ++++ pkg/agent/agent.go | 8 ++++++++ pkg/cleaners/pods.go | 48 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 pkg/cleaners/pods.go diff --git a/CHANGELOG.md b/CHANGELOG.md index a3dd758..9123103 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Filter Pod objects before storing in cache. This lowers memory usage of the HA Controller Pods. + ## [1.2.1] - 2024-03-28 ### Fixed diff --git a/pkg/agent/agent.go b/pkg/agent/agent.go index af54e72..cf14979 100644 --- a/pkg/agent/agent.go +++ b/pkg/agent/agent.go @@ -27,6 +27,7 @@ import ( "k8s.io/client-go/tools/events" "k8s.io/klog/v2" + "github.com/piraeusdatastore/piraeus-ha-controller/pkg/cleaners" "github.com/piraeusdatastore/piraeus-ha-controller/pkg/indexers" "github.com/piraeusdatastore/piraeus-ha-controller/pkg/metadata" ) @@ -135,7 +136,14 @@ func NewAgent(opt *Options) (*agent, error) { klog.V(2).Info("setting up Pod informer") + requirements, _ := opt.SatellitePodSelector.Requirements() podInformer := informerFactory.Core().V1().Pods().Informer() + err = podInformer.SetTransform(func(o any) (any, error) { + return cleaners.CleanPod(o.(*corev1.Pod), requirements), nil + }) + if err != nil { + return nil, err + } err = podInformer.AddIndexers(map[string]cache.IndexFunc{ PodByPersistentVolumeClaimIndex: indexers.Gen(func(obj *corev1.Pod) ([]string, error) { diff --git a/pkg/cleaners/pods.go b/pkg/cleaners/pods.go new file mode 100644 index 0000000..ab9c97b --- /dev/null +++ b/pkg/cleaners/pods.go @@ -0,0 +1,48 @@ +package cleaners + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + + "github.com/piraeusdatastore/piraeus-ha-controller/pkg/metadata" +) + +func CleanPod(pod *corev1.Pod, labelRequirements labels.Requirements) *corev1.Pod { + neededLabels := map[string]string{} + for i := range labelRequirements { + k := labelRequirements[i].Key() + if v, ok := pod.Labels[k]; ok { + neededLabels[k] = v + } + } + + neededAnnotations := map[string]string{} + if v, ok := pod.Annotations[metadata.AnnotationIgnoreFailOver]; ok { + neededAnnotations[metadata.AnnotationIgnoreFailOver] = v + } + + return &corev1.Pod{ + TypeMeta: pod.TypeMeta, + ObjectMeta: metav1.ObjectMeta{ + Name: pod.Name, + Namespace: pod.Namespace, + UID: pod.UID, + ResourceVersion: pod.ResourceVersion, + Labels: neededLabels, + Annotations: neededAnnotations, + OwnerReferences: pod.OwnerReferences, + DeletionTimestamp: pod.DeletionTimestamp, + }, + Spec: corev1.PodSpec{ + // Used in "agent", "failover", "force io error pods" and "suspeded pod termination". + NodeName: pod.Spec.NodeName, + // Used in "agent" and "failover". + Volumes: pod.Spec.Volumes, + }, + Status: corev1.PodStatus{ + // Used in "failover" and "suspended pod termination". + Phase: pod.Status.Phase, + }, + } +}