En kort oversikt over PostgreSQL-operatÞrer for Kubernetes, vÄrt valg og erfaring

En kort oversikt over PostgreSQL-operatÞrer for Kubernetes, vÄrt valg og erfaring

Det kommer oftere forespÞrseler fra kunder som sier: «Vi vil ha noe som Amazon RDS, men billigere»; «Vi vil ha noe som RDS, men overalt, i hvilken som helst infrastruktur». For Ä implementere en slik managed-lÞsning pÄ Kubernetes, har vi vurdert den nÄvÊrende tilstanden til de mest populÊre operatÞrene for PostgreSQL (Stolon, operatÞrene fra Crunchy Data og Zalando) og gjort vÄrt valg.

Denne artikkelen er vÄr oppsummerte erfaring, bÄde fra en teoretisk side (oversikt over lÞsninger) og fra en praktisk side (hva som ble valgt og hva vi har oppnÄdd). Men la oss fÞrst definere hvilke krav som stilles til en potensiell erstatning for RDS 


Hva er egentlig RDS

NÄr folk snakker om RDS, antar vi, mener de en administrert (managed) databaseservice som:

  1. er lett Ă„ sette opp;
  2. har muligheten til Ă„ jobbe med snapshots og gjenopprette fra dem (helst med stĂžtte for PITR);
  3. lar deg opprette master-slave-topologier;
  4. har et rikt utvalg av utvidelser;
  5. tilbyr revisjon og bruker-/tilgangsstyring.

Generelt sett kan tilnÊrmingene til Ä oppnÄ dette mÄlet vÊre ganske forskjellige, men metoden med en hypotetisk Ansible er ikke vÄr favoritt. (Kollegene fra 2GIS kom til en lignende konklusjon etter deres forsÞk pÄ Ä lage et «verktÞy for rask distribusjon av et feilfri klynge basert pÄ Postgres».)

Det er nettopp operatĂžrer – en vanlig tilnĂŠrming for Ă„ lĂžse slike oppgaver i Kubernetes-Ăžkosystemet. Mer om dem, spesifikt for databaser som kjĂžrer innenfor Kubernetes, ble allerede beskrevet av teknisk direktĂžr for «Flanta», distol, i i en av sine presentasjoner.

NB: For raskt Ä lage enkle operatÞrer anbefaler vi Ä ta en titt pÄ vÄrt open source-verktÞy shell-operator. Ved Ä bruke det kan man gjÞre dette uten kunnskap om Go, men med mer kjente metoder for systemadministratorer: i Bash, Python osv.

For PostgreSQL finnes det flere populĂŠre K8s-operatĂžrer:

  • Stolon;
  • Crunchy Data PostgreSQL Operator;
  • Zalando Postgres Operator.

La oss se nÊrmere pÄ dem.

Valget av operatĂžr

I tillegg til de viktige funksjonene som allerede er nevnt, forventet vi – som infrastrukturingeniĂžrer innen Kubernetes – ogsĂ„ fĂžlgende fra operatĂžrene:

  • deploy fra Git og med Custom Resources;
  • stĂžtte for pod anti-affinity;
  • installasjon av node affinity eller node selector;
  • installasjon av tolerations;
  • muligheter for tuning;
  • forstĂ„elige teknologier og til og med kommandoer.

Utan att gÄ in pÄ detaljer om varje punkt (frÄga i kommentarerna om det finns nÄgra frÄgor kvar efter att ha lÀst hela artikeln), vill jag pÄpeka att dessa parametrar behövs för att ge en mer nyanserad beskrivning av noderna i klustret sÄ att vi kan bestÀlla dem för specifika applikationer. PÄ sÄ sÀtt kan vi uppnÄ en optimal balans mellan prestanda och kostnad.

Nu — till sjĂ€lva PostgreSQL-operatörerna.

1. Stolon

Stolon frÄn det italienska företaget Sorint.lab i den redan nÀmnda rapporten betraktades som en typ av referens bland operatörerna för DBMS. Detta Àr ett ganska gammalt projekt: dess första offentliga release Àgde rum redan i november 2015(!), och GitHub-repositoriet kan stoltsera med nÀstan 3000 stjÀrnor och 40+ bidragsgivare.

Och verkligen, Stolon Àr ett utmÀrkt exempel pÄ genomtÀnkt arkitektur:

