Skip to main content

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.

Chartsoci://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
NamespaceUn per aplicació, amb el seu nom
Manifestosapps/base/<aplicació>/, amb noms i variant del chart a apps/<entorn>/<aplicació>/
AplicacióQuè éstesting
documoonAquesta webwww.test.lb.moon.cat
shizenGenerador d'escenaris per a wargamesshizen.test.lb.moon.cat
fumiGestor de col·leccions de manga, amb base de dades i loginfumi.test.lb.moon.cat, fumi-api.test.lb.moon.cat
kirinGestor d'economia personal, amb base de dades i loginkirin.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:

ReglaCom
Ingress a extranet amb certificat de cert-managerValors ingress del chart
Una rèplica, sense autoescalatreplicaCount: 1
RecursosRequests segons l'ús mesurat, límit de memòria, sense límit de CPU
Rollback automàticremediation.retries: 3 a la instal·lació i l'actualització
Correcció de canvis manualsdriftDetection.mode: enabled
XarxaEntrada només des de Traefik; sortida només cap on l'aplicació ho necessita
Sense token de KubernetesserviceAccount.automount: false
LogsPer 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:

NecessitatPer què importaExemple (fumi)
NomsIngress, certificat i registre DNSfumi, fumi-api
Ports on escoltaLa NetworkPolicy només hi deixa entrar Traefikfrontend 8080, API 3000
Tot el que crida, per componentLa sortida està denegada llevat que es permetiPgBouncer 6432, Keycloak, MangaDex 443
Base de dades i migracionsNomés PostgreSQL extern, a través de PgBouncerfumi, job pre-install
SecretsEs desen xifratsDATABASE_URL, MANGADEX_*
LoginEl client el crea qui gestiona KeycloakClient públic fumi
TelemetriaDecideix l'etiqueta de logs i l'anotació de mètriquesLes tres senyals per OTLP
HealthSondes de liveness i readiness/liveness, /readiness
Usuari i sistema de fitxersrestricted exigeix no-root; només hi ha emptyDirNo-root, arrel de només lectura a l'API
Memòria i CPURequests i límit de memòria-
EstatSense volums, tot l'estat va a la base de dades o al clientCap

L'exemple complet és la fitxa de fumi.

Afegir una aplicació​

Amb fumi com a referència, a testing:

  1. Base de dades: executar Create User a l'stack de PostgreSQL amb el nom de l'aplicació.
  2. Login: crear el seu client, rols i scopes al realm moon, normalment important el seu manifest KeycloakApplication a Horizon.
  3. DNS: afegir els seus noms com a àlies d'extranet.test.lb.moon.cat a la xarxa d'Horizon.
  4. Manifestos: crear apps/base/fumi/ (namespace, repositori, release i network policy) i l'overlay apps/testing/fumi/ amb els seus noms, la seva configuració i el secret xifrat:
sops apps/testing/fumi/secret.yaml
  1. 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 baseline perquè 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 8080 i 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 Kustomization apps-configs, així que la seva API sí que llegeix l'API de Kubernetes. Es connecta per PgBouncer amb prepareThreshold=0 i envia traces per OpenTelemetry.
compte

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.