Tres eran falsos positivos de k3s: KubeControllerManagerDown, KubeSchedulerDown y KubeProxyDown llevaban 92 DÍAS disparadas en severidad critical. En k3s esos tres componentes van embebidos en el proceso del servidor y no exponen las métricas que espera el chart, así que sus ServiceMonitors nunca conectaban: la alerta no medía la salud de nada, solo la ausencia de un target imposible. La cuarta, PrometheusNotConnectedToAlertmanagers, llevaba disparada desde el reinicio del máster del 16-jul. La causa es de diseño: alertmanager.enabled es false y los avisos van por Grafana→Telegram y Kuma→Telegram. Ya se había desactivado el grupo de reglas `alertmanager`, pero esta alerta vive en el grupo `prometheus`, así que sobrevivió; se quita por nombre con defaultRules.disabled. Tres "critical" permanentes no son un aviso, son entrenamiento para ignorar el panel: cuando algo se rompa de verdad, se perderá entre el ruido. Hecho por Helm y no a mano (rev 1 → 2, mismo chart 83.2.0), que es lo único que sobrevive a un futuro upgrade. Verificado ANTES de aplicar renderizando el chart con y sin los valores nuevos: el diff quita exactamente esas 4 alertas (141 → 137) y ningún recurso nuevo aparece. Comprobado además que el render reproduce el manifiesto ya desplegado, o sea que no había ediciones a mano que el upgrade fuese a aplastar. Después: 1 sola alerta disparada (Watchdog, el latido intencionado del chart, severity none) y los 15 targets de scrape en up — antes 3 fallaban siempre. Grafana sano (api/health ok, 12.4.2) y su contraseña rotada intacta, porque GF_SECURITY_ADMIN_PASSWORD solo aplica en el primer arranque. Se añade values-kube-prometheus-stack.yaml: este namespace no está bajo ArgoCD y hasta hoy los valores del release solo vivían dentro de Helm, sin forma de saber cómo estaba configurado sin interrogarlo. Se refresca el export del ConfigMap de reglas y se borran 3 dashboards que el upgrade eliminó del cluster. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
k8s-manifests
Manifests de Kubernetes gestionados por ArgoCD para el cluster chemavx.
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