Informe técnico: kzero v1.1.1

Infografía de producto kzero v1.1.1

kzero es un CLI en Go para mantenimiento fuera de banda en Kubernetes: pipelines ordenados down, up y reset desde YAML en un bastión o host de automatización. No es GitOps in-cluster. La imagen GHCR es distroless (solo el binario); el host sigue necesitando kubectl en el PATH (y helm cuando el perfil usa pasos release.* por shell).

v1.1.1 (2026-09-02) es un parche de seguridad sobre la línea 1.1.x (Go 1.26.6, sin cambios de esquema). Las capacidades funcionales descritas abajo corresponden sobre todo a v1.1.0.

En el stack operador Hermes, kzero orquesta el mantenimiento; groot (archivo de diagnóstico solo lectura) captura evidencia antes o después de la ventana — complementarios, no sustitutos. Ver §8.

1. Mantenimiento crítico y la «API enferma»

Cuando etcd, webhooks o el scheduler degradan la API, la automatización in-cluster (Argo CD, Flux) puede quedar paralizada. Una herramienta fuera de banda mantiene un camino de control independiente. Ver modelos de despliegue.

2. Por qué migrar desde Bash ad-hoc

Los scripts imperativos suelen fallar en producción por:

  • Falta de idempotencia — re-ejecutar tras un fallo parcial es arriesgado.
  • Sin dry-run nativo — simular impacto exige lógica custom por comando.
  • Errores frágiles — pérdidas transitorias de API abortan el script o se ignoran.
  • Auditoría débil — sin log estructurado por paso ni notify integrado.

kzero doctor comprueba el intérprete de shell cuando hay hooks (/bin/sh vs bash).

3. Ejemplo: script Bash típico

Ventana habitual: escalar ingesta a cero, suspender CronJob, Job de limpieza, upgrade Helm, restaurar servicios.

#!/bin/bash
set -eo pipefail

kubectl scale deployment/data-ingest --replicas=0 -n production
kubectl rollout status deployment/data-ingest -n production

kubectl patch cronjob/daily-reconcile -p '{"spec":{"suspend":true}}' -n production

kubectl delete job/storage-cleanup -n production --ignore-not-found
kubectl apply -f storage-cleanup-job.yaml
kubectl wait --for=condition=complete job/storage-cleanup --timeout=300s -n production

helm upgrade --install core-api ./charts/core-api --values prod-values.yaml -n production

kubectl scale deployment/data-ingest --replicas=3 -n production
kubectl patch cronjob/daily-reconcile -p '{"spec":{"suspend":false}}' -n production

Si kubectl wait falla por un corte transitorio, el clúster puede quedar a medias sin reanudación limpia.

4. Mapeo imperativo → declarativo

Bash / kubectl kzero v1.1.x Ventaja
kubectl scale deployment … --replicas=0 deployment.<ns>/<name> en pipelines.down Orden de pasos; hooks post para esperar drenado
kubectl patch cronjob … suspend cronjob.<ns>/<name> Suspend en down, resume en up
delete job + apply + wait job.<ns>/<name> Borrado en down; manifest: + wait_for_complete en up
helm upgrade --install … release.<ns>/<name> Helm SDK v4 con run.execution: native/auto
kubectl logs / evidencia ad hoc groot collect (opcional hooks.pre-down) Archivo .tar.gz solo lectura antes de mutar
Comprobaciones manuales kzero doctor, kzero analyze Preflight antes de mutar
Reintentos a mano Retry del motor + run.api_watchdog Cancela si la API no responde tras fail_after
curl a Slack notify.* Exit 4 con notify.require_delivery

Contrato: SPECIFICATIONS.md.

5. Perfil kzero equivalente (YAML válido)

Mismo escenario que §3, con referencias compactas del esquema real:

schema_version: "1.0"

cluster:
  name: maintenance-production
  environment: production

helm:
  workspace: ./helm-assets   # core-api.yaml para Helm SDK nativo

notify:
  require_delivery: true
  webhook:
    enabled: true
    url: "https://hooks.slack.com/services/…"

hooks:
  pre-down: ./hooks/groot-capture.sh   # opcional: groot collect antes de mutar
  on-error: ./hooks/groot-capture.sh   # opcional: segundo bundle si falla el pipeline

run:
  mode: dry-run
  execution: native
  api_watchdog:
    enabled: true
    fail_after: 30s

