{"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\/de\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","title":{"rendered":"Ein kurzer \u00dcberblick \u00fcber PostgreSQL-Operatoren f\u00fcr Kubernetes, unsere Auswahl und Erfahrungen","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Ein kurzer \u00dcberblick \u00fcber PostgreSQL-Operatoren f\u00fcr Kubernetes, unsere Auswahl und Erfahrungen\" src=\"\/wp-content\/uploads\/2020\/09\/23b2db49941fa5bd5000358c8ffb991b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nImmer h\u00e4ufiger erreichen uns Anfragen von Kunden: \u201eWir m\u00f6chten etwas wie Amazon RDS, aber g\u00fcnstiger\u201c; \u201eWir m\u00f6chten etwas wie RDS, aber \u00fcberall, in jeder Infrastruktur\u201c. Um eine \u00e4hnliche verwaltete L\u00f6sung auf Kubernetes zu realisieren, haben wir uns den aktuellen Stand der beliebtesten Operatoren f\u00fcr PostgreSQL (Stolon, Operatoren von Crunchy Data und Zalando) angesehen und unsere Wahl getroffen.<\/p>\n<p>Dieser Artikel ist unsere gesammelte Erfahrung sowohl aus theoretischer Sicht (\u00dcberblick \u00fcber die L\u00f6sungen) als auch aus praktischer Sicht (was gew\u00e4hlt wurde und was dabei herauskam). Aber zuerst lassen Sie uns kl\u00e4ren, welche Anforderungen an einen potenziellen Ersatz f\u00fcr RDS gestellt werden...<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Was ist RDS?<\/h2>\n<p>\nWenn Menschen von RDS sprechen, meinen sie aus unserer Erfahrung in der Regel einen verwalteten (managed) DB-Service, der:<\/p>\n<ol>\n<li>einfach konfiguriert werden kann;<\/li>\n<li>die M\u00f6glichkeit bietet, mit Snapshots zu arbeiten und aus diesen wiederherzustellen (vorzugsweise mit Unterst\u00fctzung von <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Point-in-time_recovery\">PITR<\/a><\/noindex>);<\/li>\n<li>die Erstellung von Master-Slave-Topologien erm\u00f6glicht;<\/li>\n<li>eine umfangreiche Liste von Erweiterungen besitzt;<\/li>\n<li>Audit und Benutzer-\/Zugangsverwaltung bereitstellt.<\/li>\n<\/ol>\n<p>\nGenerell k\u00f6nnen die Ans\u00e4tze zur Realisierung der gestellten Aufgabe sehr unterschiedlich sein, jedoch distanziert sich unser Weg mit dem bedingten Ansible. (Ein \u00e4hnliches Fazit zogen auch unsere Kollegen von 2GIS infolge ihrer <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/509926\/\">Versuche<\/a><\/noindex> ein \u201eWerkzeug zum schnellen Bereitstellen eines ausfallsicheren Clusters auf Basis von Postgres\u201c zu erstellen.)<\/p>\n<p>Operatoren sind der allgemein akzeptierte Ansatz zur L\u00f6sung solcher Aufgaben im Kubernetes-\u00d6kosystem. Mehr dazu in Bezug auf Datenbanken, die innerhalb von Kubernetes betrieben werden, berichtete der technische Direktor von \u201eFlanta\u201c <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/distol\/\" class=\"user_link\">distol<\/a><\/noindex>, in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">in einem ihrer Vortr\u00e4ge.<\/a><\/noindex>.<\/p>\n<p><i><strong>NB<\/strong><\/i><i>: F\u00fcr die schnelle Erstellung einfacher Operatoren empfehlen wir unsere Open Source-Utility <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\"><i>Shell-Operator<\/i><\/a><\/noindex><i>. Damit l\u00e4sst sich dies ohne Kenntnisse in Go und auf f\u00fcr Systemadministratoren vertrauten Wegen umsetzen: mit Bash, Python etc.<\/i><\/p>\n<p>F\u00fcr PostgreSQL gibt es mehrere beliebte K8s-Operatoren:<\/p>\n<ul>\n<li>Stolon;<\/li>\n<li>Crunchy Data PostgreSQL Operator;<\/li>\n<li>Zalando Postgres Operator.<\/li>\n<\/ul>\n<p>\nSchauen wir uns diese genauer an.<\/p>\n<h2>Die Wahl des Operators<\/h2>\n<p>\nNeben den bereits genannten wichtigen Funktionen erwarteten wir \u2013 als Ingenieure f\u00fcr Infrastrukturmanagement in Kubernetes \u2013 auch Folgendes von den Operatoren:<\/p>\n<ul>\n<li> Deployment aus Git und mit <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/operator\/#deploying-operators\">Custom Resources;<\/a><\/noindex>;<\/li>\n<li> Unterst\u00fctzung von Pod-Anti-Affinit\u00e4t;<\/li>\n<li> Festlegung von Node-Affinit\u00e4t oder Node-Selector;<\/li>\n<li> Festlegung von Toleranzen;<\/li>\n<li> m\u00f6gliche Tuning-Optionen;<\/li>\n<li> verst\u00e4ndliche Technologien und sogar Befehle.<\/li>\n<\/ul>\n<p>\nOhne auf die Details jedes Punktes einzugehen (fragen Sie in den Kommentaren, wenn Sie nach dem Lesen des gesamten Artikels Fragen dazu haben), m\u00f6chte ich insgesamt anmerken, dass diese Parameter n\u00f6tig sind, um die Spezialisierung der Clusterknoten feiner zu beschreiben, damit wir sie f\u00fcr bestimmte Anwendungen anfordern k\u00f6nnen. So k\u00f6nnen wir ein optimales Gleichgewicht zwischen Leistung und Kosten erzielen.<\/p>\n<p>Jetzt kommen wir zu den PostgreSQL-Operatoren.<\/p>\n<h3>1. Stolon<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\">Stolon<\/a><\/noindex> von der italienischen Firma Sorint.lab in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">dem bereits erw\u00e4hnten Bericht<\/a><\/noindex> wurde als gewisser Ma\u00dfstab unter den Operatoren f\u00fcr Datenbanken betrachtet. Es handelt sich um ein ziemlich altes Projekt: Die erste \u00f6ffentliche Version erschien bereits im November 2015 (!), und das GitHub-Repository kann mit fast 3000 Sternen und \u00fcber 40 Mitwirkenden aufwarten.<\/p>\n<p>Und tats\u00e4chlich ist Stolon ein hervorragendes Beispiel f\u00fcr durchdachte Architektur:<\/p>\n<p><img decoding=\"async\" alt=\"Ein kurzer \u00dcberblick \u00fcber PostgreSQL-Operatoren f\u00fcr Kubernetes, unsere Auswahl und Erfahrungen\" src=\"\/wp-content\/uploads\/2020\/09\/a34625c130bfd29c5645cf2417042de2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie Details dieses Operators sind im Bericht zu finden oder <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/blob\/master\/doc\/architecture.md\">der Projektdokumentation<\/a><\/noindex>. Insgesamt l\u00e4sst sich sagen, dass er alles kann, was beschrieben wurde: Failover, Proxy f\u00fcr transparenten Zugriff von Clients, Backups \u2026 Dabei bieten die Proxys Zugriff \u00fcber einen einzigen Service-Endpunkt \u2014 im Gegensatz zu den beiden anderen L\u00f6sungen, die weiter unten behandelt werden (bei denen es zwei Services f\u00fcr den Zugriff auf die Datenbank gibt).<\/p>\n<p>Allerdings hat Stolon <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/issues\/463#issuecomment-379666733\">keine benutzerdefinierten Ressourcen<\/a><\/noindex>, weshalb er nicht so bereitgestellt werden kann, dass man einfach und schnell \u2014 \u201ewie frische Br\u00f6tchen\u201c \u2014 Datenbankinstanzen in Kubernetes erstellen kann. Das Management erfolgt \u00fcber das Tool <code>stolonctl<\/code>, die Bereitstellung erfolgt \u00fcber ein Helm-Chart, und benutzerdefinierte Einstellungen werden im ConfigMap definiert.<\/p>\n<p>Einerseits ist es so, dass der Operator nicht wirklich ein Operator ist (da er keine CRDs verwendet). Andererseits ist es ein flexibles System, das es erm\u00f6glicht, Ressourcen in K8s so anzupassen, wie es Ihnen gef\u00e4llt.<\/p>\n<p>Zusammenfassend erschien es uns nicht optimal, einen separaten Chart f\u00fcr jede DB zu erstellen. Daher begannen wir, nach Alternativen zu suchen.<\/p>\n<h3>2. Crunchy Data PostgreSQL Operator<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\">Der Operator von Crunchy Data<\/a><\/noindex>, einem jungen amerikanischen Start-up, erschien als logische Alternative. Seine \u00f6ffentliche Geschichte begann mit dem ersten Release im M\u00e4rz 2017. Seitdem hat das GitHub-Repository etwas weniger als 1300 Sterne und \u00fcber 50 Mitwirkende erhalten. Das letzte Release von September wurde auf die Nutzung mit Kubernetes 1.15\u20141.18, OpenShift 3.11+ und 4.4+, GKE und VMware Enterprise PKS 1.3+ getestet.<\/p>\n<p>Die Architektur des Crunchy Data PostgreSQL Operators erf\u00fcllt ebenfalls die angegebenen Anforderungen:<\/p>\n<p><img decoding=\"async\" alt=\"Ein kurzer \u00dcberblick \u00fcber PostgreSQL-Operatoren f\u00fcr Kubernetes, unsere Auswahl und Erfahrungen\" src=\"\/wp-content\/uploads\/2020\/09\/343cd0494abae42fcf5b47c5bb4eb310.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas Management erfolgt \u00fcber das Tool <code>pgo<\/code>, jedoch generiert sie im Gegenzug benutzerdefinierte Ressourcen f\u00fcr Kubernetes. Deshalb haben wir als potenzielle Nutzer eine erfreuliche Nachricht vom Operator erhalten:<\/p>\n<ul>\n<li> es gibt eine Verwaltung \u00fcber CRD;<\/li>\n<li> benutzerfreundliche Verwaltung von Benutzern (auch \u00fcber CRD);<\/li>\n<li> Integration mit anderen Komponenten <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/crunchy-postgres-containers\/4.3.1\/\">Crunchy Data Container Suite<\/a><\/noindex> \u2014 eine spezialisierte Sammlung von Container-Images f\u00fcr PostgreSQL und Werkzeugen zur Arbeit damit (einschlie\u00dflich pgBackRest, pgAudit, Erweiterungen aus contrib usw.).<\/li>\n<\/ul>\n<p>\nAllerdings haben die Versuche, den Operator von Crunchy Data zu nutzen, einige Probleme aufgezeigt:<\/p>\n<ul>\n<li>Es gab keine M\u00f6glichkeit f\u00fcr tolerations \u2014 es war nur nodeSelector vorgesehen.<\/li>\n<li>Die erstellten Pods waren Teil des Deployments, obwohl wir eine Statefull-Anwendung bereitgestellt haben. Im Gegensatz zu StatefulSets k\u00f6nnen Deployments keine Festplatten erstellen.<\/li>\n<\/ul>\n<p>\nDieser letzte Nachteil f\u00fchrt zu am\u00fcsanten Momenten: In der Testumgebung konnten wir 3 Replikate mit einer Festplatte starten, <i>lokaler Speicher<\/i>, was dazu f\u00fchrte, dass der Operator meldete, dass 3 Replikate laufen (obwohl das nicht der Fall war).<\/p>\n<p>Ein weiteres Merkmal dieses Operators ist seine fertige Integration mit verschiedenen Hilfssystemen. Beispielsweise ist es einfach, pgAdmin und pgBounce zu installieren, w\u00e4hrend <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/postgres-operator\/4.4.0\/installation\/other\/ansible\/installing-metrics\/\">Dokumentation<\/a><\/noindex> vorgestellt werden vorkonfigurierte Grafana und Prometheus. Im j\u00fcngsten <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> wird besonders die verbesserte Integration mit dem Projekt <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/pgmonitor\">pgMonitor<\/a><\/noindex>, wodurch der Operator eine anschauliche Visualisierung von Metriken f\u00fcr PgSQL \"out of the box\" anbietet.<\/p>\n<p>Dennoch hat die seltsame Auswahl an generierten Kubernetes-Ressourcen uns dazu gebracht, nach einer anderen L\u00f6sung zu suchen.<\/p>\n<h3>3. Zalando Postgres Operator<\/h3>\n<p>\nDie Produkte von Zalando sind uns seit langem bekannt: Wir haben Erfahrung mit Zalenium und nat\u00fcrlich haben wir versucht <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\">Patroni<\/a><\/noindex> \u2014 ihrer beliebten HA-L\u00f6sung f\u00fcr PostgreSQL. \u00dcber den Ansatz des Unternehmens zur Erstellung des <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\">Postgres Operator<\/a><\/noindex> hat einer seiner Autoren \u2014 Alexey Klyukin \u2014 im Rahmen von <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres-Dienstag Nr. 5<\/a><\/noindex>, und wir fanden es interessant.<\/p>\n<p>Dies ist die j\u00fcngste L\u00f6sung in dem Artikel: Die erste Ver\u00f6ffentlichung fand im August 2018 statt. Dennoch hat das Projekt, trotz der wenigen formellen Releases, einen langen Weg zur\u00fcckgelegt und hat bereits das L\u00f6sung von Crunchy Data mit \u00fcber 1300 Sternen auf GitHub und der h\u00f6chsten Anzahl an Mitwirkenden (\u00fcber 70) \u00fcberholt.<\/p>\n<p>\u201eUnter der Haube\u201c dieses Operators werden zeitbew\u00e4hrte L\u00f6sungen verwendet:<\/p>\n<ul>\n<li> Patroni und <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/spilo\">Spilo<\/a><\/noindex> f\u00fcr das Management,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">WAL-E<\/a><\/noindex> \u2014 f\u00fcr Backups,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\">PgBouncer<\/a><\/noindex> \u2014 als Verbindungspool.<\/li>\n<\/ul>\n<p>\nSo wird die Architektur des Zalando-Operators dargestellt:<\/p>\n<p><img decoding=\"async\" alt=\"Ein kurzer \u00dcberblick \u00fcber PostgreSQL-Operatoren f\u00fcr Kubernetes, unsere Auswahl und Erfahrungen\" src=\"\/wp-content\/uploads\/2020\/09\/c66f10c1a818592ecaacd2db4ce5ace5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDer Operator wird vollst\u00e4ndig \u00fcber Custom Resources verwaltet, erstellt automatisch ein StatefulSet aus Containern, die dann angepasst werden k\u00f6nnen, indem verschiedene Sidecars zum Pod hinzugef\u00fcgt werden. Dies ist ein wesentlicher Vorteil im Vergleich zum Operator von Crunchy Data.<\/p>\n<p>Da wir uns f\u00fcr die L\u00f6sung von Zalando aus 3 in Betracht gezogenen Optionen entschieden haben, werden unten die M\u00f6glichkeiten beschrieben, zusammen mit der praktischen Anwendung.<\/p>\n<h2>Praxis mit dem Postgres-Operator von Zalando<\/h2>\n<p>\nDer Deployment des Operators erfolgt sehr einfach: Es gen\u00fcgt, die aktuelle Version von GitHub herunterzuladen und die YAML-Dateien aus dem Verzeichnis <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/tree\/master\/manifests\">manifests<\/a><\/noindex>. Alternativ k\u00f6nnen Sie auch <noindex><a rel=\"nofollow\" href=\"https:\/\/operatorhub.io\/operator\/postgres-operator\">OperatorHub<\/a><\/noindex>.<\/p>\n<p>Nach der Installation sollten Sie die Konfiguration <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/reference\/operator_parameters.md#aws-or-gcp-interaction\">von Speichern f\u00fcr Protokolle und Backups<\/a><\/noindex>in Betracht ziehen. Diese erfolgt \u00fcber ConfigMap <code>postgres-operator<\/code> im Namensraum, in dem Sie den Operator installiert haben. Wenn die Speicher konfiguriert sind, kann der erste PostgreSQL-Cluster bereitgestellt werden.<\/p>\n<p>Zum Beispiel sieht unser Standard-Deployment folgenderma\u00dfen aus:<\/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>\nDieses Manifest stellt einen Cluster aus 3 Instanzen mit einem Sidecar zum Abrufen von <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wrouesnel\/postgres_exporter\">postgres_exporter<\/a><\/noindex>Metriken der Anwendung bereit. Wie Sie sehen, ist alles sehr einfach, und wenn gew\u00fcnscht, k\u00f6nnen Sie buchst\u00e4blich unbegrenzt viele Cluster erstellen.<\/p>\n<p>Es ist auch erw\u00e4hnenswert, dass es eine <b>Weboberfl\u00e4che zur Verwaltung<\/b> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/operator-ui.md\">postgres-operator-ui<\/a><\/noindex>. Diese wird zusammen mit dem Operator bereitgestellt und erm\u00f6glicht das Erstellen und L\u00f6schen von Clustern sowie das Arbeiten mit Backups, die der Operator erstellt.<\/p>\n<p><img decoding=\"async\" alt=\"Ein kurzer \u00dcberblick \u00fcber PostgreSQL-Operatoren f\u00fcr Kubernetes, unsere Auswahl und Erfahrungen\" src=\"\/wp-content\/uploads\/2020\/09\/2e9ae033a9817d101c843ce061aafdb5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Liste der PostgreSQL-Cluster<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Ein kurzer \u00dcberblick \u00fcber PostgreSQL-Operatoren f\u00fcr Kubernetes, unsere Auswahl und Erfahrungen\" src=\"\/wp-content\/uploads\/2020\/09\/74a65f7f301da14a0cb7bea6d5ef84ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Backup-Verwaltung<\/i><\/p>\n<p>Eine weitere interessante Funktion ist die Unterst\u00fctzung <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/user.md#teams-api-roles\">Teams API<\/a><\/noindex>. Dieses System erstellt automatisch <b>Rollen in PostgreSQL<\/b>, basierend auf der erhaltenen Liste von Benutzernamen. Danach erm\u00f6glicht die API die R\u00fcckgabe einer Liste von Benutzern, f\u00fcr die automatisch Rollen erstellt werden.<\/p>\n<h3>Probleme und deren L\u00f6sung<\/h3>\n<p>\nDie Verwendung des Operators hat jedoch bald mehrere erhebliche Nachteile aufgezeigt:<\/p>\n<ol>\n<li> fehlende Unterst\u00fctzung f\u00fcr nodeSelector;<\/li>\n<li> Unm\u00f6glichkeit, Backups abzuschalten;<\/li>\n<li> bei der Verwendung der Funktion zur Erstellung von Datenbanken erscheinen keine Standardberechtigungen;<\/li>\n<li> gelegentlich fehlt die Dokumentation oder sie ist nicht aktuell.<\/li>\n<\/ol>\n<p>\nGl\u00fccklicherweise k\u00f6nnen viele dieser Probleme gel\u00f6st werden. Fangen wir am Ende an \u2013 Probleme mit <strong>Dokumentation<\/strong>. <\/p>\n<p>Wahrscheinlich werden Sie feststellen, dass es nicht immer klar ist, wie man ein Backup definiert und wie man den Backup-Bucket mit der Operator UI verbindet. Dies wird in der Dokumentation nur am Rande erw\u00e4hnt, aber eine konkrete Beschreibung gibt es in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/481\">PR<\/a><\/noindex>:<\/p>\n<ol>\n<li>es muss ein Geheimnis erstellt werden;<\/li>\n<li>dieses an den Operator im Parameter <code>pod_environment_secret_name<\/code> im CRD mit den Einstellungen des Operators oder im ConfigMap (je nachdem, wie Sie sich entschieden haben, den Operator zu installieren).<\/li>\n<\/ol>\n<p>\nAllerdings stellte sich heraus, dass dies derzeit nicht m\u00f6glich ist. Aus diesem Grund haben wir unsere <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">eigene Version des Operators<\/a><\/noindex> mit einigen zus\u00e4tzlichen externen Funktionen gesammelt. N\u00e4heres dazu siehe unten.<\/p>\n<p>Wenn Sie dem Operator Parameter f\u00fcr Backups \u00fcbergeben, insbesondere \u2013 <code>wal_s3_bucket<\/code> und Zugriffsschl\u00fcssel f\u00fcr AWS S3, dann <strong>wird er alles sichern<\/strong>: nicht nur Datenbanken in der Produktion, sondern auch in der Staging-Umgebung. Das war f\u00fcr uns nicht akzeptabel.<\/p>\n<p>In der Beschreibung der Parameter f\u00fcr Spilo, das die grundlegende Docker-H\u00fclle f\u00fcr PgSQL bei Verwendung des Operators ist, stellte sich heraus: Man kann den Parameter <code>WAL_S3_BUCKET<\/code> leer \u00fcbergeben, wodurch Backups deaktiviert werden. Dar\u00fcber hinaus fand sich zu gro\u00dfer Freude auch ein <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">fertiger PR<\/a><\/noindex>, den wir sofort in unser Fork akzeptiert haben. Jetzt reicht es, einfach <code>enableWALArchiving: false<\/code> zur Ressource des PostgreSQL-Clusters hinzuzuf\u00fcgen.<\/p>\n<p>Ja, es gab die M\u00f6glichkeit, es anders zu machen, indem man 2 Operatoren startete: einen f\u00fcr Staging (ohne Backups) und einen f\u00fcr Produktion. Aber so konnten wir mit einem auskommen.<\/p>\n<p>Okay, wir haben gelernt, wie man den Datenbanken Zugriff auf S3 gibt und die Backups beginnen im Speicher zu landen. Wie lassen sich die Backup-Seiten in der Operator UI zum Laufen bringen?<\/p>\n<p><img decoding=\"async\" alt=\"Ein kurzer \u00dcberblick \u00fcber PostgreSQL-Operatoren f\u00fcr Kubernetes, unsere Auswahl und Erfahrungen\" src=\"\/wp-content\/uploads\/2020\/09\/46169b53707b0bbb686798c655022f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn der Operator UI m\u00fcssen 3 Variablen hinzugef\u00fcgt werden:<\/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>\nNach dieser \u00c4nderung wird die Verwaltung der Backups verf\u00fcgbar, was in unserem Fall die Arbeit mit Staging erleichtert und es erm\u00f6glicht, Schnappsch\u00fcsse aus der Produktion dort ohne zus\u00e4tzliche Skripte zu \u00fcbertragen.<\/p>\n<p>Ein weiterer Pluspunkt war die Arbeit mit der Teams API und die umfangreichen M\u00f6glichkeiten zur Erstellung von Datenbanken und Rollen mit Hilfe des Operators. Allerdings hatten die erstellten <strong>Rollen keine Standardrechte<\/strong>. Dementsprechend konnte ein Benutzer mit Leserechten keine neuen Tabellen lesen.<\/p>\n<p>Warum ist das so? Obwohl im Code <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/pkg\/cluster\/database.go#L42\">einen<\/a><\/noindex> ben\u00f6tigte <code>GRANT<\/code>, werden sie bei Weitem nicht immer angewendet. Es gibt 2 Methoden: <code>syncPreparedDatabases<\/code> und <code>syncDatabases<\/code>. In <code>syncPreparedDatabases<\/code> \u2014 obwohl es in der Sektion <code>preparedDatabases<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/manifests\/complete-postgres-manifest.yaml#L26\">einen<\/a><\/noindex> eine Bedingung gibt <code>defaultRoles<\/code> und <code>defaultUsers<\/code> f\u00fcr die Erstellung von Rollen \u2014 standardm\u00e4\u00dfige Berechtigungen werden nicht angewendet. Wir arbeiten an einem Patch, um diese Berechtigungen automatisch anzuwenden.<\/p>\n<p>Und der letzte Punkt in unseren aktuellen Verbesserungen \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">Patch<\/a><\/noindex>, der Node Affinity zu dem erstellten StatefulSet hinzuf\u00fcgt. Unsere Kunden ziehen es oft vor, Kosten zu sparen, indem sie Spot-Instanzen verwenden, auf denen deutlich keine DB-Dienste platziert werden sollten. Dieses Problem k\u00f6nnte auch durch Toleranzen gel\u00f6st werden, aber die Verf\u00fcgbarkeit von Node Affinity gibt mehr Sicherheit.<\/p>\n<h3>Was ist herausgekommen?<\/h3>\n<p>\nInfolge der L\u00f6sung der genannten Probleme haben wir den Postgres Operator von Zalando in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">unser Repository<\/a><\/noindex>, wo er mit so n\u00fctzlichen Patches gebaut wird. Und zur Erleichterung haben wir auch <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/flant\/postgres-operator\">Docker-Image<\/a><\/noindex>.<\/p>\n<p>Liste der PRs, die in den Fork aufgenommen wurden:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1066\">Erstellung eines sicheren, leichten Docker-Images f\u00fcr den Operator<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">Deaktivierung von Backups<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1121\">Aktualisierung der Ressourcen-Versionen f\u00fcr aktuelle k8s-Versionen<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">Implementierung von Node Affinity<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nEs w\u00e4re gro\u00dfartig, wenn die Community diese PRs unterst\u00fctzen w\u00fcrde, damit sie mit der n\u00e4chsten Version des Operators (1.6) in den Upstream gelangen.<\/p>\n<h2>Bonus! Erfolgsgeschichte zur Migration von Produktion<\/h2>\n<p>\nWenn Sie Patroni verwenden, k\u00f6nnen Sie live Produktion mit minimalen Ausfallzeiten zum Operator migrieren.<\/p>\n<p>Spilo erm\u00f6glicht die Erstellung von Standby-Clustern \u00fcber S3-Speicher mit <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">Wal-E<\/a><\/noindex>, wobei das bin\u00e4re Log PgSQL zuerst in S3 gespeichert und dann von einem Replica heruntergeladen wird. Aber was ist, wenn Sie <i>nicht<\/i> Wal-E in einer alten Infrastruktur verwenden? Die L\u00f6sung dieses Problems wurde bereits <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/437318\/\">vorgeschlagen<\/a><\/noindex> auf Habr\u00e9.<\/p>\n<p>Hier kommt die logische Replikation von PostgreSQL ins Spiel. Lassen Sie uns jedoch nicht ins Detail gehen, wie man Publikationen und Abonnements erstellt, denn... unser Plan ist gescheitert.<\/p>\n<p>Das Problem ist, dass es in der DB mehrere stark genutzte Tabellen mit Millionen von Zeilen gab, die zudem st\u00e4ndig erg\u00e4nzt und gel\u00f6scht wurden. <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/12\/sql-createsubscription\">Ein einfaches Abonnement<\/a><\/noindex> c <code>copy_data<\/code>, bei dem eine neue Replica den gesamten Inhalt vom Master kopiert, konnte einfach nicht mit dem Master Schritt halten. Das Kopieren des Inhalts hat eine Woche gedauert, aber es hat den Master nie eingeholt. Letztendlich hat uns die Kl\u00e4rung des Problems <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/avitotech\/recovery-use-cases-for-logical-replication-in-postgresql-10-a1e6bab03072\">Artikel<\/a><\/noindex> Kollegen von Avito geholfen: Man kann die Daten mit <code>pg_dump<\/code>verschieben. Ich werde unsere (ein wenig angepasste) Variante dieses Algorithmus beschreiben.<\/p>\n<p>Die Idee besteht darin, ein deaktiviertes Abonnement, das an einen bestimmten Replikationsslot gebunden ist, zu erstellen und dann die Transaktionsnummer zu korrigieren. Es gab Replikate f\u00fcr den Betrieb der Produktion. Das ist wichtig, weil das Replikat helfen wird, ein konsistentes Dump zu erstellen und weiterhin \u00c4nderungen vom Master zu empfangen.<\/p>\n<p>In den folgenden Befehlen, die den Migrationsprozess beschreiben, werden die folgenden Bezeichnungen f\u00fcr die Hosts verwendet:<\/p>\n<ol>\n<li><i>master<\/i> \u2014 Ursprungsserver;<\/li>\n<li><i>replica1<\/i> \u2014 Streaming-Replikat auf dem alten Produktionssystem;<\/li>\n<li><i>replica2<\/i> \u2014 neues logisches Replikat.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Migrationsplan<\/h3>\n<p>\n1. Erstellen wir auf dem Master ein Abonnement f\u00fcr alle Tabellen im Schema <code>public<\/code> der Datenbank <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. Erstellen wir einen Replikationsslot auf dem 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. Stoppen wir die Replikation auf der alten Replik:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_pause();\"\n<\/code><\/pre>\n<p>\n4. Erhalten wir die Transaktionsnummer vom 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. Machen wir ein Dump von der alten Replik. Wir werden dies in mehreren Threads tun, was den Prozess beschleunigt:<\/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. Laden wir das Dump auf den neuen Server:<\/p>\n<pre><code class=\"bash\">pg_restore -h replica2 -F d -j 8 -d dbname dump\/\n<\/code><\/pre>\n<p>\n7. Nach dem Laden des Dumps k\u00f6nnen wir die Replikation auf der Streaming-Replik starten:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_resume();\"\n<\/code><\/pre>\n<p>\n7. Erstellen wir ein Abonnement auf der neuen logischen Replik:<\/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. Erhalten wir <code>oid<\/code> des Abonnements:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"select oid, * from pg_subscription;\"\n<\/code><\/pre>\n<p>\n9. Angenommen, wir haben erhalten <code>oid=1000<\/code>. Wenden wir die Transaktionsnummer auf das Abonnement an:<\/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. Starten wir die Replikation:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"alter subscription oldprod enable;\"\n<\/code><\/pre>\n<p>\n11. \u00dcberpr\u00fcfen wir den Status des Abonnements, die Replikation sollte funktionieren:<\/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. Nachdem die Replikation gestartet wurde und die Datenbanken synchronisiert sind, kann der Umschaltvorgang durchgef\u00fchrt werden.<\/p>\n<p>13. Nach der Deaktivierung der Replikation m\u00fcssen die Sequenzen korrigiert werden. Dies ist gut beschrieben <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fixing_Sequences\">in einem Artikel auf wiki.postgresql.org<\/a><\/noindex>.<\/p>\n<p>Dank dieses Plans verlief der Umschaltvorgang mit minimalen Verz\u00f6gerungen.<\/p>\n<h2>Fazit<\/h2>\n<p>\nKubernetes-Operatoren erm\u00f6glichen es, verschiedene Aktionen zu vereinfachen, indem sie sie auf die Erstellung von K8s-Ressourcen reduzieren. Allerdings sollte man, nachdem man eine bemerkenswerte Automatisierung mit ihrer Hilfe erreicht hat, beachten, dass sie auch eine Reihe unerwarteter Nuancen mit sich bringen kann. Daher sollte man bei der Auswahl der Operatoren weise vorgehen.<\/p>\n<p>Nach der Betrachtung der drei beliebtesten Kubernetes-Operatoren f\u00fcr PostgreSQL haben wir uns f\u00fcr das Projekt von Zalando entschieden. Es gab einige Schwierigkeiten, aber das Ergebnis hat uns wirklich erfreut, weshalb wir planen, diese Erfahrung auch auf einige andere PgSQL-Installationen auszuweiten. Wenn Sie Erfahrungen mit \u00e4hnlichen L\u00f6sungen haben, w\u00fcrden wir uns freuen, Details in den Kommentaren zu sehen!<\/p>\n<h2>P.S.<\/h2>\n<p>\nLesen Sie auch in unserem Blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">Datenbanken und Kubernetes (\u00dcberblick und Video-Pr\u00e4sentation)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres-Dienstag Nr. 5: PostgreSQL und Kubernetes. CI\/CD. Testautomatisierung.<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/480722\/\">Eine Geschichte mit dem Redis-Operator in K8s und ein kurzer \u00dcberblick \u00fcber Tools zur Datenanalyse dieser Datenbank.<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Quelle: <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.1.1 - 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\/de\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47Kurze \u00dcbersicht \u00fcber PostgreSQL-Operatoren f\u00fcr Kubernetes, unsere Wahl und Erfahrungen | ProHoster","description":"Immer h\u00e4ufiger von Kunden.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/95322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=95322"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/95322\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/95323"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=95322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=95322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=95322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}