{"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\/fr\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","title":{"rendered":"Aper\u00e7u des op\u00e9rateurs PostgreSQL pour Kubernetes, notre s\u00e9lection et notre exp\u00e9rience","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Aper\u00e7u des op\u00e9rateurs PostgreSQL pour Kubernetes, notre s\u00e9lection et notre exp\u00e9rience\" src=\"\/wp-content\/uploads\/2020\/09\/23b2db49941fa5bd5000358c8ffb991b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe plus en plus de clients demandent : \u00ab Nous voulons quelque chose comme Amazon RDS, mais moins cher \u00bb ; \u00ab Nous voulons quelque chose comme RDS, mais partout, dans n'importe quelle infrastructure \u00bb. Pour r\u00e9aliser une telle solution g\u00e9r\u00e9e sur Kubernetes, nous avons examin\u00e9 l'\u00e9tat actuel des op\u00e9rateurs les plus populaires pour PostgreSQL (Stolon, op\u00e9rateurs de Crunchy Data et Zalando) et avons fait notre choix.<\/p>\n<p>Cet article est le fruit de notre exp\u00e9rience, \u00e0 la fois d'un point de vue th\u00e9orique (aper\u00e7u des solutions) et pratique (ce qui a \u00e9t\u00e9 choisi et ce qui en est r\u00e9sult\u00e9). Mais d'abord, d\u00e9terminons quelles sont les exigences qui s'appliquent \u00e0 un \u00e9ventuel remplacement de RDS\u2026<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Qu'est-ce que RDS ?<\/h2>\n<p>\nLorsque les gens parlent de RDS, de notre exp\u00e9rience, ils font r\u00e9f\u00e9rence \u00e0 un service g\u00e9r\u00e9 (managed) de SGBD qui :<\/p>\n<ol>\n<li>est facilement configurable ;<\/li>\n<li>permet le travail avec des snapshots et de se restaurer \u00e0 partir d'eux (id\u00e9alement \u2014 avec le support de <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Point-in-time_recovery\">PITR<\/a><\/noindex>);<\/li>\n<li>permet de cr\u00e9er des topologies master-esclaves ;<\/li>\n<li>dispose d'une riche liste d'extensions ;<\/li>\n<li>offre des fonctionnalit\u00e9s d'audit et de gestion des utilisateurs \/ des acc\u00e8s.<\/li>\n<\/ol>\n<p>\nEn g\u00e9n\u00e9ral, les approches pour r\u00e9aliser la t\u00e2che formul\u00e9e peuvent \u00eatre tr\u00e8s vari\u00e9es, cependant, la voie de l'Ansible conditionnel ne nous convient pas. (Les coll\u00e8gues de 2GIS ont \u00e9galement abouti \u00e0 une conclusion similaire \u00e0 la suite de leur tentative <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/509926\/\">de cr\u00e9er un \u00ab outil pour le d\u00e9ploiement rapide d'un cluster \u00e0 tol\u00e9rance de pannes bas\u00e9 sur Postgres \u00bb.)<\/a><\/noindex> Les op\u00e9rateurs \u2014 sont l'approche g\u00e9n\u00e9ralement accept\u00e9e pour r\u00e9soudre de telles t\u00e2ches dans l'\u00e9cosyst\u00e8me Kubernetes. Plus de d\u00e9tails sur ceux-ci concernant les bases de donn\u00e9es ex\u00e9cut\u00e9es \u00e0 l'int\u00e9rieur de Kubernetes ont d\u00e9j\u00e0 \u00e9t\u00e9 abord\u00e9s par le directeur technique de Flant,<\/p>\n<p>dans l'une de ses pr\u00e9sentations <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/distol\/\" class=\"user_link\">distol<\/a><\/noindex>, sur <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">: Pour cr\u00e9er rapidement des op\u00e9rateurs simples, nous recommandons de pr\u00eater attention \u00e0 notre outil Open Source<\/a><\/noindex>.<\/p>\n<p><i><strong>NB<\/strong><\/i><i>. En l'utilisant, cela peut \u00eatre fait sans connaissances en Go, mais de mani\u00e8re plus famili\u00e8re pour les administrateurs syst\u00e8mes : en Bash, Python, etc. <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\"><i>shell-operator<\/i><\/a><\/noindex><i>Il existe plusieurs op\u00e9rateurs K8s populaires pour PostgreSQL :<\/i><\/p>\n<p>Stolon ;<\/p>\n<ul>\n<li>Op\u00e9rateur PostgreSQL de Crunchy Data ;<\/li>\n<li>Op\u00e9rateur Postgres de Zalando.<\/li>\n<li>Regardons-les de plus pr\u00e8s.<\/li>\n<\/ul>\n<p>\nChoix de l'op\u00e9rateur<\/p>\n<h2>Au-del\u00e0 des importantes capacit\u00e9s d\u00e9j\u00e0 mentionn\u00e9es ci-dessus, nous \u2014 en tant qu'ing\u00e9nieurs d'exploitation de l'infrastructure dans Kubernetes \u2014 attendions \u00e9galement des op\u00e9rateurs les \u00e9l\u00e9ments suivants :<\/h2>\n<p>\nd\u00e9ploiement depuis Git et avec<\/p>\n<ul>\n<li> ressources personnalis\u00e9es ; <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/operator\/#deploying-operators\">support de l'anti-affinit\u00e9 des pods ;<\/a><\/noindex>;<\/li>\n<li> installation de l'affinit\u00e9 ou du s\u00e9lecteur de n\u0153uds ;<\/li>\n<li> installation des tolerations ;<\/li>\n<li> possibilit\u00e9 de tuning ;<\/li>\n<li> technologies compr\u00e9hensibles et m\u00eame commandes.<\/li>\n<li> des technologies compr\u00e9hensibles et m\u00eame des \u00e9quipes.<\/li>\n<\/ul>\n<p>\nSans entrer dans les d\u00e9tails de chaque point (n'h\u00e9sitez pas \u00e0 poser des questions dans les commentaires si vous en avez apr\u00e8s avoir lu l'article complet), je souhaite souligner que ces param\u00e8tres sont n\u00e9cessaires pour d\u00e9crire plus pr\u00e9cis\u00e9ment la sp\u00e9cialisation des n\u0153uds du cluster afin de les commander pour des applications sp\u00e9cifiques. Cela nous permet d'obtenir un \u00e9quilibre optimal entre performance et co\u00fbt.<\/p>\n<p>Passons maintenant aux op\u00e9rateurs PostgreSQL.<\/p>\n<h3>1. Stolon<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\">Stolon<\/a><\/noindex> de l'entreprise italienne Sorint.lab dans <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">le rapport d\u00e9j\u00e0 mentionn\u00e9<\/a><\/noindex> \u00e9tait consid\u00e9r\u00e9 comme un certain standard parmi les op\u00e9rateurs pour SGBD. C'est un projet assez ancien : sa premi\u00e8re version publique a \u00e9t\u00e9 publi\u00e9e en novembre 2015 (!), et le d\u00e9p\u00f4t GitHub peut se vanter de pr\u00e8s de 3000 \u00e9toiles et de plus de 40 contributeurs.<\/p>\n<p>Et en effet, Stolon est un excellent exemple d'une architecture bien pens\u00e9e :<\/p>\n<p><img decoding=\"async\" alt=\"Aper\u00e7u des op\u00e9rateurs PostgreSQL pour Kubernetes, notre s\u00e9lection et notre exp\u00e9rience\" src=\"\/wp-content\/uploads\/2020\/09\/a34625c130bfd29c5645cf2417042de2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLes d\u00e9tails de la mise en \u0153uvre de cet op\u00e9rateur peuvent \u00eatre consult\u00e9s dans le rapport ou <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/blob\/master\/doc\/architecture.md\">documentation du projet<\/a><\/noindex>. D'une mani\u00e8re g\u00e9n\u00e9rale, il suffit de dire qu'il fait tout ce qui a \u00e9t\u00e9 d\u00e9crit : basculement, proxy pour l'acc\u00e8s transparent des clients, sauvegardes... De plus, les proxies fournissent un acc\u00e8s via un seul point de service \u2014 contrairement aux deux autres solutions examin\u00e9es plus loin (qui ont deux services pour acc\u00e9der \u00e0 la base).<\/p>\n<p>Cependant, Stolon <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/issues\/463#issuecomment-379666733\">n'a pas de ressources personnalis\u00e9es<\/a><\/noindex>, ce qui emp\u00eache de le d\u00e9ployer simplement et rapidement \u2014 \u00abcomme des petits pains\u00bb \u2014 pour cr\u00e9er des instances de SGBD dans Kubernetes. La gestion se fait via l'outil <code>stolonctl<\/code>, le d\u00e9ploiement via un chart Helm, et les personnalisations sont d\u00e9finies dans ConfigMap.<\/p>\n<p>D'une part, on pourrait dire que l'op\u00e9rateur n'est pas vraiment un op\u00e9rateur (puisqu'il n'utilise pas de CRD). Mais d'autre part, c'est un syst\u00e8me flexible qui permet de configurer les ressources dans K8s comme cela vous convient.<\/p>\n<p>Pour r\u00e9sumer, il ne nous a pas sembl\u00e9 optimal de cr\u00e9er un chart s\u00e9par\u00e9 pour chaque base de donn\u00e9es. Nous avons donc commenc\u00e9 \u00e0 chercher des alternatives.<\/p>\n<h3>2. Crunchy Data PostgreSQL Operator<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\">L'op\u00e9rateur de Crunchy Data<\/a><\/noindex>, une jeune startup am\u00e9ricaine, semblait \u00eatre une alternative logique. Son histoire publique commence avec la premi\u00e8re version en mars 2017 ; depuis lors, le d\u00e9p\u00f4t GitHub a re\u00e7u un peu moins de 1300 \u00e9toiles et plus de 50 contributeurs. La derni\u00e8re version de septembre a \u00e9t\u00e9 test\u00e9e pour fonctionner avec Kubernetes 1.15\u20141.18, OpenShift 3.11+ et 4.4+, GKE et VMware Enterprise PKS 1.3+.<\/p>\n<p>L'architecture de Crunchy Data PostgreSQL Operator r\u00e9pond \u00e9galement aux exigences d\u00e9clar\u00e9es :<\/p>\n<p><img decoding=\"async\" alt=\"Aper\u00e7u des op\u00e9rateurs PostgreSQL pour Kubernetes, notre s\u00e9lection et notre exp\u00e9rience\" src=\"\/wp-content\/uploads\/2020\/09\/343cd0494abae42fcf5b47c5bb4eb310.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa gestion se fait via l'outil <code>pgo<\/code>, cependant, il g\u00e9n\u00e8re des ressources personnalis\u00e9es pour Kubernetes. Ainsi, nous, en tant qu'utilisateurs potentiels, avons \u00e9t\u00e9 ravis par l'op\u00e9rateur :<\/p>\n<ul>\n<li> la gestion via CRD ;<\/li>\n<li> une gestion pratique des utilisateurs (\u00e9galement via CRD) ;<\/li>\n<li> int\u00e9gration avec d'autres composants <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/crunchy-postgres-containers\/4.3.1\/\">Crunchy Data Container Suite<\/a><\/noindex> \u2014 une collection sp\u00e9cialis\u00e9e d'images de conteneurs pour PostgreSQL et les utilitaires associ\u00e9s (y compris pgBackRest, pgAudit, des extensions de contrib, etc.).<\/li>\n<\/ul>\n<p>\nCependant, les tentatives d'utilisation de l'op\u00e9rateur de Crunchy Data ont r\u00e9v\u00e9l\u00e9 quelques probl\u00e8mes :<\/p>\n<ul>\n<li>Il n'y avait pas de possibilit\u00e9 de tolerations \u2014 seul nodeSelector \u00e9tait pr\u00e9vu.<\/li>\n<li>Les pods cr\u00e9\u00e9s faisaient partie d'un d\u00e9ploiement, m\u00eame si nous d\u00e9ployions une application stateful. Contrairement \u00e0 StatefulSet, les d\u00e9ploiements ne permettent pas de cr\u00e9er des disques.<\/li>\n<\/ul>\n<p>\nCe dernier inconv\u00e9nient a conduit \u00e0 des moments amusants : dans l'environnement de test, il a \u00e9t\u00e9 possible de lancer 3 r\u00e9pliques avec un seul disque <i>stockage local<\/i>, ce qui a conduit l'op\u00e9rateur \u00e0 indiquer que 3 r\u00e9pliques fonctionnaient (bien que ce ne f\u00fbt pas le cas).<\/p>\n<p>Une autre caract\u00e9ristique de cet op\u00e9rateur est son int\u00e9gration pr\u00eate \u00e0 l'emploi avec divers syst\u00e8mes auxiliaires. Par exemple, il est facile d'installer pgAdmin et pgBounce, et <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/postgres-operator\/4.4.0\/installation\/other\/ansible\/installing-metrics\/\">documentation<\/a><\/noindex> des Grafana et Prometheus pr\u00e9configur\u00e9s sont \u00e9galement envisag\u00e9s. Dans la r\u00e9cente <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> une meilleure int\u00e9gration avec le projet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/pgmonitor\">pgMonitor<\/a><\/noindex>, gr\u00e2ce \u00e0 laquelle l'op\u00e9rateur propose une visualisation claire des m\u00e9triques PgSQL \u00ab pr\u00eates \u00e0 l'emploi \u00bb.<\/p>\n<p>N\u00e9anmoins, le choix \u00e9trange des ressources Kubernetes g\u00e9n\u00e9r\u00e9es nous a conduits \u00e0 devoir trouver une autre solution.<\/p>\n<h3>3. Zalando Postgres Operator<\/h3>\n<p>\nNous connaissons les produits Zalando depuis longtemps : nous avons de l'exp\u00e9rience avec Zalenium et, bien s\u00fbr, nous avons essay\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\">Patroni<\/a><\/noindex> \u2014 leur solution HA populaire pour PostgreSQL. L'approche de l'entreprise pour cr\u00e9er <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\">Postgres Operator<\/a><\/noindex> a \u00e9t\u00e9 pr\u00e9sent\u00e9e par l'un de ses auteurs \u2014 Alexey Klyukin \u2014 lors du <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres Mardi n\u00b05<\/a><\/noindex>, et nous l'avons appr\u00e9ci\u00e9.<\/p>\n<p>C'est la solution la plus jeune parmi celles examin\u00e9es dans l'article : le premier lancement a eu lieu en ao\u00fbt 2018. Cependant, malgr\u00e9 le nombre limit\u00e9 de lancements formels, le projet a parcouru un long chemin, surpassant d\u00e9j\u00e0 en popularit\u00e9 la solution de Crunchy Data avec plus de 1300 \u00e9toiles sur GitHub et le nombre maximum de contributeurs (plus de 70).<\/p>\n<p>\u00ab Sous le capot \u00bb, cet op\u00e9rateur utilise des solutions \u00e9prouv\u00e9es :<\/p>\n<ul>\n<li> Patroni et <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/spilo\">Spilo<\/a><\/noindex> pour la gestion,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">WAL-E<\/a><\/noindex> \u2014 pour les sauvegardes,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\">PgBouncer<\/a><\/noindex> \u2014 comme pool de connexions.<\/li>\n<\/ul>\n<p>\nVoici comment est pr\u00e9sent\u00e9e l'architecture de l'op\u00e9rateur de Zalando :<\/p>\n<p><img decoding=\"async\" alt=\"Aper\u00e7u des op\u00e9rateurs PostgreSQL pour Kubernetes, notre s\u00e9lection et notre exp\u00e9rience\" src=\"\/wp-content\/uploads\/2020\/09\/c66f10c1a818592ecaacd2db4ce5ace5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL\u2019op\u00e9rateur est enti\u00e8rement g\u00e9r\u00e9 via les Custom Resources, cr\u00e9ant automatiquement un StatefulSet \u00e0 partir de conteneurs, qui peuvent ensuite \u00eatre personnalis\u00e9s en ajoutant divers sidecars dans le pod. Cela repr\u00e9sente un avantage consid\u00e9rable par rapport \u00e0 l\u2019op\u00e9rateur de Crunchy Data.<\/p>\n<p>Puisque nous avons choisi la solution de Zalando parmi 3 options examin\u00e9es, la description de ses fonctionnalit\u00e9s sera pr\u00e9sent\u00e9e ci-dessous, imm\u00e9diatement avec des exemples d'application.<\/p>\n<h2>Pratique avec Postgres Operator de Zalando<\/h2>\n<p>\nLe d\u00e9ploiement de l'op\u00e9rateur est tr\u00e8s simple : il suffit de t\u00e9l\u00e9charger la version actuelle depuis GitHub et d'appliquer les fichiers YAML \u00e0 partir du r\u00e9pertoire. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/tree\/master\/manifests\">manifests<\/a><\/noindex>. En variante, vous pouvez \u00e9galement utiliser <noindex><a rel=\"nofollow\" href=\"https:\/\/operatorhub.io\/operator\/postgres-operator\">OperatorHub<\/a><\/noindex>.<\/p>\n<p>Apr\u00e8s l'installation, il convient de se pr\u00e9occuper de la configuration <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/reference\/operator_parameters.md#aws-or-gcp-interaction\">des stockages pour les journaux et les sauvegardes<\/a><\/noindex>. Cela se fait via ConfigMap <code>postgres-operator<\/code> dans l'espace de noms o\u00f9 vous avez install\u00e9 l'op\u00e9rateur. Une fois les stockages configur\u00e9s, vous pouvez d\u00e9ployer le premier cluster PostgreSQL.<\/p>\n<p>Par exemple, le d\u00e9ploiement standard que nous avons est le suivant :<\/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>\nCe manifeste d\u00e9ploie un cluster de 3 instances avec un sidecar pour <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wrouesnel\/postgres_exporter\">postgres_exporter<\/a><\/noindex>, \u00e0 partir duquel nous collectons les m\u00e9triques de l'application. Comme vous pouvez le voir, tout est tr\u00e8s simple et si vous le souhaitez, vous pouvez cr\u00e9er litt\u00e9ralement un nombre illimit\u00e9 de clusters.<\/p>\n<p>Il convient \u00e9galement de pr\u00eater attention \u00e0 <b>le panneau web pour l'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>. Il est fourni avec l'op\u00e9rateur et permet de cr\u00e9er et de supprimer des clusters, ainsi que de travailler avec les sauvegardes r\u00e9alis\u00e9es par l'op\u00e9rateur.<\/p>\n<p><img decoding=\"async\" alt=\"Aper\u00e7u des op\u00e9rateurs PostgreSQL pour Kubernetes, notre s\u00e9lection et notre exp\u00e9rience\" src=\"\/wp-content\/uploads\/2020\/09\/2e9ae033a9817d101c843ce061aafdb5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Liste des clusters PostgreSQL<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Aper\u00e7u des op\u00e9rateurs PostgreSQL pour Kubernetes, notre s\u00e9lection et notre exp\u00e9rience\" src=\"\/wp-content\/uploads\/2020\/09\/74a65f7f301da14a0cb7bea6d5ef84ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Gestion des sauvegardes<\/i><\/p>\n<p>Une autre caract\u00e9ristique int\u00e9ressante est la prise en charge de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/user.md#teams-api-roles\">Teams API<\/a><\/noindex>. Ce m\u00e9canisme cr\u00e9e automatiquement <b>des r\u00f4les dans PostgreSQL<\/b>, en fonction de la liste des noms d'utilisateurs fournie. Apr\u00e8s cela, l'API permet de renvoyer la liste des utilisateurs pour lesquels des r\u00f4les sont cr\u00e9\u00e9s automatiquement.<\/p>\n<h3>Probl\u00e8mes et leurs solutions<\/h3>\n<p>\nCependant, l'utilisation de l'op\u00e9rateur a rapidement r\u00e9v\u00e9l\u00e9 plusieurs inconv\u00e9nients significatifs :<\/p>\n<ol>\n<li> absence de support pour nodeSelector;<\/li>\n<li> impossibilit\u00e9 de d\u00e9sactiver les sauvegardes;<\/li>\n<li> lors de l'utilisation de la fonction de cr\u00e9ation de bases, les privil\u00e8ges par d\u00e9faut ne sont pas appliqu\u00e9s;<\/li>\n<li> il manque parfois de la documentation ou celle-ci est obsol\u00e8te.<\/li>\n<\/ol>\n<p>\nHeureusement, beaucoup d'entre eux peuvent \u00eatre r\u00e9solus. Commen\u00e7ons par la fin \u2014 les probl\u00e8mes avec <strong>de la documentation<\/strong>. <\/p>\n<p>Vous rencontrerez probablement des difficult\u00e9s pour sp\u00e9cifier une sauvegarde et comment connecter le bucket de sauvegarde \u00e0 l'Interface Utilisateur de l'Op\u00e9rateur. Cela est bri\u00e8vement mentionn\u00e9 dans la documentation, mais une description r\u00e9elle se trouve dans <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/481\">PR<\/a><\/noindex>:<\/p>\n<ol>\n<li>il faut cr\u00e9er un secret;<\/li>\n<li>le transmettre \u00e0 l'op\u00e9rateur dans le param\u00e8tre <code>pod_environment_secret_name<\/code> dans le CRD avec les param\u00e8tres de l'op\u00e9rateur ou dans le ConfigMap (selon la mani\u00e8re dont vous avez choisi d'installer l'op\u00e9rateur).<\/li>\n<\/ol>\n<p>\nCependant, il s'av\u00e8re qu'actuellement, cela n'est pas possible. C'est pourquoi nous avons rassembl\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">notre version de l'op\u00e9rateur<\/a><\/noindex> avec quelques d\u00e9veloppements suppl\u00e9mentaires externes. Plus de d\u00e9tails \u00e0 ce sujet \u2014 voir ci-dessous.<\/p>\n<p>Si vous transmettez des param\u00e8tres \u00e0 l'op\u00e9rateur pour la sauvegarde, \u00e0 savoir \u2014 <code>wal_s3_bucket<\/code> et les cl\u00e9s d'acc\u00e8s dans AWS S3, alors il <strong>sauvegardera tout<\/strong>: non seulement les bases en production, mais aussi le staging. Cela ne nous convenait pas.<\/p>\n<p>Dans la description des param\u00e8tres de Spilo, qui est l'enveloppe Docker de base pour PgSQL lors de l'utilisation de l'op\u00e9rateur, il a \u00e9t\u00e9 r\u00e9v\u00e9l\u00e9 : vous pouvez transmettre le param\u00e8tre <code>WAL_S3_BUCKET<\/code> vide, d\u00e9sactivant ainsi les sauvegardes. De plus, \u00e0 notre grand plaisir, un <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">PR pr\u00eat<\/a><\/noindex>, que nous avons imm\u00e9diatement int\u00e9gr\u00e9 dans notre fork. Il suffit maintenant d'ajouter <code>enableWALArchiving: false<\/code> au ressourcement du cluster PostgreSQL.<\/p>\n<p>Oui, il y avait la possibilit\u00e9 de faire autrement, en lan\u00e7ant 2 op\u00e9rateurs : un pour le staging (sans sauvegardes), et un autre \u2014 pour la production. Mais nous avons pu nous contenter d'un seul.<\/p>\n<p>D'accord, nous avons appris \u00e0 donner acc\u00e8s aux bases pour S3 et les sauvegardes ont commenc\u00e9 \u00e0 \u00eatre stock\u00e9es. Comment faire fonctionner les pages de sauvegarde dans l'Interface Utilisateur de l'Op\u00e9rateur ?<\/p>\n<p><img decoding=\"async\" alt=\"Aper\u00e7u des op\u00e9rateurs PostgreSQL pour Kubernetes, notre s\u00e9lection et notre exp\u00e9rience\" src=\"\/wp-content\/uploads\/2020\/09\/46169b53707b0bbb686798c655022f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDans l'Interface Utilisateur de l'Op\u00e9rateur, il sera n\u00e9cessaire d'ajouter 3 variables :<\/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>\nApr\u00e8s cela, la gestion des sauvegardes deviendra accessible, ce qui, dans notre cas, facilitera le travail avec le staging, permettant d'y envoyer des copies de production sans scripts suppl\u00e9mentaires.<\/p>\n<p>Comme un autre avantage, on a mentionn\u00e9 le travail avec l'API Teams et des larges possibilit\u00e9s pour cr\u00e9er des bases et des r\u00f4les au moyens de l'op\u00e9rateur. Cependant, les r\u00f4les cr\u00e9\u00e9s <strong>n'avaient pas de privil\u00e8ges par d\u00e9faut<\/strong>. En cons\u00e9quence, l'utilisateur avec des droits en lecture ne pouvait pas lire les nouvelles tables.<\/p>\n<p>Pourquoi cela ? Bien que dans le code <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/pkg\/cluster\/database.go#L42\">Il existe<\/a><\/noindex> les n\u00e9cessaires <code>GRANT<\/code>, elles ne sont pas toujours appliqu\u00e9es. Il existe 2 m\u00e9thodes : <code>syncPreparedDatabases<\/code> et <code>syncDatabases<\/code>. Il y a <code>syncPreparedDatabases<\/code> \u2014 bien que dans la section <code>preparedDatabases<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/manifests\/complete-postgres-manifest.yaml#L26\">Il existe<\/a><\/noindex> il y ait une condition <code>defaultRoles<\/code> et <code>defaultUsers<\/code> pour la cr\u00e9ation des r\u00f4les, \u2014 les droits par d\u00e9faut ne s'appliquent pas. Nous sommes en train de pr\u00e9parer un patch pour que ces droits s'appliquent automatiquement.<\/p>\n<p>Et dernier point dans les am\u00e9liorations qui nous concernent \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">un patch<\/a><\/noindex>, ajoutant la Node Affinity au StatefulSet cr\u00e9\u00e9. Nos clients pr\u00e9f\u00e8rent souvent r\u00e9duire leurs co\u00fbts en utilisant des instances spot, et il est clairement risqu\u00e9 d'y d\u00e9ployer des services de base de donn\u00e9es. Ce probl\u00e8me pourrait also \u00eatre r\u00e9solu via des tolerations, mais la Node Affinity fournit une plus grande assurance.<\/p>\n<h3>Qu'est-ce qui en est sorti ?<\/h3>\n<p>\n\u00c0 la suite de la r\u00e9solution des probl\u00e8mes \u00e9voqu\u00e9s, nous avons fork\u00e9 le Postgres Operator de Zalando dans <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">notre d\u00e9p\u00f4t<\/a><\/noindex>, o\u00f9 il est assembl\u00e9 avec des patches aussi utiles. Pour plus de commodit\u00e9, nous avons \u00e9galement <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/flant\/postgres-operator\">Docker image<\/a><\/noindex>.<\/p>\n<p>Liste des PR accept\u00e9es dans le fork :<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1066\">construction d'une image Docker l\u00e9g\u00e8re et s\u00e9curis\u00e9e pour l'op\u00e9rateur<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">d\u00e9sactivation des sauvegardes<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1121\">mise \u00e0 jour des versions des ressources pour les versions actuelles de k8s<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">int\u00e9gration de la Node Affinity<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nCe serait formidable si la communaut\u00e9 soutenait ces PR afin qu'elles puissent \u00eatre int\u00e9gr\u00e9es dans l'upstream avec la prochaine version de l'op\u00e9rateur (1.6).<\/p>\n<h2>Bonus ! Histoire de succ\u00e8s avec la migration de production<\/h2>\n<p>\nSi vous utilisez Patroni, vous pouvez migrer la production en direct vers l'op\u00e9rateur avec un minimum de temps d'arr\u00eat.<\/p>\n<p>Spilo permet de cr\u00e9er des clusters standby via des stockages S3 avec <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">Wal-E<\/a><\/noindex>, lorsque le log binaire PgSQL est d'abord sauvegard\u00e9 dans S3, puis r\u00e9cup\u00e9r\u00e9 par la r\u00e9plique. Mais que faire si vous avez <i>ne<\/i> utilis\u00e9 Wal-E dans une ancienne infrastructure ? La solution \u00e0 ce probl\u00e8me a d\u00e9j\u00e0 \u00e9t\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/437318\/\">propos\u00e9e<\/a><\/noindex> sur Habr\u00e9.<\/p>\n<p>La r\u00e9plication logique de PostgreSQL vient \u00e0 la rescousse. Cependant, nous n'allons pas entrer dans les d\u00e9tails, comme la cr\u00e9ation de publications et d'abonnements, car\u2026 notre plan a \u00e9chou\u00e9.<\/p>\n<p>Le fait est qu'il y avait plusieurs tables tr\u00e8s charg\u00e9es dans la BDD avec des millions de lignes, qui, de plus, \u00e9taient constamment ajout\u00e9es et supprim\u00e9es. <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/12\/sql-createsubscription\">Un simple abonnement<\/a><\/noindex> avec <code>copy_data<\/code>, lorsque la nouvelle r\u00e9plique copie tout le contenu du ma\u00eetre, ne parvenait tout simplement pas \u00e0 suivre le ma\u00eetre. La copie du contenu a dur\u00e9 une semaine, mais n'a jamais rattrap\u00e9 le ma\u00eetre. Au final, nous avons pu r\u00e9soudre le probl\u00e8me gr\u00e2ce \u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/avitotech\/recovery-use-cases-for-logical-replication-in-postgresql-10-a1e6bab03072\">article<\/a><\/noindex> un coll\u00e8gue d'Avito : il est possible de transf\u00e9rer les donn\u00e9es en utilisant <code>pg_dump<\/code>. Je vais d\u00e9crire notre (un peu modifi\u00e9) version de cet algorithme.<\/p>\n<p>L'id\u00e9e est de cr\u00e9er une souscription d\u00e9sactiv\u00e9e li\u00e9e \u00e0 un slot de r\u00e9plication sp\u00e9cifique, puis de corriger le num\u00e9ro de transaction. Des r\u00e9pliques \u00e9taient disponibles pour le fonctionnement de la production. C'est important, car la r\u00e9plique aide \u00e0 cr\u00e9er un dump coh\u00e9rent et \u00e0 continuer \u00e0 recevoir les changements du ma\u00eetre.<\/p>\n<p>Dans les commandes suivantes d\u00e9crivant le processus de migration, les notations suivantes seront utilis\u00e9es pour les h\u00f4tes :<\/p>\n<ol>\n<li><i>master<\/i> \u2014 serveur source ;<\/li>\n<li><i>replica1<\/i> \u2014 r\u00e9plique en streaming sur l'ancienne production ;<\/li>\n<li><i>replica2<\/i> \u2014 nouvelle r\u00e9plique logique.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Plan de migration<\/h3>\n<p>\n1. Cr\u00e9ons sur le ma\u00eetre une souscription \u00e0 toutes les tables dans le sch\u00e9ma <code>public<\/code> de la base <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. Cr\u00e9ons un slot de r\u00e9plication sur le ma\u00eetre :<\/p>\n<pre><code class=\"bash\">psql -h master -c \"select pg_create_logical_replication_slot('repl', 'pgoutput');\"\n<\/code><\/pre>\n<p>\n3. Arr\u00eatons la r\u00e9plication sur l'ancienne r\u00e9plique :<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_pause();\"\n<\/code><\/pre>\n<p>\n4. Obtenons le num\u00e9ro de transaction du ma\u00eetre :<\/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. R\u00e9alisons un dump de l'ancienne r\u00e9plique. Nous le ferons en plusieurs flux, ce qui aidera \u00e0 acc\u00e9l\u00e9rer le processus :<\/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. Chargeons le dump sur le nouveau serveur :<\/p>\n<pre><code class=\"bash\">pg_restore -h replica2 -F d -j 8 -d dbname dump\/\n<\/code><\/pre>\n<p>\n7. Apr\u00e8s le chargement du dump, nous pouvons relancer la r\u00e9plication sur la r\u00e9plique en streaming :<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_resume();\"\n<\/code><\/pre>\n<p>\n8. Cr\u00e9ons une souscription sur la nouvelle r\u00e9plique logique :<\/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>\n9. Obtenons <code>oid<\/code> de la souscription :<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"select oid, * from pg_subscription;\"\n<\/code><\/pre>\n<p>\n10. Supposons que nous avons obtenu <code>oid=1000<\/code>. Appliquons le num\u00e9ro de transaction \u00e0 la souscription :<\/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>\n11. Lancez la r\u00e9plication :<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"alter subscription oldprod enable;\"\n<\/code><\/pre>\n<p>\n12. V\u00e9rifions le statut de la souscription, la r\u00e9plication doit \u00eatre op\u00e9rationnelle :<\/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>\n13. Une fois la r\u00e9plication lanc\u00e9e et les bases synchronis\u00e9es, il est possible d'effectuer le basculement.<\/p>\n<p>14. Apr\u00e8s la d\u00e9sactivation de la r\u00e9plication, il faut corriger les s\u00e9quences. Cela est bien d\u00e9crit <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fixing_Sequences\">dans un article sur wiki.postgresql.org<\/a><\/noindex>.<\/p>\n<p>Gr\u00e2ce \u00e0 ce plan, le basculement s'est effectu\u00e9 avec un minimum de retards.<\/p>\n<h2>Conclusion<\/h2>\n<p>\nLes op\u00e9rateurs Kubernetes simplifient diverses actions en les r\u00e9duisant \u00e0 la cr\u00e9ation de ressources K8s. Cependant, apr\u00e8s avoir atteint une automatisation impressionnante gr\u00e2ce \u00e0 eux, il est important de se rappeler qu'elle peut \u00e9galement apporter son lot de nuances inattendues, c'est pourquoi il faut choisir les op\u00e9rateurs avec discernement.<\/p>\n<p>Apr\u00e8s avoir examin\u00e9 les trois op\u00e9rateurs Kubernetes les plus populaires pour PostgreSQL, nous avons choisi le projet de Zalando. Nous avons d\u00fb surmonter certaines difficult\u00e9s, mais le r\u00e9sultat a vraiment \u00e9t\u00e9 satisfaisant, ce qui nous incite \u00e0 \u00e9tendre cette exp\u00e9rience \u00e0 d'autres installations PgSQL. Si vous avez une exp\u00e9rience avec des solutions similaires, nous serions ravis de voir les d\u00e9tails dans les commentaires !<\/p>\n<h2>P.S.<\/h2>\n<p>\nLisez aussi dans notre blog :<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">Bases de donn\u00e9es et Kubernetes (aper\u00e7u et vid\u00e9o de la pr\u00e9sentation)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres-Tuesday n\u00b05 : PostgreSQL et Kubernetes. CI\/CD. Automatisation des tests.<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/480722\/\">Une histoire avec l'op\u00e9rateur Redis dans K8s et un mini-aper\u00e7u des outils d'analyse de donn\u00e9es de cette base de donn\u00e9es.<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Aper\u00e7u des op\u00e9rateurs PostgreSQL pour Kubernetes, notre s\u00e9lection et notre exp\u00e9rience | ProHoster","description":"De plus en plus de clients.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/95322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=95322"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/95322\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/95323"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=95322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=95322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=95322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}