pipelines:
  down:
    - deployment.production/data-ingest
    - cronjob.production/daily-reconcile
    - job.production/storage-cleanup
  up:
    - job.production/storage-cleanup:
        manifest: ./jobs/storage-cleanup.yaml
        wait_for_complete: true
        timeout: 5m
    - release.production/core-api
    - deployment.production/data-ingest:
        replicas: 3
        wait_for_ready: true
    - cronjob.production/daily-reconcile

En down, los workloads escalan a 0 automáticamente. Más patrones: pvc-statefulset-data-strategy.md.

Ejemplos operador: kzero-selfhosted/run/examples.

6. Flujo de trabajo seguro

Ejecuta las compuertas antes de run.mode: live. En bastión de producción, captura evidencia con groot primero (o vía hooks.pre-down):

curl -fsSL https://get.kzero.hermesrodriguez.com/install.sh | sh
kzero --print-sample-config > ./kzero.yaml

# Recomendado: archivo solo lectura mientras el clúster sigue observable
groot collect -c ./groot.yaml -o ./evidence/pre-down-$(date +%Y%m%d-%H%M).tar.gz

kzero doctor -c ./kzero.yaml
kzero analyze -c ./kzero.yaml
kzero diff -c ./kzero.yaml --phase down

kzero down -c ./kzero.yaml
# … ventana de mantenimiento …
kzero up -c ./kzero.yaml
kzero diff -c ./kzero.yaml --phase up
Comando Propósito
groot collect (opcional) Logs/eventos/snapshot API → .tar.gz para RCA y tickets
doctor API, rutas de binarios, pistas RBAC, shell
analyze Plan estático + comprobaciones de objetos
diff Deseado vs live; exit 2 si hay drift
down / up / reset Ejecución live; api_watchdog cancela si la API cae

Wrapper para cron/CI:

kzero diff --config ./kzero.yaml --phase up || exit 2
kzero reset --config ./kzero.yaml

Cookbook: diff.md.

7. Códigos de salida

Código Significado Acción típica
0 Éxito Continuar
1 Config / validación Fallar CI; corregir YAML
2 Error Kubernetes o drift en diff Parar; revisar clúster
3 Aborto del ejecutor / hooks On-call; estado posiblemente parcial
4 Fallo de notify Con notify.require_delivery: true

8. Ecosistema Hermes: groot complementa a kzero

kzero muta el clúster (escala, Helm, Jobs, PVCs). groot es solo lectura: groot collect empaqueta logs de pods, eventos y snapshots de API en un .tar.gz para incidentes, RCA y cumplimiento. No sustituye a kzero — preserva cómo estaba el clúster antes del down / up.

Repo Rol
hrodrig/groot CLI: collect, validate, inspect; upload S3/GCS/SFTP opcional
groot-selfhosted Bastión, CronJob Helm, playbooks operador
groot-trigger HTTP in-cluster → Job con groot collect bajo demanda
groot-share (gfs) Catálogo VPS: ingest, listado, descarga, retención

Landing: groot.hermesrodriguez.com. Misma familia que pgwd (watchdog Postgres) y gghstats (analítica GitHub).

Los exit codes 0–4 de kzero siguen el patrón de groot exitcode.

9. Capacidades v1.1.0 (sin cambios en v1.1.1)

  • kzero diff, pasos nativos job/cronjob, Helm SDK v4, Cosign + SBOM.

v1.1.1: solo Go 1.26.6 — usar ghcr.io/hrodrig/kzero:v1.1.1.

10. Matriz comparativa

Capacidad kzero v1.1.1 GitOps Ansible Scripts shell
Arquitectura Fuera de banda In-cluster SSH externo Externo
Mantenimiento Pipelines YAML Reconciliación Playbooks Imperativo
Resiliencia API api_watchdog Depende de API Media Baja
Simulación analyze, dry-run, diff Preview sync check-mode Inexistente

11. Alcance y enlaces

kzero es un orquestador de mantenimiento discreto, no sustituto de Argo/Flux. Combínalo con groot cuando necesites un bundle de evidencia en la misma ventana.

Recurso Enlace
SPEC SPECIFICATIONS.md
Config de ejemplo kzero.sample.yml
Changelog CHANGELOG.md
kzero (mantenimiento) hrodrig/kzero · kzero-selfhosted
groot (archivo diagnóstico) hrodrig/groot · groot-selfhosted
groot ecosistema groot-trigger · groot-share
Operador kzero-selfhosted/run/examples