From 472bb6e5b981fd57b1a972de73be9e7f75b416d4 Mon Sep 17 00:00:00 2001 From: chemavx Date: Wed, 12 Aug 2026 20:09:46 +0000 Subject: [PATCH] =?UTF-8?q?gitea-runner:=20sidecar=20que=20barre=20im?= =?UTF-8?q?=C3=A1genes=20hu=C3=A9rfanas=20en=20dind?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El pod fue desalojado el 2026-08-12 tras 21 días: el emptyDir de dind superó su límite de 10Gi. La caché de buildx no era la causa (los workflows hacen `buildx rm` al inicio de cada run y se recicla sola, ~330M). Lo que se acumula son imágenes sin tag: al republicar upstream catthehacker/ubuntu:act-22.04, la anterior (1,5G) queda colgada para siempre. Ni el GC de dockerd ni el de buildkit lo recogen porque ambos calculan su umbral contra el disco del nodo (913G), no contra el cap del pod. Nunca saltan antes del desalojo. El sidecar hace `docker image prune -f` cada 6h por localhost:2375. Sin -a: solo dangling, nunca una imagen con tag, así que la caché de act y la de buildkit siguen intactas y los builds no se frenan. Se descartó un CronJob externo: exigiría pods/exec o publicar el 2375 como Service, y ese puerto va sin TLS ni auth sobre un docker privilegiado. Co-Authored-By: Claude Opus 5 --- gitea/deployment-gitea-runner.yaml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/gitea/deployment-gitea-runner.yaml b/gitea/deployment-gitea-runner.yaml index fbf4449..1b70cf0 100644 --- a/gitea/deployment-gitea-runner.yaml +++ b/gitea/deployment-gitea-runner.yaml @@ -101,6 +101,36 @@ spec: name: runner-data - mountPath: /etc/act_runner name: runner-config + # Recolector de imágenes huérfanas. El emptyDir de dind está capado a 10Gi, + # pero el GC de dockerd y el de buildkit calculan su umbral contra el disco + # del nodo (913G), así que no saltan nunca antes del desalojo. El 2026-08-12 + # el pod fue desalojado tras 21 días por eso. Lo que se acumula son imágenes + # sin tag: cada vez que upstream republica catthehacker/ubuntu:act-22.04, la + # anterior (1,5G) queda colgada y nadie la borra. + # prune SIN -a a propósito: borra solo las dangling, jamás una imagen con tag, + # así que no vacía la caché de act ni la de buildkit y los builds no se frenan. + - args: + - | + while true; do + sleep 21600 + docker image prune -f || true + done + command: + - /bin/sh + - -c + env: + - name: DOCKER_HOST + value: tcp://localhost:2375 + image: docker:24.0.9-cli + imagePullPolicy: IfNotPresent + name: janitor + resources: + limits: + cpu: 100m + memory: 64Mi + requests: + cpu: 10m + memory: 32Mi dnsPolicy: ClusterFirst nodeSelector: kubernetes.io/hostname: chemavx-k8