From 3dda969784ac93887ca277e3b85afe7df3c8b40a Mon Sep 17 00:00:00 2001 From: riotpiaole <19826264+Riotpiaole@users.noreply.github.com> Date: Mon, 22 Jun 2026 12:22:55 -0700 Subject: [PATCH] fix: align GOMEMLIMIT with pod memory limits and force fresh image pulls Go's GC doesn't respect cgroup memory limits on its own, risking OOMKill under load; set GOMEMLIMIT to ~90% of each deployment's resources.limits.memory. Also switch imagePullPolicy to Always so :latest tags aren't served stale from node-local cache after a new push. --- k8s/charts/management-service/templates/deployment.yaml | 3 +++ k8s/charts/management-service/values.yaml | 8 +++++++- k8s/charts/queue-crd/templates/operator-deployment.yaml | 2 ++ k8s/charts/queue-crd/values.yaml | 5 ++++- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/k8s/charts/management-service/templates/deployment.yaml b/k8s/charts/management-service/templates/deployment.yaml index b3250fa..a5af206 100644 --- a/k8s/charts/management-service/templates/deployment.yaml +++ b/k8s/charts/management-service/templates/deployment.yaml @@ -22,6 +22,9 @@ spec: containerPort: {{ .Values.grpcPort }} - name: http containerPort: {{ .Values.httpPort }} + env: + - name: GOMEMLIMIT + value: {{ .Values.goMemLimit | quote }} envFrom: - configMapRef: name: management-service-config diff --git a/k8s/charts/management-service/values.yaml b/k8s/charts/management-service/values.yaml index 00ee3c5..33844a7 100644 --- a/k8s/charts/management-service/values.yaml +++ b/k8s/charts/management-service/values.yaml @@ -4,7 +4,7 @@ replicaCount: 2 image: repository: forgejo.riotpiao.homelab.com/rock/kafka-management-service tag: latest - pullPolicy: IfNotPresent + pullPolicy: Always grpcPort: 9090 httpPort: 8080 @@ -23,6 +23,12 @@ resources: cpu: "1" memory: 512Mi +# Go's GC only reacts to GOGC by default and has no idea about the cgroup +# memory limit above -- it'll happily grow heap until the kernel OOMKills it. +# Setting GOMEMLIMIT to ~90% of the container limit makes the GC self-throttle +# before that happens. Keep this in sync with resources.limits.memory. +goMemLimit: "460MiB" + hpa: enabled: true minReplicas: 2 diff --git a/k8s/charts/queue-crd/templates/operator-deployment.yaml b/k8s/charts/queue-crd/templates/operator-deployment.yaml index b7b5b9e..3f886ca 100644 --- a/k8s/charts/queue-crd/templates/operator-deployment.yaml +++ b/k8s/charts/queue-crd/templates/operator-deployment.yaml @@ -23,5 +23,7 @@ spec: value: {{ .Values.kafkaBrokers | quote }} - name: KMSVC_REDIS_ADDR value: {{ .Values.redisAddr | quote }} + - name: GOMEMLIMIT + value: {{ .Values.goMemLimit | quote }} resources: {{- toYaml .Values.resources | nindent 12 }} diff --git a/k8s/charts/queue-crd/values.yaml b/k8s/charts/queue-crd/values.yaml index fc2b8c1..1069077 100644 --- a/k8s/charts/queue-crd/values.yaml +++ b/k8s/charts/queue-crd/values.yaml @@ -3,7 +3,7 @@ namespace: sqs image: repository: forgejo.riotpiao.homelab.com/rock/kafka-management-service-queue-operator tag: latest - pullPolicy: IfNotPresent + pullPolicy: Always kafkaBrokers: "kmsvc-kafka-bootstrap.sqs.svc.cluster.local:9092" redisAddr: "kmsvc-redis-master.sqs.svc.cluster.local:6379" @@ -15,3 +15,6 @@ resources: limits: cpu: 500m memory: 256Mi + +# See management-service/values.yaml's goMemLimit comment -- same reasoning. +goMemLimit: "230MiB"