Aplicacions
Les aplicacions es despleguen després de tots els nivells d'infraestructura, cadascuna des del seu propi Helm chart i publicada a la classe extranet.
| Charts | oci://registry-1.docker.io/reiizumi/<chart>; testing fa servir la variant -develop si existeix |
| Versió | testing segueix cada nova versió del chart (*); producció segueix la versió major actual |
| Namespace | Un per aplicació, amb el seu nom |
| Manifestos | apps/base/<aplicació>/, amb noms i variant del chart a apps/<entorn>/<aplicació>/ |
| Aplicació | Què és | testing |
|---|---|---|
| documoon | Aquesta web | www.test.lb.moon.cat |
| shizen | Generador d'escenaris per a wargames | shizen.test.lb.moon.cat |
| fumi | Gestor de col·leccions de manga, amb base de dades i login | fumi.test.lb.moon.cat, fumi-api.test.lb.moon.cat |
| kirin | Gestor d'economia personal, amb base de dades i login | kirin.test.lb.moon.cat, kirin-api.test.lb.moon.cat |
Els noms de testing són CNAMEs d'extranet.test.lb.moon.cat al DNS local.
Què rep cada aplicació
Cada carpeta d'aplicació conté un Namespace, un OCIRepository per al seu chart, un HelmRelease i una NetworkPolicy, i segueix les regles del clúster:
| Regla | Com |
|---|---|
Ingress a extranet amb certificat de cert-manager | Valors ingress del chart |
| Una rèplica, sense autoescalat | replicaCount: 1 |
| Recursos | Requests segons l'ús mesurat, límit de memòria, sense límit de CPU |
| Rollback automàtic | remediation.retries: 3 a la instal·lació i l'actualització |
| Correcció de canvis manuals | driftDetection.mode: enabled |
| Xarxa | Entrada només des de Traefik; sortida només cap on l'aplicació ho necessita |
| Sense token de Kubernetes | serviceAccount.automount: false |
| Logs | Per OpenTelemetry si l'aplicació ho suporta; si no, l'etiqueta monitoring/logs |
La fitxa de desplegament
El clúster ho bloqueja tot per defecte: sense trànsit de sortida, sense privilegis, sense disc, sense API de Kubernetes i amb un límit de memòria. Per això cada aplicació ha de declarar el que necessita abans de desplegar-se. El que no es declara simplement no funciona, normalment en silenci, com un timeout.
Cada aplicació ho aporta a la seva fitxa de desplegament, una plantilla que es desa al seu propi repositori (per exemple com a DEPLOYMENT.md) i que no depèn de l'entorn:
| Necessitat | Per què importa | Exemple (fumi) |
|---|---|---|
| Noms | Ingress, certificat i registre DNS | fumi, fumi-api |
| Ports on escolta | La NetworkPolicy només hi deixa entrar Traefik | frontend 8080, API 3000 |
| Tot el que crida, per component | La sortida està denegada llevat que es permeti | PgBouncer 6432, Keycloak, MangaDex 443 |
| Base de dades i migracions | Només PostgreSQL extern, a través de PgBouncer | fumi, job pre-install |
| Secrets | Es desen xifrats | DATABASE_URL, MANGADEX_* |
| Login | El client el crea qui gestiona Keycloak | Client públic fumi |
| Telemetria | Decideix l'etiqueta de logs i l'anotació de mètriques | Les tres senyals per OTLP |
| Health | Sondes de liveness i readiness | /liveness, /readiness |
| Usuari i sistema de fitxers | restricted exigeix no-root; només hi ha emptyDir | No-root, arrel de només lectura a l'API |
| Memòria i CPU | Requests i límit de memòria | - |
| Estat | Sense volums, tot l'estat va a la base de dades o al client | Cap |
L'exemple complet és la fitxa de fumi.
Afegir una aplicació
Amb fumi com a referència, a testing:
- Base de dades: executar Create User a l'stack de PostgreSQL amb el nom de l'aplicació.
- Login: crear el seu client, rols i scopes al realm
moon, normalment important el seu manifestKeycloakApplicationa Horizon. - DNS: afegir els seus noms com a àlies d'
extranet.test.lb.moon.cata la xarxa d'Horizon. - Manifestos: crear
apps/base/fumi/(namespace, repositori, release i network policy) i l'overlayapps/testing/fumi/amb els seus noms, la seva configuració i el secret xifrat:
sops apps/testing/fumi/secret.yaml
- Pujar-ho i aplicar:
git add . && git commit && git push
flux reconcile kustomization flux-system --with-source
Validar:
flux get helmreleases -n fumi # fumi True
kubectl -n fumi get pods,ingress,certificate
curl -sI https://fumi.test.lb.moon.cat/ | head -1 # HTTP/2 200
Després, iniciar sessió amb un usuari del realm moon que tingui el rol fumi:user. A Grafana, Tempo mostra el servei fumi-api i Loki {cluster="tanya", service_name="fumi-api"}.
Particularitats
- documoon: web estàtica servida per nginx, sense base de dades, login ni secrets. Fa servir
baselineperquè la seva imatge executa nginx com a root al port 80. El seu log d'accés es recull per etiqueta. - shizen: web estàtica amb nginx no-root al
8080i arrel de només lectura. Canvia molt poc, així que està fixada a una versió del chart i Flux només la revisa una vegada l'any; una versió nova és un commit canviant el tag. - fumi: frontend, API sobre PostgreSQL i un job de migració que actualitza l'esquema abans de cada release (si falla, es manté la versió anterior). Envia traces, mètriques i logs per OpenTelemetry.
- kirin: interfície en React i API en Quarkus sobre PostgreSQL. Les seves categories i mètodes de pagament són recursos de Kubernetes (CRDs del chart), aplicats després per la
Kustomizationapps-configs, així que la seva API sí que llegeix l'API de Kubernetes. Es connecta per PgBouncer ambprepareThreshold=0i envia traces per OpenTelemetry.
Les CRDs de kirin són plantilles normals del chart: desinstal·lar el release esborra totes les categories i mètodes de pagament. Flux els torna a aplicar des de Git, però no es conserva res més.
Actualitzacions
FluxCD desplega cada nova versió del chart i ho notifica a Slack: qualsevol versió a testing, la mateixa versió major a producció. Una actualització fallida torna enrere sola.