backup-system: barrido semanal de imágenes containerd por nodo
El worker llegó al 80,9% de disco: 223 imágenes para ~20 pods, 62 GB en containerd. Cada build de CI publica un tag y nadie recoge los viejos — 97 tags de researchowl y 105 de polymarket-bot, decomisada en julio. El GC de kubelet no basta: solo entra al 85% de imagefs, o sea cuando ya no queda sitio. Un prune manual dejó el worker en 23% (54 GB) y el master en 15% (58 GB). Un CronJob por nodo porque un CronJob programa un solo pod; el nodo se fija con nodeSelector. Domingos 06:30 y 07:15, el hueco entre backups. El script hace varias pasadas a propósito: borrar snapshots satura a containerd y las llamadas siguientes dan DeadlineExceeded. No es fallo, es cola. Se reintenta mirando la salida, no el código de retorno, porque crictl devuelve 0 aunque haya borrados fallidos. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
# Un CronJob por nodo a propósito: un CronJob programa UN pod, así que para
|
||||
# barrer los dos nodos hacen falta dos objetos fijados con nodeSelector. Un
|
||||
# DaemonSet no vale (no tiene calendario) y dejarlo suelto lo mandaría siempre
|
||||
# al mismo sitio. Si se añade un nodo al cluster, hay que añadirlo aquí.
|
||||
#
|
||||
# Domingos a las 06:30 y 07:15, escalonados. Es el hueco libre: los backups
|
||||
# diarios ocupan 02:00, 03:00, 03:30, 04:00 y 05:00, y n8n-workflow-monitor y
|
||||
# renovate caen cada 6 h en punto (00, 06, 12, 18). El prune castiga el disco
|
||||
# y no interesa que coincida con nada que esté copiando datos.
|
||||
apiVersion: batch/v1
|
||||
kind: CronJob
|
||||
metadata:
|
||||
name: image-prune-n97
|
||||
namespace: backup-system
|
||||
spec:
|
||||
schedule: "30 6 * * 0"
|
||||
concurrencyPolicy: Forbid
|
||||
successfulJobsHistoryLimit: 3
|
||||
failedJobsHistoryLimit: 1
|
||||
jobTemplate:
|
||||
spec:
|
||||
# Sin reintentos: si una pasada se queda a medias, el barrido de la semana
|
||||
# siguiente recoge lo que quedó. Nada urgente que reintentar en caliente.
|
||||
backoffLimit: 0
|
||||
activeDeadlineSeconds: 2400
|
||||
template:
|
||||
spec:
|
||||
restartPolicy: Never
|
||||
automountServiceAccountToken: false
|
||||
nodeSelector:
|
||||
kubernetes.io/hostname: chemavx-n97
|
||||
containers:
|
||||
- name: image-prune
|
||||
image: busybox:1.38.0
|
||||
command: ["/bin/sh", "/scripts/image-prune.sh"]
|
||||
securityContext:
|
||||
# privileged + runAsUser 0: el script hace chroot al host para usar
|
||||
# el crictl del binario de k3s y su socket de containerd.
|
||||
privileged: true
|
||||
runAsUser: 0
|
||||
resources:
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 64Mi
|
||||
limits:
|
||||
cpu: "1"
|
||||
memory: 256Mi
|
||||
volumeMounts:
|
||||
- name: host-root
|
||||
mountPath: /host
|
||||
- name: scripts
|
||||
mountPath: /scripts
|
||||
volumes:
|
||||
- name: host-root
|
||||
hostPath:
|
||||
path: /
|
||||
type: Directory
|
||||
- name: scripts
|
||||
configMap:
|
||||
name: image-prune-script
|
||||
defaultMode: 0755
|
||||
---
|
||||
apiVersion: batch/v1
|
||||
kind: CronJob
|
||||
metadata:
|
||||
name: image-prune-k8
|
||||
namespace: backup-system
|
||||
spec:
|
||||
schedule: "15 7 * * 0"
|
||||
concurrencyPolicy: Forbid
|
||||
successfulJobsHistoryLimit: 3
|
||||
failedJobsHistoryLimit: 1
|
||||
jobTemplate:
|
||||
spec:
|
||||
backoffLimit: 0
|
||||
activeDeadlineSeconds: 2400
|
||||
template:
|
||||
spec:
|
||||
restartPolicy: Never
|
||||
automountServiceAccountToken: false
|
||||
nodeSelector:
|
||||
kubernetes.io/hostname: chemavx-k8
|
||||
containers:
|
||||
- name: image-prune
|
||||
image: busybox:1.38.0
|
||||
command: ["/bin/sh", "/scripts/image-prune.sh"]
|
||||
securityContext:
|
||||
privileged: true
|
||||
runAsUser: 0
|
||||
resources:
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 64Mi
|
||||
limits:
|
||||
cpu: "1"
|
||||
memory: 256Mi
|
||||
volumeMounts:
|
||||
- name: host-root
|
||||
mountPath: /host
|
||||
- name: scripts
|
||||
mountPath: /scripts
|
||||
volumes:
|
||||
- name: host-root
|
||||
hostPath:
|
||||
path: /
|
||||
type: Directory
|
||||
- name: scripts
|
||||
configMap:
|
||||
name: image-prune-script
|
||||
defaultMode: 0755
|
||||
Reference in New Issue
Block a user