Postgres mardi n°5 : « PostgreSQL et Kubernetes. CI/CD. Automatisation des tests"

Postgres mardi n°5 : « PostgreSQL et Kubernetes. CI/CD. Automatisation des tests"

À la fin de l'annĂ©e derniĂšre, une autre diffusion en direct de la communautĂ© russe PostgreSQL a eu lieu #RuPostgres, au cours de laquelle son co-fondateur Nikolai Samokhvalov s'est entretenu avec le directeur technique de Flant, Dmitry Stolyarov, Ă  propos de ce SGBD dans le contexte de Kubernetes.

Nous publions une transcription de la partie principale de cette discussion, et Ă  ChaĂźne YouTube communautaire VidĂ©o complĂšte postĂ©e :

Voir la vidéo

Bases de données et Kubernetes

NA: Nous ne parlerons pas de VACUUM et de CHECKPOINTs aujourd'hui. Nous voulons parler de Kubernetes. Je sais que vous avez de nombreuses annĂ©es d'expĂ©rience. J'ai regardĂ© vos vidĂ©os et mĂȘme revu certaines d'entre elles... Allons droit au but : pourquoi Postgres ou MySQL dans K8 ?

DS: Il n’y a pas et ne peut pas y avoir de rĂ©ponse dĂ©finitive Ă  cette question. Mais en gĂ©nĂ©ral, c'est la simplicitĂ© et la commoditĂ©... le potentiel. Tout le monde veut des services gĂ©rĂ©s.

NA: À comment RDS, seulement à la maison ?

DS: Oui : comme RDS, n'importe oĂč.

NA: « N'importe oĂč » est un bon point. Dans les grandes entreprises, tout est situĂ© Ă  des endroits diffĂ©rents. Pourquoi alors, s’il s’agit d’une grande entreprise, ne pas adopter une solution toute faite ? Par exemple, Nutanix a ses propres dĂ©veloppements, d'autres sociĂ©tĂ©s (VMware...) ont le mĂȘme « RDS, uniquement chez soi ».

DS: Mais nous parlons d'une implĂ©mentation distincte qui ne fonctionnera que sous certaines conditions. Et si nous parlons de Kubernetes, alors il existe une grande variĂ©tĂ© d'infrastructures (qui peuvent ĂȘtre dans les K8). Il s'agit essentiellement d'une norme pour les API vers le cloud...

NA: C'est aussi gratuit !

DS: Ce n'est pas si important. La gratuité est importante pour un segment pas trÚs important du marché. Autre chose est important... Vous vous souvenez probablement du reportage «Bases de données et Kubernetes"?

NA: Oui

DS: J'ai rĂ©alisĂ© qu'il avait Ă©tĂ© reçu de maniĂšre trĂšs ambiguĂ«. Certains pensaient que je disais : « Les gars, mettons toutes les bases de donnĂ©es dans Kubernetes ! », tandis que d’autres pensaient que ce n’étaient que de terribles vĂ©los. Mais je voulais dire quelque chose de complĂštement diffĂ©rent : « Regardez ce qui se passe, quels sont les problĂšmes et comment ils peuvent ĂȘtre rĂ©solus. Devons-nous utiliser les bases de donnĂ©es Kubernetes maintenant ? Production? Enfin, seulement si tu aimes... faire certaines choses. Mais pour un dĂ©veloppeur, je peux dire que je le recommande. Pour un dĂ©veloppeur, le dynamisme de crĂ©ation/suppression d’environnements est trĂšs important.

NS : Par dev, vous entendez tous les environnements qui ne sont pas des prod ? Mise en scĂšne, assurance qualité 

DS: Si nous parlons de stands de performance, alors probablement pas, car les exigences y sont spĂ©cifiques. Si nous parlons de cas particuliers oĂč une trĂšs grande base de donnĂ©es est nĂ©cessaire pour la prĂ©paration, alors probablement pas... S'il s'agit d'un environnement statique et de longue durĂ©e, quel est l'avantage d'avoir la base de donnĂ©es situĂ©e dans les K8 ?

NA: Aucun. Mais oĂč voyons-nous des environnements statiques ? Un environnement statique deviendra obsolĂšte demain.

DS: La mise en scĂšne peut ĂȘtre statique. Nous avons des clients...

NA: Oui, j'en ai un aussi. C'est un gros problÚme si vous disposez d'une base de données de 10 To et d'un staging de 200 Go...

DS: J'ai un cas trÚs cool ! Lors de la préparation, il existe une base de données de produits dans laquelle les modifications sont apportées. Et il y a un bouton : « déployer en production ». Ces changements - les deltas - sont ajoutés (il semble qu'ils soient simplement synchronisés via l'API) en production. C'est une option trÚs exotique.

