{"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\/sk\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","title":{"rendered":"Kr\u00e1tky preh\u013ead oper\u00e1torov PostgreSQL pre Kubernetes, n\u00e1\u0161 v\u00fdber a sk\u00fasenosti","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kr\u00e1tky preh\u013ead oper\u00e1torov PostgreSQL pre Kubernetes, n\u00e1\u0161 v\u00fdber a sk\u00fasenosti\" src=\"\/wp-content\/uploads\/2020\/09\/23b2db49941fa5bd5000358c8ffb991b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u010coraz \u010dastej\u0161ie dost\u00e1vame od klientov po\u017eiadavky ako: \u201eChceme nie\u010do ako Amazon RDS, ale lacnej\u0161ie\u201c; \u201eChceme nie\u010do ako RDS, ale \u00faplne vo v\u0161etk\u00fdch infra\u0161trukt\u00farach\u201c. Aby sme realizovali podobn\u00e9 managed rie\u0161enie na Kubernetes, pozreli sme sa na aktu\u00e1lny stav najpopul\u00e1rnej\u0161\u00edch oper\u00e1torov pre PostgreSQL (Stolon, oper\u00e1tori od Crunchy Data a Zalando) a urobili sme svoj v\u00fdber.<\/p>\n<p>Tento \u010dl\u00e1nok je n\u00e1\u0161 preobt\u00ed\u017een\u00fd sk\u00fasenos\u0165 a to z teoretick\u00e9ho poh\u013eadu (preh\u013ead rie\u0161en\u00ed) aj z praktickej str\u00e1nky (\u010do bolo vybran\u00e9 a \u010do z toho vzniklo). Ale najprv si definujme, ak\u00e9 po\u017eiadavky s\u00fa kladen\u00e9 na potenci\u00e1lnu n\u00e1hradu RDS...<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>\u010co vlastne je RDS<\/h2>\n<p>\nKe\u010f \u013eudia hovoria o RDS, pod\u013ea na\u0161ich sk\u00fasenost\u00ed, maj\u00fa na mysli spravovan\u00fd (managed) slu\u017ebu DB, ktor\u00e1:<\/p>\n<ol>\n<li>je \u013eahko nastavite\u013en\u00e1;<\/li>\n<li>m\u00e1 mo\u017enos\u0165 pr\u00e1ce so snapshotmi a obnovi\u0165 sa z nich (ide\u00e1lne \u2014 s podporou <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Point-in-time_recovery\">PITR<\/a><\/noindex>);<\/li>\n<li>umo\u017e\u0148uje vytv\u00e1ra\u0165 topol\u00f3gie master-slave;<\/li>\n<li>m\u00e1 bohat\u00fd zoznam roz\u0161\u00edren\u00ed;<\/li>\n<li>poskytuje audit a spr\u00e1vu pou\u017e\u00edvate\u013eov\/pr\u00edstupov.<\/li>\n<\/ol>\n<p>\n\u010co sa t\u00fdka implement\u00e1cie stanoven\u00e9ho \u00faloha, pr\u00edstupy m\u00f4\u017eu by\u0165 ve\u013emi r\u00f4zne, av\u0161ak cesta s podmiene\u010dn\u00fdm Ansible n\u00e1m nie je bl\u00edzka. (K podobn\u00e9mu z\u00e1veru dospeli aj kolegovia z 2GIS na z\u00e1klade <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/509926\/\">ich pokusu<\/a><\/noindex> vytvori\u0165 \u201en\u00e1stroj na r\u00fdchle nasadenie vysokodostupn\u00e9ho klastera na z\u00e1klade Postgres\u201c.)<\/p>\n<p>Pr\u00e1ve oper\u00e1tori \u2014 s\u00fa be\u017en\u00fdm pr\u00edstupom na rie\u0161enie tak\u00fdchto \u00faloh v ekosyst\u00e9me Kubernetes. O nich podrobnej\u0161ie v s\u00favislosti s datab\u00e1zami be\u017eiacimi v Kubernetes u\u017e hovoril technick\u00fd riadite\u013e \u201eFlanta\u201c, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/distol\/\" class=\"user_link\">distol<\/a><\/noindex>, v <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">v jednom zo svojich vyst\u00fapen\u00ed<\/a><\/noindex>.<\/p>\n<p><i><strong>Pozn\u00e1mka<\/strong><\/i><i>: Na r\u00fdchle vytv\u00e1ranie jednoduch\u00fdch oper\u00e1torov odpor\u00fa\u010dame venova\u0165 pozornos\u0165 na\u0161ej Open Source utilite <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\"><i>shell-operator<\/i><\/a><\/noindex><i>. Pou\u017eit\u00edm jej je mo\u017en\u00e9 to robi\u0165 bez znalosti Go, a be\u017enej\u0161\u00edmi sp\u00f4sobmi pre syst\u00e9mov\u00fdch administr\u00e1torov: na Bash, Python a pod.<\/i><\/p>\n<p>Pre PostgreSQL existuje nieko\u013eko popul\u00e1rnych K8s oper\u00e1torov:<\/p>\n<ul>\n<li>Stolon;<\/li>\n<li>Crunchy Data PostgreSQL Operator;<\/li>\n<li>Zalando Postgres Operator.<\/li>\n<\/ul>\n<p>\nPozrime sa na ne podrobnej\u0161ie.<\/p>\n<h2>V\u00fdber oper\u00e1tora<\/h2>\n<p>\nOkrem t\u00fdch d\u00f4le\u017eit\u00fdch mo\u017enost\u00ed, ktor\u00e9 u\u017e boli uveden\u00e9 vy\u0161\u0161ie, sme \u2014 ako in\u017einieri infra\u0161trukt\u00fary v Kubernetes \u2014 o\u010dak\u00e1vali od oper\u00e1torov aj nasleduj\u00face:<\/p>\n<ul>\n<li> deploy z Git a s <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/operator\/#deploying-operators\">Custom Resources<\/a><\/noindex>;<\/li>\n<li> podporu pod anti-affinity;<\/li>\n<li> in\u0161tal\u00e1ciu node affinity alebo node selector;<\/li>\n<li> in\u0161tal\u00e1ciu tolerations;<\/li>\n<li> existencia mo\u017enost\u00ed lad\u00edrenia;<\/li>\n<li> jasn\u00e9 technol\u00f3gie a dokonca aj pr\u00edkazy.<\/li>\n<\/ul>\n<p>\nBez podrobnost\u00ed o ka\u017edom z bodoch (p\u00fdtajte sa v koment\u00e1roch, ak po pre\u010d\u00edtan\u00ed cel\u00e9ho \u010dl\u00e1nku zostan\u00fa ot\u00e1zky), chcem v celku zd\u00f4razni\u0165, \u017ee tieto parametre s\u00fa potrebn\u00e9 na presnej\u0161ie op\u00edsanie \u0161pecializ\u00e1cie uzlov klastra, aby sme ich mohli objedn\u00e1va\u0165 na konkr\u00e9tne aplik\u00e1cie. Tak m\u00f4\u017eeme dosiahnu\u0165 optim\u00e1lnu rovnov\u00e1hu medzi v\u00fdkonom a n\u00e1kladmi.<\/p>\n<p>Teraz - k samotn\u00fdm oper\u00e1torom PostgreSQL.<\/p>\n<h3>1. Stolon<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\">Stolon<\/a><\/noindex> od talianskej spolo\u010dnosti Sorint.lab v <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">u\u017e spomenutej spr\u00e1ve<\/a><\/noindex> bol pova\u017eovan\u00fd za ur\u010dit\u00fd etal\u00f3n medzi oper\u00e1tormi pre DBMS. Je to pomerne star\u00fd projekt: jeho prv\u00e9 verejn\u00e9 vydanie sa uskuto\u010dnilo u\u017e v novembri 2015 (!) a GitHub repozit\u00e1r sa m\u00f4\u017ee pochv\u00e1li\u0165 takmer 3000 hviezdami a 40+ prispievate\u013emi.<\/p>\n<p>A naozaj, Stolon je skvel\u00fdm pr\u00edkladom premyslenej architekt\u00fary:<\/p>\n<p><img decoding=\"async\" alt=\"Kr\u00e1tky preh\u013ead oper\u00e1torov PostgreSQL pre Kubernetes, n\u00e1\u0161 v\u00fdber a sk\u00fasenosti\" src=\"\/wp-content\/uploads\/2020\/09\/a34625c130bfd29c5645cf2417042de2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nS dizajnom tohto oper\u00e1tora sa m\u00f4\u017eete podrobnej\u0161ie obozn\u00e1mi\u0165 v spr\u00e1ve alebo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/blob\/master\/doc\/architecture.md\">dokument\u00e1cii projektu<\/a><\/noindex>. Celkovo v\u0161ak sta\u010d\u00ed poveda\u0165, \u017ee zvl\u00e1dne v\u0161etko, \u010do je pop\u00edsan\u00e9: failover, proxy na transparentn\u00fd pr\u00edstup pre klientov, z\u00e1lohy\u2026 A proxy poskytuj\u00fa pr\u00edstup cez jeden servisn\u00fd endpoint - na rozdiel od dvoch \u010fal\u0161\u00edch rie\u0161en\u00ed, ktor\u00e9 bud\u00fa \u010falej presk\u00faman\u00e9 (maj\u00fa po dva servisy na pr\u00edstup k datab\u00e1ze).<\/p>\n<p>Av\u0161ak Stolon <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/issues\/463#issuecomment-379666733\">nem\u00e1 vlastn\u00e9 zdroje<\/a><\/noindex>, preto ho nemo\u017eno nasadi\u0165 tak, aby bolo jednoduch\u00e9 a r\u00fdchle - \u201eako hor\u00face kol\u00e1\u010de\u201c - vytv\u00e1ra\u0165 in\u0161tancie DBMS v Kubernetes. Spr\u00e1va sa vykon\u00e1va prostredn\u00edctvom n\u00e1stroja <code>stolonctl<\/code>, nasadenie - prostredn\u00edctvom Helm chartu, a pou\u017e\u00edvate\u013esk\u00e9 defin\u00edcie sa ur\u010duj\u00fa v ConfigMap.<\/p>\n<p>Na jednej strane to vyzer\u00e1, \u017ee oper\u00e1tor nie je \u00faplne oper\u00e1torom (ve\u010f nepou\u017e\u00edva CRD). Ale na druhej strane - je to flexibiln\u00fd syst\u00e9m, ktor\u00fd umo\u017e\u0148uje nastavi\u0165 zdroje v K8s tak, ako v\u00e1m to vyhovuje.<\/p>\n<p>Zhrnut\u00edm, pre n\u00e1s sa nepodarilo n\u00e1js\u0165 optim\u00e1lnu cestu, ako zavies\u0165 samostatn\u00fd chart pre ka\u017ed\u00fa DB. Preto sme za\u010dali h\u013eada\u0165 alternat\u00edvy.<\/p>\n<h3>2. Crunchy Data PostgreSQL Operator<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\">Oper\u00e1tor od Crunchy Data<\/a><\/noindex>, mlad\u00e9ho americk\u00e9ho startupu, sa jav\u00ed ako logick\u00e1 alternat\u00edva. Jeho verejn\u00e1 hist\u00f3ria sa za\u010d\u00edna prv\u00fdm vydan\u00edm v marci 2017, odvtedy GitHub repozit\u00e1r z\u00edskal necel\u00fdch 1300 hviezd a 50+ prispievate\u013eov. Posledn\u00e9 vydanie z septembra bolo testovan\u00e9 na pr\u00e1cu s Kubernetes 1.15\u20141.18, OpenShift 3.11+ a 4.4+, GKE a VMware Enterprise PKS 1.3+.<\/p>\n<p>Architekt\u00fara Crunchy Data PostgreSQL Operator tie\u017e sp\u013a\u0148a deklarovan\u00e9 po\u017eiadavky:<\/p>\n<p><img decoding=\"async\" alt=\"Kr\u00e1tky preh\u013ead oper\u00e1torov PostgreSQL pre Kubernetes, n\u00e1\u0161 v\u00fdber a sk\u00fasenosti\" src=\"\/wp-content\/uploads\/2020\/09\/343cd0494abae42fcf5b47c5bb4eb310.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSpr\u00e1va prebieha prostredn\u00edctvom n\u00e1stroja <code>pgo<\/code>, av\u0161ak na druhej strane generuje Custom Resources pre Kubernetes. Preto n\u00e1s ako potenci\u00e1lnych pou\u017e\u00edvate\u013eov oper\u00e1tor pote\u0161il:<\/p>\n<ul>\n<li> existuje spr\u00e1va cez CRD;<\/li>\n<li> pohodln\u00e1 spr\u00e1va pou\u017e\u00edvate\u013eov (tie\u017e cez CRD);<\/li>\n<li> integr\u00e1cia s in\u00fdmi komponentmi <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/crunchy-postgres-containers\/4.3.1\/\">Crunchy Data Container Suite<\/a><\/noindex> \u2014 \u0161pecializovan\u00e1 kolekcia obrazov kontajnerov pre PostgreSQL a util\u00edt pre jeho obsluhu (vr\u00e1tane pgBackRest, pgAudit, roz\u0161\u00edrenia z contrib at\u010f.).<\/li>\n<\/ul>\n<p>\nAv\u0161ak pokusy o za\u010datie pou\u017e\u00edvania oper\u00e1tora od Crunchy Data odhalili nieko\u013eko probl\u00e9mov:<\/p>\n<ul>\n<li>Nebola mo\u017enos\u0165 nastavi\u0165 tolerancie \u2014 predpokladan\u00fd bol iba nodeSelector.<\/li>\n<li>Vytvoren\u00e9 pod 'y boli s\u00fa\u010das\u0165ou Deploymentu, aj ke\u010f sme nasadzovali stateful aplik\u00e1ciu. Na rozdiel od StatefulSet, Deploymenty nevedia vytv\u00e1ra\u0165 disky.<\/li>\n<\/ul>\n<p>\nPosledn\u00e1 nev\u00fdhoda vedie k z\u00e1bavn\u00fdm momentom: na testovacej \u0161peci\u00e1lne sa n\u00e1m podarilo spusti\u0165 3 repliky s jedn\u00fdm diskem <i>local storage<\/i>, v d\u00f4sledku \u010doho oper\u00e1tor ozn\u00e1mil, \u017ee 3 repliky funguj\u00fa (aj ke\u010f to tak nebolo).<\/p>\n<p>\u010eal\u0161ou vlastnos\u0165ou tohto oper\u00e1tora je jeho hotov\u00e1 integr\u00e1cia s r\u00f4znymi pomocn\u00fdmi syst\u00e9mami. Napr\u00edklad, je \u013eahk\u00e9 nain\u0161talova\u0165 pgAdmin a pgBounce, a v <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/postgres-operator\/4.4.0\/installation\/other\/ansible\/installing-metrics\/\">dokumen\u00e1cie<\/a><\/noindex> taktie\u017e s\u00fa zva\u017eovan\u00e9 prednastaven\u00e9 Grafana a Prometheus. V ned\u00e1vnom <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\/releases\/tag\/v4.5.0-beta.1\">vydan\u00ed 4.5.0-beta1<\/a><\/noindex> sa osobitne spom\u00edna vylep\u0161en\u00e1 integr\u00e1cia s projektom <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/pgmonitor\">pgMonitor<\/a><\/noindex>, v\u010faka \u010domu oper\u00e1tor pon\u00faka preh\u013eadn\u00fa vizualiz\u00e1ciu metr\u00edk pre PgSQL \u201ez out-of-the-box\u201c.<\/p>\n<p>Napriek tomu zvl\u00e1\u0161tny v\u00fdber generovan\u00fdch Kubernetes zdrojov viedol k potrebe n\u00e1js\u0165 in\u00e9 rie\u0161enie.<\/p>\n<h3>3. Zalando Postgres Operator<\/h3>\n<p>\nProdukty Zalando pozn\u00e1me u\u017e dlh\u0161ie: m\u00e1me sk\u00fasenosti s pou\u017e\u00edvan\u00edm Zalenium a samozrejme sme sa pok\u00fasili <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\">Patroni<\/a><\/noindex> \u2014 ich popul\u00e1rne HA rie\u0161enie pre PostgreSQL. O pr\u00edstupe spolo\u010dnosti k vytvoreniu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\">Postgres Operator<\/a><\/noindex> rozpr\u00e1val jeden z jeho autorov \u2014 Alexej Klyukin \u2014 v \u017eivom prenose <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres-u utorku \u010d. 5<\/a><\/noindex>, a n\u00e1m sa p\u00e1\u010dil.<\/p>\n<p>Toto je najmlad\u0161ie rie\u0161enie z t\u00fdch, ktor\u00e9 sa sk\u00famaj\u00fa v \u010dl\u00e1nku: prv\u00e9 vydanie sa uskuto\u010dnilo v auguste 2018. Napriek tomu, \u017ee m\u00e1 len nieko\u013eko form\u00e1lnych vydan\u00ed, projekt pre\u0161iel dlh\u00fa cestu a u\u017e prekonal popul\u00e1rnos\u0165 rie\u0161enia od Crunchy Data s viac ako 1300 hviezdami na GitHub a maxim\u00e1lnym po\u010dtom prispievate\u013eov (70+).<\/p>\n<p>\u201ePod kapotou\u201c tohto oper\u00e1tora sa pou\u017e\u00edvaj\u00fa osved\u010den\u00e9 rie\u0161enia:<\/p>\n<ul>\n<li> Patroni a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/spilo\">Spilo<\/a><\/noindex> na spr\u00e1vu,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">WAL-E<\/a><\/noindex> \u2014 na z\u00e1lohovanie,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\">PgBouncer<\/a><\/noindex> \u2014 ako pool pripojen\u00ed.<\/li>\n<\/ul>\n<p>\nTu je zobrazen\u00e1 architekt\u00fara oper\u00e1tora od Zalando:<\/p>\n<p><img decoding=\"async\" alt=\"Kr\u00e1tky preh\u013ead oper\u00e1torov PostgreSQL pre Kubernetes, n\u00e1\u0161 v\u00fdber a sk\u00fasenosti\" src=\"\/wp-content\/uploads\/2020\/09\/c66f10c1a818592ecaacd2db4ce5ace5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOper\u00e1tor je plne spravovan\u00fd cez vlastn\u00e9 zdroje, automaticky vytv\u00e1ra StatefulSet z kontajnerov, ktor\u00e9 je mo\u017en\u00e9 prisp\u00f4sobi\u0165 pridan\u00edm r\u00f4znych sidecarov do podu. To v\u0161etko predstavuje v\u00fdznamn\u00fa v\u00fdhodu v porovnan\u00ed s oper\u00e1torom od Crunchy Data.<\/p>\n<p>Ke\u010f\u017ee sme si vybrali rie\u0161enie od Zalando spomedzi 3 zva\u017eovan\u00fdch mo\u017enost\u00ed, ni\u017e\u0161ie bude uveden\u00fd popis jeho mo\u017enost\u00ed spolu s praxou jeho vyu\u017eitia.<\/p>\n<h2>Praxe s Postgres Operator od Zalando<\/h2>\n<p>\nNasadenie oper\u00e1tora prebieha ve\u013emi jednoducho: sta\u010d\u00ed stiahnu\u0165 aktu\u00e1lnu verziu z GitHubu a aplikova\u0165 YAML s\u00fabory z adres\u00e1ra <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/tree\/master\/manifests\">manifests<\/a><\/noindex>. Ako alternat\u00edvu je mo\u017en\u00e9 tie\u017e vyu\u017ei\u0165 <noindex><a rel=\"nofollow\" href=\"https:\/\/operatorhub.io\/operator\/postgres-operator\">OperatorHub<\/a><\/noindex>.<\/p>\n<p>Po in\u0161tal\u00e1cii je potrebn\u00e9 postara\u0165 sa o nastavenie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/reference\/operator_parameters.md#aws-or-gcp-interaction\">\u00falo\u017e\u00edsk pre logy a z\u00e1lohy<\/a><\/noindex>. To sa vykon\u00e1va prostredn\u00edctvom ConfigMap <code>postgres-operator<\/code> v n\u00e1zvovom priestore, do ktor\u00e9ho ste nain\u0161talovali oper\u00e1tor. Ke\u010f s\u00fa \u00falo\u017eisk\u00e1 nastaven\u00e9, m\u00f4\u017eete nasadi\u0165 prv\u00fd klaster PostgreSQL.<\/p>\n<p>Napr\u00edklad, \u0161tandardn\u00e9 nasadenie vyzer\u00e1 nasledovne:<\/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>\nTento manifest nasadzuje klaster z 3 in\u0161tanci\u00ed so sidecar-om vo forme <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wrouesnel\/postgres_exporter\">postgres_exporter<\/a><\/noindex>, z ktor\u00e9ho sn\u00edmame metriky aplik\u00e1cie. Ako vid\u00edte, v\u0161etko je ve\u013emi jednoduch\u00e9, a ak si prajete, m\u00f4\u017eete vytvori\u0165 prakticky neobmedzen\u00e9 mno\u017estvo klastrov.<\/p>\n<p>Je potrebn\u00e9 venova\u0165 pozornos\u0165 aj <b>webov\u00e9mu panelu pre administr\u00e1ciu<\/b> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/operator-ui.md\">postgres-operator-ui<\/a><\/noindex>. Ten je dod\u00e1van\u00fd spolu s oper\u00e1torom a umo\u017e\u0148uje vytv\u00e1ra\u0165 a maza\u0165 klastre, ako aj pracova\u0165 so z\u00e1lohami, ktor\u00e9 oper\u00e1tor vytv\u00e1ra.<\/p>\n<p><img decoding=\"async\" alt=\"Kr\u00e1tky preh\u013ead oper\u00e1torov PostgreSQL pre Kubernetes, n\u00e1\u0161 v\u00fdber a sk\u00fasenosti\" src=\"\/wp-content\/uploads\/2020\/09\/2e9ae033a9817d101c843ce061aafdb5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Zoznam klastrov PostgreSQL<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Kr\u00e1tky preh\u013ead oper\u00e1torov PostgreSQL pre Kubernetes, n\u00e1\u0161 v\u00fdber a sk\u00fasenosti\" src=\"\/wp-content\/uploads\/2020\/09\/74a65f7f301da14a0cb7bea6d5ef84ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Spr\u00e1va z\u00e1loh<\/i><\/p>\n<p>\u010eal\u0161ou zauj\u00edmavou funkciou je podpora <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/user.md#teams-api-roles\">Teams API<\/a><\/noindex>. Tento mechanizmus automaticky vytv\u00e1ra <b>role v PostgreSQL<\/b>, vych\u00e1dzaj\u00fac z prijat\u00e9ho zoznamu pou\u017e\u00edvate\u013esk\u00fdch mien. Potom API umo\u017e\u0148uje vr\u00e1ti\u0165 zoznam pou\u017e\u00edvate\u013eov, pre ktor\u00fdch sa automaticky vytv\u00e1raj\u00fa role.<\/p>\n<h3>Probl\u00e9my a ich rie\u0161enie<\/h3>\n<p>\nAv\u0161ak pou\u017e\u00edvanie oper\u00e1tora \u010doskoro odhalilo nieko\u013eko v\u00e1\u017enych nedostatkov:<\/p>\n<ol>\n<li> absencia podpory nodeSelector;<\/li>\n<li> neschopnos\u0165 vypn\u00fa\u0165 z\u00e1lohovanie;<\/li>\n<li> pri pou\u017e\u00edvan\u00ed funkcie vytv\u00e1rania datab\u00e1z sa neobjavuj\u00fa predvolen\u00e9 opr\u00e1vnenia;<\/li>\n<li> pr\u00edle\u017eitostne ch\u00fdba dokument\u00e1cia alebo je zastaran\u00e1.<\/li>\n<\/ol>\n<p>\nNa\u0161\u0165astie, mnoh\u00e9 z t\u00fdchto probl\u00e9mov sa daj\u00fa vyrie\u0161i\u0165. Za\u010dnime na konci \u2014 probl\u00e9m s <strong>dokument\u00e1ciou<\/strong>. <\/p>\n<p>pravdepodobne naraz\u00edte na to, \u017ee nie je v\u017edy jasn\u00e9, ako nastavi\u0165 z\u00e1lohu a ako pripoji\u0165 z\u00e1lohov\u00fd k\u00f4\u0161 k rozhraniu Operator UI. O tom sa v dokument\u00e1cii hovor\u00ed letmo, ale re\u00e1lny popis n\u00e1jdete v <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/481\">PR<\/a><\/noindex>:<\/p>\n<ol>\n<li>je potrebn\u00e9 vytvori\u0165 tajn\u00fd k\u013e\u00fa\u010d;<\/li>\n<li>preda\u0165 ho oper\u00e1torovi ako parameter <code>pod_environment_secret_name<\/code> v CRD s nastaveniami oper\u00e1tora alebo v ConfigMap (z\u00e1vis\u00ed od toho, ako ste sa rozhodli nain\u0161talova\u0165 oper\u00e1tora).<\/li>\n<\/ol>\n<p>\nAv\u0161ak, ako sa uk\u00e1zalo, v s\u00fa\u010dasnosti to nie je mo\u017en\u00e9. Pr\u00e1ve preto sme zhroma\u017edili <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">na\u0161u verziu oper\u00e1tora<\/a><\/noindex> s niektor\u00fdmi dodato\u010dn\u00fdmi tret\u00edmi stranami. Viac o nej \u2014 pozri ni\u017e\u0161ie.<\/p>\n<p>Ak pred\u00e1vate oper\u00e1torovi parametre pre z\u00e1lohu, konkr\u00e9tne \u2014 <code>wal_s3_bucket<\/code> a pr\u00edstupov\u00e9 k\u013e\u00fa\u010de do AWS S3, potom on <strong>bude z\u00e1lohova\u0165 v\u0161etko<\/strong>: nielen datab\u00e1zy vo v\u00fdrobe, ale aj na stagingu. To n\u00e1m nevyhovovalo.<\/p>\n<p>V popise parametrov pre Spilo, \u010do je z\u00e1kladn\u00fd Docker obal pre PgSQL pri pou\u017e\u00edvan\u00ed oper\u00e1tora, sa uk\u00e1zalo: je mo\u017en\u00e9 predlo\u017ei\u0165 parameter <code>WAL_S3_BUCKET<\/code> pr\u00e1zdny, \u010d\u00edm sa z\u00e1lohy vypn\u00fa. Navy\u0161e, k na\u0161ej ve\u013ekej radosti sa na\u0161iel aj <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">pripraven\u00fd PR<\/a><\/noindex>, ktor\u00fd sme hne\u010f prijali do n\u00e1\u0161ho forku. Teraz sta\u010d\u00ed jednoducho prida\u0165 <code>enableWALArchiving: false<\/code> do zdroja klastru PostgreSQL.<\/p>\n<p>\u00c1no, bola mo\u017enos\u0165 to urobi\u0165 inak, spusten\u00edm 2 oper\u00e1torov: jedn\u00e9ho pre staging (bez z\u00e1loh), a druh\u00e9ho \u2014 pre v\u00fdrobu. Ale takto sme sa dok\u00e1zali zaob\u00eds\u0165 jedn\u00fdm.<\/p>\n<p>Dobre, nau\u010dili sme sa pred\u00e1va\u0165 pr\u00edstup do datab\u00e1z pre S3 a z\u00e1lohy sa za\u010dali dost\u00e1va\u0165 do \u00falo\u017eiska. Ako prin\u00fati\u0165 str\u00e1nky z\u00e1loh fungova\u0165 v rozhran\u00ed Operator UI?<\/p>\n<p><img decoding=\"async\" alt=\"Kr\u00e1tky preh\u013ead oper\u00e1torov PostgreSQL pre Kubernetes, n\u00e1\u0161 v\u00fdber a sk\u00fasenosti\" src=\"\/wp-content\/uploads\/2020\/09\/46169b53707b0bbb686798c655022f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV rozhran\u00ed Operator UI bude potrebn\u00e9 prida\u0165 3 premenn\u00e9:<\/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>\nPo tomto sa spr\u00e1va o z\u00e1loh\u00e1ch stane dostupnou, \u010do v na\u0161om pr\u00edpade zjednodu\u0161\u00ed pr\u00e1cu so stagingom, umo\u017en\u00ed posiela\u0165 tam vzorky z v\u00fdrobn\u00e9ho prostredia bez \u010fal\u0161\u00edch skriptov.<\/p>\n<p>Ako \u010fal\u0161ia v\u00fdhoda sa spom\u00ednala pr\u00e1ca s Teams API a \u0161irok\u00e9 mo\u017enosti na vytv\u00e1ranie datab\u00e1z a rol\u00ed pomocou oper\u00e1tora. Av\u0161ak vytvoren\u00e9 <strong>role nemali predvolen\u00e9 opr\u00e1vnenia.<\/strong>T\u00fdm p\u00e1dom, pou\u017e\u00edvate\u013e s opr\u00e1vnen\u00edm na \u010d\u00edtanie nemohol \u010d\u00edta\u0165 nov\u00e9 tabu\u013eky.<\/p>\n<p>Pre\u010do je to tak? Napriek tomu, \u017ee v k\u00f3de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/pkg\/cluster\/database.go#L42\">je<\/a><\/noindex> s\u00fa potrebn\u00e9 <code>GRANT<\/code>, nie s\u00fa v\u017edy aplikovan\u00e9. Existuj\u00fa 2 met\u00f3dy: <code>syncPreparedDatabases<\/code> a <code>syncDatabases<\/code>. V <code>syncPreparedDatabases<\/code> \u2014 aj ke\u010f v sekcii <code>preparedDatabases<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/manifests\/complete-postgres-manifest.yaml#L26\">je<\/a><\/noindex> existuje podmienka <code>defaultRoles<\/code> a <code>defaultUsers<\/code> na vytvorenie rol\u00ed, \u2014 predvolen\u00e9 pr\u00e1va sa neuplat\u0148uj\u00fa. Pracujeme na pr\u00edprave z\u00e1platy, aby sa tieto pr\u00e1va automaticky aplikovali.<\/p>\n<p>A posledn\u00e1 vec v aktu\u00e1lnych vylep\u0161eniach \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">z\u00e1plata<\/a><\/noindex>, prid\u00e1vaj\u00faca Node Affinity do vytv\u00e1ran\u00e9ho StatefulSet. Na\u0161i klienti \u010dasto preferuj\u00fa zn\u00ed\u017ei\u0165 n\u00e1klady pou\u017eit\u00edm spot-in\u0161tanci\u00ed, a tie by rozhodne nemali hosti\u0165 datab\u00e1zov\u00e9 slu\u017eby. T\u00fato ot\u00e1zku by bolo mo\u017en\u00e9 vyrie\u0161i\u0165 aj prostredn\u00edctvom tolerancie, ale pr\u00edtomnos\u0165 Node Affinity poskytuje v\u00e4\u010d\u0161iu istotu.<\/p>\n<h3>\u010co sa podarilo?<\/h3>\n<p>\nNa z\u00e1klade rie\u0161enia uveden\u00fdch probl\u00e9mov sme forkovali Postgres Operator od Zalando do <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">svojho repozit\u00e1ra<\/a><\/noindex>, kde sa zostavuje s tak\u00fdmi u\u017eito\u010dn\u00fdmi z\u00e1platami. A pre v\u00e4\u010d\u0161ie pohodlie sme zostavili aj <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/flant\/postgres-operator\">Docker-image<\/a><\/noindex>.<\/p>\n<p>Zoznam PR prijat\u00fdch do fork:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1066\">zostavenie v Dockeri bezpe\u010dn\u00e9ho \u013eahk\u00e9ho obrazu pre oper\u00e1tora<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">deaktiv\u00e1cia z\u00e1loh<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1121\">aktualiz\u00e1cia verzi\u00ed zdrojov pre aktu\u00e1lne verzie k8s<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">implement\u00e1cia Node Affinity<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nBude skvel\u00e9, ak komunita podpor\u00ed tieto PR, aby sa dostali do upstreamu v nasleduj\u00facej verzii oper\u00e1tora (1.6).<\/p>\n<h2>Bonus! Pr\u00edbeh \u00faspechu s migr\u00e1ciou produkcie<\/h2>\n<p>\nAk pou\u017e\u00edvate Patroni, m\u00f4\u017eete migrova\u0165 \u017eiv\u00fa produkciu na oper\u00e1tora s minim\u00e1lnym v\u00fdpadkom.<\/p>\n<p>Spilo umo\u017e\u0148uje vytv\u00e1ra\u0165 standby-klastre cez S3 \u00falo\u017eisk\u00e1 s <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">Wal-E<\/a><\/noindex>, ke\u010f sa bin\u00e1rny log PgSQL najprv uklad\u00e1 do S3 a potom sa na\u010d\u00edtava replikou. Ale \u010do robi\u0165, ak <i>nie<\/i> pou\u017e\u00edvate Wal-E v starej infra\u0161trukt\u00fare? Rie\u0161enie tohto probl\u00e9mu u\u017e <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/437318\/\">bolo navrhnut\u00e9<\/a><\/noindex> na Habr.<\/p>\n<p>Na pomoc prich\u00e1dza logick\u00e1 replik\u00e1cia PostgreSQL. Av\u0161ak nebudeme sa zaobera\u0165 detailmi, ako vytv\u00e1ra\u0165 publik\u00e1cie a predplatn\u00e9, preto\u017ee\u2026 n\u00e1\u0161 pl\u00e1n zlyhal.<\/p>\n<p>Ide o to, \u017ee v DB bolo nieko\u013eko vysoko z\u00e1\u0165a\u017een\u00fdch tabuliek s mili\u00f3nmi riadkov, ktor\u00e9 sa navy\u0161e neust\u00e1le dop\u013a\u0148ali a vymaz\u00e1vali. <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/12\/sql-createsubscription\">Jednoduch\u00e9 predplatn\u00e9<\/a><\/noindex> s <code>copy_data<\/code>, ke\u010f nov\u00e1 replik\u00e1cia kop\u00edruje v\u0161etok obsah z majstra, jednoducho nest\u00edhala za majstrom. Kop\u00edrovanie obsahu fungovalo t\u00fd\u017ede\u0148, ale nakoniec nedostihlo majstra. Nakoniec, s probl\u00e9mom pomohla <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/avitotech\/recovery-use-cases-for-logical-replication-in-postgresql-10-a1e6bab03072\">\u010dl\u00e1nok<\/a><\/noindex> kolegy\u0148a z Avito: je mo\u017en\u00e9 prenies\u0165 \u00fadaje pomocou <code>pg_dump<\/code>. Op\u00ed\u0161em na\u0161u (malo upraven\u00fa) verziu tohto algoritmu.<\/p>\n<p>Ideou je, \u017ee je mo\u017en\u00e9 vytvori\u0165 vypnut\u00e9 predplatn\u00e9, priraden\u00e9 ku konkr\u00e9tnemu replik\u00e1cii slotu, a potom opravi\u0165 \u010d\u00edslo transakcie. K dispoz\u00edcii boli repliky na pr\u00e1cu s produkciou. To je d\u00f4le\u017eit\u00e9, preto\u017ee replika pom\u00f4\u017ee vytvori\u0165 konzistentn\u00fa dump a pokra\u010dova\u0165 v z\u00edskavan\u00ed zmien z mastera.<\/p>\n<p>V nasleduj\u00facich pr\u00edkazoch, ktor\u00e9 popisuj\u00fa proces migr\u00e1cie, bud\u00fa pou\u017eit\u00e9 nasleduj\u00face ozna\u010denia pre hostite\u013eov:<\/p>\n<ol>\n<li><i>master<\/i> \u2014 zdrojov\u00fd server;<\/li>\n<li><i>replica1<\/i> \u2014 streamov\u00e1 replika na starom produkte;<\/li>\n<li><i>replica2<\/i> \u2014 nov\u00e1 logick\u00e1 replika.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Pl\u00e1n migr\u00e1cie<\/h3>\n<p>\n1. Vytvor\u00edme na masteri predplatn\u00e9 pre v\u0161etky tabu\u013eky v sch\u00e9me <code>public<\/code> datab\u00e1zy <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. Vytvor\u00edme slot replik\u00e1cie na masteri:<\/p>\n<pre><code class=\"bash\">psql -h master -c \"select pg_create_logical_replication_slot('repl', 'pgoutput');\"\n<\/code><\/pre>\n<p>\n3. Zastav\u00edme replik\u00e1ciu na starej replice:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_pause();\"\n<\/code><\/pre>\n<p>\n4. Z\u00edskame \u010d\u00edslo transakcie z mastera:<\/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. Urob\u00edme dump zo starej repliky. Budeme to robi\u0165 v nieko\u013ek\u00fdch vl\u00e1knach, \u010do pom\u00f4\u017ee ur\u00fdchli\u0165 proces:<\/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. Na\u010d\u00edta\u0165 dump na nov\u00fd server:<\/p>\n<pre><code class=\"bash\">pg_restore -h replica2 -F d -j 8 -d dbname dump\/\n<\/code><\/pre>\n<p>\n7. Po na\u010d\u00edtan\u00ed dumpu m\u00f4\u017eeme spusti\u0165 replik\u00e1ciu na streamovej replice:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_resume();\"\n<\/code><\/pre>\n<p>\n7. Vytvor\u00edme predplatn\u00e9 na novej logickej replike:<\/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. Z\u00edskame <code>oid<\/code> predplatn\u00e9:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"select oid, * from pg_subscription;\"\n<\/code><\/pre>\n<p>\n9. Predpokladajme, \u017ee bol z\u00edskan\u00fd <code>oid=1000<\/code>. Aplikujeme \u010d\u00edslo transakcie na predplatn\u00e9:<\/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. Spust\u00edme replik\u00e1ciu:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"alter subscription oldprod enable;\"\n<\/code><\/pre>\n<p>\n11. Skontrolujeme stav predplatn\u00e9ho, replik\u00e1cia by mala fungova\u0165:<\/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. Po spusten\u00ed replik\u00e1cie a synchroniz\u00e1cii datab\u00e1z m\u00f4\u017eeme vykona\u0165 prepn\u00fa\u0165.<\/p>\n<p>13. Po vypnut\u00ed replik\u00e1cie je potrebn\u00e9 opravi\u0165 sekvencie. Toto je dobre op\u00edsan\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fixing_Sequences\">v \u010dl\u00e1nku na wiki.postgresql.org<\/a><\/noindex>.<\/p>\n<p>V\u010faka tak\u00e9muto pl\u00e1nu pre\u0161lo prepn\u00fa\u0165 s minim\u00e1lnymi oneskoreniami.<\/p>\n<h2>Z\u00e1ver<\/h2>\n<p>\nKubernetes oper\u00e1tory umo\u017e\u0148uj\u00fa zjednodu\u0161i\u0165 r\u00f4zne \u010dinnosti z\u00fa\u017een\u00edm na vytv\u00e1ranie K8s zdrojov. Av\u0161ak, aj ke\u010f dosiahnete skvel\u00fa automatiz\u00e1ciu, mali by ste ma\u0165 na pam\u00e4ti, \u017ee m\u00f4\u017ee prinies\u0165 aj niektor\u00e9 neo\u010dak\u00e1van\u00e9 nuansy, preto k v\u00fdberu oper\u00e1torov pristupujte s rozvahou.<\/p>\n<p>Po presk\u00faman\u00ed troch najpopul\u00e1rnej\u0161\u00edch Kubernetes oper\u00e1torov pre PostgreSQL sme sa rozhodli pre projekt od Zalando. Museli sme prekon\u00e1va\u0165 ur\u010dit\u00e9 \u0165a\u017ekosti, ale v\u00fdsledok n\u00e1s naozaj pote\u0161il, tak\u017ee pl\u00e1nujeme roz\u0161\u00edri\u0165 tento z\u00e1\u017eitok aj na niektor\u00e9 in\u00e9 in\u0161tal\u00e1cie PgSQL. Ak m\u00e1te sk\u00fasenosti s podobn\u00fdmi rie\u0161eniami, radi uvid\u00edme podrobnosti v koment\u00e1roch!<\/p>\n<h2>P.S.<\/h2>\n<p>\nPre\u010d\u00edtajte si tie\u017e na na\u0161om blogu:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">Datab\u00e1zy a Kubernetes (prezent\u00e1cia a video predn\u00e1\u0161ky)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres utorok \u010d. 5: PostgreSQL a Kubernetes. CI\/CD. Automatiz\u00e1cia testovania<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/480722\/\">Jedna hist\u00f3ria s oper\u00e1torom Redis v K8s a mini-preh\u013ead n\u00e1strojov na anal\u00fdzu d\u00e1t tejto datab\u00e1zy<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/520616\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b: \u00ab\u0425\u043e\u0442\u0438\u043c \u043a\u0430\u043a Amazon RDS, \u043d\u043e \u0434\u0435\u0448\u0435\u0432\u043b\u0435\u00bb; \u00ab\u0425\u043e\u0442\u0438\u043c \u043a\u0430\u043a RDS, \u043d\u043e \u0432\u0435\u0437\u0434\u0435, \u0432 \u043b\u044e\u0431\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\u00bb. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 managed-\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 Kubernetes, \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f PostgreSQL (Stolon, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043e\u0442 Crunchy Data \u0438 Zalando) \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 \u0432\u044b\u0431\u043e\u0440. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u043e\u043f\u044b\u0442 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95323,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95322","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\/sk\/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\udd47Kr\u00e1tky preh\u013ead oper\u00e1torov PostgreSQL pre Kubernetes, n\u00e1\u0161 v\u00fdber a sk\u00fasenosti | ProHoster","description":"\u010coraz \u010dastej\u0161ie od klientov.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/95322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=95322"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/95322\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/95323"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=95322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=95322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=95322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}