diff --git a/README.md b/README.md index 21f47b9..9fee262 100644 --- a/README.md +++ b/README.md @@ -352,3 +352,390 @@ DOCKER_BIN="$(command -v docker)" \ CURL_BIN="$(command -v curl)" \ sudo -E LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh install-autostart ``` + + +# Bootstrap GitOps completo v4.0 + +La versión v4.0 agrega dos piezas al laboratorio: + +1. **App-of-Apps** + - Aplica `root-apps-registry`. + - Fuente: `https://gitea.cruzcloud.net/devops/apps-registry.git`. + - Revisión: `main`. + - Ruta: `apps`. + - Espera las ocho Applications existentes en el repositorio. + - Informa cuáles siguen `Progressing`, `OutOfSync` o `Degraded`. + +2. **Gitea Actions runner persistente** + - Contenedor: `gitea-runner`. + - Registro persistente: `/DATA/AppData/k3d-lab/gitea-runner/data/.runner`. + - Monta `/var/run/docker.sock`. + - Política `unless-stopped`. + - Etiqueta compatible con `runs-on: ubuntu-latest`. + - El servicio systemd también valida y recupera el runner. + +## Primera adopción del runner existente + +Primero confirma que no haya un workflow activo y ejecuta: + +```bash +MIGRATE_EXISTING_RUNNER=true ./deploy-lab.sh runner +``` + +El script: + +- detecta la imagen actual; +- copia `/data` desde el contenedor existente; +- guarda `.runner` fuera del contenedor; +- recrea `gitea-runner` con el volumen persistente; +- no requiere un token nuevo si `.runner` pudo recuperarse. + +## Runner desde cero + +Obtén un token desde Gitea: + +```text +apps-registry -> Settings -> Actions -> Runners +``` + +Guárdalo sin mostrarlo: + +```bash +sudo install -d -m 0700 -o devops /DATA/AppData/k3d-lab/secrets +sudo sh -c 'umask 077; cat > /DATA/AppData/k3d-lab/secrets/gitea-runner-registration-token' +``` + +Pega únicamente el token y finaliza con `Ctrl+D`. Después: + +```bash +sudo chown devops /DATA/AppData/k3d-lab/secrets/gitea-runner-registration-token +sudo chmod 0600 /DATA/AppData/k3d-lab/secrets/gitea-runner-registration-token +./deploy-lab.sh runner +``` + +El token solo se utiliza para generar `/data/.runner`. El contenedor permanente no conserva el token de registro como variable de entorno. + +## Repositorio privado de Argo CD + +Cuando `apps-registry` sea privado, crea: + +```bash +sudo sh -c 'umask 077; printf "%s\n" "devops" > /DATA/AppData/k3d-lab/secrets/argocd-repo-username' +sudo sh -c 'umask 077; cat > /DATA/AppData/k3d-lab/secrets/argocd-repo-password' +``` + +Pega un token de Gitea con lectura del repositorio y finaliza con `Ctrl+D`. + +```bash +sudo chown devops /DATA/AppData/k3d-lab/secrets/argocd-repo-username +sudo chown devops /DATA/AppData/k3d-lab/secrets/argocd-repo-password +sudo chmod 0600 /DATA/AppData/k3d-lab/secrets/argocd-repo-* +``` + +## Aplicar solo GitOps al clúster actual + +```bash +./deploy-lab.sh gitops +``` + +## Reconstrucción completa + +```bash +LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh bootstrap +``` + +El orden es: + +```text +k3d -> Argo CD -> repositorio Gitea -> root-apps-registry + -> Applications hijas -> RBAC postdeploy -> Gitea runner +``` + +## Reinstalar systemd + +```bash +sudo LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh install-autostart +``` + +## Verificación + +```bash +kubectl get applications.argoproj.io -n argocd +docker ps --filter name=gitea-runner +docker logs --tail 100 gitea-runner +``` + + +# Caché Git persistente v4.1 + +La versión v4.1 no recrea `root-apps-registry` como fuente principal. +Antes de aplicar GitOps: + +1. clona `apps-registry` cuando no existe; +2. ejecuta `git fetch --prune` cuando ya existe; +3. alinea la copia local con `origin/main`; +4. valida `application.yaml` y la carpeta `apps/`; +5. aplica `application.yaml` directamente desde el clon; +6. registra el commit utilizado; +7. conserva el clon en `/DATA` para una recuperación cuando Gitea esté + temporalmente fuera de servicio. + +Ruta: + +```text +/DATA/AppData/k3d-lab/git/apps-registry +``` + +Commit utilizado: + +```text +/DATA/AppData/k3d-lab/git/apps-registry.commit +``` + +## Actualizar únicamente el clon + +```bash +./deploy-lab.sh repo-sync +``` + +## Actualizar el clon y reconciliar Argo CD + +```bash +./deploy-lab.sh gitops +``` + +## Reconstrucción desde cero + +```bash +LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh bootstrap +``` + +El `bootstrap` intenta obtener primero la última versión de `main`. Cuando +Gitea no responde y ya existe un clon válido, utiliza el commit cacheado y +permite que Argo CD vuelva a reconciliarse cuando Gitea regrese. + +El watchdog no hace `git fetch` cada cinco minutos por defecto. Solo usa el +clon para restaurar `root-apps-registry` si desaparece. Argo CD sigue siendo +el encargado de observar Git y desplegar cambios durante la operación normal. + +Para actualizar el clon también durante `ensure`: + +```bash +APP_REGISTRY_REFRESH_ON_ENSURE=true \ +sudo LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh install-autostart +``` + +No se recomienda en el valor predeterminado porque haría una consulta a +Gitea en cada ejecución del watchdog. + + +# Corrección v4.2: descubrimiento dinámico y monitoring + +## Applications esperadas + +La lista ya no está codificada manualmente. El script descubre el +`metadata.name` real de cada `Application` dentro de: + +```text +/DATA/AppData/k3d-lab/git/apps-registry/apps/ +``` + +Esto evita falsos errores cuando el nombre real es, por ejemplo, +`monitoring-governance` y no `monitoring-governance-app`. + +También se puede seguir forzando una lista explícita: + +```bash +EXPECTED_GITOPS_APPS="ecommerce-app,monitoring-app" ./deploy-lab.sh gitops +``` + +## Diagnóstico de kube-prometheus-stack + +```bash +./deploy-lab.sh monitoring-diagnose +``` + +El comando muestra: + +- versión del chart; +- estado Sync/Health; +- operación de Argo CD; +- mensaje del hook; +- Jobs y Pods admission-create/admission-patch; +- eventos recientes; +- condiciones de la Application. + +Para chart `58.2.1` o `58.2.2`, usa como mínimo `58.3.3` y agrega: + +```yaml +helm: + parameters: + - name: prometheusOperator.admissionWebhooks.patch.ttlSecondsAfterFinished + value: "60" +``` + + +# Multi-repo y governance v4.3 + +La versión v4.3 incorpora el segundo repositorio GitOps: + +```text +https://gitea.cruzcloud.net/devops/platform-infra.git +``` + +El repositorio contiene los overlays Kustomize utilizados por las +Applications `*-governance`. + +## Cachés persistentes + +```text +/DATA/AppData/k3d-lab/git/apps-registry +/DATA/AppData/k3d-lab/git/platform-infra +``` + +## Validación Kustomize + +El script descubre en `apps-registry/apps/*.yaml` todas las Applications +cuyo `repoURL` apunta a `platform-infra`, valida que sus rutas existan y +ejecuta: + +```bash +kubectl kustomize +``` + +Los snapshots renderizados quedan en: + +```text +/DATA/AppData/k3d-lab/rendered/platform-infra/ +``` + +Durante un bootstrap se aplican antes de crear las Applications de workload. +Esto garantiza que Namespace, ResourceQuota, LimitRange y NetworkPolicy +estén presentes antes de instalar Helm charts. + +## Contrato obligatorio de monitoring + +`monitoring-governance` debe contener un `LimitRange`, porque su +`ResourceQuota` exige requests y limits de CPU y memoria. + +Se incluyen archivos de referencia en: + +```text +repo-patches/platform-infra/monitoring-governance/ +├── limitrange.yaml +└── kustomization.yaml +``` + +Copia `limitrange.yaml` al repositorio `platform-infra` y agrega el recurso +a su `kustomization.yaml`. + +## Sincronizar ambos repositorios + +```bash +./deploy-lab.sh repo-sync +``` + +## Reconciliar GitOps completo + +```bash +LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh gitops +``` + +## Reinstalar watchdog + +```bash +sudo LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh install-autostart +``` + + +# Recuperación de operación obsoleta de Grafana + +Grafana puede funcionar mientras Argo CD mantiene una operación antigua, +por ejemplo target `58.3.3` con operación activa `58.2.1`. + +```bash +./deploy-lab.sh monitoring-diagnose +./deploy-lab.sh monitoring-recover +``` + +La recuperación valida el LimitRange, termina la operación anterior, +elimina únicamente los Jobs admission temporales, ejecuta hard refresh, +sincroniza la revisión actual y espera `Synced/Healthy`. + +Cuando `argocd` no está instalado en ZimaOS se usa temporalmente la imagen +oficial de Argo CD con `--core` y `/DATA/.kube/config`. + +El manifiesto funcional está en: + +```text +repo-patches/apps-registry/apps/monitoring-app.yaml +``` + + +# Corrección v4.4.1: compatibilidad CLI Argo CD 3.2 + +`argocd app terminate-op` y `argocd app sync` no aceptan +`--app-namespace` en la versión usada por el laboratorio. + +La función `argocd_core_cli` ahora ejecuta: + +```bash +argocd app terminate-op monitoring-app --core +argocd app sync monitoring-app --core --async --prune --assumeYes +``` + +Las Applications del laboratorio residen en `argocd`, el namespace de +control de Argo CD. + + +# Corrección v4.4.2 + +Se corrigen dos comportamientos: + +1. Cuando `monitoring-app` ya tiene: + - revisión de operación igual al target; + - fase `Succeeded`; + - estado `Synced/Healthy`; + + el script termina correctamente y no inicia otra sincronización. + +2. En modo `argocd --core`, el kubeconfig temporal fija el namespace + actual en `argocd`. Esto evita: + +```text +configmap "argocd-cm" not found +``` + +El flujo intenta primero hard refresh y auto-sync. Solo llama +`argocd app sync --core` si Argo CD no inicia la reconciliación. + + +# Corrección v4.4.3: Gitea runner y restart storm + +El watchdog se ejecuta como `devops`; no puede pedir una contraseña de +`sudo`. La v4.4.3: + +- crea las rutas persistentes del Gitea runner durante `install-autostart`; +- elimina `sudo` del flujo `ensure -> ensure_gitea_runner`; +- cambia el servicio `oneshot` a `Restart=no`; +- deja los reintentos exclusivamente al timer de cinco minutos; +- limita fallos con `StartLimitIntervalSec=15min` y `StartLimitBurst=3`; +- agrega `Persistent=true` al timer. + +Esto evita ciclos como: + +```text +restart counter is at 645 +sudo: a terminal is required +Failed to allocate directory watch: Too many open files +``` + +Instalación: + +```bash +sudo systemctl stop k3d-lab-ensure.timer +sudo systemctl stop k3d-lab-ensure.service || true +sudo systemctl reset-failed k3d-lab-ensure.service + +sudo LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh install-autostart +```