Sådan bygger du en skalerbar Symfony-applikation på Kubernetes

Moderne webapplikationer er komplekse. Forbrugernes forventninger til din applikation øges konstant: I dag skal en applikation være hurtig, praktisk, let at bruge og smuk.

At imødekomme disse krav kan blive en anden vanskelighed i vejen mod at skabe et fantastisk produkt. Selv hvis du tackle et reelt problem, skal du implementere det på den rigtige måde for at tjene til livets ophold.

For at lette denne nye vanskelighed og reducere den tid, der bruges på at oprette og vedligeholde disse forventede funktioner, udnytter en moderne applikation normalt mange forskellige komponenter, fra indholdsleveringsnetværk (CDN) til fuldtekstsøgningstjenester og belastningsbalancere.

Oversigt over moderne webapplikationsarkitektur (fra Webarkitektur 101 af Jonathan Fulton)

Denne arkitektur har til formål at opbygge en applikation på toppen af ​​generiske tjenester (cache, fuldtekstsøgning, jobkø osv.). Dette reducerer naturligvis den tid, der kræves for at vedligeholde disse tjenester, da de normalt vedligeholdes af en anden (og undertiden open source).

Når du bruger en sådan infrastruktur, er det afgørende at være i stand til at interagere let med alle dens komponenter inden for din applikation. Det er her Kubernetes og Symfony arbejder sammen for at hjælpe dig med at opnå utrolige resultater ekstremt hurtigt.

Kubernetes: en Docker containereorkester

For et par år siden begyndte Docker-projektet at dukke op som en måde at lade udviklere let skabe infrastrukturer som den foregående. Med et par konfigurationslinjer er enhver udvikler, der bruger Docker, i stand til at oprette et netværk af sammenkoblede containere, hvilket abstraherer kompleksiteten ved at opsætte hver af tjenesterne.

Dette projekt revolutionerede den måde, mange udviklere tænkte på infrastruktur. I dag er det almindeligt at bruge udtrykket DevOps, der henviser til personer, der er i stand til at udvikle applikationer, mens man har den passende infrastruktur i tankerne.

Kubernetes er det naturlige følgende trin: det skaber et produktionsklart miljø, hvor Docker-containere kan køre, hvilket giver sikkerhed, elasticitet og skalerbarhed. Ved hjælp af Docker og Kubernetes vil du nemt kunne oprette applikationer, der udnytter et komplet sæt generiske tjenester, hvilket hjælper dig med at opbygge fantastiske produkter meget hurtigere.

I denne artikel vil jeg fokusere mere præcist på Kubernetes på Google Cloud Platform (GCP) for at have et eksempel, men dette kan anvendes på enhver skyudbyder.

Brug af Symfony i Kubernetes

Det er altid nyttigt at tænke på integrationen af ​​din applikation i din infrastruktur, før du udvikler den. Det giver dig mulighed for at bestemme, hvilke tjenester du har brug for baseret på dine forretningskrav, og hvordan du interagerer med dem fra din applikation.

Et af de vigtigste elementer, du skal huske på, når du opretter en applikation, er dens evne til at skalere.

"At skalere en applikation" betyder faktisk at øge antallet af produktionsforekomster af din applikations kode for at håndtere flere forespørgsler. For at oprette en "skalerbar applikation" er der således en enkelt hovedidee, som du altid skal huske på: gem ikke status for din applikation i kodebeholderen. Hvis din kodebeholder har en tilstand, duplikeres denne tilstand under skalering, hvilket fører til konsistensproblemer, der kan ødelægge din ansøgning.

Som jeg forklarede i min artikel om oprettelse af en hurtig testsuite med Symfony, er der to vigtigste steder, hvor tilstanden for vores applikation bor: databasen og filsystemet.

Brug Flysystem til at gemme dine applikationsfiler i det administrerede fillager

Stort set alle skyudbydere har mindst en eller anden måde at opbevare fillignende elementer eksternt (GCP har Google Cloud Storage). Tøv ikke med at stole på dem for at gemme dine applikationsfiler: de er uendeligt strækbare, giver en let at konfigurere CDN oven på dem og er hurtige og pålidelige.

