{"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\/it\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","title":{"rendered":"Panoramica dei operatori PostgreSQL per Kubernetes: la nostra scelta e esperienza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Panoramica dei operatori PostgreSQL per Kubernetes: la nostra scelta e esperienza\" src=\"\/wp-content\/uploads\/2020\/09\/23b2db49941fa5bd5000358c8ffb991b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSempre pi\u00f9 spesso riceviamo richieste dai clienti come: \u00abVogliamo qualcosa simile a Amazon RDS, ma pi\u00f9 economico\u00bb; \u00abVogliamo qualcosa come RDS, ma ovunque, su qualsiasi infrastruttura\u00bb. Per realizzare una soluzione gestita su Kubernetes, abbiamo esaminato lo stato attuale dei pi\u00f9 popolari operatori per PostgreSQL (Stolon, operatori di Crunchy Data e Zalando) e abbiamo fatto la nostra scelta.<\/p>\n<p>Questo articolo rappresenta la nostra esperienza, sia dal punto di vista teorico (una panoramica delle soluzioni) sia pratico (cosa \u00e8 stato scelto e quali risultati sono stati ottenuti). Ma prima di tutto, definiamo quali sono i requisiti chiave per potenziali sostituti di RDS\u2026<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Cos'\u00e8 RDS?<\/h2>\n<p>\nQuando le persone parlano di RDS, dalla nostra esperienza, si riferiscono a un servizio di database gestionato (managed) che:<\/p>\n<ol>\n<li>\u00e8 facile da configurare;<\/li>\n<li>ha la possibilit\u00e0 di lavorare con snapshot e di ripristinarli (idealmente con supporto per <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Point-in-time_recovery\">PITR<\/a><\/noindex>);<\/li>\n<li>permette di creare topologie master-slave;<\/li>\n<li>ha un ricco elenco di estensioni;<\/li>\n<li>fornisce audit e gestione degli utenti\/accessi.<\/li>\n<\/ol>\n<p>\nIn generale, gli approcci per realizzare il compito assegnato possono essere molto diversi, tuttavia il metodo con Ansible non ci \u00e8 familiare. (Colleghi di 2GIS sono giunti a una conclusione simile durante <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/509926\/\">il loro tentativo<\/a><\/noindex> di creare \u00abuno strumento per il rapido deployment di un cluster a tolleranza di guasti basato su Postgres\u00bb.)<\/p>\n<p>Gli operatori sono l'approccio comunemente accettato per affrontare problemi simili nell'ecosistema Kubernetes. Abbiamo gi\u00e0 parlato di loro in relazione a database eseguiti all'interno di Kubernetes durante una delle conferenze del CTO di \u00abFlanta\u00bb, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/distol\/\" class=\"user_link\">distol<\/a><\/noindex>, nel <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">in uno dei suoi interventi<\/a><\/noindex>.<\/p>\n<p><i><strong>NB<\/strong><\/i><i>: Per la creazione rapida di operatori semplici, ti consigliamo di prestare attenzione alla nostra utility Open Source <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\"><i>shell-operator<\/i><\/a><\/noindex><i>. Utilizzandola, puoi farlo senza conoscere Go, ma con metodi pi\u00f9 familiari per gli amministratori di sistema: Bash, Python, ecc.<\/i><\/p>\n<p>Per PostgreSQL esistono diversi operatori K8s popolari:<\/p>\n<ul>\n<li>Stolon;<\/li>\n<li>Crunchy Data PostgreSQL Operator;<\/li>\n<li>Zalando Postgres Operator.<\/li>\n<\/ul>\n<p>\nEsaminiamoli pi\u00f9 da vicino.<\/p>\n<h2>Scelta dell'operatore<\/h2>\n<p>\nOltre alle importanti funzionalit\u00e0 gi\u00e0 menzionate sopra, noi \u2014 come ingegneri di operations nell'infrastruttura Kubernetes \u2014 ci aspettavamo anche dai operatori quanto segue:<\/p>\n<ul>\n<li> deploy da Git e con <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/operator\/#deploying-operators\">Custom Resources<\/a><\/noindex>;<\/li>\n<li> supporto alla pod anti-affinity;<\/li>\n<li> installazione di node affinity o node selector;<\/li>\n<li> installazione di tolerations;<\/li>\n<li> presenza di funzionalit\u00e0 di tuning;<\/li>\n<li> tecnologie comprensibili e persino comandi.<\/li>\n<\/ul>\n<p>\nSenza entrare nei dettagli di ciascun punto (chiedete nei commenti se avete domande su di essi dopo aver letto tutto l'articolo), vorrei sottolineare che questi parametri sono necessari per descrivere con maggiore precisione la specializzazione dei nodi del cluster, in modo da ordinarli in base a specifiche applicazioni. In questo modo possiamo ottenere un ottimale equilibrio tra prestazioni e costi.<\/p>\n<p>Ora, passiamo agli operatori PostgreSQL.<\/p>\n<h3>1. Stolon<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\">Stolon<\/a><\/noindex> dall'azienda italiana Sorint.lab in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">gi\u00e0 menzionato nel rapporto<\/a><\/noindex> \u00e8 stato considerato come un certo standard tra gli operatori per i DBMS. \u00c8 un progetto piuttosto vecchio: la sua prima pubblica release risale a novembre 2015(!), e il repository GitHub pu\u00f2 vantare quasi 3000 stelle e oltre 40 collaboratori.<\/p>\n<p>E in effetti, Stolon \u00e8 un ottimo esempio di architettura ben pensata:<\/p>\n<p><img decoding=\"async\" alt=\"Panoramica dei operatori PostgreSQL per Kubernetes: la nostra scelta e esperienza\" src=\"\/wp-content\/uploads\/2020\/09\/a34625c130bfd29c5645cf2417042de2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCol dispositivo di questo operatore in dettaglio \u00e8 possibile consultare il rapporto o <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/blob\/master\/doc\/architecture.md\">la documentazione del progetto<\/a><\/noindex>. In generale, basta dire che \u00e8 in grado di fare tutto quanto descritto: failover, proxy per l'accesso trasparente ai clienti, backup... Inoltre, i proxy forniscono accesso tramite un singolo endpoint di servizio, a differenza delle due altre soluzioni discusse di seguito (che hanno due servizi per l'accesso al database).<\/p>\n<p>Tuttavia, Stolon <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/issues\/463#issuecomment-379666733\">non ha Custom Resources<\/a><\/noindex>, il che rende impossibile il deployment in modo semplice e veloce \u2014 \"come pane appena sfornato\" \u2014 per creare istanze di DBMS in Kubernetes. La gestione avviene tramite l'utility <code>stolonctl<\/code>, il deploy avviene tramite Helm chart, e le configurazioni personalizzate vengono definite nel ConfigMap.<\/p>\n<p>Da un lato, sembra che l'operatore non sia effettivamente un operatore (dato che non utilizza CRD). Dall'altro lato, \u00e8 un sistema flessibile che consente di configurare le risorse in K8s nel modo che preferisci.<\/p>\n<p>In sintesi, per noi non \u00e8 sembrata ottimale la strada di creare un chart separato per ogni DB. Pertanto, abbiamo iniziato a cercare alternative.<\/p>\n<h3>2. Crunchy Data PostgreSQL Operator<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\">L'operatore di Crunchy Data<\/a><\/noindex>, una giovane startup americana sembrava un'alternativa logica. La sua storia pubblica inizia con il primo rilascio di marzo 2017, da allora il repository su GitHub ha ricevuto poco meno di 1300 stelle e oltre 50 collaboratori. L'ultimo rilascio di settembre \u00e8 stato testato per funzionare con Kubernetes 1.15\u20141.18, OpenShift 3.11+ e 4.4+, GKE e VMware Enterprise PKS 1.3+.<\/p>\n<p>L'architettura del Crunchy Data PostgreSQL Operator soddisfa anche i requisiti dichiarati:<\/p>\n<p><img decoding=\"async\" alt=\"Panoramica dei operatori PostgreSQL per Kubernetes: la nostra scelta e esperienza\" src=\"\/wp-content\/uploads\/2020\/09\/343cd0494abae42fcf5b47c5bb4eb310.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa gestione avviene tramite l'utility <code>pgo<\/code>, ma genera a sua volta Custom Resources per Kubernetes. Pertanto, abbiamo, come potenziali utenti, trovato lieto il fatto che l'operatore offre:<\/p>\n<ul>\n<li> gestione tramite CRD;<\/li>\n<li> gestione degli utenti facile (anche tramite CRD);<\/li>\n<li> integrazione con altri componenti <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/crunchy-postgres-containers\/4.3.1\/\">Crunchy Data Container Suite<\/a><\/noindex> \u2014 una collezione specializzata di immagini container per PostgreSQL e utility per lavorarci (inclusi pgBackRest, pgAudit, estensioni da contrib, ecc.).<\/li>\n<\/ul>\n<p>\nTuttavia, i tentativi di iniziare a utilizzare l'operatore di Crunchy Data hanno rivelato alcuni problemi:<\/p>\n<ul>\n<li>Non era disponibile la possibilit\u00e0 di tolerations \u2014 \u00e8 previsto solo il nodeSelector.<\/li>\n<li>I pod creati facevano parte del Deployment, anche se stavamo implementando un'applicazione stateful. A differenza degli StatefulSet, i Deployment non possono creare dischi.<\/li>\n<\/ul>\n<p>\nL'ultimo difetto porta a situazioni divertenti: nell'ambiente di test siamo riusciti ad avviare 3 repliche con un solo disco. <i>storage locale<\/i>, il che ha fatto s\u00ec che l'operatore segnalasse che 3 repliche erano funzionanti (anche se non era cos\u00ec).<\/p>\n<p>Un'altra caratteristica di questo operatore \u00e8 la sua integrazione predefinita con vari sistemi ausiliari. Ad esempio, \u00e8 facile installare pgAdmin e pgBounce, e nel <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/postgres-operator\/4.4.0\/installation\/other\/ansible\/installing-metrics\/\">documentazione<\/a><\/noindex> si considerano Grafana e Prometheus preconfigurati. Nella recente <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\/releases\/tag\/v4.5.0-beta.1\">release 4.5.0-beta1<\/a><\/noindex> si segnala il miglioramento dell'integrazione con il progetto <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/pgmonitor\">pgMonitor<\/a><\/noindex>, che consente all'operatore di offrire visualizzazioni chiare delle metriche PgSQL \u201cout of the box\u201d.<\/p>\n<p>Tuttavia, la strana scelta delle risorse Kubernetes generate ci ha portato alla necessit\u00e0 di trovare un'altra soluzione.<\/p>\n<h3>3. Zalando Postgres Operator<\/h3>\n<p>\nI prodotti Zalando ci sono noti da tempo: abbiamo esperienza con Zalenium e, naturalmente, abbiamo provato <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\">Patroni<\/a><\/noindex> \u2014 la loro popolare soluzione HA per PostgreSQL. Uno degli autori del <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\">Postgres Operator<\/a><\/noindex> ha parlato di questo approccio \u2014 Alexey Klyukin \u2014 nella trasmissione <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres Tuesday n. 5<\/a><\/noindex>, e ci \u00e8 piaciuto.<\/p>\n<p>Questa \u00e8 la soluzione pi\u00f9 giovane tra quelle trattate nell'articolo: il primo rilascio \u00e8 avvenuto nell'agosto del 2018. Tuttavia, nonostante il numero relativamente ridotto di rilasci formali, il progetto ha compiuto grandi progressi, superando gi\u00e0 in popolarit\u00e0 la soluzione di Crunchy Data con oltre 1300 stelle su GitHub e il massimo numero di collaboratori (oltre 70).<\/p>\n<p>\u00abSotto il cofano\u00bb di questo operatore si trovano soluzioni collaudate nel tempo:<\/p>\n<ul>\n<li> Patroni e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/spilo\">Spilo<\/a><\/noindex> per la gestione,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">WAL-E<\/a><\/noindex> \u2014 per i backup,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\">PgBouncer<\/a><\/noindex> \u2014 come pool di connessioni.<\/li>\n<\/ul>\n<p>\nEcco come \u00e8 presentata l'architettura dell'operatore di Zalando:<\/p>\n<p><img decoding=\"async\" alt=\"Panoramica dei operatori PostgreSQL per Kubernetes: la nostra scelta e esperienza\" src=\"\/wp-content\/uploads\/2020\/09\/c66f10c1a818592ecaacd2db4ce5ace5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Custom Resources, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 StatefulSet \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0432 pod \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 sidecar&#8217;\u044b. \u0412\u0441\u0451 \u044d\u0442\u043e \u2014 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u044e\u0441 \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u043e\u0442 Crunchy Data.<\/p>\n<p>Poich\u00e9 abbiamo scelto la soluzione di Zalando tra le 3 opzioni considerate, la descrizione delle sue possibilit\u00e0 sar\u00e0 presentata di seguito, insieme alla pratica di applicazione.<\/p>\n<h2>Pratica con Postgres Operator di Zalando<\/h2>\n<p>\nIl deployment dell'operatore avviene in modo molto semplice: \u00e8 sufficiente scaricare il rilascio attuale da GitHub e applicare i file YAML dalla directory. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/tree\/master\/manifests\">manifests<\/a><\/noindex>. In alternativa, puoi anche utilizzare <noindex><a rel=\"nofollow\" href=\"https:\/\/operatorhub.io\/operator\/postgres-operator\">OperatorHub<\/a><\/noindex>.<\/p>\n<p>Dopo l'installazione, \u00e8 consigliabile occuparsi della configurazione <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/reference\/operator_parameters.md#aws-or-gcp-interaction\">degli archivi per log e backup<\/a><\/noindex>. Questa viene effettuata tramite ConfigMap <code>postgres-operator<\/code> nello spazio dei nomi in cui hai installato l'operatore. Una volta configurati gli archivi, puoi distribuire il primo cluster PostgreSQL.<\/p>\n<p>Ad esempio, il nostro deployment standard appare come segue:<\/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: &quot;12&quot;\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>\nQuesto manifesto distribuisce un cluster di 3 istanze con un sidecar sotto forma di <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wrouesnel\/postgres_exporter\">postgres_exporter<\/a><\/noindex>, da cui raccogliamo le metriche dell'applicazione. Come vedi, \u00e8 molto semplice e, se lo desideri, puoi creare letteralmente un numero illimitato di cluster.<\/p>\n<p>Vale la pena prestare attenzione anche alla <b>pannello web per la gestione<\/b> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/operator-ui.md\">postgres-operator-ui<\/a><\/noindex>. Viene fornito con l'operatore e consente di creare ed eliminare cluster, oltre a gestire i backup effettuati dall'operatore.<\/p>\n<p><img decoding=\"async\" alt=\"Panoramica dei operatori PostgreSQL per Kubernetes: la nostra scelta e esperienza\" src=\"\/wp-content\/uploads\/2020\/09\/2e9ae033a9817d101c843ce061aafdb5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Elenco dei cluster PostgreSQL<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Panoramica dei operatori PostgreSQL per Kubernetes: la nostra scelta e esperienza\" src=\"\/wp-content\/uploads\/2020\/09\/74a65f7f301da14a0cb7bea6d5ef84ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Gestione dei backup<\/i><\/p>\n<p>Un'altra interessante funzionalit\u00e0 \u00e8 il supporto per <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/user.md#teams-api-roles\">Teams API<\/a><\/noindex>. Questo meccanismo crea automaticamente <b>ruoli in PostgreSQL<\/b>, sulla base dell'elenco dei nomi utenti ricevuti. Successivamente, l'API consente di restituire l'elenco degli utenti per i quali i ruoli vengono creati automaticamente.<\/p>\n<h3>Problemi e soluzioni<\/h3>\n<p>\nTuttavia, l'uso dell'operatore ha presto messo in evidenza alcuni difetti significativi:<\/p>\n<ol>\n<li> assenza di supporto per nodeSelector;<\/li>\n<li> impossibilit\u00e0 di disattivare i backup;<\/li>\n<li> quando si utilizza la funzione di creazione di database, non vengono assegnati privilegi di default;<\/li>\n<li> mancanza periodica di documentazione o documentazione obsoleta.<\/li>\n<\/ol>\n<p>\nFortunatamente, molti di questi problemi possono essere risolti. Cominciamo dalla fine \u2014 problemi con <strong>documentazione<\/strong>. <\/p>\n<p>Probabilmente ti imbatterai nella difficolt\u00e0 di capire come impostare un backup e come collegare il bucket di backup all'Operator UI. La documentazione lo menziona solo brevemente, mentre la descrizione reale si trova in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/481\">PR<\/a><\/noindex>:<\/p>\n<ol>\n<li>\u00e8 necessario creare un segreto;<\/li>\n<li>trasmetterlo all'operatore come parametro <code>pod_environment_secret_name<\/code> In CRD con le impostazioni dell'operatore o in ConfigMap (a seconda di come hai deciso di installare l'operatore).<\/li>\n<\/ol>\n<p>\nTuttavia, al momento si \u00e8 rivelato impossibile. \u00c8 per questo che abbiamo raccolto <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">la nostra versione dell'operatore<\/a><\/noindex> con alcune implementazioni aggiuntive di terze parti. Maggiori dettagli di seguito.<\/p>\n<p>Se si passano all'operatore parametrici per il backup, ossia \u2014 <code>wal_s3_bucket<\/code> e le chiavi di accesso in AWS S3, allora lui <strong>effettuer\u00e0 il backup di tutto<\/strong>: non solo dei database in produzione, ma anche di staging. Questo non ci ha soddisfatto.<\/p>\n<p>Nella descrizione dei parametri di Spilo, che \u00e8 il wrapper Docker di base per PgSQL utilizzando l'operatore, \u00e8 emerso: \u00e8 possibile passare il parametro <code>WAL_S3_BUCKET<\/code> vuoto, disabilitando cos\u00ec i backup. Inoltre, con grande gioia \u00e8 stato trovato anche un <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">PR pronto<\/a><\/noindex>, che abbiamo subito integrato nel nostro fork. Ora basta semplicemente aggiungere <code>enableWALArchiving: false<\/code> alle risorse del cluster PostgreSQL.<\/p>\n<p>S\u00ec, era possibile fare diversamente, avviando 2 operatori: uno per staging (senza backup) e l'altro per produzione. Ma in questo modo siamo riusciti a farne a meno di uno.<\/p>\n<p>Ok, abbiamo imparato a dare accesso alle basi per S3 e i backup hanno cominciato a finire nel repository. Come far funzionare le pagine di backup nell'Operator UI?<\/p>\n<p><img decoding=\"async\" alt=\"Panoramica dei operatori PostgreSQL per Kubernetes: la nostra scelta e esperienza\" src=\"\/wp-content\/uploads\/2020\/09\/46169b53707b0bbb686798c655022f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNell'UI di Operator sar\u00e0 necessario aggiungere 3 variabili:<\/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>\nDopo di ci\u00f2, la gestione dei backup sar\u00e0 disponibile, il che nel nostro caso semplificher\u00e0 il lavoro con lo staging, consentendo di consegnare snapshot dalla produzione senza ulteriori script.<\/p>\n<p>Un ulteriore vantaggio menzionato \u00e8 l'integrazione con l'API di Teams e le ampie possibilit\u00e0 di creare basi e ruoli tramite l'operatore. Tuttavia, i ruoli creati <strong>non avevano diritti di default<\/strong>. Pertanto, un utente con diritti in sola lettura non poteva visualizzare le nuove tabelle.<\/p>\n<p>Perch\u00e9? Nonostante nel codice <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/pkg\/cluster\/database.go#L42\">ci siano<\/a><\/noindex> necessari <code>GRANT<\/code>, questi non vengono applicati sempre. Ci sono 2 metodi: <code>syncPreparedDatabases<\/code> e <code>syncDatabases<\/code>. In <code>syncPreparedDatabases<\/code> \u2014 nonostante ci sia una condizione nella sezione <code>preparedDatabases<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/manifests\/complete-postgres-manifest.yaml#L26\">ci siano<\/a><\/noindex> per i diritti <code>defaultRoles<\/code> e <code>defaultUsers<\/code> per la creazione dei ruoli, i diritti di default non vengono applicati. Stiamo preparando una patch affinch\u00e9 questi diritti vengano applicati automaticamente.<\/p>\n<p>E l'ultimo punto nelle modifiche pertinenti per noi \u00e8 \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">per correggere l'errore.<\/a><\/noindex>, aggiungendo Node Affinity nel StatefulSet creato. I nostri clienti spesso preferiscono ridurre i costi utilizzando istanze spot, e non \u00e8 consigliabile ospitare servizi di database su di esse. Questo problema potrebbe essere risolto anche mediante tolerations, ma avere Node Affinity fornisce maggiore certezza.<\/p>\n<h3>Cosa \u00e8 stato ottenuto?<\/h3>\n<p>\nIn seguito alla risoluzione dei problemi elencati, abbiamo forkato il Postgres Operator di Zalando nel <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">nostro repository<\/a><\/noindex>, dove viene compilato con patch cos\u00ec utili. Per maggiore comodit\u00e0, abbiamo anche <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/flant\/postgres-operator\">immagine Docker<\/a><\/noindex>.<\/p>\n<p>Elenco delle PR accettate nel fork:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1066\">compilazione di un'immagine leggera e sicura in Docker per l'operatore<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">disattivazione dei backup<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1121\">aggiornamento delle versioni delle risorse per le versioni pi\u00f9 recenti di k8s<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">implementazione di Node Affinity<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nSarebbe fantastico se la comunit\u00e0 supportasse queste PR affinch\u00e9 vengano integrate nell'upstream con la prossima versione dell'operatore (1.6).<\/p>\n<h2>Bonus! Storia di successo sulla migrazione in produzione<\/h2>\n<p>\nSe usate Patroni, \u00e8 possibile migrare la produzione attiva all'operatore con un fermo minimo.<\/p>\n<p>Spilo consente di creare cluster standby attraverso archiviazione S3 con <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">Wal-E<\/a><\/noindex>, quando il log binario PgSQL viene prima salvato in S3 e poi prelevato dalla replica. Ma cosa fare se <i>non<\/i> utilizzate Wal-E in una vecchia infrastruttura? La soluzione a questo problema \u00e8 gi\u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/437318\/\">\u00e8 stata proposta<\/a><\/noindex> su Habr.<\/p>\n<p>A supporto arriva la replicazione logica di PostgreSQL. Tuttavia, non approfondiremo i dettagli su come creare pubblicazioni e iscrizioni, perch\u00e9... il nostro piano ha subito un fallimento.<\/p>\n<p>Il fatto \u00e8 che nel database c'erano diverse tabelle molto cariche con milioni di righe, che inoltre venivano continuamente popolate e svuotate. <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/12\/sql-createsubscription\">Iscrizione semplice<\/a><\/noindex> con <code>copy_data<\/code>, quando una nuova replica copia tutto il contenuto dal master, non riusciva proprio a tenere il passo. La copia dei contenuti \u00e8 durata una settimana, ma non ha mai raggiunto il master. In definitiva, la soluzione al problema \u00e8 stata fornita <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/avitotech\/recovery-use-cases-for-logical-replication-in-postgresql-10-a1e6bab03072\">articolo<\/a><\/noindex> da colleghi di Avito: \u00e8 possibile trasferire i dati utilizzando <code>pg_dump<\/code>. Descriver\u00f2 la nostra (leggermente rielaborata) variante di questo algoritmo.<\/p>\n<p>L'idea \u00e8 che si possa creare un'iscrizione disattivata, legata a uno specifico slot di replicazione, e poi correggere il numero della transazione. Erano disponibili repliche per il lavoro in produzione. \u00c8 importante, poich\u00e9 la replica aiuter\u00e0 a creare un dump consistente e continuare a ricevere modifiche dal master.<\/p>\n<p>Nei successivi comandi che descrivono il processo di migrazione, verranno utilizzate le seguenti designazioni per gli host:<\/p>\n<ol>\n<li><i>master<\/i> \u2014 server di origine;<\/li>\n<li><i>replica1<\/i> \u2014 replica logica su produzione vecchia;<\/li>\n<li><i>replica2<\/i> \u2014 nuova replica logica.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Piano di migrazione<\/h3>\n<p>\n1. Creeremo un abbonamento a tutte le tabelle nello schema sul master <code>pubblico<\/code> database <code>dbname<\/code>:<\/p>\n<pre><code class=\"bash\">psql -h master -d dbname -c &quot;CREATE PUBLICATION dbname FOR ALL TABLES;&quot;\n<\/code><\/pre>\n<p>\n2. Creeremo uno slot di replica sul master:<\/p>\n<pre><code class=\"bash\">psql -h master -c &quot;select pg_create_logical_replication_slot('repl', 'pgoutput');&quot;\n<\/code><\/pre>\n<p>\n3. Fermiamo la replica sulla vecchia replica:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c &quot;select pg_wal_replay_pause();&quot;\n<\/code><\/pre>\n<p>\n4. Otteniamo il numero della transazione dal master:<\/p>\n<pre><code class=\"bash\">psql -h master -c &quot;select replay_lsn from pg_stat_replication where client_addr = 'replica1';&quot;\n<\/code><\/pre>\n<p>\n5. Faremo un dump dalla vecchia replica. Procederemo in pi\u00f9 thread per velocizzare il processo:<\/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. Caricheremo il dump sul nuovo server:<\/p>\n<pre><code class=\"bash\">pg_restore -h replica2 -F d -j 8 -d dbname dump\/\n<\/code><\/pre>\n<p>\n7. Dopo il caricamento del dump, \u00e8 possibile avviare la replica sulla replica logica:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c &quot;select pg_wal_replay_resume();&quot;\n<\/code><\/pre>\n<p>\n7. Creeremo un abbonamento sulla nuova replica logica:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -c &quot;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');&quot;\n<\/code><\/pre>\n<p>\n8. Otteniamo <code>oid<\/code> abbonamenti:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c &quot;select oid, * from pg_subscription;&quot;\n<\/code><\/pre>\n<p>\n9. Supponiamo che sia stato ottenuto <code>oid=1000<\/code>. Applicheremo il numero della transazione all'abbonamento:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c &quot;select pg_replication_origin_advance('pg_1000', 'AA\/AAAAAAAA');&quot;\n<\/code><\/pre>\n<p>\n10. Avviamo la replica:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c &quot;alter subscription oldprod enable;&quot;\n<\/code><\/pre>\n<p>\n11. Verifichiamo lo stato dell'iscrizione; la replica dovrebbe essere attiva:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c &quot;select * from pg_replication_origin_status;&quot;\npsql -h master -d dbname -c &quot;select slot_name, restart_lsn, confirmed_flush_lsn from pg_replication_slots;&quot;\n<\/code><\/pre>\n<p>\n12. Dopo aver avviato la replica e sincronizzato i database, \u00e8 possibile effettuare il failover.<\/p>\n<p>13. Dopo aver disattivato la replica, \u00e8 necessario correggere le sequenze. Questo \u00e8 ben descritto <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fixing_Sequences\">nell'articolo su wiki.postgresql.org<\/a><\/noindex>.<\/p>\n<p>Grazie a questo piano, il failover \u00e8 avvenuto con ritardi minimi.<\/p>\n<h2>Conclusione<\/h2>\n<p>\nGli operatori Kubernetes consentono di semplificare diverse azioni, riducendole alla creazione di risorse K8s. Tuttavia, avendo raggiunto una notevole automazione con il loro aiuto, \u00e8 importante ricordare che essa pu\u00f2 portare anche a una serie di imprevisti, quindi approcciate la scelta degli operatori con saggezza.<\/p>\n<p>Dopo aver esaminato i tre operatori Kubernetes pi\u00f9 popolari per PostgreSQL, abbiamo deciso di scegliere il progetto di Zalando. Abbiamo affrontato alcune difficolt\u00e0, ma il risultato \u00e8 stato veramente soddisfacente, tanto che intendiamo ampliare questa esperienza ad alcune altre installazioni PgSQL. Se avete esperienza con soluzioni simili, saremo felici di conoscere i dettagli nei commenti!<\/p>\n<h2>P.S.<\/h2>\n<p>\nLeggete anche nel nostro blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">Database e Kubernetes (panoramica e video della presentazione)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres Marted\u00ec #5: PostgreSQL e Kubernetes. CI\/CD. Automazione dei test<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/480722\/\">Una storia con l'operatore Redis in K8s e una mini-rassegna degli strumenti per l'analisi dei dati di questo DB<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Fonte: <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 4.9.10 - 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 \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\" \/>\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\/it\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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 \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/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\udd47Rassegna degli operatori PostgreSQL per Kubernetes, la nostra scelta e esperienza | ProHoster","description":"Sempre pi\u00f9 spesso i clienti fanno richieste come: \u00abVogliamo qualcosa come Amazon RDS, ma pi\u00f9 economico\u00bb; \u00abVogliamo qualcosa come RDS, ma ovunque, su qualsiasi infrastruttura\u00bb. Per implementare una soluzione managed simile su Kubernetes, abbiamo esaminato lo stato attuale dei pi\u00f9 popolari operatori per PostgreSQL (Stolon, operatori di Crunchy Data e Zalando) e abbiamo fatto la nostra scelta. Questo articolo riassume la nostra esperienza e","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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 \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","og:url":"https:\/\/prohoster.info\/it\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/95322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=95322"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/95322\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/95323"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=95322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=95322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=95322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}