Update README.md
This commit is contained in:
@@ -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 <ruta>
|
||||
```
|
||||
|
||||
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
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user