Los dos estaban en git sin ninguna Application que los gestionara: editar el repo no desplegaba nada. De ahi que un pin de imagen de abril nunca llegara al cluster y gitea se subiera solo de 1.25.5 a 1.27.0, y que vaultwarden se parcheara con kubectl replace. A partir de ahora manda git. Verificado en frio antes de adoptar: los 17 manifiestos coincidian campo a campo con lo vivo, asi que la adopcion no revierte nada. Con ServerSideApply/ServerSideDiff, igual que el kube-prometheus-stack: estos objetos arrastran un last-applied viejo y el merge clasico intentaria borrar lo que ese blob declaraba y git ya no; en un PVC eso es un campo inmutable y el sync falla. Limpieza que iba en el mismo paquete: - Fuera la basura de export de 5 ficheros: last-applied-configuration, la revision del Deployment y las anotaciones que pone el provisionador en los PVC (bind-completed, selected-node...). Es lo que dejaba los recursos OutOfSync para siempre. Verificado que el resto del manifiesto no cambia. - Fuera serviceaccount-default y kube-root-ca.crt de los dos: los crea k8s solo en cada namespace. - RESCATADO configmap-gitea-runner-config: config del act_runner escrita a mano en abril, montada por el runner y que NO estaba en git. Reconstruir gitea desde el repo levantaba el runner sin configuracion. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
k8s-manifests
Manifests de Kubernetes gestionados por ArgoCD para el cluster chemavx.
Ojo: no todo lo de aquí lo aplica ArgoCD. Unos 11 directorios (monitoring, argocd, authentik, gitea, homarr, vaultwarden, cloudflare-ddns, cluster-wide…) se gestionan a mano: ahí un commit no despliega nada, hay que editar el fichero y hacer kubectl apply. Para comprobar que esos ficheros siguen describiendo lo desplegado: python3 tools/audita-exports.py (ver tools/README.md).
Regla crítica: secrets en git
Los secrets con datos sensibles NO se guardan en este repo.
Los archivos de secret en este repo sólo contienen metadata (name, namespace, labels, annotations). Los campos data / stringData se gestionan manualmente fuera de git.
Por qué
Un valor placeholder como REDACTED es base64 válido que decodifica a bytes no-UTF-8. Si ArgoCD aplica ese manifest, corrompe el secret en el cluster, lo que puede:
- Romper certificados TLS (ERR_CERT_AUTHORITY_INVALID)
- Impedir que pods arranquen (
grpc: error while marshaling: string field contains invalid UTF-8) - Cifrar credenciales con una clave incorrecta
Secrets TLS (cert-manager)
Los secrets TLS los gestiona cert-manager automáticamente a partir del recurso Certificate. No crear archivos secret-*-tls.yaml con datos.
Secrets de aplicación — crear manualmente antes del primer deploy
| Namespace | Secret | Comando |
|---|---|---|
n8n |
n8n-secret |
kubectl create secret generic n8n-secret --from-literal=encryption-key='<valor-en-vaultwarden>' -n n8n |
authentik |
authentik-secret |
Ver Vaultwarden → "authentik" |
cloudflare-ddns |
cloudflare-ddns-secret |
Ver Vaultwarden → "cloudflare-ddns" |
vaultwarden |
vaultwarden-secret |
Ver Vaultwarden → "vaultwarden" |
ghost-en |
ghost-en-smtp |
kubectl create secret generic ghost-en-smtp --from-literal=SMTP_USER='<user-gmail>' --from-literal=SMTP_PASS='<app-password>' -n ghost-en |
argocd |
argocd-secret |
Gestionado por ArgoCD bootstrap |
argocd |
argocd-redis |
Gestionado por ArgoCD bootstrap |
monitoring |
kube-prometheus-stack-grafana |
Ver Vaultwarden → "grafana" |
monitoring |
kube-prometheus-stack-admission |
Generado por helm (webhook TLS) |
ArgoCD ignoreDifferences para secrets
Toda ArgoCD Application que gestione un namespace con secrets debe incluir ignoreDifferences para el campo /data:
spec:
ignoreDifferences:
- group: ""
kind: Secret
name: <nombre-del-secret>
namespace: <namespace>
jsonPointers:
- /data
syncPolicy:
syncOptions:
- RespectIgnoreDifferences=true
Ver n8n ArgoCD Application como referencia.
Pre-commit hook
Este repo incluye un pre-commit hook que rechaza commits con REDACTED en archivos .yaml.
Instalar con:
cp .githooks/pre-commit .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
Renovate Bot
Secret renovate-token gestionado manualmente (no está en el repo).
Para recrearlo:
kubectl create secret generic renovate-token \
--from-literal=RENOVATE_TOKEN=<token-gitea> \
-n renovate
Token en https://git.chemavx.xyz/user/settings/applications con permisos:
issue: Read/Write, repository: Read/Write, user: Read
Imagen fijada a 38.0.0 — no actualizar a latest sin probar autenticación primero.
ArgoCD patches
Después de instalar ArgoCD aplicar:
kubectl apply -f argocd-patches/redis-patch.yaml