NA: J'ai vu des startups dans la Valley qui sont assises dans RDS ou mĂȘme dans Heroku - ce sont des histoires d'il y a 2-3 ans - et elles tĂ©lĂ©chargent le dump sur leur ordinateur portable. Parce que la base de donnĂ©es ne fait encore que 80 Go et qu'il y a de la place sur l'ordinateur portable. Ensuite ils achĂštent des disques supplĂ©mentaires pour tout le monde afin de disposer de 3 bases de donnĂ©es pour rĂ©aliser diffĂ©rents dĂ©veloppements. C’est aussi comme ça que ça se passe. J'ai aussi vu qu'ils n'ont pas peur de copier la production dans la mise en scĂšne - cela dĂ©pend beaucoup de l'entreprise. Mais j’ai aussi vu qu’ils ont trĂšs peur et qu’ils n’ont souvent pas assez de temps ni de mains. Mais avant de passer Ă  ce sujet, je veux entendre parler de Kubernetes. Ai-je bien compris que personne n'est encore en prod ?

DS: Nous avons de petites bases de données en prod. Nous parlons de volumes de plusieurs dizaines de gigaoctets et de services non critiques pour lesquels nous étions trop paresseux pour faire des répliques (et ce n'est pas nécessaire). Et à condition qu'il y ait un stockage normal sous Kubernetes. Cette base de données fonctionnait dans une machine virtuelle - conditionnellement dans VMware, au-dessus du systÚme de stockage. Nous l'avons placé dans PV et maintenant nous pouvons le transférer de machine à machine.

NA: Des bases de donnĂ©es de cette taille, jusqu'Ă  100 Go, peuvent ĂȘtre dĂ©ployĂ©es en quelques minutes sur de bons disques et un bon rĂ©seau, non ? Une vitesse de 1 Go par seconde n’est plus exotique.

DS: Oui, pour un fonctionnement linéaire, ce n'est pas un problÚme.

NA: Okay, il faut juste penser Ă  la prod. Et si nous envisageons Kubernetes pour les environnements hors production, que devons-nous faire ? Je vois ça chez Zalando faire l'opĂ©rateur, en Croquant sciage, il existe d'autres options. Et voici SurGres - voici notre bon ami Alvaro d'Espagne : ce qu'ils font n'est pas simplement l'opĂ©rateur, et toute la distribution (StackGres), dans lequel, en plus de Postgres lui-mĂȘme, ils ont Ă©galement dĂ©cidĂ© d'insĂ©rer une sauvegarde, le proxy Envoy...

DS: EnvoyĂ© pour quoi ? Équilibrer spĂ©cifiquement le trafic Postgres ?

NA: Oui. Autrement dit, ils le voient comme suit : si vous prenez une distribution et un noyau Linux, alors PostgreSQL standard est le noyau, et ils veulent crĂ©er une distribution qui sera compatible avec le cloud et exĂ©cutĂ©e sur Kubernetes. Ils assemblent des composants (sauvegardes, etc.) et les dĂ©boguent pour qu'ils fonctionnent bien.

DS: TrÚs cool! Il s'agit essentiellement d'un logiciel permettant de créer votre propre Postgres géré.

NA: Les distributions Linux ont d'Ă©ternels problĂšmes : comment crĂ©er des pilotes pour que tout le matĂ©riel soit pris en charge. Et ils ont l’idĂ©e qu’ils travailleront dans Kubernetes. Je sais que chez l'opĂ©rateur Zalando nous avons rĂ©cemment vu une connexion Ă  AWS et ce n'est plus trĂšs bon. Il ne devrait pas y avoir de lien avec une infrastructure spĂ©cifique – Ă  quoi ça sert alors ?

DS: Je ne sais pas exactement dans quelle situation Zalando s'est retrouvĂ©, mais dans Kubernetes, le stockage est dĂ©sormais fait de telle maniĂšre qu'il est impossible de faire une sauvegarde sur disque en utilisant une mĂ©thode gĂ©nĂ©rique. RĂ©cemment en standard - dans la derniĂšre version SpĂ©cifications CSI — nous avons rendu les instantanĂ©s possibles, mais oĂč sont-ils implĂ©mentĂ©s ? HonnĂȘtement, tout est encore aussi brut... Nous essayons CSI sur AWS, GCE, Azure, vSphere, mais dĂšs que vous commencez Ă  l'utiliser, vous voyez qu'il n'est pas encore prĂȘt.

NA: C’est pourquoi nous devons parfois compter sur les infrastructures. Je pense que nous en sommes encore Ă  un stade prĂ©coce – des douleurs de croissance. Question : Quels conseils donneriez-vous aux dĂ©butants qui souhaitent essayer PgSQL dans K8 ? Quel opĂ©rateur peut-ĂȘtre ?

DS: Le problĂšme c'est que Postgres c'est 3% pour nous. Nous avons Ă©galement une trĂšs grande liste de logiciels diffĂ©rents dans Kubernetes, je ne vais mĂȘme pas tout lister. Par exemple, Elasticsearch. Il existe de nombreux opĂ©rateurs : certains se dĂ©veloppent activement, d'autres non. Nous avons Ă©tabli des exigences pour nous-mĂȘmes, ce qui devrait ĂȘtre chez l'opĂ©rateur afin que nous le prenions au sĂ©rieux. Dans un opĂ©rateur spĂ©cifiquement pour Kubernetes - pas dans un « opĂ©rateur pour faire quelque chose dans les conditions d'Amazon »... En fait, nous utilisons assez largement (= presque tous les clients) un seul opĂ©rateur - pour Redis (nous publierons bientĂŽt un article sur lui).

NA: Et pas pour MySQL non plus ? Je sais que Percona... puisqu'ils travaillent désormais sur MySQL, MongoDB et Postgres, ils devront créer une sorte de solution universelle : pour toutes les bases de données, pour tous les fournisseurs de cloud.

DS: Nous n'avons pas eu le temps de regarder les opĂ©rateurs pour MySQL. Ce n’est pas notre objectif principal pour le moment. MySQL fonctionne bien en mode autonome. Pourquoi utiliser un opĂ©rateur si vous pouvez simplement lancer une base de donnĂ©es... Vous pouvez lancer un conteneur Docker avec Postrges, ou vous pouvez le lancer de maniĂšre simple.

NA: Il y avait une question à ce sujet aussi. Pas d'opérateur du tout ?

DS: Oui, 100 % d'entre nous utilisent PostgreSQL sans opĂ©rateur. Si loin. Nous utilisons activement l'opĂ©rateur pour Prometheus et Redis. Nous envisageons de trouver un opĂ©rateur pour Elasticsearch - c'est celui qui est le plus « en feu », car nous voulons l'installer dans Kubernetes dans 100 % des cas. Tout comme nous voulons nous assurer que MongoDB est Ă©galement toujours installĂ© dans Kubernetes. Ici, certains souhaits apparaissent - on a le sentiment que dans ces cas, quelque chose peut ĂȘtre fait. Et nous n'avons mĂȘme pas regardĂ© Postgres. Bien sĂ»r, nous savons qu’il existe diffĂ©rentes options, mais en fait nous en avons une autonome.

Base de données pour les tests dans Kubernetes

NA: Passons au sujet des tests. Comment dĂ©ployer les modifications dans la base de donnĂ©es – du point de vue DevOps. Il existe des microservices, de nombreuses bases de donnĂ©es, quelque chose change tout le temps quelque part. Comment garantir un CI/CD normal afin que tout soit en ordre du point de vue du SGBD. Quelle est votre approche ?

DS: Il ne peut y avoir une seule rĂ©ponse. Il existe plusieurs options. Le premier est la taille de la base que nous souhaitons dĂ©ployer. Vous avez vous-mĂȘme mentionnĂ© que les entreprises ont des attitudes diffĂ©rentes Ă  l'Ă©gard du fait d'avoir une copie de la base de donnĂ©es de production sur le dĂ©veloppement et sur la scĂšne.

NA: Et dans les conditions du RGPD, je pense qu'ils sont de plus en plus prudents... Je peux dire qu'en Europe, ils ont déjà commencé à imposer des amendes.

DS: Mais souvent, vous pouvez Ă©crire un logiciel qui extrait un dump de la production et le masque. Les donnĂ©es de production sont obtenues (instantanĂ©, dump, copie binaire...), mais elles sont anonymisĂ©es. A la place, il peut y avoir des scripts de gĂ©nĂ©ration : il peut s'agir de luminaires ou simplement d'un script qui gĂ©nĂšre une grande base de donnĂ©es. Le problĂšme est : combien de temps faut-il pour crĂ©er une image de base ? Et combien de temps faut-il pour le dĂ©ployer dans l’environnement souhaitĂ© ?

Nous sommes arrivĂ©s Ă  un schĂ©ma : si le client dispose d'un ensemble de donnĂ©es fixes (version minimale de la base de donnĂ©es), alors nous les utilisons par dĂ©faut. Si nous parlons d'environnements de rĂ©vision, lorsque nous avons créé une branche, nous avons dĂ©ployĂ© une instance de l'application - nous y dĂ©ployons une petite base de donnĂ©es. Mais ça s'est bien passĂ© ĐČĐ°Ń€ĐžĐ°ĐœŃ‚, lorsque nous effectuons un vidage de la production une fois par jour (la nuit) et construisons un conteneur Docker avec PostgreSQL et MySQL avec ces donnĂ©es chargĂ©es basĂ©es sur celui-ci. Si vous devez agrandir la base de donnĂ©es 50 fois Ă  partir de cette image, cela se fait assez simplement et rapidement.

NA: Par simple copie ?

DS: Les données sont stockées directement dans l'image Docker. Ceux. Nous avons une image toute faite, quoique de 100 Go. Grùce aux couches de Docker, nous pouvons déployer rapidement cette image autant de fois que nécessaire. La méthode est stupide, mais elle fonctionne bien.

NA: Ensuite, lorsque vous testez, cela change directement dans Docker, n'est-ce pas ? Copie sur Ă©criture dans Docker - jetez-le et recommencez, tout va bien. Classe! Et l’utilisez-vous dĂ©jĂ  pleinement ?

DS: Pendant longtemps.

NA: Nous faisons des choses trÚs similaires. Seulement, nous n'utilisons pas la copie sur écriture de Docker, mais une autre.

DS: Ce n'est pas générique. Et Docker fonctionne partout.

NA: En théorie, oui. Mais nous y avons aussi des modules, vous pouvez créer différents modules et travailler avec différents systÚmes de fichiers. Quel moment ici. Du cÎté de Postgres, nous regardons tout cela différemment. Maintenant, j'ai regardé du cÎté Docker et j'ai vu que tout fonctionnait pour vous. Mais si la base de données est énorme, par exemple 1 To, alors tout cela prend beaucoup de temps : opérations de nuit et tout mettre dans Docker... Et si 5 To sont mis dans Docker... Ou est-ce que tout va bien ?

DS: Quelle est la diffĂ©rence : ce sont des blobs, juste des bits et des octets.

NA: La diffĂ©rence est la suivante : le faites-vous via le dump et la restauration ?

DS: Pas du tout nĂ©cessaire. Les mĂ©thodes pour gĂ©nĂ©rer cette image peuvent ĂȘtre diffĂ©rentes.

NA: Pour certains clients, nous avons fait en sorte qu'au lieu de gĂ©nĂ©rer rĂ©guliĂšrement une image de base, nous la tenions constamment Ă  jour. Il s'agit essentiellement d'une rĂ©plique, mais elle reçoit les donnĂ©es non pas directement du maĂźtre, mais via une archive. Une archive binaire oĂč les WAL sont tĂ©lĂ©chargĂ©s quotidiennement, oĂč des sauvegardes sont effectuĂ©es... Ces WAL atteignent ensuite l'image de base avec un lĂ©ger retard (littĂ©ralement 1 Ă  2 secondes). Nous le clonons de quelque maniĂšre que ce soit - nous avons maintenant ZFS par dĂ©faut.

DS: Mais avec ZFS, vous ĂȘtes limitĂ© Ă  un seul nƓud.

NA: Oui. Mais ZFS a aussi un pouvoir magique envoyer: avec, vous pouvez envoyer un instantanĂ© et mĂȘme (je n'ai pas encore vraiment testĂ© ça, mais...) vous pouvez envoyer un delta entre deux PGDATA. En fait, nous disposons d’un autre outil que nous n’avons pas vraiment envisagĂ© pour de telles tĂąches. PostgreSQL a pg_rewind, qui fonctionne comme un rsync « intelligent », en sautant une grande partie de ce que vous n’avez pas besoin de regarder, car rien n’y a changĂ©. On peut faire une synchronisation rapide entre les deux serveurs et rembobiner de la mĂȘme maniĂšre.

Donc, de ce cĂŽtĂ© plus DBA, nous essayons de crĂ©er un outil qui nous permette de faire la mĂȘme chose que vous avez dit : nous avons une base de donnĂ©es, mais nous voulons tester quelque chose 50 fois, presque simultanĂ©ment.

DS: 50 fois signifie que vous devez commander 50 instances Spot.

NA: Non, nous faisons tout sur une seule machine.

DS: Mais comment allez-vous agrandir 50 fois si cette base de données fait, disons, un téraoctet. TrÚs probablement, elle a besoin de 256 Go de RAM conditionnels ?

NA: Oui, parfois vous avez besoin de beaucoup de mĂ©moire - c'est normal. Mais ceci est un exemple tirĂ© de la vie. La machine de production dispose de 96 cƓurs et de 600 Go. Dans le mĂȘme temps, 32 cƓurs (voire 16 cƓurs maintenant parfois) et 100 Ă  120 Go de mĂ©moire sont utilisĂ©s pour la base de donnĂ©es.

DS: Et 50 exemplaires y rentrent ?

NA: Il n'y a donc qu'une seule copie, alors la copie sur écriture (ZFS) fonctionne... Je vais vous le dire plus en détail.

Par exemple, nous avons une base de données de 10 To. Ils ont créé un disque pour cela, ZFS a également compressé sa taille de 30 à 40 %. Puisque nous ne effectuons pas de tests de charge, le temps de réponse exact n'est pas important pour nous : qu'il soit jusqu'à 2 fois plus lent - ce n'est pas grave.

Nous donnons l'opportunitĂ© aux programmeurs, QA, DBA, etc. effectuer des tests dans 1-2 threads. Par exemple, ils peuvent effectuer une sorte de migration. Il ne nĂ©cessite pas 10 cƓurs Ă  la fois – il a besoin de 1 backend Postgres, 1 cƓur. La migration va commencer - peut-ĂȘtre aspirateur automatique dĂ©marrera toujours, alors le deuxiĂšme noyau sera utilisĂ©. Nous avons 16 Ă  32 cƓurs allouĂ©s, donc 10 personnes peuvent travailler en mĂȘme temps, sans problĂšme.

Parce que physiquement PGDATA de mĂȘme, il s'avĂšre que nous trompons Postgres. L'astuce est la suivante : par exemple, 10 Postgres sont lancĂ©s simultanĂ©ment. Quel est le problĂšme habituellement ? Ils mettent tampons_partagĂ©s, disons 25%. En consĂ©quence, il s'agit de 200 Go. Vous ne pourrez pas en lancer plus de trois, car la mĂ©moire sera Ă©puisĂ©e.

Mais Ă  un moment donnĂ©, nous avons rĂ©alisĂ© que ce n'Ă©tait pas nĂ©cessaire : nous avons dĂ©fini shared_buffers sur 2 Go. PostgreSQL a taille_cache_efficace, et en rĂ©alitĂ© c'est le seul qui influence plans. Nous l'avons fixĂ© Ă  0,5 To. Et peu importe qu’ils n’existent pas rĂ©ellement : il fait des projets comme s’ils existaient.

En consĂ©quence, lorsque nous testons une sorte de migration, nous pouvons collecter tous les plans - nous verrons comment cela se passera en production. Les secondes y seront diffĂ©rentes (plus lentes), mais les donnĂ©es que nous lisons rĂ©ellement et les plans eux-mĂȘmes (quels sont les JOIN, etc.) s'avĂšrent exactement les mĂȘmes qu'en production. Et vous pouvez exĂ©cuter plusieurs de ces vĂ©rifications en parallĂšle sur une seule machine.

DS: Ne pensez-vous pas qu'il y a quelques problĂšmes ici ? La premiĂšre est une solution qui ne fonctionne que sur PostgreSQL. Cette approche est trĂšs privĂ©e, elle n'est pas gĂ©nĂ©rique. La seconde est que Kubernetes (et tout ce que vont faire les technologies cloud dĂ©sormais) implique de nombreux nƓuds, et ces nƓuds sont Ă©phĂ©mĂšres. Et dans votre cas, il s’agit d’un nƓud persistant avec Ă©tat. Ces choses me mettent en conflit.

NA: Tout d'abord, je suis d'accord, c'est une histoire purement Postgres. Je pense que si nous avons une sorte d'E/S directe et un pool de tampons pour presque toute la mĂ©moire, cette approche ne fonctionnera pas - les plans seront diffĂ©rents. Mais pour l’instant nous travaillons uniquement avec Postgres, nous ne pensons pas aux autres.

À propos de Kubernetes. Vous nous dites vous-mĂȘme partout que nous avons une base de donnĂ©es persistante. Si l'instance Ă©choue, l'essentiel est de sauvegarder le disque. Ici, nous avons Ă©galement toute la plateforme dans Kubernetes, et le composant avec Postgres est sĂ©parĂ© (mĂȘme s'il sera lĂ  un jour). Donc, tout est comme ça : l'instance est tombĂ©e, mais nous avons sauvegardĂ© son PV et l'avons simplement connectĂ© Ă  une autre (nouvelle) instance, comme si de rien n'Ă©tait.

DS: De mon point de vue, nous crĂ©ons des pods dans Kubernetes. K8s - Ă©lastique : les nƓuds sont commandĂ©s selon les besoins. La tĂąche consiste simplement Ă  crĂ©er un pod et Ă  dire qu'il a besoin d'une quantitĂ© X de ressources, puis les K8 le dĂ©couvriront par eux-mĂȘmes. Mais la prise en charge du stockage dans Kubernetes est toujours instable : 1.16dans 1.17 (cette version a Ă©tĂ© publiĂ©e ĐœĐ”ĐŽĐ”Đ»Đž il y a), ces fonctionnalitĂ©s ne deviennent que la version bĂȘta.

Six mois Ă  un an s'Ă©couleront - cela deviendra plus ou moins stable, ou du moins il sera dĂ©clarĂ© comme tel. Ensuite, la possibilitĂ© de prendre des instantanĂ©s et de redimensionner rĂ©sout complĂštement votre problĂšme. Parce que tu as une base. Oui, ce n'est peut-ĂȘtre pas trĂšs rapide, mais la vitesse dĂ©pend de ce qui se cache sous le capot, car certaines implĂ©mentations peuvent copier et copier sur Ă©criture au niveau du sous-systĂšme de disque.

NA: Il est également nécessaire que tous les moteurs (Amazon, Google...) commencent à supporter cette version - cela prend également du temps.

DS: Nous ne les utilisons pas encore. Nous utilisons le nĂŽtre.

Développement local pour Kubernetes

NA: Avez-vous rencontré un tel souhait lorsque vous devez installer tous les pods sur une seule machine et faire un si petit test. Pour obtenir rapidement une preuve de concept, vérifiez que l'application s'exécute dans Kubernetes, sans lui consacrer un tas de machines. Il y a Minikube, non ?

DS: Il me semble que ce cas - dĂ©ployĂ© sur un nƓud - concerne exclusivement le dĂ©veloppement local. Ou quelques manifestations d’un tel modĂšle. Manger MinikubeLĂ  K3, GENTIL. Nous nous dirigeons vers l'utilisation de Kubernetes IN Docker. Nous avons maintenant commencĂ© Ă  travailler avec pour des tests.

NA: Je pensais qu'il s'agissait d'une tentative d'envelopper tous les pods dans une seule image Docker. Mais il s’est avĂ©rĂ© qu’il s’agissait de quelque chose de complĂštement diffĂ©rent. Quoi qu'il en soit, il existe des conteneurs sĂ©parĂ©s, des pods sĂ©parĂ©s - uniquement dans Docker.

DS: Oui. Et il y a une imitation assez drĂŽle, mais le sens est le suivant... Nous avons un utilitaire de dĂ©ploiement - cour. Nous voulons en faire un mode conditionnel werf up: « Donnez-moi Kubernetes local. Â» Et puis exĂ©cutez le conditionnel ici werf follow. Ensuite, le dĂ©veloppeur pourra Ă©diter l'EDI et un processus sera lancĂ© dans le systĂšme qui verra les modifications et reconstruira les images, en les redĂ©ployant sur les K8 locaux. C'est ainsi que nous voulons tenter de rĂ©soudre le problĂšme du dĂ©veloppement local.

Instantanés et clonage de bases de données dans la réalité de K8

NA: Si nous revenons Ă  la copie sur Ă©criture. J'ai remarquĂ© que les nuages ​​​​ont aussi des instantanĂ©s. Ils fonctionnent diffĂ©remment. Par exemple, dans GCP : vous disposez d’une instance de plusieurs tĂ©raoctets sur la cĂŽte est des États-Unis. Vous prenez des instantanĂ©s pĂ©riodiquement. Vous rĂ©cupĂ©rez une copie du disque sur la cĂŽte ouest Ă  partir d'un instantanĂ© - en quelques minutes tout est prĂȘt, cela fonctionne trĂšs rapidement, seul le cache doit ĂȘtre rempli en mĂ©moire. Mais ces clones (instantanĂ©s) sont destinĂ©s Ă  « provisionner » un nouveau volume. C'est cool lorsque vous devez crĂ©er beaucoup d'instances.

Mais pour les tests, il me semble que les instantanĂ©s, dont vous parlez dans Docker ou dont je parle dans ZFS, btrfs et mĂȘme LVM... - ils permettent de ne pas crĂ©er de donnĂ©es vraiment nouvelles sur une seule machine. Dans le cloud, vous les paierez toujours Ă  chaque fois et n'attendrez pas des secondes, mais des minutes (et dans le cas charge paresseuse, Ă©ventuellement une montre).

Au lieu de cela, vous pouvez obtenir ces données en une seconde ou deux, exécuter le test et les jeter. Ces instantanés résolvent différents problÚmes. Dans le premier cas, pour évoluer et obtenir de nouvelles répliques, et dans le second, pour des tests.

DS: je ne suis pas d'accord. Faire fonctionner correctement le clonage de volumes est la tĂąche du cloud. Je n’ai pas examinĂ© leur implĂ©mentation, mais je sais comment nous procĂ©dons sur le matĂ©riel. Nous avons Ceph, il autorise n'importe quel volume physique (RBD) dire cloner et obtenir un deuxiĂšme volume avec les mĂȘmes caractĂ©ristiques en quelques dizaines de millisecondes, IOPS'ami, etc. Vous devez comprendre qu'il y a une copie sur Ă©criture dĂ©licate Ă  l'intĂ©rieur. Pourquoi le cloud ne devrait-il pas faire de mĂȘme ? Je suis sĂ»r qu'ils essaient de procĂ©der d'une maniĂšre ou d'une autre.

NA: Mais il leur faudra quand mĂȘme des secondes, des dizaines de secondes pour lancer une instance, y amener Docker, etc.

DS: Pourquoi est-il nĂ©cessaire de relancer une instance entiĂšre ? Nous avons une instance avec 32 cƓurs, 16... et elle peut y entrer - par exemple quatre. Lorsque nous en commanderons la cinquiĂšme, l'instance sera dĂ©jĂ  levĂ©e, puis elle sera supprimĂ©e.

NA: Oui, intĂ©ressant, Kubernetes s'avĂšre ĂȘtre une autre histoire. Notre base de donnĂ©es n'est pas dans K8 et nous en avons une instance. Mais le clonage d'une base de donnĂ©es de plusieurs tĂ©raoctets ne prend pas plus de deux secondes.

DS: C'est bien. Mais mon premier point est qu’il ne s’agit pas d’une solution gĂ©nĂ©rique. Oui, c'est cool, mais cela ne convient qu'Ă  Postgres et uniquement sur un seul nƓud.

NA: Il ne convient pas seulement à Postgres : ces plans, comme je l'ai décrit, ne fonctionneront que dans celui-ci. Mais si nous ne nous soucions pas des plans et que nous avons juste besoin de toutes les données pour les tests fonctionnels, alors cela convient à n'importe quel SGBD.

DS: Il y a de nombreuses annĂ©es, nous avons fait quelque chose de similaire sur les instantanĂ©s LVM. C'est un classique. Cette approche a Ă©tĂ© trĂšs activement utilisĂ©e. Les nƓuds avec Ă©tat ne sont qu'un problĂšme. Parce qu'il ne faut pas les laisser tomber, il faut toujours s'en souvenir...

NA: Voyez-vous une possibilitĂ© d’hybride ici ? Disons que stateful est une sorte de pod, il fonctionne pour plusieurs personnes (de nombreux testeurs). Nous avons un seul volume, mais grĂące au systĂšme de fichiers, les clones sont locaux. Si le pod tombe, mais que le disque reste, le pod se lĂšvera, comptera les informations sur tous les clones, reprendra tout et dira : « Voici vos clones fonctionnant sur ces ports, continuez Ă  travailler avec eux.

DS: Techniquement, cela signifie qu'au sein de Kubernetes, il s'agit d'un seul pod dans lequel nous exécutons plusieurs Postgres.

NA: Oui. Il a une limite : disons que pas plus de 10 personnes travaillent avec lui en mĂȘme temps. Si vous en avez besoin de 20, nous lancerons un deuxiĂšme module de ce type. Nous le clonerons entiĂšrement, aprĂšs avoir reçu le deuxiĂšme volume complet, il aura les mĂȘmes 10 clones « fins ». Vous ne voyez pas cette opportunitĂ© ?

DS: Nous devons ajouter ici des problĂšmes de sĂ©curitĂ©. Ce type d'organisation implique que ce pod dispose de privilĂšges (capacitĂ©s) Ă©levĂ©s, car il peut effectuer des opĂ©rations non standard sur le systĂšme de fichiers... Mais je le rĂ©pĂšte : je crois qu'Ă  moyen terme ils rĂ©pareront le stockage dans Kubernetes, et dans les nuages, ils rĂ©pareront toute l'histoire avec des volumes - tout "fonctionnera". Il y aura un redimensionnement, un clonage... Il y a un volume - nous disons : « CrĂ©ez-en un nouveau sur cette base Â» et aprĂšs une seconde et demie, nous obtenons ce dont nous avons besoin.

NA: Je ne crois pas Ă  une seconde et demie pour plusieurs tĂ©raoctets. Sur Ceph, vous le faites vous-mĂȘme, mais vous parlez des nuages. AccĂ©dez au cloud, crĂ©ez un clone d'un volume EBS de plusieurs tĂ©raoctets sur EC2 et voyez quelles seront les performances. Cela ne prendra pas quelques secondes. Je suis trĂšs intĂ©ressĂ© de savoir quand ils atteindront ce niveau. Je comprends ce que vous dites, mais je ne suis pas d'accord.

DS: Ok, mais j'ai dit à moyen terme, pas à court terme. Pour plusieurs années.

À propos de l'opĂ©rateur pour PostgreSQL de Zalando

Au milieu de cette réunion, Alexey Klyukin, un ancien développeur de Zalando, s'est également joint à nous et a évoqué l'histoire de l'opérateur PostgreSQL :

C’est formidable que ce sujet soit abordĂ© de maniĂšre gĂ©nĂ©rale : Ă  la fois Postgres et Kubernetes. Lorsque nous avons commencĂ© Ă  le faire chez Zalando en 2017, c'Ă©tait un sujet que tout le monde voulait aborder, mais personne ne le faisait. Tout le monde possĂ©dait dĂ©jĂ  Kubernetes, mais lorsqu'ils demandaient quoi faire avec les bases de donnĂ©es, mĂȘme les gens aiment Kelsey High Tower, qui prĂȘchait les K8, a dit quelque chose comme ceci :

« AccĂ©dez aux services gĂ©rĂ©s et utilisez-les, n'exĂ©cutez pas la base de donnĂ©es dans Kubernetes. Sinon, vos K8 dĂ©cideront, par exemple, de faire une mise Ă  niveau, d’éteindre tous les nƓuds et vos donnĂ©es s’envoleront trĂšs, trĂšs loin.

Nous avons dĂ©cidĂ© de crĂ©er un opĂ©rateur qui, contrairement Ă  cet avis, lancera une base de donnĂ©es Postgres dans Kubernetes. Et nous avions une bonne raison - patroni. Il s'agit d'un basculement automatique pour PostgreSQL, effectuĂ© correctement, c'est-Ă -dire en utilisant etcd, consul ou ZooKeeper comme stockage d'informations sur le cluster. Un tel rĂ©fĂ©rentiel qui donnera Ă  tous ceux qui demandent, par exemple, quel est le leader actuel, les mĂȘmes informations - malgrĂ© le fait que nous ayons tout distribuĂ© - afin qu'il n'y ait pas de cerveau divisĂ©. De plus, nous avions Image Docker pour lui.

En gĂ©nĂ©ral, le besoin de basculement automatique de l’entreprise est apparu aprĂšs la migration d’un centre de donnĂ©es matĂ©riel interne vers le cloud. Le cloud reposait sur une solution propriĂ©taire PaaS (Platform-as-a-Service). C'est Open Source, mais il a fallu beaucoup de travail pour le rendre opĂ©rationnel. Ça s'appelait COUP DE COUDE.

Au dĂ©part, Kubernetes n’existait pas. Plus prĂ©cisĂ©ment, lorsque notre propre solution a Ă©tĂ© dĂ©ployĂ©e, les K8 existaient dĂ©jĂ , mais ils Ă©taient tellement bruts qu'ils n'Ă©taient pas adaptĂ©s Ă  la production. C'Ă©tait, Ă  mon avis, 2015 ou 2016. En 2017, Kubernetes Ă©tait devenu plus ou moins mature : il fallait y migrer.

Et nous avions déjà un conteneur Docker. Il existait un PaaS qui utilisait Docker. Pourquoi ne pas essayer les K8 ? Pourquoi ne pas écrire votre propre opérateur ? Murat Kabilov, qui nous est venu d'Avito, a lancé ce projet de sa propre initiative - « pour jouer » - et le projet a « décollé ».

Mais en général, je voulais parler d'AWS. Pourquoi y avait-il du code historique lié à AWS...

Lorsque vous exĂ©cutez quelque chose dans Kubernetes, vous devez comprendre que K8 est un travail en cours. Il se dĂ©veloppe, s’amĂ©liore et mĂȘme s’effondre de temps en temps. Vous devez garder un Ɠil attentif sur tous les changements apportĂ©s Ă  Kubernetes, vous devez ĂȘtre prĂȘt Ă  vous y plonger si quelque chose se produit et Ă  apprendre comment cela fonctionne en dĂ©tail - peut-ĂȘtre plus que vous ne le souhaiteriez. Ceci, en principe, s'applique Ă  toute plate-forme sur laquelle vous exĂ©cutez vos bases de donnĂ©es...

Ainsi, lorsque nous avons fait la dĂ©claration, Postgres s'exĂ©cutait sur un volume externe (EBS dans ce cas, puisque nous travaillions sur AWS). La base de donnĂ©es s'est agrandie, Ă  un moment donnĂ© il a fallu la redimensionner : par exemple, la taille initiale d'EBS Ă©tait de 100 To, la base de donnĂ©es s'est agrandie, maintenant nous voulons faire EBS de 200 To. Comment? Disons que vous pouvez effectuer un vidage/restauration sur une nouvelle instance, mais cela prendra beaucoup de temps et impliquera des temps d'arrĂȘt.

Par conséquent, je voulais un redimensionnement qui agrandirait la partition EBS, puis indiquerait au systÚme de fichiers d'utiliser le nouvel espace. Et nous l'avons fait, mais à cette époque, Kubernetes ne disposait d'aucune API pour l'opération de redimensionnement. Depuis que nous travaillons sur AWS, nous avons écrit du code pour son API.

Personne ne vous empĂȘche de faire de mĂȘme pour d’autres plateformes. Rien n'indique dans la dĂ©claration qu'il ne peut ĂȘtre exĂ©cutĂ© que sur AWS et qu'il ne fonctionnera pas sur tout le reste. En gĂ©nĂ©ral, il s'agit d'un projet Open Source : si quelqu'un souhaite accĂ©lĂ©rer l'Ă©mergence de l'utilisation de la nouvelle API, il est le bienvenu. Manger GitHub, pull request - l'Ă©quipe Zalando essaie d'y rĂ©pondre assez rapidement et de promouvoir l'opĂ©rateur. Autant que je sache, le projet participĂ© au Google Summer of Code et Ă  d'autres initiatives similaires. Zalando y travaille trĂšs activement.

PS-Bonus !

Si le sujet de PostgreSQL et Kubernetes vous intĂ©resse, veuillez Ă©galement noter que le prochain Postgres Tuesday a eu lieu la semaine derniĂšre, oĂč j'ai parlĂ© avec Nikolai Alexandre Kukushkin de Zalando. La vidĂ©o de celui-ci est disponible ici.

PPS

A lire aussi sur notre blog :

Source: habr.com

Ajouter un commentaire