En kort oversikt over PostgreSQL-operatÞrer for Kubernetes, vÄrt valg og erfaring
Med denna operatör kan man gĂ„ djupare i rapporten eller projektets dokumentation. Sammanfattningsvis kan man sĂ€ga att den kan göra allt som beskrivs: failover, proxy för transparent Ă„tkomst för kunder, backup
 Dessutom tillhandahĂ„ller proxy Ă„tkomst via en enda tjĂ€nstpunkt — till skillnad frĂ„n de tvĂ„ andra lösningarna som beskrivs nedan (de har tvĂ„ tjĂ€nster för Ă„tkomst till databasen).

Men Stolon har inga Custom Resources, vilket gör att den inte kan distribueras sĂ„ enkelt och snabbt — "som varma bakverk" — för att skapa DBMS-instanser i Kubernetes. Hantering görs via verktyget stolonctl, distribution via Helm-diagrammet, och anvĂ€ndardefinitioner anges i ConfigMap.

Å ena sidan verkar det som om operatören inte riktigt Ă€r en operatör (eftersom den inte anvĂ€nder CRD). Men Ă„ andra sidan Ă€r detta ett flexibelt system som gör att man kan konfigurera resurser i K8s som man vill.

Sammanfattningsvis, personligen verkade det för oss inte optimalt att ha ett separat diagram för varje databas. DÀrför började vi söka alternativ.

2. Crunchy Data PostgreSQL Operator

Operatören frĂ„n Crunchy Data, en ung amerikansk startup, verkade vara ett logiskt alternativ. Dess offentliga historia börjar med den första releasen i mars 2017, och sedan dess har GitHub-repositoriet fĂ„tt lite mindre Ă€n 1300 stjĂ€rnor och 50+ bidragsgivare. Den senaste releasen frĂ„n september har testats för arbete med Kubernetes 1.15—1.18, OpenShift 3.11+ och 4.4+, GKE och VMware Enterprise PKS 1.3+.

Arkitekturen av Crunchy Data PostgreSQL Operator uppfyller ocksÄ de angivna kraven:

En kort oversikt over PostgreSQL-operatÞrer for Kubernetes, vÄrt valg og erfaring

Administrasjon skjer via et verktĂžy pgo, men det genererer i sin tur Custom Resources for Kubernetes. SĂ„ operatĂžren gledet oss som potensielle brukere:

  • det finnes administrasjon via CRD;
  • brukervennlig administrasjon (ogsĂ„ via CRD);
  • integrasjon med andre komponenter Crunchy Data Container Suite — en spesialisert samling av containerbilder for PostgreSQL og verktĂžy for Ă„ jobbe med det (inkludert pgBackRest, pgAudit, utvidelser fra contrib osv.).

Men forsÞk pÄ Ä begynne Ä bruke operatÞren fra Crunchy Data avdekket flere problemer:

  • Det var ikke mulig Ă„ bruke tolerations — bare nodeSelector var tilgjengelig.
  • De opprettede podene var en del av Deployment, til tross for at vi distribuerte en stateful-applikasjon. I motsetning til StatefulSet kan ikke Deployment opprette disker.

Den siste ulempen fÞrte til morsomme situasjoner: pÄ testmiljÞet klarte vi Ä starte 3 replikater med én disk local storage, noe som resulterte i at operatÞren rapporterte at 3 replikater kjÞrte (selv om det ikke var tilfelle).

En annen funksjon ved denne operatÞren er dens ferdige integrasjon med ulike stÞttesystemer. For eksempel er det enkelt Ä installere pgAdmin og pgBounce, og i dokumentasjonen vurderes forhÄndsinnstilte Grafana og Prometheus. I den nylige utgivelsen 4.5.0-beta1 blir det spesielt nevnt at integrasjonen med prosjektet pgMonitor, noe som gjÞr at operatÞren tilbyr visuell fremstilling av PgSQL-metrikker "out of the box".

Likevel fÞrte det merkelige valget av genererte Kubernetes-ressurser til at vi mÄtte finne en annen lÞsning.

3. Zalando Postgres Operator

Zalando-produkter er godt kjent for oss: vi har erfaring med Zalenium og selvfĂžlgelig har vi prĂžvd Patroni — deres populĂŠre HA-lĂžsning for PostgreSQL. Om selskapets tilnĂŠrming til Ă„ lage Postgres Operator fortalte en av forfatterne, Alexey Klyukin, i sendingen Postgres tirsdag nr. 5, og vi likte det.

Dette er den nyeste lÞsningen blant de som vurderes i artikkelen: den fÞrste utgivelsen fant sted i august 2018. Men til tross for det relativt lille antallet offisielle utgivelser, har prosjektet gjort store fremskritt og allerede overgÄtt lÞsningen fra Crunchy Data med 1300+ stjerner pÄ GitHub og det hÞyeste antallet bidragsytere (70+).

