{"id":95322,"date":"2020-09-28T07:42:39","date_gmt":"2020-09-28T05:42:39","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt"},"modified":"2020-09-28T07:42:39","modified_gmt":"2020-09-28T05:42:39","slug":"kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","title":{"rendered":"En kort \u00f6versikt \u00f6ver PostgreSQL-operat\u00f6rer f\u00f6r Kubernetes, v\u00e5rt val och erfarenhet","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"En kort \u00f6versikt \u00f6ver PostgreSQL-operat\u00f6rer f\u00f6r Kubernetes, v\u00e5rt val och erfarenhet\" src=\"\/wp-content\/uploads\/2020\/09\/23b2db49941fa5bd5000358c8ffb991b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKunder kommer allt oftare med f\u00f6rfr\u00e5gningar som: \"Vi vill ha n\u00e5got som Amazon RDS, men billigare\"; \"Vi vill ha n\u00e5got liknande RDS, men i alla infrastrukturer\". F\u00f6r att implementera en s\u00e5dan managed-l\u00f6sning p\u00e5 Kubernetes har vi granskat tillst\u00e5ndet f\u00f6r de mest popul\u00e4ra operat\u00f6rerna f\u00f6r PostgreSQL (Stolon, operat\u00f6rer fr\u00e5n Crunchy Data och Zalando) och gjort v\u00e5rt val.<\/p>\n<p>Den h\u00e4r artikeln handlar om v\u00e5ra insikter, b\u00e5de fr\u00e5n ett teoretiskt perspektiv (\u00f6versikt \u00f6ver l\u00f6sningar) och praktiskt (vad har valts och vad har vi \u00e5stadkommit). Men f\u00f6rst, l\u00e5t oss klarg\u00f6ra vilka krav som st\u00e4lls p\u00e5 en potentiell ers\u00e4ttning f\u00f6r RDS...<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Vad \u00e4r RDS?<\/h2>\n<p>\nN\u00e4r m\u00e4nniskor pratar om RDS, s\u00e5 menar de, enligt v\u00e5r erfarenhet, en hanterad (managed) databas tj\u00e4nst som:<\/p>\n<ol>\n<li>\u00e4r enkel att konfigurera;<\/li>\n<li>har m\u00f6jlighet att arbeta med snapshots och kunna \u00e5terst\u00e4llas fr\u00e5n dem (helst med st\u00f6d f\u00f6r <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Point-in-time_recovery\">PITR<\/a><\/noindex>);<\/li>\n<li>m\u00f6jlighet att skapa master-slave-topologier;<\/li>\n<li>har en rik lista av till\u00e4gg;<\/li>\n<li>erbjuder revision och hantering av anv\u00e4ndare\/beh\u00f6righeter.<\/li>\n<\/ol>\n<p>\nGenerellt kan tillv\u00e4gag\u00e5ngss\u00e4tten f\u00f6r att l\u00f6sa den st\u00e4llda uppgiften vara ganska olika, men vi drar oss f\u00f6r att anv\u00e4nda Ansible. (En liknande slutsats gjorde ocks\u00e5 kollegorna fr\u00e5n 2GIS efter <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/509926\/\">deras f\u00f6rs\u00f6k<\/a><\/noindex> att skapa \"ett verktyg f\u00f6r snabb distribution av en felresistent Postgres-kluster.\")<\/p>\n<p>Operat\u00f6rer \u00e4r det allm\u00e4nt accepterade tillv\u00e4gag\u00e5ngss\u00e4ttet f\u00f6r att l\u00f6sa s\u00e5dana uppgifter inom Kubernetes-ekosystemet. Mer om dem i relation till databaser som k\u00f6rs inuti Kubernetes har teknisk direkt\u00f6r f\u00f6r \"Flanta\" redan ber\u00e4ttat, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/distol\/\" class=\"user_link\">distol<\/a><\/noindex>, i <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">ett av sina f\u00f6redrag<\/a><\/noindex>.<\/p>\n<p><i><strong>NB<\/strong><\/i><i>: F\u00f6r att snabbt skapa enkla operat\u00f6rer rekommenderar vi att titta p\u00e5 v\u00e5rt Open Source-verktyg <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\"><i>shell-operator<\/i><\/a><\/noindex><i>. Genom att anv\u00e4nda det kan detta g\u00f6ras utan kunskaper i Go, p\u00e5 mer v\u00e4lbekanta s\u00e4tt f\u00f6r systemadministrat\u00f6rer: i Bash, Python etc.<\/i><\/p>\n<p>Det finns flera popul\u00e4ra K8s-operat\u00f6rer f\u00f6r PostgreSQL:<\/p>\n<ul>\n<li>Stolon;<\/li>\n<li>Crunchy Data PostgreSQL Operator;<\/li>\n<li>Zalando Postgres Operator.<\/li>\n<\/ul>\n<p>\nL\u00e5t oss titta n\u00e4rmare p\u00e5 dem.<\/p>\n<h2>Val av operat\u00f6r<\/h2>\n<p>\nF\u00f6rutom de viktiga funktioner som redan n\u00e4mnts f\u00f6rv\u00e4ntade vi oss ocks\u00e5, som infrastrukturingenj\u00f6rer inom Kubernetes, f\u00f6ljande fr\u00e5n operat\u00f6rerna:<\/p>\n<ul>\n<li> deploy fr\u00e5n Git och med <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/operator\/#deploying-operators\">Custom Resources<\/a><\/noindex>;<\/li>\n<li> st\u00f6der pod anti-affinity;<\/li>\n<li> installation av node affinity eller node selector;<\/li>\n<li> installation av tolerations;<\/li>\n<li> m\u00f6jligheter till justering;<\/li>\n<li> f\u00f6rst\u00e5eliga teknologier och till och med kommandon.<\/li>\n<\/ul>\n<p>\nUtan att g\u00e5 in p\u00e5 detaljer f\u00f6r varje punkt (fr\u00e5ga i kommentarerna om det finns fr\u00e5gor kvar efter att ha l\u00e4st hela artikeln), kan jag generellt p\u00e5peka att dessa parametrar beh\u00f6vs f\u00f6r en mer detaljerad beskrivning av specialiseringen av klusternoderna f\u00f6r att best\u00e4lla dem f\u00f6r specifika applikationer. P\u00e5 s\u00e5 s\u00e4tt kan vi uppn\u00e5 en optimal balans mellan prestanda och kostnad.<\/p>\n<p>Nu \u2013 till sj\u00e4lva PostgreSQL-operat\u00f6rerna.<\/p>\n<h3>1. Stolon<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\">Stolon<\/a><\/noindex> fr\u00e5n det italienska f\u00f6retaget Sorint.lab i <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">den redan n\u00e4mnda presentationen<\/a><\/noindex> betraktades som en typ av referens bland operat\u00f6rer f\u00f6r databashanteringssystem. Det \u00e4r ett ganska gammalt projekt: den f\u00f6rsta offentliga versionen sl\u00e4pptes redan i november 2015(!), och GitHub-repot kan skryta med n\u00e4stan 3000 stj\u00e4rnor och 40+ bidragsgivare.<\/p>\n<p>Och faktiskt \u00e4r Stolon ett utm\u00e4rkt exempel p\u00e5 genomt\u00e4nkt arkitektur:<\/p>\n<p><img decoding=\"async\" alt=\"En kort \u00f6versikt \u00f6ver PostgreSQL-operat\u00f6rer f\u00f6r Kubernetes, v\u00e5rt val och erfarenhet\" src=\"\/wp-content\/uploads\/2020\/09\/a34625c130bfd29c5645cf2417042de2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOm konstruktionen av denna operat\u00f6r kan man l\u00e4sa mer detaljerat i presentationen eller <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/blob\/master\/doc\/architecture.md\">projektets dokumentation<\/a><\/noindex>. I stort sett kan man s\u00e4ga att den klarar av allt som beskrivs: failover, proxy f\u00f6r transparent kund\u00e5tkomst, s\u00e4kerhetskopior\u2026 Dessutom erbjuder proxy\u00e5tkomst genom en enda tj\u00e4nst-endpoint \u2013 till skillnad fr\u00e5n de tv\u00e5 andra l\u00f6sningarna som diskuterats senare (de har tv\u00e5 tj\u00e4nster f\u00f6r \u00e5tkomst till databasen).<\/p>\n<p>Men Stolon <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/issues\/463#issuecomment-379666733\">har inga anpassade resurser<\/a><\/noindex>, vilket g\u00f6r att den inte kan distribueras s\u00e5 enkelt och snabbt \u2013 \"som varma bakverk\" \u2013 f\u00f6r att skapa instanser av databashanteringssystemet i Kubernetes. Hanteringen sker via verktyget <code>stolonctl<\/code>, distribution \u2013 via Helm-diagram, och anv\u00e4ndardefinierade anges i ConfigMap.<\/p>\n<p>\u00c5 ena sidan verkar det som att operat\u00f6ren inte riktigt \u00e4r en operat\u00f6r (eftersom den inte anv\u00e4nder CRD). Men \u00e5 andra sidan \u2013 det \u00e4r ett flexibelt system som l\u00e5ter dig konfigurera resurser i K8s p\u00e5 det s\u00e4tt som du vill.<\/p>\n<p>Sammanfattningsvis tyckte vi personligen att det inte var optimalt att ha ett separat diagram f\u00f6r varje databas. S\u00e5 vi b\u00f6rjade leta efter alternativ.<\/p>\n<h3>2. Crunchy Data PostgreSQL Operator<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\">Operat\u00f6ren fr\u00e5n Crunchy Data<\/a><\/noindex>, en ung amerikansk startup, verkade vara ett logiskt alternativ. Dess offentliga historia b\u00f6rjade med den f\u00f6rsta versionen i mars 2017, och sedan dess har GitHub-repot f\u00e5tt n\u00e5got mindre \u00e4n 1300 stj\u00e4rnor och 50+ bidragsgivare. Den senaste versionen fr\u00e5n september testades f\u00f6r att fungera med Kubernetes 1.15\u20131.18, OpenShift 3.11+ och 4.4+, GKE och VMware Enterprise PKS 1.3+.<\/p>\n<p>Arkitekturen f\u00f6r Crunchy Data PostgreSQL Operator uppfyller ocks\u00e5 de angivna kraven:<\/p>\n<p><img decoding=\"async\" alt=\"En kort \u00f6versikt \u00f6ver PostgreSQL-operat\u00f6rer f\u00f6r Kubernetes, v\u00e5rt val och erfarenhet\" src=\"\/wp-content\/uploads\/2020\/09\/343cd0494abae42fcf5b47c5bb4eb310.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHantera g\u00f6rs via ett verktyg <code>pgo<\/code>, men det genererar i sin tur Custom Resources f\u00f6r Kubernetes. S\u00e5 som potentiella anv\u00e4ndare blev vi glatt \u00f6verraskade av operat\u00f6ren:<\/p>\n<ul>\n<li> det finns hantering via CRD;<\/li>\n<li> anv\u00e4ndarv\u00e4nlig hantering (\u00e4ven den via CRD);<\/li>\n<li> integration med andra komponenter <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/crunchy-postgres-containers\/4.3.1\/\">Crunchy Data Container Suite<\/a><\/noindex> \u2014 en specialiserad samling av containerbilder f\u00f6r PostgreSQL och verktyg f\u00f6r att arbeta med den (inklusive pgBackRest, pgAudit, till\u00e4gg fr\u00e5n contrib osv.).<\/li>\n<\/ul>\n<p>\nN\u00e4r vi dock f\u00f6rs\u00f6kte b\u00f6rja anv\u00e4nda operat\u00f6ren fr\u00e5n Crunchy Data uppstod n\u00e5gra problem:<\/p>\n<ul>\n<li>Det fanns ingen m\u00f6jlighet till toleranser \u2014 endast nodeSelector var tillg\u00e4nglig.<\/li>\n<li>De skapade pod'arna var en del av Deployment, trots att vi distribuerade en stateful-applikation. Till skillnad fr\u00e5n StatefulSet kan inte Deployment skapa diskar.<\/li>\n<\/ul>\n<p>\nDen sista nackdelen leder till roliga situationer: i testmilj\u00f6n lyckades vi k\u00f6ra 3 repliker med en disk <i>lokal lagring<\/i>, vilket gjorde att operat\u00f6ren rapporterade att 3 repliker fungerade (\u00e4ven om s\u00e5 inte var fallet).<\/p>\n<p>En annan funktion hos denna operat\u00f6r \u00e4r dess f\u00e4rdiga integration med olika hj\u00e4lpsystem. Till exempel, det \u00e4r enkelt att installera pgAdmin och pgBounce, och i <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/postgres-operator\/4.4.0\/installation\/other\/ansible\/installing-metrics\/\">dokumentationen<\/a><\/noindex> f\u00f6rhandsinst\u00e4llningen av Grafana och Prometheus \u00f6verv\u00e4gs. I den senaste <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\/releases\/tag\/v4.5.0-beta.1\">versionen 4.5.0-beta1<\/a><\/noindex> noteras den f\u00f6rb\u00e4ttrade integrationen med projektet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/pgmonitor\">pgMonitor<\/a><\/noindex>, vilket g\u00f6r att operat\u00f6ren erbjuder en visuell presentation av PgSQL-metrics \"out-of-the-box\".<\/p>\n<p>\u00c4nd\u00e5 ledde det m\u00e4rkliga valet av genererade Kubernetes-resurser oss till att beh\u00f6va hitta en alternativ l\u00f6sning.<\/p>\n<h3>3. Zalando Postgres Operator<\/h3>\n<p>\nZalando-produkter \u00e4r vi v\u00e4lbekanta med: vi har erfarenhet av att anv\u00e4nda Zalenium och sj\u00e4lvklart har vi provat <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\">Patroni<\/a><\/noindex> \u2014 deras popul\u00e4ra HA-l\u00f6sning f\u00f6r PostgreSQL. Om f\u00f6retagets tillv\u00e4gag\u00e5ngss\u00e4tt f\u00f6r att skapa <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\">Postgres Operator<\/a><\/noindex> ber\u00e4ttade en av dess f\u00f6rfattare \u2014 Alexey Klyukin \u2014 i s\u00e4ndningen av <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres-tisdag #5<\/a><\/noindex>, och vi tyckte att den var intressant.<\/p>\n<p>Detta \u00e4r den yngsta l\u00f6sningen bland de som behandlas i artikeln: den f\u00f6rsta versionen sl\u00e4pptes i augusti 2018. Trots det lilla antalet formella versioner har projektet gjort stora framsteg och redan \u00f6vertr\u00e4ffat l\u00f6sningen fr\u00e5n Crunchy Data med \u00f6ver 1300 stj\u00e4rnor p\u00e5 GitHub och det h\u00f6gsta antalet bidragsgivare (70+).<\/p>\n<p>\"Under huven\" f\u00f6r denna operat\u00f6r anv\u00e4nds bepr\u00f6vade l\u00f6sningar:<\/p>\n<ul>\n<li> Patroni och <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/spilo\">Spilo<\/a><\/noindex> f\u00f6r hantering,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">WAL-E<\/a><\/noindex> \u2014 f\u00f6r s\u00e4kerhetskopior,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\">PgBouncer<\/a><\/noindex> \u2014 som en anslutningspool.<\/li>\n<\/ul>\n<p>\nS\u00e5 h\u00e4r presenteras operat\u00f6rens arkitektur fr\u00e5n Zalando:<\/p>\n<p><img decoding=\"async\" alt=\"En kort \u00f6versikt \u00f6ver PostgreSQL-operat\u00f6rer f\u00f6r Kubernetes, v\u00e5rt val och erfarenhet\" src=\"\/wp-content\/uploads\/2020\/09\/c66f10c1a818592ecaacd2db4ce5ace5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOperat\u00f6ren hanteras helt genom Custom Resources, och skapar automatiskt ett StatefulSet av containrar som sedan kan anpassas genom att l\u00e4gga till olika sidecar i podden. Allt detta \u00e4r en betydande f\u00f6rdel j\u00e4mf\u00f6rt med operat\u00f6ren fr\u00e5n Crunchy Data.<\/p>\n<p>Eftersom det var l\u00f6sningen fr\u00e5n Zalando som vi valde bland tre \u00f6verv\u00e4gda alternativ, kommer en ytterligare beskrivning av dess funktioner att presenteras nedan, tillsammans med praktisk till\u00e4mpning.<\/p>\n<h2>Praktik med Postgres Operator fr\u00e5n Zalando<\/h2>\n<p>\nDistributionen av operat\u00f6ren sker mycket enkelt: det r\u00e4cker med att ladda ner den aktuella versionen fr\u00e5n GitHub och till\u00e4mpa YAML-filerna fr\u00e5n katalogen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/tree\/master\/manifests\">manifests<\/a><\/noindex>. Som ett alternativ kan man \u00e4ven anv\u00e4nda <noindex><a rel=\"nofollow\" href=\"https:\/\/operatorhub.io\/operator\/postgres-operator\">OperatorHub<\/a><\/noindex>.<\/p>\n<p>Efter installationen b\u00f6r man se till att konfigurera <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/reference\/operator_parameters.md#aws-or-gcp-interaction\">lagringsl\u00f6sningar f\u00f6r loggar och s\u00e4kerhetskopior<\/a><\/noindex>. Detta g\u00f6rs via ConfigMap <code>postgres-operator<\/code> i det namnutrymme d\u00e4r du installerade operat\u00f6ren. N\u00e4r lagringsl\u00f6sningarna \u00e4r konfigurerade kan du distribuera din f\u00f6rsta PostgreSQL-kluster.<\/p>\n<p>Till exempel ser v\u00e5r standarddistribution ut som f\u00f6ljer:<\/p>\n<pre><code class=\"plaintext\">apiVersion: acid.zalan.do\/v1\nkind: postgresql\nmetadata:\n name: staging-db\nspec:\n numberOfInstances: 3\n patroni:\n   synchronous_mode: true\n postgresql:\n   version: \"12\"\n resources:\n   limits:\n     cpu: 100m\n     memory: 1Gi\n   requests:\n     cpu: 100m\n     memory: 1Gi\n sidecars:\n - env:\n   - name: DATA_SOURCE_URI\n     value: 127.0.0.1:5432\n   - name: DATA_SOURCE_PASS\n     valueFrom:\n       secretKeyRef:\n         key: password\n         name: postgres.staging-db.credentials\n   - name: DATA_SOURCE_USER\n     value: postgres\n   image: wrouesnel\/postgres_exporter\n   name: prometheus-exporter\n   resources:\n     limits:\n       cpu: 500m\n       memory: 100Mi\n     requests:\n       cpu: 100m\n       memory: 100Mi\n teamId: staging\n volume:\n   size: 2Gi\n<\/code><\/pre>\n<p>\nDenna manifest distribuerar en kluster med 3 instanser med sidecar i form av <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wrouesnel\/postgres_exporter\">postgres_exporter<\/a><\/noindex>, varifr\u00e5n vi h\u00e4mtar applikationsmetrik. Som du ser \u00e4r det v\u00e4ldigt enkelt, och om s\u00e5 \u00f6nskas kan man skapa ett bokstavligt talat obegr\u00e4nsat antal kluster.<\/p>\n<p>Det \u00e4r v\u00e4rt att notera \u00e4ven <b>webbpanelen f\u00f6r administration<\/b> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/operator-ui.md\">postgres-operator-ui<\/a><\/noindex>. Den levereras tillsammans med operat\u00f6ren och g\u00f6r det m\u00f6jligt att skapa och ta bort kluster, samt arbeta med s\u00e4kerhetskopior som operat\u00f6ren g\u00f6r.<\/p>\n<p><img decoding=\"async\" alt=\"En kort \u00f6versikt \u00f6ver PostgreSQL-operat\u00f6rer f\u00f6r Kubernetes, v\u00e5rt val och erfarenhet\" src=\"\/wp-content\/uploads\/2020\/09\/2e9ae033a9817d101c843ce061aafdb5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Lista \u00f6ver PostgreSQL-kluster<\/i><\/p>\n<p><img decoding=\"async\" alt=\"En kort \u00f6versikt \u00f6ver PostgreSQL-operat\u00f6rer f\u00f6r Kubernetes, v\u00e5rt val och erfarenhet\" src=\"\/wp-content\/uploads\/2020\/09\/74a65f7f301da14a0cb7bea6d5ef84ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Hantera s\u00e4kerhetskopior<\/i><\/p>\n<p>En annan intressant funktion \u00e4r st\u00f6det f\u00f6r <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/user.md#teams-api-roles\">Teams API<\/a><\/noindex>. Denna mekanism skapar automatiskt <b>roller i PostgreSQL<\/b>, baserat p\u00e5 den mottagna listan \u00f6ver anv\u00e4ndarnamn. D\u00e4refter g\u00f6r API:et det m\u00f6jligt att returnera listan \u00f6ver anv\u00e4ndare f\u00f6r vilka roller skapas automatiskt.<\/p>\n<h3>Problem och l\u00f6sningar<\/h3>\n<p>\nMen anv\u00e4ndningen av operat\u00f6ren avsl\u00f6jade snart flera betydande nackdelar:<\/p>\n<ol>\n<li> brist p\u00e5 nodeSelector-st\u00f6d;<\/li>\n<li> of\u00f6rm\u00e5ga att st\u00e4nga av s\u00e4kerhetskopior;<\/li>\n<li> n\u00e4r funktionen f\u00f6r att skapa databaser anv\u00e4nds, tilldelas inga standardbeh\u00f6righeter;<\/li>\n<li> ibland saknas dokumentation eller s\u00e5 \u00e4r den inaktuell.<\/li>\n<\/ol>\n<p>\nLyckligtvis kan m\u00e5nga av dessa problem l\u00f6sas. L\u00e5t oss b\u00f6rja med slutet \u2014 problemen med <strong>dokumentationen<\/strong>. <\/p>\n<p>Du kommer troligen att st\u00f6ta p\u00e5 att det inte alltid \u00e4r klart hur man st\u00e4ller in en s\u00e4kerhetskopia och hur man kopplar en s\u00e4kerhetskopieringsbucket till Operator UI. Detta n\u00e4mns kort i dokumentationen, men en detaljerad beskrivning finns i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/481\">PR<\/a><\/noindex>:<\/p>\n<ol>\n<li>du m\u00e5ste skapa en hemlighet;<\/li>\n<li>\u00f6verf\u00f6ra den till operat\u00f6ren i parametern <code>pod_environment_secret_name<\/code> i CRD med operat\u00f6rens inst\u00e4llningar eller i ConfigMap (beroende p\u00e5 hur du valde att installera operat\u00f6ren).<\/li>\n<\/ol>\n<p>\nMen som det visade sig \u00e4r detta f\u00f6r n\u00e4rvarande om\u00f6jligt. Just d\u00e4rf\u00f6r har vi samlat <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">v\u00e5r version av operat\u00f6ren<\/a><\/noindex> med n\u00e5gra extra tredjepartsanpassningar. Mer om den \u2014 se nedan.<\/p>\n<p>Om du \u00f6verf\u00f6r parametrar f\u00f6r s\u00e4kerhetskopiering till operat\u00f6ren, n\u00e4mligen \u2014 <code>wal_s3_bucket<\/code> och \u00e5tkomstnycklarna till AWS S3, kommer den <strong>att s\u00e4kerhetskopiera allt<\/strong>: inte bara databaser i produktion, utan \u00e4ven staging. Det passade inte oss.<\/p>\n<p>I beskrivningen av parametrarna f\u00f6r Spilo, vilket \u00e4r en grundl\u00e4ggande Docker-wrapper f\u00f6r PgSQL vid anv\u00e4ndning av operat\u00f6ren, visade det sig: det g\u00e5r att \u00f6verf\u00f6ra parametern <code>WAL_S3_BUCKET<\/code> som tom, vilket st\u00e4nger av s\u00e4kerhetskopior. Dessutom, till v\u00e5r stora gl\u00e4dje hittade jag ocks\u00e5 en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">f\u00e4rdig PR<\/a><\/noindex>, som vi omedelbart accepterade i v\u00e5r fork. Nu r\u00e4cker det med att enkelt l\u00e4gga till <code>enableWALArchiving: false<\/code> i resursen f\u00f6r PostgreSQL-klustret.<\/p>\n<p>Ja, det fanns m\u00f6jlighet att g\u00f6ra det annorlunda genom att starta 2 operat\u00f6rer: en f\u00f6r staging (utan s\u00e4kerhetskopior) och en f\u00f6r produktion. Men s\u00e5 kunde vi klara oss med en.<\/p>\n<p>Okej, vi l\u00e4rde oss att ge databaser \u00e5tkomst till S3 och s\u00e4kerhetskopior b\u00f6rjade hamna i lagringen. Hur f\u00e5r man s\u00e4kerhetskopiorna att fungera i Operator UI?<\/p>\n<p><img decoding=\"async\" alt=\"En kort \u00f6versikt \u00f6ver PostgreSQL-operat\u00f6rer f\u00f6r Kubernetes, v\u00e5rt val och erfarenhet\" src=\"\/wp-content\/uploads\/2020\/09\/46169b53707b0bbb686798c655022f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI Operator UI m\u00e5ste du l\u00e4gga till 3 variabler:<\/p>\n<ul>\n<li> <code>SPILO_S3_BACKUP_BUCKET<\/code><\/li>\n<li> <code>AWS_ACCESS_KEY_ID<\/code><\/li>\n<li> <code>AWS_SECRET_ACCESS_KEY<\/code><\/li>\n<\/ul>\n<p>\nEfter detta kommer hanteringen av s\u00e4kerhetskopior att bli tillg\u00e4nglig, vilket i v\u00e5rt fall kommer att f\u00f6renkla arbetet med staging, s\u00e5 att vi kan leverera snapshots fr\u00e5n produktion utan extra skript.<\/p>\n<p>Som en ytterligare f\u00f6rdel n\u00e4mndes m\u00f6jligheten att arbeta med Teams API och de stora m\u00f6jligheterna att skapa databaser och roller med hj\u00e4lp av operat\u00f6ren. Men de skapade <strong>rollerna hade inga standardbeh\u00f6righeter<\/strong>. D\u00e4rf\u00f6r kunde en anv\u00e4ndare med l\u00e4sbeh\u00f6righet inte l\u00e4sa de nya tabellerna.<\/p>\n<p>Varf\u00f6r \u00e4r det s\u00e5? Trots att det i koden <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/pkg\/cluster\/database.go#L42\">det finns<\/a><\/noindex> n\u00f6dv\u00e4ndiga <code>GRANT<\/code>, de till\u00e4mpas l\u00e5ngt ifr\u00e5n alltid. Det finns 2 metoder: <code>syncPreparedDatabases<\/code> och <code>syncDatabases<\/code>. I <code>syncPreparedDatabases<\/code> \u2014 trots att det i avsnittet <code>preparedDatabases<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/manifests\/complete-postgres-manifest.yaml#L26\">det finns<\/a><\/noindex> finns ett villkor <code>defaultRoles<\/code> och <code>defaultUsers<\/code> f\u00f6r att skapa roller, \u2014 till\u00e4mpas inte beh\u00f6righeterna som standard. Vi \u00e4r i f\u00e4rd med att f\u00f6rbereda en patch s\u00e5 att dessa r\u00e4ttigheter automatiskt till\u00e4mpas.<\/p>\n<p>Och den sista punkten bland de aktuella f\u00f6rb\u00e4ttringarna \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">patch<\/a><\/noindex>, som l\u00e4gger till Node Affinity i den skapade StatefulSet. V\u00e5ra kunder f\u00f6redrar ofta att minska kostnaderna genom att anv\u00e4nda spot-instanser, och det \u00e4r uppenbart inte l\u00e4mpligt att placera databastj\u00e4nster p\u00e5 dem. Denna fr\u00e5ga skulle ocks\u00e5 kunna l\u00f6sas med tolerans, men att ha Node Affinity ger st\u00f6rre s\u00e4kerhet.<\/p>\n<h3>Vad blev resultatet?<\/h3>\n<p>\nSom resultat av att l\u00f6sa de n\u00e4mnda problemen har vi forkat Postgres Operator fr\u00e5n Zalando till <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">v\u00e5r egen repository<\/a><\/noindex>, d\u00e4r den byggs med s\u00e5 anv\u00e4ndbara patchar. Och f\u00f6r att \u00f6ka bekv\u00e4mligheten har vi ocks\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/flant\/postgres-operator\">Docker-image<\/a><\/noindex>.<\/p>\n<p>Lista \u00f6ver PR:er som tagits emot i forken:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1066\">bygget av en s\u00e4ker l\u00e4tt Docker-image f\u00f6r operat\u00f6ren<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">inaktivering av s\u00e4kerhetskopior<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1121\">uppdatering av resursversioner f\u00f6r aktuella versioner av k8s<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">implementering av Node Affinity<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nDet vore fantastiskt om gemenskapen kunde st\u00f6dja dessa PR:er s\u00e5 att de kom med i upstream med n\u00e4sta version av operat\u00f6ren (1.6).<\/p>\n<h2>Bonus! Framh\u00e4vt projekt med migrering av produktion<\/h2>\n<p>\nOm du anv\u00e4nder Patroni kan du migrera en livsproduktion med minimal nedtid till operat\u00f6ren.<\/p>\n<p>Spilo m\u00f6jligg\u00f6r att skapa standby-kluster via S3-lagringar med <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">Wal-E<\/a><\/noindex>, d\u00e4r den bin\u00e4ra loggen f\u00f6r PgSQL f\u00f6rst sparas i S3 och sedan h\u00e4mtas av replik. Men vad g\u00f6r man om du <i>inte<\/i> anv\u00e4nder Wal-E i en gammal infrastruktur? L\u00f6sningen p\u00e5 detta problem har redan <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/437318\/\">f\u00f6reslagits<\/a><\/noindex> p\u00e5 Habr\u00e9.<\/p>\n<p>Logisk replikering av PostgreSQL kommer till hj\u00e4lp. Men vi ska inte g\u00e5 in p\u00e5 detaljer om hur man skapar pub-likningar och prenumerationer, eftersom\u2026 v\u00e5r plan misslyckades.<\/p>\n<p>Problemet \u00e4r att databasen hade flera tunga tabeller med miljontals rader, som dessutom hela tiden fylldes p\u00e5 och togs bort. <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/12\/sql-createsubscription\">En enkel prenumeration<\/a><\/noindex> med <code>copy_data<\/code>, n\u00e4r en ny replik kopierar allt inneh\u00e5ll fr\u00e5n m\u00e4staren, h\u00e4ngde helt enkelt inte med m\u00e4staren. Inneh\u00e5llskopieringen fungerade i en vecka men n\u00e5dde aldrig m\u00e4staren. Till slut hj\u00e4lpte det att f\u00e5 klarhet i problemet <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/avitotech\/recovery-use-cases-for-logical-replication-in-postgresql-10-a1e6bab03072\">artikeln<\/a><\/noindex> genom kollegor fr\u00e5n Avito: man kan flytta data med hj\u00e4lp av <code>pg_dump<\/code>. Jag kommer att beskriva v\u00e5r (lite modifierade) version av denna algoritm.<\/p>\n<p>Id\u00e9n \u00e4r att skapa en inaktiv prenumeration kopplad till en specifik replikationsslot och sedan korrigera transaktionsnumret. Det fanns repliker tillg\u00e4ngliga f\u00f6r produktionsarbetet. Detta \u00e4r viktigt eftersom repliken kommer att skapa en konsekvent dump och forts\u00e4tta ta emot \u00e4ndringar fr\u00e5n master.<\/p>\n<p>I de f\u00f6ljande kommandona som beskriver migrationsprocessen kommer f\u00f6ljande beteckningar att anv\u00e4ndas f\u00f6r v\u00e4rdarna:<\/p>\n<ol>\n<li><i>master<\/i> \u2014 ursprunglig server;<\/li>\n<li><i>replica1<\/i> \u2014 str\u00f6mrepliken p\u00e5 den gamla produktionen;<\/li>\n<li><i>replica2<\/i> \u2014 ny logisk replik.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Migrationsplan<\/h3>\n<p>\n1. Skapa en prenumeration f\u00f6r alla tabeller i schemat <code>public<\/code> av databasen <code>dbname<\/code>:<\/p>\n<pre><code class=\"bash\">psql -h master -d dbname -c \"CREATE PUBLICATION dbname FOR ALL TABLES;\"\n<\/code><\/pre>\n<p>\n2. Skapa en replikationsslot p\u00e5 master:<\/p>\n<pre><code class=\"bash\">psql -h master -c \"select pg_create_logical_replication_slot('repl', 'pgoutput');\"\n<\/code><\/pre>\n<p>\n3. Stoppa replikationen p\u00e5 den gamla repliken:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_pause();\"\n<\/code><\/pre>\n<p>\n4. H\u00e4mta transaktionsnumret fr\u00e5n master:<\/p>\n<pre><code class=\"bash\">psql -h master -c \"select replay_lsn from pg_stat_replication where client_addr = 'replica1';\"\n<\/code><\/pre>\n<p>\n5. Ta en dump fr\u00e5n den gamla repliken. Vi kommer att g\u00f6ra detta med flera tr\u00e5dar, vilket kommer att p\u00e5skynda processen:<\/p>\n<pre><code class=\"bash\">pg_dump -h replica1 --no-publications --no-subscriptions -O -C -F d -j 8 -f dump\/ dbname\n<\/code><\/pre>\n<p>\n6. Ladda upp dumpen till den nya servern:<\/p>\n<pre><code class=\"bash\">pg_restore -h replica2 -F d -j 8 -d dbname dump\/\n<\/code><\/pre>\n<p>\n7. Efter att dumpen har laddats kan replikationen startas p\u00e5 str\u00f6mrepliken:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_resume();\"\n<\/code><\/pre>\n<p>\n7. Skapa en prenumeration p\u00e5 den nya logiska repliken:<\/p>\n<pre><code class=\"bash\">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');\"\n<\/code><\/pre>\n<p>\n8. H\u00e4mta <code>oid<\/code> prenumerationen:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"select oid, * from pg_subscription;\"\n<\/code><\/pre>\n<p>\n9. Anta att vi har f\u00e5tt <code>oid=1000<\/code>. Till\u00e4mpa transaktionsnumret p\u00e5 prenumerationen:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"select pg_replication_origin_advance('pg_1000', 'AA\/AAAAAAAA');\"\n<\/code><\/pre>\n<p>\n10. Starta replikationen:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"alter subscription oldprod enable;\"\n<\/code><\/pre>\n<p>\n11. Kontrollera statusen f\u00f6r prenumerationen, replikationen b\u00f6r fungera:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"select * from pg_replication_origin_status;\"\npsql -h master -d dbname -c \"select slot_name, restart_lsn, confirmed_flush_lsn from pg_replication_slots;\"\n<\/code><\/pre>\n<p>\n12. Efter att replikationen har startat och databaserna har synkroniserats kan omkopplingen g\u00f6ras.<\/p>\n<p>13. Efter att replikationen har st\u00e4ngts av \u00e4r det n\u00f6dv\u00e4ndigt att korrigera sekvenserna. Detta \u00e4r v\u00e4l beskrivna <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fixing_Sequences\">i artikeln p\u00e5 wiki.postgresql.org<\/a><\/noindex>.<\/p>\n<p>Tack vare denna plan blev omkopplingen av med minimal f\u00f6rdr\u00f6jning.<\/p>\n<h2>Slutsats<\/h2>\n<p>\nKubernetes-operat\u00f6rer g\u00f6r det m\u00f6jligt att f\u00f6renkla olika \u00e5tg\u00e4rder genom att reducera dem till att skapa K8s-resurser. Men n\u00e4r man uppn\u00e5r fantastisk automatisering med deras hj\u00e4lp, b\u00f6r man komma ih\u00e5g att det ocks\u00e5 kan medf\u00f6ra vissa ov\u00e4ntade nuanser, s\u00e5 var noga med att smart v\u00e4lja operat\u00f6rer.<\/p>\n<p>Efter att ha granskat tre av de mest popul\u00e4ra Kubernetes-operat\u00f6rerna f\u00f6r PostgreSQL, valde vi projektet fr\u00e5n Zalando. Vi st\u00f6tte dock p\u00e5 vissa sv\u00e5righeter, men resultatet \u00f6verraskade verkligen positivt, s\u00e5 vi planerar att utvidga denna erfarenhet till andra PgSQL-installationer. Om du har erfarenhet av liknande l\u00f6sningar \u2013 vi ser fram emot att l\u00e4sa dina detaljer i kommentarerna!<\/p>\n<h2>P.S.<\/h2>\n<p>\nL\u00e4s \u00e4ven i v\u00e5r blogg:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">Databaser och Kubernetes (\u00f6versikt och videof\u00f6rel\u00e4sning)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres-tisdag nr 5: PostgreSQL och Kubernetes. CI\/CD. Automatisering av testning<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/480722\/\">En ber\u00e4ttelse om Redis-operat\u00f6ren i K8s och en liten \u00f6versikt av verktyg f\u00f6r att analysera data fr\u00e5n denna databas<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>K\u00e4lla: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/520616\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b: \u00ab\u0425\u043e\u0442\u0438\u043c \u043a\u0430\u043a Amazon RDS, \u043d\u043e \u0434\u0435\u0448\u0435\u0432\u043b\u0435\u00bb; \u00ab\u0425\u043e\u0442\u0438\u043c \u043a\u0430\u043a RDS, \u043d\u043e \u0432\u0435\u0437\u0434\u0435, \u0432 \u043b\u044e\u0431\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\u00bb. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 managed-\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 Kubernetes, \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f PostgreSQL (Stolon, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043e\u0442 Crunchy Data \u0438 Zalando) \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 \u0432\u044b\u0431\u043e\u0440. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u043e\u043f\u044b\u0442 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95323,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95322","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 PostgreSQL \u0434\u043b\u044f Kubernetes, \u043d\u0430\u0448 \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u043f\u044b\u0442 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-28T05:42:39+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-28T05:42:39+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kort \u00f6versikt \u00f6ver PostgreSQL-operat\u00f6rer f\u00f6r Kubernetes, v\u00e5rt val och v\u00e5r erfarenhet | ProHoster","description":"Allt oftare fr\u00e5n kunder.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 PostgreSQL \u0434\u043b\u044f Kubernetes, \u043d\u0430\u0448 \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u043f\u044b\u0442 | ProHoster","og:description":"\u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.","og:url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-28T05:42:39+00:00","article:modified_time":"2020-09-28T05:42:39+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95322","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:08:22","updated":"2022-09-30 21:12:08","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/95322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=95322"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/95322\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/95323"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=95322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=95322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=95322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}