Update README.md
This commit is contained in:
@@ -1 +1,354 @@
|
||||
NOTA NPM: Fwd 192.168.68.61:90 | Scheme: http | Websockets: ON"
|
||||
# Laboratorio k3d estable para ZimaOS
|
||||
|
||||
Este paquete reemplaza el `deploy-lab.sh` original por una versión idempotente y no destructiva.
|
||||
|
||||
## Qué corrige
|
||||
|
||||
- No elimina `lab-cluster` en cada ejecución.
|
||||
- Crea el clúster solo cuando no existe.
|
||||
- Usa `subnet: auto` para mantener IP internas estables tras reinicios.
|
||||
- Conserva el datastore SQLite, certificados y token de K3s en `/DATA/AppData/k3d-lab/k3s/server`.
|
||||
- Conserva los datos de `local-path-provisioner` fuera de los contenedores.
|
||||
- Usa un token de clúster persistente.
|
||||
- Mantiene fijos los puertos `46421`, `90` y `9443`.
|
||||
- Valida que ZimaOS siga usando `192.168.68.61` antes de desplegar.
|
||||
- Instala Argo CD con versión fijada y `server-side apply`.
|
||||
- No crea el `argocd-manager` innecesario para desplegar en el mismo clúster.
|
||||
- Crea RBAC de Headlamp y RBAC de solo lectura para la validación postdeploy.
|
||||
- Regenera los archivos requeridos para los secrets de Gitea Actions.
|
||||
- Instala opcionalmente un watchdog systemd para recuperar el clúster después del boot.
|
||||
|
||||
## Primera recuperación / creación
|
||||
|
||||
Ejecutar como el usuario `devops`, no con `sudo`:
|
||||
|
||||
```bash
|
||||
chmod +x deploy-lab.sh
|
||||
|
||||
LAB_HOST_IP=192.168.68.61 \
|
||||
./deploy-lab.sh bootstrap
|
||||
```
|
||||
|
||||
Como Docker y k3d están actualmente vacíos, `bootstrap` creará un clúster nuevo. En ejecuciones posteriores iniciará y reconciliará el clúster existente.
|
||||
|
||||
## Validación
|
||||
|
||||
```bash
|
||||
./deploy-lab.sh status
|
||||
|
||||
kubectl get nodes -o wide
|
||||
kubectl get pods -A
|
||||
kubectl get ingress -A
|
||||
```
|
||||
|
||||
## Autostart después de reinicios
|
||||
|
||||
Ejecutar solamente después de que `bootstrap` termine correctamente:
|
||||
|
||||
```bash
|
||||
sudo ./deploy-lab.sh install-autostart
|
||||
```
|
||||
|
||||
Verificar:
|
||||
|
||||
```bash
|
||||
systemctl status k3d-lab-ensure.timer --no-pager
|
||||
journalctl -u k3d-lab-ensure.service -n 200 --no-pager
|
||||
```
|
||||
|
||||
El timer se ejecuta 60 segundos después del arranque y posteriormente cada cinco minutos. El servicio intenta iniciar el clúster, regenera el kubeconfig y valida los tres nodos.
|
||||
|
||||
## Recuperación manual
|
||||
|
||||
```bash
|
||||
./deploy-lab.sh recover
|
||||
```
|
||||
|
||||
`recover` no crea ni elimina el clúster. Solo intenta iniciar uno existente y reconcilia Argo CD.
|
||||
|
||||
## Applications de Argo CD
|
||||
|
||||
Guarda los manifiestos `Application`, `ApplicationSet` o el `app-of-apps` en:
|
||||
|
||||
```text
|
||||
/DATA/AppData/k3d-lab/bootstrap/
|
||||
```
|
||||
|
||||
Al ejecutar nuevamente `bootstrap`, el script aplicará automáticamente todos los `.yaml` y `.yml` de ese directorio.
|
||||
|
||||
## Secrets para la validación postdeploy
|
||||
|
||||
Después de crear un clúster nuevo, se generan:
|
||||
|
||||
```text
|
||||
/DATA/AppData/k3d-lab/gitea-actions-secrets/K8S_SERVER.txt
|
||||
/DATA/AppData/k3d-lab/gitea-actions-secrets/K8S_CA_B64.txt
|
||||
/DATA/AppData/k3d-lab/gitea-actions-secrets/K8S_TOKEN.txt
|
||||
/DATA/AppData/k3d-lab/gitea-actions-secrets/K8S_TLS_SERVER_NAME.txt
|
||||
```
|
||||
|
||||
Copia sus valores a los secrets equivalentes del repositorio `devops/apps-registry` en Gitea. No publiques el contenido de `K8S_TOKEN.txt`.
|
||||
|
||||
## Headlamp
|
||||
|
||||
Genera un token cuando sea necesario:
|
||||
|
||||
```bash
|
||||
kubectl create token headlamp-admin -n headlamp
|
||||
```
|
||||
|
||||
El script crea el RBAC, pero el Deployment/Ingress de Headlamp debe provenir del repositorio GitOps.
|
||||
|
||||
## Reset limpio
|
||||
|
||||
Solo cuando realmente quieras iniciar desde cero:
|
||||
|
||||
```bash
|
||||
CONFIRM_RESET=DELETE-lab-cluster ./deploy-lab.sh reset
|
||||
```
|
||||
|
||||
Antes de limpiar el estado, el script crea un archivo en:
|
||||
|
||||
```text
|
||||
/DATA/AppData/k3d-lab/backups/
|
||||
```
|
||||
|
||||
## Variables principales
|
||||
|
||||
```text
|
||||
CLUSTER_NAME=lab-cluster
|
||||
APP_DATA_PATH=/DATA/AppData/k3d-lab
|
||||
KUBECONFIG_PATH=/DATA/.kube/config
|
||||
LAB_HOST_IP=192.168.68.61
|
||||
EXPECTED_HOST_IP=192.168.68.61
|
||||
K3S_IMAGE=rancher/k3s:v1.35.5-k3s1
|
||||
ARGOCD_VERSION=v3.2.0
|
||||
```
|
||||
|
||||
Para aceptar conscientemente una IP distinta:
|
||||
|
||||
```bash
|
||||
LAB_HOST_IP=192.168.68.X \
|
||||
ALLOW_IP_CHANGE=true \
|
||||
./deploy-lab.sh bootstrap
|
||||
```
|
||||
|
||||
También deberás actualizar NPM y los secrets de Gitea Actions.
|
||||
|
||||
|
||||
## Arranque automático reforzado v3
|
||||
|
||||
La versión v3 agrega:
|
||||
|
||||
- `subnet: auto` al crear el clúster para mantener IP estática por nodo.
|
||||
- `restart=unless-stopped` solamente a los contenedores de `lab-cluster`.
|
||||
- Dependencias systemd sobre el `DockerRootDir` real y `APP_DATA_PATH`.
|
||||
- Inicio 90 segundos después del boot.
|
||||
- Reintento automático del servicio cada 30 segundos si falla.
|
||||
- Watchdog cada 5 minutos.
|
||||
- Regeneración del kubeconfig.
|
||||
- Recuperación de agentes `NotReady`.
|
||||
- Re-registro automático de un agente persistentemente obsoleto.
|
||||
- Validación de Traefik, Argo CD y el puerto HTTP publicado.
|
||||
|
||||
### Instalar
|
||||
|
||||
```bash
|
||||
LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh bootstrap
|
||||
sudo LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh install-autostart
|
||||
```
|
||||
|
||||
### Prueba de reinicio
|
||||
|
||||
Antes:
|
||||
|
||||
```bash
|
||||
./deploy-lab.sh status
|
||||
systemctl status k3d-lab-ensure.timer --no-pager
|
||||
systemctl cat k3d-lab-ensure.service
|
||||
systemctl cat docker.service
|
||||
```
|
||||
|
||||
Después del reboot, espera hasta 10 minutos y valida:
|
||||
|
||||
```bash
|
||||
systemctl status k3d-lab-ensure.service --no-pager
|
||||
journalctl -b -u k3d-lab-ensure.service --no-pager
|
||||
./deploy-lab.sh status
|
||||
curl -I -H 'Host: argocd.cruzcloud.net' http://127.0.0.1:90
|
||||
curl -I -H 'Host: shop.cruzcloud.net' http://127.0.0.1:90
|
||||
```
|
||||
|
||||
|
||||
## Corrección v3.1 para ZimaOS
|
||||
|
||||
ZimaOS puede no incluir el comando `openssl`. El script ya no lo exige:
|
||||
|
||||
1. Usa `openssl` cuando está disponible.
|
||||
2. Si no, usa `/dev/urandom` con `od`.
|
||||
3. Como último fallback, usa `hexdump`.
|
||||
|
||||
Para crear o recuperar el laboratorio, no uses `sudo sh`:
|
||||
|
||||
```bash
|
||||
LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh bootstrap
|
||||
```
|
||||
|
||||
Solo la instalación de systemd requiere sudo:
|
||||
|
||||
```bash
|
||||
sudo LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh install-autostart
|
||||
```
|
||||
|
||||
|
||||
## Corrección v3.2: rollout de Argo CD
|
||||
|
||||
- `argocd-server` solo se reinicia cuando `server.insecure` cambia.
|
||||
- El timeout específico de Argo CD aumenta a 420 segundos.
|
||||
- Si el rollout falla, el script muestra Pods y eventos.
|
||||
- Si la réplica nueva ya está disponible y únicamente queda un Pod antiguo
|
||||
atascado en `Terminating`, elimina solo ese Pod antiguo y reintenta.
|
||||
- No fuerza la eliminación cuando todavía no existe una réplica nueva disponible.
|
||||
|
||||
Ejecución:
|
||||
|
||||
```bash
|
||||
LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh bootstrap
|
||||
```
|
||||
|
||||
|
||||
## Corrección v3.3: permisos de credenciales Gitea Actions
|
||||
|
||||
La generación de credenciales ya no ejecuta `chmod` sobre todos los `.txt`
|
||||
históricos. Cada archivo se genera temporalmente y se instala con:
|
||||
|
||||
- propietario: usuario que ejecuta `bootstrap`;
|
||||
- grupo: grupo principal del usuario;
|
||||
- permisos: `0600`.
|
||||
|
||||
Además se regenera `KUBE_CONFIG_DATA.txt` con un kubeconfig Base64 de
|
||||
privilegios mínimos para `gitea-postdeploy-validator`, manteniendo
|
||||
compatibilidad con el workflow anterior.
|
||||
|
||||
Para continuar:
|
||||
|
||||
```bash
|
||||
LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh bootstrap
|
||||
```
|
||||
|
||||
|
||||
## Corrección v3.4: propietario sin asumir grupo `devops`
|
||||
|
||||
ZimaOS tiene al usuario `devops` con grupo principal `samba`; no existe
|
||||
necesariamente un grupo llamado `devops`.
|
||||
|
||||
La v3.4:
|
||||
|
||||
- usa `chown devops` y no `chown devops:devops`;
|
||||
- usa `install -o devops` sin forzar grupo para archivos privados;
|
||||
- mantiene permisos `0700` en el directorio de secretos;
|
||||
- mantiene permisos `0600` en credenciales y kubeconfigs;
|
||||
- conserva el grupo existente del filesystem cuando solo cambia el propietario.
|
||||
|
||||
El grupo de la unidad systemd sigue obteniéndose dinámicamente con
|
||||
`id -gn devops`, por lo que en ZimaOS será `samba`.
|
||||
|
||||
|
||||
## Corrección v3.5: kubeconfig sin `current-context`
|
||||
|
||||
La v3.5 valida y corrige el kubeconfig antes de instalarlo:
|
||||
|
||||
- obtiene el kubeconfig directamente desde k3d;
|
||||
- confirma que contenga al menos un contexto;
|
||||
- activa explícitamente ese contexto;
|
||||
- confirma que exista un API Server;
|
||||
- instala `/DATA/.kube/config` con propietario `devops` y permisos `0600`;
|
||||
- no depende de `.profile`;
|
||||
- systemd continúa usando la ruta explícita de kubeconfig.
|
||||
|
||||
Reparación manual equivalente:
|
||||
|
||||
```bash
|
||||
TMP_KUBECONFIG="$(mktemp)"
|
||||
k3d kubeconfig get lab-cluster > "$TMP_KUBECONFIG"
|
||||
CTX="$(KUBECONFIG="$TMP_KUBECONFIG" kubectl config get-contexts -o name | head -1)"
|
||||
KUBECONFIG="$TMP_KUBECONFIG" kubectl config use-context "$CTX"
|
||||
sudo install -d -m 0700 -o devops /DATA/.kube
|
||||
sudo install -m 0600 -o devops "$TMP_KUBECONFIG" /DATA/.kube/config
|
||||
rm -f "$TMP_KUBECONFIG"
|
||||
```
|
||||
|
||||
|
||||
## Corrección v3.6: systemd en ZimaOS sin `/usr/local/sbin`
|
||||
|
||||
ZimaOS no garantiza que `/usr/local/sbin` exista o sea escribible. La v3.6
|
||||
instala la copia persistente del script en:
|
||||
|
||||
```text
|
||||
/DATA/AppData/k3d-lab/bin/deploy-k3d-lab
|
||||
```
|
||||
|
||||
La unidad usa Bash explícitamente:
|
||||
|
||||
```ini
|
||||
ExecStart=/bin/bash /DATA/AppData/k3d-lab/bin/deploy-k3d-lab ensure
|
||||
```
|
||||
|
||||
Esto también funciona cuando `/DATA` tiene la opción de montaje `noexec`.
|
||||
|
||||
Instalación:
|
||||
|
||||
```bash
|
||||
sudo LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh install-autostart
|
||||
```
|
||||
|
||||
|
||||
## Corrección v3.7: watchdog systemd sin `sudo`
|
||||
|
||||
El servicio se ejecuta como `devops` y no dispone de una terminal para
|
||||
introducir la contraseña de sudo. La v3.7 elimina `sudo` del camino de
|
||||
ejecución del modo `ensure`.
|
||||
|
||||
Cambios:
|
||||
|
||||
- comprueba escritura en `/DATA/AppData/k3d-lab`, no en la raíz `/DATA`;
|
||||
- regenera `/DATA/.kube/config` directamente como `devops`;
|
||||
- prepara propietario y permisos durante `install-autostart`;
|
||||
- no intenta iniciar Docker mediante sudo desde systemd;
|
||||
- muestra automáticamente `systemctl status` y `journalctl` si la prueba
|
||||
inicial del servicio falla.
|
||||
|
||||
Instalación:
|
||||
|
||||
```bash
|
||||
sudo LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh install-autostart
|
||||
```
|
||||
|
||||
|
||||
## Corrección v3.8: PATH de systemd y ubicación de k3d
|
||||
|
||||
La shell interactiva de ZimaOS puede encontrar `k3d` en una ruta bajo
|
||||
`/DATA`, mientras systemd utiliza un PATH mínimo. La v3.8:
|
||||
|
||||
- localiza automáticamente `k3d`, `kubectl`, `docker` y `curl`;
|
||||
- agrega los directorios detectados al PATH de la unidad;
|
||||
- guarda las rutas en `/etc/default/k3d-lab`;
|
||||
- permite indicar rutas explícitas con `K3D_BIN`, `KUBECTL_BIN`,
|
||||
`DOCKER_BIN` y `CURL_BIN`;
|
||||
- muestra el PATH efectivo al terminar.
|
||||
|
||||
Instalación normal:
|
||||
|
||||
```bash
|
||||
sudo LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh install-autostart
|
||||
```
|
||||
|
||||
Fallback explícito:
|
||||
|
||||
```bash
|
||||
K3D_BIN="$(command -v k3d)" \
|
||||
KUBECTL_BIN="$(command -v kubectl)" \
|
||||
DOCKER_BIN="$(command -v docker)" \
|
||||
CURL_BIN="$(command -v curl)" \
|
||||
sudo -E LAB_HOST_IP=192.168.68.61 ./deploy-lab.sh install-autostart
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user