«Under panseret» bruker denne operatÞren lÞsninger som er tidstestet:

  • Patroni og Spilo for administrasjon,
  • WAL-E — for sikkerhetskopiering,
  • PgBouncer — som en tilkoblingspool.

Slik er operatorarkitekturen fra Zalando presentert:

En kort oversikt over PostgreSQL-operatÞrer for Kubernetes, vÄrt valg og erfaring

Operatoren administreres helt via Custom Resources, og oppretter automatisk en StatefulSet fra containere, som deretter kan tilpasses ved Ă„ legge til ulike sidecar-er i pod-en. Dette er et betydelig pluss sammenlignet med operatĂžren fra Crunchy Data.

Siden det var lĂžsningen fra Zalando vi valgte blant tre vurderte alternativer, vil videre beskrivelse av dens funksjoner bli presentert nedenfor, sammen med praksisen for anvendelse.

Praksis med Postgres Operator fra Zalando

Deployeringen av operatÞren skjer veldig enkelt: det er nok Ä laste ned den aktuelle utgaven fra GitHub og anvende YAML-filene fra direktorien manifester. Som et alternativ kan man ogsÄ bruke OperatorHub.

Etter installasjonen bÞr man ta seg tid til Ä konfigurere lagringsplasser for logger og sikkerhetskopier. Dette gjÞres via ConfigMap postgres-operator i navnerommet hvor du installerte operatÞren. NÄr lagringsplassene er konfigurert, kan du deployere den fÞrste PostgreSQL-klusteret.

For eksempel ser vÄr standarddeployering slik ut:

apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
 name: staging-db
spec:
 numberOfInstances: 3
 patroni:
   synchronous_mode: true
 postgresql:
   version: "12"
 resources:
   limits:
     cpu: 100m
     memory: 1Gi
   requests:
     cpu: 100m
     memory: 1Gi
 sidecars:
 - env:
   - name: DATA_SOURCE_URI
     value: 127.0.0.1:5432
   - name: DATA_SOURCE_PASS
     valueFrom:
       secretKeyRef:
         key: password
         name: postgres.staging-db.credentials
   - name: DATA_SOURCE_USER
     value: postgres
   image: wrouesnel/postgres_exporter
   name: prometheus-exporter
   resources:
     limits:
       cpu: 500m
       memory: 100Mi
     requests:
       cpu: 100m
       memory: 100Mi
 teamId: staging
 volume:
   size: 2Gi

Denne manifestet deployerer et kluster med tre eksemplarer med sidecar i form av postgres_exporter, som vi henter applikasjonsmetrikker fra. Som du ser, er det veldig enkelt, og om Ăžnskelig kan man bruke bokstavelig talt et ubegrenset antall kluster.

Det er ogsĂ„ verdt Ă„ merke seg webpanelet for administrasjon — postgres-operator-ui. Det leveres sammen med operatĂžren og lar deg opprette og slette kluster, samt arbeide med sikkerhetskopier som operatĂžren lager.

En kort oversikt over PostgreSQL-operatÞrer for Kubernetes, vÄrt valg og erfaring
Liste over PostgreSQL-kluster

En kort oversikt over PostgreSQL-operatÞrer for Kubernetes, vÄrt valg og erfaring
Administrering av sikkerhetskopier

En annen interessant funksjon er stÞtten for Teams API. Denne mekanismen oppretter automatisk roller i PostgreSQL, basert pÄ den mottatte listen av brukernavn. Deretter lar API-et deg returnere listen over brukere, for hvilke roller blir opprettet automatisk.

Problemer og lĂžsninger

Imidlertid avdekket bruken av operatĂžren snart flere betydelige ulemper:

  1. mangel pÄ stÞtte for nodeSelector;
  2. umulighet Ă„ deaktivere sikkerhetskopier;
  3. nÄr man bruker funksjonen for Ä opprette databaser, fÄr man ikke standardrettigheter;
  4. det mangler periodisk dokumentasjon, eller den er utdaterte.

Heldigvis kan mange av dem lþses. La oss begynne med slutten – problemer med dokumentasjon.

Det er sannsynlig at du vil oppleve at det ikke alltid er klart hvordan man spesifiserer sikkerhetskopiering og hvordan man kobler bakoverbĂžtte til Operator UI. Dette er nevnt kort i dokumentasjonen, mens en virkelig beskrivelse finnes i PR:

  1. du mÄ lage et hemmelig;
  2. overfĂžre det til operatĂžren som parameter pod_environment_secret_name i CRD med innstillingene til operatĂžren eller i ConfigMap (avhengig av hvordan du har valgt Ă„ installere operatĂžren).

