{"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":"Kurzer \u00dcberblick \u00fcber PostgreSQL-Betreiber f\u00fcr Kubernetes, unsere Auswahl und Erfahrung","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kurzer \u00dcberblick \u00fcber PostgreSQL-Betreiber f\u00fcr Kubernetes, unsere Auswahl und Erfahrung\" src=\"\/wp-content\/uploads\/2020\/09\/23b2db49941fa5bd5000358c8ffb991b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nImmer h\u00e4ufiger erhalten wir Anfragen von Kunden wie: \u201eWir wollen etwas wie Amazon RDS, aber g\u00fcnstiger\u201c; \u201eWir m\u00f6chten RDS, jedoch \u00fcberall und in jeder Infrastruktur\u201c. Um eine solche Managed-L\u00f6sung auf Kubernetes umzusetzen, haben wir uns die aktuellen L\u00f6sungen der g\u00e4ngigsten PostgreSQL-Operatoren (Stolon, L\u00f6sungen von Crunchy Data und Zalando) angesehen und unsere Entscheidung getroffen.<\/p>\n<p>Dieser Artikel basiert auf unseren Erfahrungen sowohl aus theoretischer Sicht (\u00dcberblick \u00fcber L\u00f6sungen) als auch aus praktischer Sicht (was ausgew\u00e4hlt wurde und welches Ergebnis erzielt wurde). Aber zuerst sollten wir kl\u00e4ren, welche Anforderungen tats\u00e4chlich an einen potentiellen Ersatz f\u00fcr RDS gestellt werden\u2026<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Was ist eigentlich RDS?<\/h2>\n<p>\nWenn Menschen von RDS sprechen, verstehen sie nach unserer Erfahrung in der Regel einen verwalteten (Managed) Datenbankdienst, der:<\/p>\n<ol>\n<li>einfach einzurichten ist;<\/li>\n<li>die M\u00f6glichkeit zur Arbeit mit Snapshots bietet und sich aus diesen wiederherstellen l\u00e4sst (idealerweise mit Unterst\u00fctzung von <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Point-in-time_recovery\">PITR<\/a><\/noindex>);<\/li>\n<li>erm\u00f6glicht die Erstellung von Master-Slave-Topologien;<\/li>\n<li>\u00fcber eine umfangreiche Liste an Erweiterungen verf\u00fcgt;<\/li>\n<li>Audit- und Benutzerverwaltungs-\/Zugriffsoptionen bereitstellt.<\/li>\n<\/ol>\n<p>\nWenn wir allgemein sprechen, gibt es viele Ans\u00e4tze zur Umsetzung der gestellten Aufgabe, jedoch ist der Weg mit Ansible f\u00fcr uns nicht geeignet. (Zu einem \u00e4hnlichen Schluss kamen auch die Kollegen von 2GIS aus ihrem Versuch, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/509926\/\">ein \"Werkzeug f\u00fcr die schnelle Bereitstellung eines fehlertoleranten Clusters auf Basis von Postgres\" zu erstellen.)<\/a><\/noindex> Betreiber sind der allgemein akzeptierte Ansatz zur L\u00f6sung solcher Aufgaben im Kubernetes-\u00d6kosystem. Mehr dazu in Bezug auf Datenbanken, die innerhalb von Kubernetes ausgef\u00fchrt werden, hat der technische Direktor von \"Flanta\" bereits in einem seiner Vortr\u00e4ge erz\u00e4hlt,<\/p>\n<p>: Um einfache Operatoren schnell zu erstellen, empfehlen wir, unsere Open Source-Utility zu beachten. <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\/\">Mit ihr l\u00e4sst sich das ohne Kenntnisse in Go und auf vertrauteren Wegen f\u00fcr Sysadmins umsetzen: in Bash, Python usw.<\/a><\/noindex>.<\/p>\n<p><i><strong>NB<\/strong><\/i><i>F\u00fcr PostgreSQL gibt es mehrere beliebte K8s-Operatoren: <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\"><i>shell-operator<\/i><\/a><\/noindex><i>Stolon;<\/i><\/p>\n<p>Crunchy Data PostgreSQL Operator;<\/p>\n<ul>\n<li>Zalando Postgres Operator.<\/li>\n<li>Schauen wir uns diese genauer an.<\/li>\n<li>Die Wahl des Operators<\/li>\n<\/ul>\n<p>\nNeben den wichtigen Funktionen, die bereits erw\u00e4hnt wurden, erwarteten wir als Infrastruktur-Engineers im Kubernetes auch Folgendes von den Operatoren:<\/p>\n<h2>Deployment aus Git und mit<\/h2>\n<p>\nCustom Resources<\/p>\n<ul>\n<li> Unterst\u00fctzung von Pod-Anti-Affinit\u00e4t; <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/operator\/#deploying-operators\">Benutzerdefinierte Ressourcen<\/a><\/noindex>;<\/li>\n<li> Unterst\u00fctzung f\u00fcr Anti-Affinit\u00e4t;<\/li>\n<li> die Konfiguration von Node Affinity oder Node Selector;<\/li>\n<li> die Konfiguration von Tolerierungen;<\/li>\n<li> die Verf\u00fcgbarkeit von Tuning-M\u00f6glichkeiten;<\/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 nach dem Lesen des gesamten Artikels noch Fragen dazu bleiben), m\u00f6chte ich insgesamt anmerken, dass diese Parameter f\u00fcr eine genauere Beschreibung der Spezialisierung der Clusterknoten notwendig sind, um sie f\u00fcr spezifische Anwendungen zu konfigurieren. So k\u00f6nnen wir ein optimales Gleichgewicht zwischen Performance und Kosten erreichen.<\/p>\n<p>Kommen wir nun 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 eine Art Benchmark unter den Operatoren f\u00fcr Datenbanken betrachtet. Es ist ein recht altes Projekt: Die erste \u00f6ffentliche Ver\u00f6ffentlichung fand bereits im November 2015 statt(!), 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=\"Kurzer \u00dcberblick \u00fcber PostgreSQL-Betreiber f\u00fcr Kubernetes, unsere Auswahl und Erfahrung\" src=\"\/wp-content\/uploads\/2020\/09\/a34625c130bfd29c5645cf2417042de2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie Details dieses Operators finden Sie im Bericht oder <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/blob\/master\/doc\/architecture.md\">in der Projektdokumentation.<\/a><\/noindex>. Insgesamt gesagt, ist es ausreichend zu erw\u00e4hnen, dass er alles beschriebene beherrscht: Failover, Proxys f\u00fcr einen transparenten Zugang f\u00fcr Kunden, Backups\u2026 Zudem bieten Proxys Zugang \u00fcber einen einzigen Service-Endpoint \u2013 im Gegensatz zu den zwei anderen L\u00f6sungen, die hier behandelt werden (dort gibt es jeweils zwei Dienste f\u00fcr den Zugang zur Datenbank).<\/p>\n<p>Doch Stolon <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/issues\/463#issuecomment-379666733\">verf\u00fcgt nicht \u00fcber Custom Resources<\/a><\/noindex>, weshalb es nicht m\u00f6glich ist, ihn so zu deployen, dass man einfach und schnell \u2013 \u201ewie frische Br\u00f6tchen\u201c \u2013 Instanzen einer DBMS in Kubernetes erstellen kann. Die Verwaltung erfolgt \u00fcber das Dienstprogramm <code>stolonctl<\/code>, das Deployment geschieht \u00fcber das Helm-Chart, und Benutzerdefinierte Ressourcen werden in ConfigMap festgelegt.<\/p>\n<p>Einerseits scheint es, dass der Operator nicht wirklich ein Operator ist (da er keine CRD verwendet). Andererseits ist es ein flexibles System, das es erlaubt, Ressourcen in K8s so anzupassen, wie es Ihnen passt.<\/p>\n<p>Zusammenfassend erschien es uns nicht optimal, f\u00fcr jede DB ein eigenes Chart anzulegen. 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>, eines jungen amerikanischen Startups, erschien als logische Alternative. Seine \u00f6ffentliche Geschichte beginnt mit dem ersten Release im M\u00e4rz 2017. Seitdem hat das GitHub-Repository knapp 1300 Sterne und \u00fcber 50 Mitwirkende erhalten. Die letzte Ver\u00f6ffentlichung im September wurde auf die Kompatibilit\u00e4t mit Kubernetes 1.15\u20131.18, OpenShift 3.11+ und 4.4+, GKE sowie 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=\"Kurzer \u00dcberblick \u00fcber PostgreSQL-Betreiber f\u00fcr Kubernetes, unsere Auswahl und Erfahrung\" src=\"\/wp-content\/uploads\/2020\/09\/343cd0494abae42fcf5b47c5bb4eb310.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie Verwaltung erfolgt \u00fcber das Dienstprogramm <code>pgo<\/code>, welches seinerseits Custom Resources f\u00fcr Kubernetes generiert. Daher waren wir als potenzielle Benutzer erfreut, dass der Operator folgende Funktionen bietet:<\/p>\n<ul>\n<li> Verwaltung \u00fcber CRD;<\/li>\n<li> benutzerfreundliche Verwaltung (ebenfalls \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 einer spezialisierten Sammlung von Container-Images f\u00fcr PostgreSQL und dazugeh\u00f6rigen Tools (einschlie\u00dflich pgBackRest, pgAudit, Erweiterungen aus contrib usw.).<\/li>\n<\/ul>\n<p>\nBei dem Versuch, den Operator von Crunchy Data zu nutzen, traten jedoch einige Probleme auf:<\/p>\n<ul>\n<li>Es gab keine M\u00f6glichkeit, Tolerierungen zu nutzen \u2014 lediglich nodeSelector wurde vorgesehen.<\/li>\n<li>Die erstellten Pods waren Teil des Deployments, obwohl wir eine zustandsbehaftete Anwendung bereitgestellt haben. Im Gegensatz zu StatefulSets k\u00f6nnen Deployments keine Datentr\u00e4ger erstellen.<\/li>\n<\/ul>\n<p>\nDer letzte Nachteil f\u00fchrte zu am\u00fcsanten Situationen: In der Testumgebung konnten 3 Replikate mit einem einzigen Datentr\u00e4ger gestartet werden, <i>lokaler Speicher<\/i>, was dazu f\u00fchrte, dass der Operator meldete, dass 3 Replikate laufen (was nicht der Fall war).<\/p>\n<p>Eine weitere Besonderheit dieses Operators ist seine sofortige Integration mit verschiedenen Hilfsystemen. So lassen sich zum Beispiel pgAdmin und pgBounce problemlos 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> vorgestellte vorkonfigurierte Instanzen von Grafana und Prometheus ber\u00fccksichtigt werden. In der j\u00fcngsten <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\/releases\/tag\/v4.5.0-beta.1\">Version 4.5.0-beta1<\/a><\/noindex> wurde 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 PgSQL-Metriken \u201eout of the box\u201c bietet.<\/p>\n<p>Dennoch f\u00fchrte die seltsame Auswahl der erzeugten Kubernetes-Ressourcen dazu, dass wir eine andere L\u00f6sung finden mussten.<\/p>\n<h3>3. Zalando Postgres Operator<\/h3>\n<p>\nDie Produkte von Zalando sind uns schon lange bekannt: Wir haben Erfahrungen mit Zalenium und nat\u00fcrlich haben wir <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\">Patroni<\/a><\/noindex> ihr beliebtes HA-Setup f\u00fcr PostgreSQL ausprobiert. \u00dcber den Ansatz des Unternehmens zur Erstellung des <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\">Postgres Operators<\/a><\/noindex> berichtete einer seiner Autoren \u2013 Alexey Klyukin \u2013 im <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres-Dienstag Nr. 5<\/a><\/noindex>, und es hat uns gefallen.<\/p>\n<p>Dies ist die j\u00fcngste L\u00f6sung aus den in dem Artikel betrachteten: Die erste Ver\u00f6ffentlichung fand im August 2018 statt. Trotz einer geringen Anzahl formaler Releases hat das Projekt jedoch einen langen Weg zur\u00fcckgelegt und bereits die L\u00f6sung von Crunchy Data mit \u00fcber 1300 Sternen auf GitHub und der h\u00f6chsten Anzahl an Mitwirkenden (\u00fcber 70) \u00fcberholt.<\/p>\n<p>Unter der Haube dieses Operators kommen bew\u00e4hrte L\u00f6sungen zum Einsatz:<\/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> f\u00fcr Backups,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\">PgBouncer<\/a><\/noindex> als Verbindungspool.<\/li>\n<\/ul>\n<p>\nSo sieht die Architektur des Operators von Zalando aus:<\/p>\n<p><img decoding=\"async\" alt=\"Kurzer \u00dcberblick \u00fcber PostgreSQL-Betreiber f\u00fcr Kubernetes, unsere Auswahl und Erfahrung\" 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>Da wir uns f\u00fcr die L\u00f6sung von Zalando unter den 3 betrachteten Optionen entschieden haben, wird die weitere Beschreibung seiner Funktionen unten zusammen mit praktischen Anwendungen dargestellt.<\/p>\n<h2>Praktische Erfahrung mit dem Postgres Operator von Zalando<\/h2>\n<p>\nDas Deployment des Operators erfolgt sehr einfach: Es gen\u00fcgt, die aktuelle Version von GitHub herunterzuladen und die YAML-Dateien aus dem Verzeichnis anzuwenden. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/tree\/master\/manifests\">Manifeste<\/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>. Dies erfolgt \u00fcber ConfigMap <code>postgres-operator<\/code> im Namensraum, in dem Sie den Operator installiert haben. Nachdem die Speicher konfiguriert sind, k\u00f6nnen Sie den ersten PostgreSQL-Cluster bereitstellen.<\/p>\n<p>Zum Beispiel sieht unser Standard-Deployment wie folgt 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: &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>\nDieses Manifest deployt einen Cluster mit 3 Instanzen mit einem Sidecar, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wrouesnel\/postgres_exporter\">postgres_exporter<\/a><\/noindex>das wir f\u00fcr die Metriken der Anwendung nutzen. Wie Sie sehen, ist es ganz einfach, und wenn Sie m\u00f6chten, k\u00f6nnen Sie buchst\u00e4blich eine unbegrenzte Anzahl an Clustern erstellen.<\/p>\n<p>Es ist auch wichtig, auf die <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>. Es wird zusammen mit dem Operator bereitgestellt und erm\u00f6glicht das Erstellen und L\u00f6schen von Clustern sowie die Verwaltung von Backups, die der Operator erstellt.<\/p>\n<p><img decoding=\"async\" alt=\"Kurzer \u00dcberblick \u00fcber PostgreSQL-Betreiber f\u00fcr Kubernetes, unsere Auswahl und Erfahrung\" 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=\"Kurzer \u00dcberblick \u00fcber PostgreSQL-Betreiber f\u00fcr Kubernetes, unsere Auswahl und Erfahrung\" src=\"\/wp-content\/uploads\/2020\/09\/74a65f7f301da14a0cb7bea6d5ef84ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Backup-Verwaltung<\/i><\/p>\n<p>Ein weiteres interessantes Merkmal ist die Unterst\u00fctzung von <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/user.md#teams-api-roles\">Teams API<\/a><\/noindex>. Dieser Mechanismus erstellt automatisch <b>Rollen in PostgreSQL<\/b>, basierend auf der erhaltenen Liste von Benutzernamen. Anschlie\u00dfend 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\u00f6sungen<\/h3>\n<p>\nDie Nutzung des Operators hat jedoch bald mehrere wesentliche Nachteile aufgedeckt:<\/p>\n<ol>\n<li> fehlende Unterst\u00fctzung f\u00fcr nodeSelector;<\/li>\n<li> Unm\u00f6glichkeit, Backups zu deaktivieren;<\/li>\n<li> bei der Verwendung der Funktion zum Erstellen von Datenbanken fehlen standardm\u00e4\u00dfig Berechtigungen;<\/li>\n<li> gelegentlich mangelt es an Dokumentation oder sie ist veraltet.<\/li>\n<\/ol>\n<p>\nGl\u00fccklicherweise k\u00f6nnen viele von ihnen gel\u00f6st werden. Beginnen wir mit dem Ende \u2013 Probleme mit <strong>Dokumentation<\/strong>. <\/p>\n<p>Wahrscheinlich werden Sie feststellen, dass es nicht immer klar ist, wie man ein Backup schreibt und wie man den Backup-Bucket mit der Operator UI verbindet. In der Dokumentation wird dies nur kurz erw\u00e4hnt, w\u00e4hrend eine detaillierte Beschreibung in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/481\">PR<\/a><\/noindex>:<\/p>\n<ol>\n<li>ein Geheimnis erstellt werden muss;<\/li>\n<li>es muss dem Operator als Parameter \u00fcbergeben werden. <code>pod_environment_secret_name<\/code> im CRD mit den Operator-Einstellungen oder in einem ConfigMap (je nachdem, wie Sie sich entschieden haben, den Operator zu installieren).<\/li>\n<\/ol>\n<p>\nWie sich herausgestellt hat, ist dies derzeit jedoch nicht m\u00f6glich. Deshalb haben wir <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">unsere eigene Version des Operators<\/a><\/noindex> mit einigen zus\u00e4tzlichen externen Arbeiten entwickelt. Weitere Informationen finden Sie unten.<\/p>\n<p>Wenn man dem Operator Parameter f\u00fcr das Backup \u00fcbergibt, n\u00e4mlich <code>wal_s3_bucket<\/code> und die Zugangskeys f\u00fcr AWS S3, wird er <strong>alles sichern<\/strong>: nicht nur die 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 zu 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 die Backups deaktiviert werden. Zudem hat sich zu unserer gro\u00dfen 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 aufgenommen haben, gefunden. Jetzt reicht es, einfach <code>enableWALArchiving: false<\/code> zum PostgreSQL-Cluster-Ressourc hinzuzuf\u00fcgen.<\/p>\n<p>Ja, es w\u00e4re m\u00f6glich gewesen, es anders zu machen, indem man 2 Operatoren gestartet h\u00e4tte: einen f\u00fcr Staging (ohne Backups) und einen f\u00fcr die Produktion. Aber so konnten wir mit einem auskommen.<\/p>\n<p>Okay, wir haben gelernt, den Zugriff auf S3 f\u00fcr die Datenbanken zu gew\u00e4hren, und die Backups landen nun im Speicher. Wie sollen wir die Backup-Seiten im Operator UI zum Laufen bringen?<\/p>\n<p><img decoding=\"async\" alt=\"Kurzer \u00dcberblick \u00fcber PostgreSQL-Betreiber f\u00fcr Kubernetes, unsere Auswahl und Erfahrung\" src=\"\/wp-content\/uploads\/2020\/09\/46169b53707b0bbb686798c655022f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn der Operator-Benutzeroberfl\u00e4che 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 Anpassung wird die Verwaltung von Backups verf\u00fcgbar sein, was in unserem Fall die Arbeit mit Staging vereinfachen wird, indem wir Snapshots aus der Produktion dorthin bereitstellen, ohne zus\u00e4tzliche Skripte.<\/p>\n<p>Ein weiterer Vorteil ist die Arbeit mit der Teams API und die umfangreichen M\u00f6glichkeiten zur Erstellung von Datenbanken und Rollen durch den Operator. Allerdings hatten die erstellten <strong>Rollen standardm\u00e4\u00dfig keine Berechtigungen.<\/strong>Daher konnte ein Benutzer mit Lesezugriff 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\">gibt es<\/a><\/noindex> die erforderlichen <code>GRANT<\/code>vorhanden sind, werden sie nicht immer angewendet. Es gibt 2 Methoden: <code>syncPreparedDatabases<\/code> und <code>syncDatabases<\/code>In <code>syncPreparedDatabases<\/code> \u2014 obwohl im Abschnitt <code>preparedDatabases<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/manifests\/complete-postgres-manifest.yaml#L26\">gibt es<\/a><\/noindex> eine Bedingung vorhanden ist <code>defaultRoles<\/code> und <code>defaultUsers<\/code> um Rollen zu erstellen, werden die Standardberechtigungen nicht angewendet. Wir arbeiten an einem Patch, damit diese Berechtigungen automatisch angewendet werden.<\/p>\n<p>Und der letzte Punkt in den f\u00fcr uns relevanten Verbesserungen ist \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">Patch<\/a><\/noindex>, die Node Affinity in das erstellte StatefulSet integriert. Unsere Kunden ziehen oft in Betracht, Kosten zu sparen, indem sie Spot-Instanzen nutzen, auf denen DB-Services eindeutig nicht platziert werden sollten. Dieses Problem k\u00f6nnte auch durch Tolerierungen gel\u00f6st werden, aber Node Affinity bietet eine gr\u00f6\u00dfere Sicherheit.<\/p>\n<h3>Was ist das Ergebnis?<\/h3>\n<p>\nNach 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\">unseres Repositorys<\/a><\/noindex>, wo er mit so n\u00fctzlichen Patches zusammengestellt wird. Zur Erleichterung haben wir auch <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/flant\/postgres-operator\">ein Docker-Image<\/a><\/noindex>.<\/p>\n<p>Eine 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\">Bau 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 der Backups<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1121\">Aktualisierung der Ressourcenversionen f\u00fcr die aktuellen k8s-Versionen<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">Implementierung der Node Affinity<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nEs w\u00e4re gro\u00dfartig, wenn die Community diese PRs unterst\u00fctzt, damit sie in der n\u00e4chsten Version des Operators (1.6) in den Upstream gelangen.<\/p>\n<h2>Bonus! Erfolgsgeschichte zur Migration von Production<\/h2>\n<p>\nWenn Sie Patroni verwenden, k\u00f6nnen Sie mit dem Operator live Production mit minimalen Ausfallzeiten 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>, wenn das bin\u00e4re PgSQL-Protokoll zuerst in S3 gespeichert und dann von einem Replikat extrahiert wird. Aber was tun, wenn Sie <i>nicht<\/i> Wal-E in einer alten Infrastruktur verwenden? Die L\u00f6sung dieses Problems ist bereits <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/437318\/\">wurde angeboten<\/a><\/noindex> auf Habr.<\/p>\n<p>Hier kommt die logische Replikation von PostgreSQL ins Spiel. Lassen Sie uns jedoch nicht in die Einzelheiten eintauchen, wie Publikationen und Abonnements erstellt werden, denn\u2026 unser Plan hat gefloppt.<\/p>\n<p>Das Problem ist, dass es in der Datenbank mehrere stark belastete Tabellen mit Millionen von Zeilen gab, die zudem st\u00e4ndig hinzugef\u00fcgt und gel\u00f6scht wurden. <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/12\/sql-createsubscription\">Ein einfaches Abonnement<\/a><\/noindex> mit <code>copy_data<\/code>, bei dem die neue Replik alles vom Master kopiert, konnte einfach nicht mit dem Master Schritt halten. Die Daten\u00fcbertragung lief eine Woche, aber holte den Master nicht ein. Schlie\u00dflich half, das Problem zu l\u00f6sen, <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/avitotech\/recovery-use-cases-for-logical-replication-in-postgresql-10-a1e6bab03072\">Artikel<\/a><\/noindex> ein Kollege von Avito: es ist m\u00f6glich, die Daten zu \u00fcbertragen, indem man <code>pg_dump<\/code>. Ich beschreibe unsere (leicht \u00fcberarbeitete) Variante dieses Algorithmus.<\/p>\n<p>Die Idee besteht darin, ein deaktiviertes Abonnement zu erstellen, das an einen bestimmten Replikationsslot gebunden ist, und dann die Transaktionsnummer zu korrigieren. Es gab Repliken f\u00fcr den Betrieb in der Produktion. Das ist wichtig, denn die Replik hilft, einen konsistenten 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 Hosts verwendet:<\/p>\n<ol>\n<li><i>master<\/i> \u2014 Quellserver;<\/li>\n<li><i>replica1<\/i> \u2014 Stream-Replikat auf der alten Produktionsumgebung;<\/li>\n<li><i>replica2<\/i> \u2014 neue logische Replikation.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Migrationsplan<\/h3>\n<p>\n1. Wir erstellen auf dem Master eine Publikation f\u00fcr alle Tabellen im Schema <code>public<\/code> Datenbank <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. Wir erstellen einen Replikationsslot auf dem 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. Wir stoppen die Replikation auf der alten Replik:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c &quot;select pg_wal_replay_pause();&quot;\n<\/code><\/pre>\n<p>\n4. Wir erhalten die Transaktionsnummer vom 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. Wir erstellen ein Dump von der alten Replik. Wir werden dies in mehreren Streams tun, um den Prozess zu beschleunigen:<\/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. Wir laden 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 kann die Replikation auf der Stream-Replik gestartet werden:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c &quot;select pg_wal_replay_resume();&quot;\n<\/code><\/pre>\n<p>\n8. Wir erstellen eine Publikation auf der neuen logischen Replik:<\/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>\n9. Wir erhalten <code>oid<\/code> der Publikation:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c &quot;select oid, * from pg_subscription;&quot;\n<\/code><\/pre>\n<p>\n10. Angenommen, wir haben erhalten <code>oid=1000<\/code>. Wir wenden die Transaktionsnummer auf die Publikation an:<\/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. Lassen Sie uns die Replikation starten:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c &quot;alter subscription oldprod enable;&quot;\n<\/code><\/pre>\n<p>\n11. \u00dcberpr\u00fcfen Sie den Status des Abonnements, die Replikation sollte aktiv sein:<\/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. Nachdem die Replikation gestartet und die Datenbanken synchronisiert sind, kann der Umschalter vollzogen werden.<\/p>\n<p>13. Nach der Deaktivierung der Replikation sollten die Sequenzen angepasst werden. Dies ist gut beschrieben <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fixing_Sequences\">im Artikel auf wiki.postgresql.org<\/a><\/noindex>.<\/p>\n<p>Dank dieses Plans wurde der Umschaltvorgang mit minimalen Verz\u00f6gerungen durchgef\u00fchrt.<\/p>\n<h2>Fazit<\/h2>\n<p>\nKubernetes-Operatoren vereinfachen verschiedene Aktionen, indem sie diese auf die Erstellung von K8s-Ressourcen reduzieren. Es ist jedoch wichtig zu bedenken, dass trotz der hervorragenden Automatisierung auch unerwartete Nuancen auftreten k\u00f6nnen, daher sollten Sie bei der Auswahl der Operatoren weise vorgehen.<\/p>\n<p>Nachdem wir die drei beliebtesten Kubernetes-Operatoren f\u00fcr PostgreSQL untersucht hatten, entschieden wir uns f\u00fcr das Projekt von Zalando. Damit hatten wir einige Herausforderungen zu bew\u00e4ltigen, aber das Ergebnis hat uns wirklich erfreut, weshalb wir planen, diese Erfahrungen auch auf weitere PgSQL-Installationen auszuweiten. Wenn Sie Erfahrungen mit \u00e4hnlichen L\u00f6sungen haben, w\u00fcrden wir uns freuen, Ihre 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 des Vortrags)<\/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. Automatisierung von Tests<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/480722\/\">Eine Geschichte \u00fcber den Redis-Operator in K8s und einen kurzen \u00dcberblick \u00fcber Werkzeuge 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 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\/de\/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=\"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 \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\/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\udd47Kurzer \u00dcberblick \u00fcber PostgreSQL-Operatoren f\u00fcr Kubernetes, unsere Auswahl und Erfahrungen | ProHoster","description":"Immer h\u00e4ufiger erhalten wir Anfragen von Kunden: \u201eWir m\u00f6chten etwas wie Amazon RDS, aber g\u00fcnstiger\u201c; \u201eWir m\u00f6chten wie RDS, aber \u00fcberall, in jeder Infrastruktur\u201c. Um ein solches Managed-L\u00f6sung auf Kubernetes zu realisieren, haben wir den aktuellen Stand der beliebtesten Operatoren f\u00fcr PostgreSQL (Stolon, Operatoren von Crunchy Data und Zalando) betrachtet und unser Urteil gef\u00e4llt. Dieser Artikel ist das Ergebnis unserer Erfahrungen und","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 \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\/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"},"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}]}}