{"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\/lv\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","title":{"rendered":"Kubernetes PostgreSQL operatoru \u012bss apskats, m\u016bsu izv\u0113le un pieredze","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kubernetes PostgreSQL operatoru \u012bss apskats, m\u016bsu izv\u0113le un pieredze\" src=\"\/wp-content\/uploads\/2020\/09\/23b2db49941fa5bd5000358c8ffb991b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKlienti arvien bie\u017e\u0101k vaic\u0101: \u00abV\u0113lamies k\u0101 Amazon RDS, bet l\u0113t\u0101k\u00bb; \u00abV\u0113lamies k\u0101 RDS, bet visur, jebkur\u0101 infrastrukt\u016br\u0101\u00bb. Lai realiz\u0113tu l\u012bdz\u012bgu p\u0101rvald\u012btu risin\u0101jumu uz Kubernetes, m\u0113s apl\u016bkoj\u0101m pa\u0161reiz\u0113jo popul\u0101r\u0101k\u0101 PostgreSQL operatoru st\u0101vokli (Stolon, operatori no Crunchy Data un Zalando) un izdar\u012bj\u0101m savu izv\u0113li.<\/p>\n<p>\u0160is raksts ir m\u016bsu ieg\u016bt\u0101 pieredze, gan no teor\u0113tisk\u0101 viedok\u013ca (risin\u0101jumu apskats), gan no praktisk\u0101 aspekta (kas tika izv\u0113l\u0113ts un k\u0101di bija rezult\u0101ti). Bet vispirms noskaidrosim, k\u0101di visp\u0101r ir pras\u012bbas potenci\u0101lajai RDS aizvietot\u0101jai \u2026<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Kas ir RDS?<\/h2>\n<p>\nKad cilv\u0113ki run\u0101 par RDS, p\u0113c m\u016bsu pieredzes, vi\u0146i dom\u0101 par p\u0101rvald\u012btu (managed) DB serveru, kas:<\/p>\n<ol>\n<li>ir viegli konfigur\u0113jams;<\/li>\n<li>ir iesp\u0113ja str\u0101d\u0101t ar snapshot un atjaunoties no tiem (v\u0113lams ar atbalstu <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Point-in-time_recovery\">PITR<\/a><\/noindex>);<\/li>\n<li>\u013cauj izveidot master-slave topolo\u0123ijas;<\/li>\n<li>ir bag\u0101ts papla\u0161in\u0101jumu saraksts;<\/li>\n<li>nodro\u0161ina audit\u0113\u0161anu un lietot\u0101ju\/piek\u013cuves p\u0101rvald\u012bbu.<\/li>\n<\/ol>\n<p>\nRun\u0101jot visp\u0101r\u012bgi, uzdevuma \u012bsteno\u0161anas pieejas var b\u016bt diezgan da\u017e\u0101das, tom\u0113r ce\u013c\u0161 ar nosac\u012bto Ansible mums nav tuvs. (L\u012bdz\u012bg\u0101 secin\u0101jum\u0101 non\u0101ca ar\u012b kol\u0113\u0123i no 2GIS savas <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/509926\/\">m\u0113\u0123in\u0101juma<\/a><\/noindex> izveidot \u00abr\u012bku \u0101trai k\u013c\u016bdu tolerantu klastra izvieto\u0161anai uz Postgres\u00bb.)<\/p>\n<p>Tie\u0161i operatori ir visp\u0101rpie\u0146emta pieeja l\u012bdz\u012bgu uzdevumu risin\u0101\u0161anai Kubernetes ekosist\u0113m\u0101. S\u012bk\u0101k par tiem saist\u012bb\u0101 ar datu b\u0101z\u0113m, kas tiek palaistas Kubernetes iek\u0161ien\u0113, jau st\u0101st\u012bja Flanta tehniskais direktors, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/distol\/\" class=\"user_link\">distol<\/a><\/noindex>, vien\u0101 no saviem zi\u0146ojumiem <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">: Lai \u0101tri izveidotu vienk\u0101r\u0161us operatorus, iesak\u0101m piev\u0113rst uzman\u012bbu m\u016bsu Open Source r\u012bkam<\/a><\/noindex>.<\/p>\n<p><i><strong>Piez\u012bme<\/strong><\/i><i>shell-operator <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\"><i>. Izmantojot to, var \u0161o izveidot bez Go zin\u0101\u0161an\u0101m, bet ar administratoriem pierast\u0101m metod\u0113m: uz Bash, Python utt.<\/i><\/a><\/noindex><i>PostgreSQL ir vair\u0101ki popul\u0101ri K8s operatori:<\/i><\/p>\n<p>Stolon;<\/p>\n<ul>\n<li>Crunchy Data PostgreSQL Operator;<\/li>\n<li>Zalando Postgres Operator.<\/li>\n<li>Apskat\u012bsim tos tuv\u0101k.<\/li>\n<\/ul>\n<p>\nOperatora izv\u0113le<\/p>\n<h2>Papildus t\u0101m svar\u012bgaj\u0101m iesp\u0113j\u0101m, kas jau min\u0113tas iepriek\u0161, m\u0113s \u2014 k\u0101 infrastrukt\u016bras in\u017eenieri Kubernetes vid\u0113 \u2014 ar\u012b gaid\u012bj\u0101m no operatoriem sekojo\u0161o:<\/h2>\n<p>\nimplement\u0101ciju no Git un ar<\/p>\n<ul>\n<li> Custom Resources <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/operator\/#deploying-operators\">anti-affinity atbalsts podiem;<\/a><\/noindex>;<\/li>\n<li> node affinity vai node selector uzst\u0101d\u012b\u0161ana;<\/li>\n<li> tolerances uzst\u0101d\u012b\u0161ana;<\/li>\n<li> tuning iesp\u0113ju pieejam\u012bba;<\/li>\n<li> .<\/li>\n<li> saprotamas tehnolo\u0123ijas un pat komandas.<\/li>\n<\/ul>\n<p>\nNeiedzi\u013cinoties deta\u013c\u0101s par katru no punktiem (jaut\u0101jiet koment\u0101ros, ja p\u0113c visu rakstu izlas\u012b\u0161anas paliek jaut\u0101jumi), atz\u012bm\u0113sim kopum\u0101, ka \u0161ie parametri ir nepiecie\u0161ami, lai prec\u012bz\u0101k aprakst\u012btu klastera mezglu specializ\u0101ciju, lai tos var\u0113tu pas\u016bt\u012bt konkr\u0113t\u0101m lietojumprogramm\u0101m. T\u0101 m\u0113s varam sasniegt optim\u0101lu l\u012bdzsvaru starp veiktsp\u0113ju un izmaks\u0101m.<\/p>\n<p>Tagad \u2014 pie pa\u0161u PostgreSQL operatoriem.<\/p>\n<h3>1. Stolon<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\">Stolon<\/a><\/noindex> no it\u0101\u013cu uz\u0146\u0113muma Sorint.lab <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">jau min\u0113taj\u0101 zi\u0146ojum\u0101<\/a><\/noindex> tika apskat\u012bts k\u0101 noteikts etalons starp operatoriem datu b\u0101z\u0113m. Tas ir sal\u012bdzino\u0161i vecs projekts: t\u0101 pirm\u0101 publisk\u0101 versija notika jau 2015. gada novembr\u012b(!), un GitHub repozitorija var lepoties ar gandr\u012bz 3000 zvaigzn\u0113m un vair\u0101k nek\u0101 40 kontrib\u016btoriem.<\/p>\n<p>Un patie\u0161\u0101m, Stolon ir izcils p\u0101rdom\u0101tas arhitekt\u016bras piem\u0113rs:<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes PostgreSQL operatoru \u012bss apskats, m\u016bsu izv\u0113le un pieredze\" src=\"\/wp-content\/uploads\/2020\/09\/a34625c130bfd29c5645cf2417042de2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAr \u0161\u012b operatora ier\u012bko\u0161anu detaliz\u0113ti var iepaz\u012bties zi\u0146ojum\u0101 vai <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/blob\/master\/doc\/architecture.md\">projekta dokument\u0101cij\u0101<\/a><\/noindex>. Kopum\u0101 pietiek teikt, ka tas prot visu iepriek\u0161 aprakst\u012bto: failover, proxy caursp\u012bd\u012bgai klientu piek\u013cuvei, dubl\u0113jumus\u2026 Un, kas interesanti, proxy nodro\u0161ina piek\u013cuvi caur vienu pakalpojumu gala punktu \u2014 at\u0161\u0137ir\u012bb\u0101 no diviem citiem risin\u0101jumiem, kas tiks apl\u016bkoti t\u0101l\u0101k (tiem ir divi pakalpojumi piek\u013cuvei datu b\u0101zei).<\/p>\n<p>Tom\u0113r Stolon <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/issues\/463#issuecomment-379666733\">nav Custom Resources<\/a><\/noindex>, k\u0101 rezult\u0101t\u0101 to nevar t\u0101 izvietot, lai vienk\u0101r\u0161i un \u0101tri \u2014 \"k\u0101 karstus p\u012br\u0101dzi\u0146us\" \u2014 izveidotu datu b\u0101zu instanc\u0113s Kubernetes. Vad\u012bba tiek veikta, izmantojot util\u012btu <code>stolonctl<\/code>, izvieto\u0161ana \u2014 caur Helm chart, bet lietot\u0101ju defin\u012bcijas tiek noteiktas ConfigMap.<\/p>\n<p>No vienas puses, izn\u0101k, ka operators \u012bsti nav operators (galu gal\u0101 tas neizmanto CRD). Bet no otras puses \u2014 t\u0101 ir elast\u012bga sist\u0113ma, kas \u013cauj konfigur\u0113t resursus K8s t\u0101, k\u0101 jums \u0113rt\u0101k.<\/p>\n<p>Kopum\u0101, person\u012bgi mums tas ne\u0161\u0137ita optim\u0101ls ce\u013c\u0161 izveidot atsevi\u0161\u0137u chart katrai datu b\u0101zei. T\u0101p\u0113c s\u0101k\u0101m mekl\u0113t alternat\u012bvas.<\/p>\n<h3>2. Crunchy Data PostgreSQL Operator<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\">Operators no Crunchy Data<\/a><\/noindex>, jauna amerik\u0101\u0146u starta uz\u0146\u0113muma, izskat\u012bj\u0101s k\u0101 lo\u0123iska alternat\u012bva. T\u0101 publisk\u0101 v\u0113sture s\u0101kas ar pirmo izdo\u0161anu 2017. gada mart\u0101, kop\u0161 t\u0101 laika GitHub repozitorijs ir ieguvis nedaudz maz\u0101k nek\u0101 1300 zvaigznes un vair\u0101k nek\u0101 50 kontrib\u016btoriem. P\u0113d\u0113j\u0101 izdo\u0161ana septembr\u012b tika p\u0101rbaud\u012bta darbam ar Kubernetes 1.15\u20141.18, OpenShift 3.11+ un 4.4+, GKE un VMware Enterprise PKS 1.3+.<\/p>\n<p>Crunchy Data PostgreSQL Operator arhitekt\u016bra ar\u012b atbilst deklar\u0113taj\u0101m pras\u012bb\u0101m:<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes PostgreSQL operatoru \u012bss apskats, m\u016bsu izv\u0113le un pieredze\" src=\"\/wp-content\/uploads\/2020\/09\/343cd0494abae42fcf5b47c5bb4eb310.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u0101rvald\u012bba notiek caur util\u012btu <code>pgo<\/code>, tom\u0113r t\u0101 savuk\u0101rt \u0123ener\u0113 piel\u0101gotos resursus Kubernetes. T\u0101p\u0113c m\u016bs k\u0101 potenci\u0101los lietot\u0101jus operators iepriecin\u0101ja:<\/p>\n<ul>\n<li> ir p\u0101rvald\u012bba caur CRD;<\/li>\n<li> \u0113rta lietot\u0101ju p\u0101rvald\u012bba (t\u0101pat caur CRD);<\/li>\n<li> integr\u0101cija ar citiem komponentiem <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/crunchy-postgres-containers\/4.3.1\/\">Crunchy Data Container Suite<\/a><\/noindex> \u2014 specializ\u0113ta konteineru att\u0113lu kolekcija PostgreSQL un r\u012bku izmanto\u0161anai ar to (ieskaitot pgBackRest, pgAudit, papla\u0161in\u0101jumus no contrib utt.).<\/li>\n<\/ul>\n<p>\nTom\u0113r m\u0113\u0123in\u0101jumi s\u0101kt izmantot Crunchy Data operatoru atkl\u0101ja vair\u0101kas probl\u0113mas:<\/p>\n<ul>\n<li>Nebija iesp\u0113jams izmantot tolerances \u2014 bija pieejams tikai nodeSelector.<\/li>\n<li>Izveidotie pod\u2019i bija da\u013ca no Deployment\u2019a, neskatoties uz to, ka m\u0113s izvietoj\u0101m stateful lietojumu. At\u0161\u0137ir\u012bb\u0101 no StatefulSet, Deployment\u2019i nesp\u0113j izveidot diskus.<\/li>\n<\/ul>\n<p>\nP\u0113d\u0113jais tr\u016bkums noved pie smiekl\u012bg\u0101m situ\u0101cij\u0101m: test\u0113\u0161anas vid\u0113 izdev\u0101s palaist 3 replikas ar vienu disku <i>viet\u0113j\u0101 kr\u0101tuv\u0113<\/i>, t\u0101 rezult\u0101t\u0101 operators zi\u0146oja, ka 3 replikas darbojas (lai gan t\u0101 nebija paties\u012bba).<\/p>\n<p>V\u0113l viena \u0161\u012b operatora iez\u012bme ir t\u0101 gatav\u0101 integr\u0101cija ar da\u017e\u0101d\u0101m pal\u012bgier\u012bc\u0113m. Piem\u0113ram, viegli uzst\u0101d\u012bt pgAdmin un pgBounce, bet <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/postgres-operator\/4.4.0\/installation\/other\/ansible\/installing-metrics\/\">dokument\u0101cij\u0101<\/a><\/noindex> tiek apsv\u0113rti iepriek\u0161 konfigur\u0113tie Grafana un Prometheus. Nesenaj\u0101 <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> atsevi\u0161\u0137i tiek uzsv\u0113rta uzlabot\u0101 integr\u0101cija ar projektu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/pgmonitor\">pgMonitor<\/a><\/noindex>, pateicoties kuram operators pied\u0101v\u0101 vizu\u0101lu metrikas skat\u012bjumu par PgSQL \"no kastes\".<\/p>\n<p>Tom\u0113r d\u012bvainais \u0123ener\u0113to Kubernetes resursu izv\u0113le noveda m\u016bs pie nepiecie\u0161am\u012bbas mekl\u0113t citu risin\u0101jumu.<\/p>\n<h3>3. Zalando Postgres Operators<\/h3>\n<p>\nZalando produkti mums ir zin\u0101mi ilgu laiku: ir pieredze ar Zalenium un, protams, m\u0113s esam izm\u0113\u0123in\u0101ju\u0161i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\">Patroni<\/a><\/noindex> \u2014 vi\u0146u popul\u0101ro HA risin\u0101jumu PostgreSQL. Par uz\u0146\u0113muma pieeju <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\">Postgres Operators<\/a><\/noindex> st\u0101st\u012bja viens no t\u0101 autoriem \u2014 Aleksejs K\u013cukins \u2014 \u0113ter\u0101 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres otrdien\u0101 Nr. 5<\/a><\/noindex>, un tas mums iepatik\u0101s.<\/p>\n<p>\u0160is ir jaun\u0101kais risin\u0101jums no apskat\u012btajiem \u0161aj\u0101 rakst\u0101: pirmais releases notika 2018. gada august\u0101. Tom\u0113r, pat neskatoties uz nelielo form\u0101lo releases skaitu, projekts ir veicis lielu ce\u013cu, jau apsteidzot Crunchy Data risin\u0101jumu ar 1300+ zvaigzn\u0113m GitHub un maksim\u0101lo dev\u0113ju skaitu (70+).<\/p>\n<p>\"Zem v\u0101ka\" \u0161\u012b operatora izmanto laika p\u0101rbaud\u012btus risin\u0101jumus:<\/p>\n<ul>\n<li> Patroni un <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/spilo\">Spilo<\/a><\/noindex> oper\u0101cij\u0101m,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">WAL-E<\/a><\/noindex> \u2014 rezerves kopij\u0101m,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\">PgBouncer<\/a><\/noindex> \u2014 k\u0101 savienojumu baseins.<\/li>\n<\/ul>\n<p>\nT\u0101 izskat\u0101s Zalando operatora arhitekt\u016bra:<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes PostgreSQL operatoru \u012bss apskats, m\u016bsu izv\u0113le un pieredze\" src=\"\/wp-content\/uploads\/2020\/09\/c66f10c1a818592ecaacd2db4ce5ace5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOperators tiek piln\u012bb\u0101 p\u0101rvald\u012bti, izmantojot Custom Resources, autom\u0101tiski izveidojot StatefulSet no konteineriem, kurus p\u0113c tam var piel\u0101got, pievienojot pod da\u017e\u0101dus sidecar. Viss \u0161is ir b\u016btisks ieguvums sal\u012bdzin\u0101jum\u0101 ar operatoru no Crunchy Data.<\/p>\n<p>Since we chose the solution from Zalando among three options considered, the further description of its capabilities will be presented below, immediately along with practical application.<\/p>\n<h2>Practice with Postgres Operator from Zalando<\/h2>\n<p>\nThe deployment of the operator is very simple: just download the current release from GitHub and apply the YAML files from the directory <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/tree\/master\/manifests\">manifests<\/a><\/noindex>. Alternatively, you can also use <noindex><a rel=\"nofollow\" href=\"https:\/\/operatorhub.io\/operator\/postgres-operator\">OperatorHub<\/a><\/noindex>.<\/p>\n<p>After installation, you should take care of setting up <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/reference\/operator_parameters.md#aws-or-gcp-interaction\">storage for logs and backups<\/a><\/noindex>. This is done through ConfigMap <code>postgres-operator<\/code> in the namespace where you installed the operator. Once the storages are configured, you can deploy your first PostgreSQL cluster.<\/p>\n<p>For example, our standard deployment looks like this:<\/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>\nThis manifest deploys a cluster of 3 instances with a sidecar in the form of <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wrouesnel\/postgres_exporter\">postgres_exporter<\/a><\/noindex>, from which we collect application metrics. As you can see, everything is very simple, and if desired, you can create literally an unlimited number of clusters.<\/p>\n<p>Attention should also be paid to <b>the web panel for administration<\/b> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/operator-ui.md\">postgres-operator-ui<\/a><\/noindex>. It comes bundled with the operator and allows creating and deleting clusters, as well as working with backups created by the operator.<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes PostgreSQL operatoru \u012bss apskats, m\u016bsu izv\u0113le un pieredze\" src=\"\/wp-content\/uploads\/2020\/09\/2e9ae033a9817d101c843ce061aafdb5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>List of PostgreSQL clusters<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes PostgreSQL operatoru \u012bss apskats, m\u016bsu izv\u0113le un pieredze\" src=\"\/wp-content\/uploads\/2020\/09\/74a65f7f301da14a0cb7bea6d5ef84ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Backup management<\/i><\/p>\n<p>Another interesting feature is the support for <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/user.md#teams-api-roles\">Teams API<\/a><\/noindex>. This mechanism automatically creates <b>roles in PostgreSQL<\/b>, based on the received list of user names. After that, the API allows you to return the list of users for whom roles are automatically created.<\/p>\n<h3>Problems and their solutions<\/h3>\n<p>\nHowever, using the operator soon revealed several significant drawbacks:<\/p>\n<ol>\n<li> there is no support for nodeSelector;<\/li>\n<li> neiesp\u0113jam\u012bba atsl\u0113gt dubl\u0113jumus;<\/li>\n<li> izmantojot datu b\u0101zu izveides funkciju, netiek pie\u0161\u0137irtas noklus\u0113juma privil\u0113\u0123ijas;<\/li>\n<li> periodiski tr\u016bkst dokument\u0101cijas vai ar\u012b t\u0101 ir novecojusi.<\/li>\n<\/ol>\n<p>\nPar laimi, daudzas no t\u0101m var risin\u0101t. S\u0101ksim ar beigu \u2014 probl\u0113mas ar <strong>dokumento\u0161anu<\/strong>. <\/p>\n<p>Diem\u017e\u0113l j\u016bs varat sastapties ar to, ka ne vienm\u0113r ir skaidrs, k\u0101 nor\u0101d\u012bt dubl\u0113jumu un k\u0101 pievienot dubl\u0113jumu pakotni Operator UI. Par to dokument\u0101cij\u0101 ir piemin\u0113ts pavisam nedaudz, bet re\u0101lais apraksts atrodams <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/481\">PR<\/a><\/noindex>:<\/p>\n<ol>\n<li>j\u0101izveido nosl\u0113pums;<\/li>\n<li>j\u0101p\u0101rskaita to operatoram parametr\u0101 <code>pod_environment_secret_name<\/code> CRD ar operatora iestat\u012bjumiem vai ConfigMap (atkar\u012bb\u0101 no t\u0101, k\u0101 j\u016bs nol\u0113m\u0101t uzst\u0101d\u012bt operatoru).<\/li>\n<\/ol>\n<p>\nTom\u0113r, k\u0101 izr\u0101d\u012bj\u0101s, \u0161obr\u012bd tas nav iesp\u0113jams. T\u0101p\u0113c m\u0113s esam apkopoju\u0161i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">savu operatora versiju<\/a><\/noindex> ar da\u017e\u0101m papildu tre\u0161o pu\u0161u izstr\u0101d\u0113m. Pla\u0161\u0101k par to \u2014 skatiet zem\u0101k.<\/p>\n<p>Ja nododat operatoram parametrus dubl\u0113jumam, proti \u2014 <code>wal_s3_bucket<\/code> un piek\u013cuves atsl\u0113gas AWS S3, tad vi\u0146\u0161 <strong>dubl\u0113s visu<\/strong>: ne tikai datu b\u0101zes ra\u017eo\u0161an\u0101, bet ar\u012b test\u0113\u0161an\u0101. M\u016bs tas neapmierin\u0101ja.<\/p>\n<p>Parametru aprakst\u0101 Spilo, kas ir pamata Docker apk\u0101rtne PgSQL operatora lieto\u0161an\u0101, izr\u0101d\u012bj\u0101s: var nodot parametrs <code>WAL_S3_BUCKET<\/code> tuk\u0161u, t\u0101d\u0113j\u0101di atsl\u0113dzot dubl\u0113jumus. V\u0113l vair\u0101k, par lielu prieku atrad\u0101s ar\u012b <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">gatavs PR<\/a><\/noindex>, kuru m\u0113s nekav\u0113joties pie\u0146\u0113m\u0101m sav\u0101 forka. Tagad ir pietiekami vienk\u0101r\u0161i pievienot <code>enableWALArchiving: false<\/code> resursam PostgreSQL klaster\u012b.<\/p>\n<p>J\u0101, bija iesp\u0113ja izdar\u012bt cit\u0101d\u0101k, palaidot 2 operatorus: viens test\u0113\u0161anai (bez dubl\u0113jumiem), otrs \u2014 ra\u017eo\u0161anai. Bet t\u0101d\u0113j\u0101di m\u0113s var\u0113j\u0101m iztikt ar vienu.<\/p>\n<p>Labi, m\u0113s esam iem\u0101c\u012bju\u0161ies nodot piek\u013cuvi datu b\u0101z\u0113m S3 un dubl\u0113jumi s\u0101ka nok\u013c\u016bt glab\u0101tav\u0101. K\u0101 pan\u0101kt, lai dubl\u0113jumu lapas darbotos Operator UI?<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes PostgreSQL operatoru \u012bss apskats, m\u016bsu izv\u0113le un pieredze\" src=\"\/wp-content\/uploads\/2020\/09\/46169b53707b0bbb686798c655022f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOperator UI b\u016bs nepiecie\u0161ams pievienot 3 main\u012bgos:<\/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>\nP\u0113c tam dubl\u0113jumu p\u0101rvald\u012b\u0161ana k\u013c\u016bs pieejama, kas m\u016bsu gad\u012bjum\u0101 atvieglos darbu ar test\u0113\u0161anu, \u013caujot nos\u016bt\u012bt tur momentnaud\u012bjumu no ra\u017eo\u0161anas bez papildu skriptiem.<\/p>\n<p>K\u0101 v\u0113l viens plus tika min\u0113ta sadarb\u012bba ar Teams API un pla\u0161as iesp\u0113jas datu b\u0101zu un lomu izveid\u0113, izmantojot operatoru. Tom\u0113r izveidotaj\u0101m <strong>lomu nebija noklus\u0113juma ties\u012bbu<\/strong>. Attiec\u012bgi lietot\u0101js ar las\u012b\u0161anas ties\u012bb\u0101m nevar\u0113ja las\u012bt jaun\u0101s tabulas.<\/p>\n<p>K\u0101p\u0113c t\u0101? Neskatoties uz to, ka kod\u0101 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/pkg\/cluster\/database.go#L42\">ir<\/a><\/noindex> nepiecie\u0161am\u0101s <code>GRANT<\/code>, tie netiek pielietoti katr\u0101 situ\u0101cij\u0101. Ir 2 metodes: <code>syncPreparedDatabases<\/code> un <code>syncDatabases<\/code>. Iz <code>syncPreparedDatabases<\/code> \u2014 neskatoties uz to, ka sada\u013c\u0101 <code>preparedDatabases<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/manifests\/complete-postgres-manifest.yaml#L26\">ir<\/a><\/noindex> ir nosac\u012bjums <code>defaultRoles<\/code> un <code>defaultUsers<\/code> lomu izveidei, \u2014 noklus\u0113juma ties\u012bbas netiek pielietotas. M\u0113s str\u0101d\u0101jam pie pl\u0101na, lai \u0161\u012bs ties\u012bbas tiktu autom\u0101tiski pielietotas.<\/p>\n<p>Un p\u0113d\u0113jais moments aktu\u0101lajos uzlabojumos \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">pl\u0101ksne<\/a><\/noindex>, pievienojot Node Affinity izveidotajam StatefulSet. M\u016bsu klienti bie\u017ei vien dod priek\u0161roku izmaksu samazin\u0101\u0161anai, izmantojot spot instance, un uz t\u0101m noteikti nevajadz\u0113tu izvietot datu b\u0101\u017eu pakalpojumus. \u0160o jaut\u0101jumu var\u0113tu risin\u0101t ar\u012b ar toleranc\u0113m, bet Node Affinity kl\u0101tb\u016btne sniedz liel\u0101ku p\u0101rliec\u012bbu.<\/p>\n<h3>Kas izn\u0101ca?<\/h3>\n<p>\nP\u0113c min\u0113to probl\u0113mu risin\u0101\u0161anas m\u0113s forkn\u0113j\u0101m Postgres Operator no Zalando uz <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">m\u016bsu repozitoriju<\/a><\/noindex>, kur tas tiek veidots ar tik noder\u012bg\u0101m pataug\u0101m. Un, lai nodro\u0161in\u0101tu \u0113rt\u012bbu, m\u0113s apkopoj\u0101m ar\u012b <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/flant\/postgres-operator\">Docker att\u0113lu<\/a><\/noindex>.<\/p>\n<p>Priek\u0161likumu saraksts, kas pie\u0146emts forka:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1066\">dro\u0161a viegla att\u0113la izveide Docker operatoram<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">dubl\u0113\u0161anas atsl\u0113g\u0161ana<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1121\">resursu versiju atjaunin\u0101\u0161ana aktu\u0101l\u0101m k8s versij\u0101m<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">Node Affinity ievie\u0161ana<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nB\u016btu lieliski, ja kopiena atbalst\u012btu \u0161os PR, lai tie iek\u013cautos upstream n\u0101kamaj\u0101 operatora versij\u0101 (1.6).<\/p>\n<h2>Bonuss! Pan\u0101kumu st\u0101sts par ra\u017eo\u0161anas migr\u0101ciju<\/h2>\n<p>\nJa j\u016bs izmantojat Patroni, oper\u0101tors var migr\u0113t dz\u012bvu ra\u017eo\u0161anu ar minim\u0101lu d\u012bkst\u0101vi.<\/p>\n<p>Spilo \u013cauj veidot standby klasterus, izmantojot S3 glab\u0101tuves ar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">Wal-E<\/a><\/noindex>, kad PgSQL bin\u0101rais \u017eurn\u0101ls vispirms tiek saglab\u0101ts S3, un p\u0113c tam tiek ievad\u012bts replik\u0101. Bet ko dar\u012bt, ja jums <i>nees<\/i> ir izmantots Wal-E vecaj\u0101 infrastrukt\u016br\u0101? \u0160\u012bs probl\u0113mas risin\u0101jums jau <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/437318\/\">ir ieteikts<\/a><\/noindex> uz habra.<\/p>\n<p>Pal\u012bdz\u0113t n\u0101k lo\u0123isk\u0101 PostgreSQL replik\u0101cija. Tom\u0113r neiedzi\u013cin\u0101simies deta\u013c\u0101s, k\u0101 izveidot publik\u0101cijas un parakstus, jo\u2026 m\u016bsu pl\u0101ns izg\u0101z\u0101s.<\/p>\n<p>Probl\u0113ma ir t\u0101, ka datu b\u0101z\u0113 bija vair\u0101kas noslogotas tabulas ar miljoniem rindu, kuras nep\u0101rtraukti tika papildin\u0101tas un dz\u0113stas. <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/12\/sql-createsubscription\">Vienk\u0101r\u0161s paraksts<\/a><\/noindex> ar <code>copy_data<\/code>, kad jauna replika kop\u0113 visu saturu no meistara, vienk\u0101r\u0161i nepasp\u0113ja sekot meistaram. Saturs tika kop\u0113ts ned\u0113\u013cu, bet tom\u0113r nesekm\u012bgi pan\u0101ca meistaru. Rezult\u0101t\u0101 ar probl\u0113mu pal\u012bdz\u0113ja <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/avitotech\/recovery-use-cases-for-logical-replication-in-postgresql-10-a1e6bab03072\">raksts<\/a><\/noindex> kol\u0113\u0123i no Avito: var p\u0101rvietot datus, izmantojot <code>pg_dump<\/code>. Aprakst\u012b\u0161u m\u016bsu (nedaudz uzlaboto) \u0161\u012b algoritma variantu.<\/p>\n<p>Ideja ir t\u0101da, ka var izveidot izsl\u0113gtu abonementu, pievienotu konkr\u0113tam replik\u0101cijas slotam, un p\u0113c tam labot dar\u012bjuma numuru. Bija pieejamas replikas darbam ar produkciju. Tas ir svar\u012bgi, jo replik\u0101cija pal\u012bdz\u0113s izveidot konsekventu dump un turpin\u0101t sa\u0146emt izmai\u0146as no meistara.<\/p>\n<p>N\u0101kamaj\u0101s komand\u0101s, kas apraksta migr\u0101cijas procesu, tiks izmantotas \u0161\u0101das apz\u012bm\u0113jumi hostiem:<\/p>\n<ol>\n<li><i>master<\/i> \u2014 avota serveris;<\/li>\n<li><i>replica1<\/i> \u2014 pl\u016bsmas replik\u0101cija vecaj\u0101 produkcij\u0101;<\/li>\n<li><i>replica2<\/i> \u2014 jaun\u0101 lo\u0123isk\u0101 replik\u0101cija.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Migr\u0101cijas pl\u0101ns<\/h3>\n<p>\n1. Izveidosim meistara abonementu uz vis\u0101m tabul\u0101m sh\u0113m\u0101 <code>public<\/code> datub\u0101zes <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. Izveidosim replik\u0101cijas slotu meistara pus\u0113:<\/p>\n<pre><code class=\"bash\">psql -h master -c \"select pg_create_logical_replication_slot('repl', 'pgoutput');\"\n<\/code><\/pre>\n<p>\n3. Aptur\u0113sim replik\u0101ciju vecaj\u0101 replik\u0101:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_pause();\"\n<\/code><\/pre>\n<p>\n4. Ieg\u016bsim dar\u012bjuma numuru no meistara:<\/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. Izveidosim dump no vec\u0101s replikas. To dar\u012bsim vair\u0101kos pavedienos, kas pal\u012bdz\u0113s pa\u0101trin\u0101t procesu:<\/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. Aug\u0161upiel\u0101d\u0113sim dump jaunaj\u0101 server\u012b:<\/p>\n<pre><code class=\"bash\">pg_restore -h replica2 -F d -j 8 -d dbname dump\\\/\n<\/code><\/pre>\n<p>\n7. P\u0113c dump aug\u0161upiel\u0101des varam uzs\u0101kt replik\u0101ciju pl\u016bsmas replik\u0101:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_resume();\"\n<\/code><\/pre>\n<p>\n7. Izveidosim abonementu jaunaj\u0101 lo\u0123iskaj\u0101 replik\u0101:<\/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. Ieg\u016bsim <code>oid<\/code> abonementus:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"select oid, * from pg_subscription;\"\n<\/code><\/pre>\n<p>\n9. Pie\u0146emam, ka tika ieg\u016bts <code>oid=1000<\/code>. Lietosim dar\u012bjuma numuru abonementam:<\/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. Uzs\u0101ksim replik\u0101ciju:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"alter subscription oldprod enable;\"\n<\/code><\/pre>\n<p>\n11. P\u0101rbaud\u012bsim abonementa statusu, replik\u0101cijai j\u0101darbojas:<\/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. P\u0113c tam, kad replik\u0101cija uzs\u0101kta un datub\u0101zes sinhroniz\u0113tas, m\u0113s varam veikt p\u0101rsl\u0113g\u0161anu.<\/p>\n<p>13. P\u0113c replik\u0101cijas pabeig\u0161anas j\u0101labo sec\u012bbas. Tas ir labi aprakst\u012bts <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fixing_Sequences\">rakst\u0101 wiki.postgresql.org<\/a><\/noindex>.<\/p>\n<p>Pateicoties \u0161\u0101dam pl\u0101nam, p\u0101rsl\u0113g\u0161ana notika ar minim\u0101l\u0101m aizkav\u0113\u0161an\u0101m.<\/p>\n<h2>Secin\u0101jums<\/h2>\n<p>\nKubernetes operatori \u013cauj vienk\u0101r\u0161ot da\u017e\u0101das darb\u012bbas, samazinot t\u0101s l\u012bdz K8s resursu izveidei. Tom\u0113r, sasniedzot izcilu automatiz\u0101ciju, j\u0101atceras, ka t\u0101 var rad\u012bt ar\u012b virkni nev\u0113lamu nianses, t\u0101d\u0113\u013c pie operatoru izv\u0113les pieejiet p\u0101rdom\u0101ti.<\/p>\n<p>Apskatot tr\u012bs popul\u0101r\u0101kos Kubernetes operatorus PostgreSQL, m\u0113s izv\u0113l\u0113j\u0101mies projektu no Zalando. Ar to sask\u0101r\u0101mies ar da\u017e\u0101m gr\u016bt\u012bb\u0101m, ta\u010du rezult\u0101ts patie\u0161\u0101m iepriecin\u0101ja, t\u0101p\u0113c pl\u0101nojam papla\u0161in\u0101t \u0161o pieredzi ar\u012b uz cit\u0101m PgSQL instal\u0101cij\u0101m. Ja jums ir pieredze ar l\u012bdz\u012bgiem risin\u0101jumiem \u2014 b\u016bsim priec\u012bgi redz\u0113t deta\u013cas koment\u0101ros!<\/p>\n<h2>P.S.<\/h2>\n<p>\nLasiet ar\u012b m\u016bsu emu\u0101ra rakstos:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">Datu b\u0101zes un Kubernetes (apskats un zi\u0146ojuma video)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres otrdiena nr. 5: PostgreSQL un Kubernetes. CI\/CD. Automatiz\u0101cija test\u0113\u0161anai.<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/480722\/\">Vienas st\u0101sts par Redis operatoru K8s un \u012bss r\u012bku p\u0101rskats datu anal\u012bzei \u0161aj\u0101 datub\u0101z\u0113<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Avots: <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.5 - 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\/lv\/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.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"lv_LV\" \/>\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\/lv\/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\udd47Kopsavilkums par PostgreSQL operatoriem Kubernetes, m\u016bsu izv\u0113le un pieredze | ProHoster","description":"Arvien bie\u017e\u0101k no klientiem.","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","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\/lv\/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\/lv\/wp-json\/wp\/v2\/posts\/95322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=95322"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/95322\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media\/95323"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=95322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=95322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=95322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}