Imidlertid, som det viste seg, er dette for Ăžyeblikket umulig. Det er derfor vi samlet vĂ„r versjon av operatĂžren med noen ekstra tredjepartsarbeider. Mer om den — se nedenfor.

Hvis du overfĂžrer parametere til operatĂžren for sikkerhetskopiering, nemlig — wal_s3_bucket og tilgangsnĂžkler i AWS S3, vil den sikkerhetskopiere alt: ikke bare databaser i produksjon, men ogsĂ„ staging. Dette var ikke akseptabelt for oss.

I beskrivelsen av parametrene til Spilo, som er den grunnleggende Docker-innpakningen for PgSQL nÄr man bruker operatÞren, viste det seg: man kan overfÞre parameteren WAL_S3_BUCKET som tom, og dermed deaktivere sikkerhetskopier. Dessuten, til stor glede, ble det funnet en ferdig PR, som vi straks aksepterte i vÄrt fork. NÄ er det nok Ä legge til enableWALArchiving: false i ressursen til PostgreSQL-klyngen.

Ja, det var mulig Ă„ gjĂžre det annerledes, ved Ă„ kjĂžre 2 operatĂžrer: en for staging (uten sikkerhetskopier), og den andre — for produksjon. Men slik klarte vi oss med Ă©n.

Ok, vi lÊrte Ä gi databasene tilgang til S3, og sikkerhetskopiene begynte Ä komme inn i lagringen. Hvordan fÄr man sidene for sikkerhetskopier til Ä fungere i Operator UI?

En kort oversikt over PostgreSQL-operatÞrer for Kubernetes, vÄrt valg og erfaring

I Operator UI mÄ du legge til 3 variabler:

  • SPILO_S3_BACKUP_BUCKET
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

Etter dette blir hÄndteringen av sikkerhetskopier tilgjengelig, noe som i vÄrt tilfelle forenkler arbeidet med staging, ved Ä tillate levering av utsnitt fra produksjon uten ekstra skript.

Som en annen fordel ble det nevnt at arbeidet med Teams API og de brede mulighetene for opprettelse av databaser og roller ved hjelp av operatĂžren. Imidlertid hadde de opprettede rollene ikke standardrettigheter.Dermed kunne en bruger med lĂŠserettigheder ikke lĂŠse de nye tabeller.

Hvorfor er det sĂ„dan? Selvom det i koden det finnes er nĂždvendigt, GRANT, de anvendes langt fra altid. Der er 2 metoder: syncPreparedDatabases og syncDatabases. I syncPreparedDatabases — selvom der i sektionen preparedDatabases det finnes er en betingelse defaultRoles og defaultUsers til oprettelse af roller, anvendes standardrettighederne ikke automatisk. Vi er i gang med at forberede en patch, sĂ„ disse rettigheder anvendes automatisk.

Og det sidste punkt i de forbedringer, der er relevante for os — patch, der tilfĂžjer Node Affinity til den oprettede StatefulSet. Vore kunder foretrĂŠkker ofte at reducere omkostningerne ved at bruge spot-instanser, og pĂ„ dem bĂžr man ikke placere databaser. Dette problem kunne ogsĂ„ lĂžses gennem tolerations, men tilstedevĂŠrelsen af Node Affinity giver stĂžrre sikkerhed.

Hvad kom der ud af det?

Som resultat af lÞsningen pÄ de nÊvnte problemer har vi forgrenet Postgres Operator fra Zalando til vores eget repository,, hvor det samles med sÄ nyttige patches. For mere bekvemmelighed har vi ogsÄ samlet Docker-image.

En liste over PR'er, der er accepteret i forgreningen:

Det ville vÊre fantastisk, hvis fÊllesskabet stÞttede disse PR'er, sÄ de kom ind i upstream med den nÊste version af operatoren (1.6).

Bonus! Succeshistorie om migrering af produktion

Hvis du bruger Patroni, kan man migrere aktiv produktion til operatĂžren med minimal nedetid.

Spilo gÞr det muligt at lave standby-klynger via S3-lagring med Wal-E,, hvor den binÊre log PgSQL fÞrst gemmes i S3 og derefter hentes af replikationen. Men hvad skal man gÞre, hvis du ikke bruger Wal-E i en gammel infrastruktur? LÞsningen pÄ dette problem er allerede blevet foreslÄet pÄ Habr.

Logisk replikation af PostgreSQL kommer til hjĂŠlp. Men lad os ikke dykke ned i detaljer om, hvordan man opretter publikationer og abonnementer, fordi... vores plan mislykkedes.