Jeg bruger normalt Flysystem til at få adgang til og interagere med sådanne tjenester. Flysystem er et bibliotek, der giver en abstraktion for filsystemet. Ud over at hjælpe dig med at oprette en bedre testsuite er Flysystem også kompatibel med mange udbydere, hvoraf der næsten helt sikkert er din skyudbyder.

Til Google Cloud Storage bruger jeg personligt https://github.com/Superbalist/flysystem-google-cloud-storage.

Konfigurer doktrin til at bruge den leverede SQL-service

De fleste skyudbydere giver dig også muligheden for at stole på deres egen administrerede SQL-service. GCP har Google Cloud SQL-tjenesten, der understøtter MySQL og PostgreSQL.

Disse produkter er en fantastisk måde at gemme databasestatusen for din applikation på et skalerbart og pålideligt sted. Hvis du bruger Google Cloud SQL med Kubernetes, anbefaler jeg dig at bruge Cloud SQL-proxy. Det opretter en proxy til din database, som du kan bruge det som en klassisk database med doktrin.

Brug Redis til din cache og dine sessioner

Din applikationscache og sessioner er en del af status for dit projekt. De skal deles mellem dine tilfælde for at undgå problemer.

Redis er perfekt egnet til disse brugssager: som en hukommelsesnøgleværdi butik er den ekstremt hurtig, og den er i stand til at håndtere hundreder af tusinder af forbindelser parallelt. Det vil sandsynligvis ikke være flaskehalsen i din ansøgning.

Heldigvis er Symfony allerede designet af naturen for at tillade konfiguration af Redis som en session handler og som en cache backend:

  • for at konfigurere det som en session handler, bruger jeg personligt https://github.com/snc/SncRedisBundle
  • til at konfigurere det som en cache-backend er et par konfigurationslinjer nok:
ramme:
    cache:
        app: cache.adapter.redis
        default_redis_provider: "redis: // localhost"

Brug en delt placering til dine logfiler

Mens dine applikationslogfiler teknisk set ikke er en del af din tilstand, er det et mareridt at fejlsøge problemer med at sende dem i mange forskellige containere. Det er normalt en god ide at opbevare dem på et delt sted i stedet for inde i containeren.

Der er mange handlere tilgængelige i Monolog, som kan hjælpe på dette niveau: ElasticSearch, MongoDB, ... Jeg har dog en tendens til at kunne lide Sentry: det er en super nyttig tjeneste, der automatisk skaber virkelig detaljerede rapporter om dine problemer. Jeg vil tale lidt mere om det, og hvordan man bruger det i Symfony i en fremtidig artikel :).

Brug miljøvariabler til at konfigurere din applikation inden i Kubernetes

Der er en tilstand, som vi let kan glemme: legitimationsoplysninger og hemmeligheder. Selvom de ikke ændres ved kørsel, skal de hverken af ​​sikkerhedsmæssige grunde opbevares i din kodebeholder.

Heldigvis er det muligt at gøre det bedre med Kubernetes. Der er faktisk to måder at gøre det bedre på:

  • enten kan du stole på Kubernetes-miljøvariabler for at injicere værdierne direkte i dine containere og bruge miljøvariabelfunktionerne i Symfony.
  • eller du kan bruge det dedikerede hemmelige styringssystem fra Kubernetes, som giver dig mulighed for at gemme, administrere og montere hemmeligheder som filer i dine containere, som understøttes af Symfony med processorer i miljøvariabler (env (fil: your_secret_file)).

Denne idé om ikke at gemme status for en applikation tæt på dens kode bliver noget standard. De koncepter, jeg har listet her, er bare toppen af ​​isbjerget: tøv ikke med at kigge på The Twelve-Factor App og Reproducible Builds for at lære mere.

Har du noget andet at tilføje til denne artikel? Tøv ikke med at kommentere!