Problemet er, at der var flere belastede tabeller i databasen med millioner af rÊkker, som desuden konstant blev tilfÞjet og slettet. Simpelt abonnement med copy_data, hvor en ny replik kopierer alt indhold fra master, kunne simpelthen ikke fÞlge med masteren. IndholdsoverfÞrslen fungerede i en uge, men nÄede aldrig masteren. Som fÞlge heraf hjalp article kollegerne fra Avito: man kan overfÞre data ved at bruge pg_dump. Jeg vil beskrive vores (lidt forbedrede) version af denne algoritme.

Ideen er at man kan oprette en deaktiveret abonnement knyttet til en bestemt replikationsslot og derefter korrigere transaktionsnummeret. Der var replikaer til rÄdighed for production. Dette er vigtigt, da replikaen vil hjÊlpe med at skabe en konsistent dump og fortsÊtte med at modtage Êndringer fra masteren.

I de efterfĂžlgende kommandoer, der beskriver migreringsprocessen, vil fĂžlgende betegnelser blive brugt for vĂŠrtterne:

  1. master — kilde server;
  2. replica1 — stream-replika pĂ„ den gamle production;
  3. replica2 — ny logisk replika.

Migreringsplan

1. Opretter et abonnement pÄ alle tabeller i skemaet offentlig database dbname:

psql -h master -d dbname -c "CREATE PUBLICATION dbname FOR ALL TABLES;"

2. Opretter en replikationsslot pÄ masteren:

psql -h master -c "select pg_create_logical_replication_slot('repl', 'pgoutput');"

3. Stopper replikationen pÄ den gamle replika:

psql -h replica1 -c "select pg_wal_replay_pause();"

4. Henter transaktionsnummeret fra masteren:

psql -h master -c "select replay_lsn from pg_stat_replication where client_addr = 'replica1';"

5. Tag dump fra den gamle replika. Vi vil gÞre dette i flere trÄde, hvilket hjÊlper med at fremskynde processen:

pg_dump -h replica1 --no-publications --no-subscriptions -O -C -F d -j 8 -f dump/ dbname

6. Laster dumpen op pÄ den nye server:

pg_restore -h replica2 -F d -j 8 -d dbname dump/

7. Efter indlÊsning af dump kan replikationen startes pÄ stream-replikaen:

psql -h replica1 -c "select pg_wal_replay_resume();"

7. Opretter abonnement pÄ den nye logiske replika:

psql -h replica2 -c "create subscription oldprod connection 'host=replica1 port=5432 user=postgres password=secret dbname=dbname' publication dbname with (enabled = false, create_slot = false, copy_data = false, slot_name='repl');"

8. Henter oid af abonnementet:

psql -h replica2 -d dbname -c "select oid, * from pg_subscription;"

9. Antag, at der blev modtaget oid=1000. Anvender transaktionsnummeret pÄ abonnementet:

psql -h replica2 -d dbname -c "select pg_replication_origin_advance('pg_1000', 'AA/AAAAAAAA');"

10. Starter replikationen:

psql -h replica2 -d dbname -c "alter subscription oldprod enable;"

11. Kontrollerer status for abonnementet, replikationen bĂžr fungere:

psql -h replica2 -d dbname -c "select * from pg_replication_origin_status;"
psql -h master -d dbname -c "select slot_name, restart_lsn, confirmed_flush_lsn from pg_replication_slots;"

12. NÄr replikationen er startet og databaserne er synkroniseret, kan der foretages et skift.

13. Efter at have deaktiveret replikationen skal sekvenserne korrigeres. Dette er godt beskrevet i artiklen pÄ wiki.postgresql.org.

Takket vĂŠre denne plan blev skiftet gennemfĂžrt med minimale forsinkelser.

Konklusjon

Kubernetes-operatÞrar gjer det enklare Ä utfÞre ulike oppgÄver ved Ä redusere dei til Ä opprette K8s-ressursar. Men etter Ä ha oppnÄdd bemerkelsesverdig automatisering med dei, bÞr ein hugse at dette kan bringe med seg ein del uventa utfordringar, sÄ det er viktig Ä velje operatÞrar med omhu.

Etter Ä ha vurdert dei tre mest populÊre Kubernetes-operatÞrane for PostgreSQL, valde vi prosjektet frÄ Zalando. Og vi mÄtte overvinne visse vanskar, men resultatet var verkeleg tilfredsstillande, sÄ vi planlegg Ä utvide denne erfaringa til fleire andre PgSQL-installasjonar. Hvis du har erfaring med tilsvarande lÞysingar, vil vi gjerne sjÄ detaljar i kommentarane!

P.S.

Also read in our blog:

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster