{"id":96965,"date":"2020-10-15T14:42:53","date_gmt":"2020-10-15T12:42:53","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019"},"modified":"2020-10-15T14:42:53","modified_gmt":"2020-10-15T12:42:53","slug":"operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","title":{"rendered":"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/56e002c7408c4708e39ece867f84171e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le rapport traite des questions pratiques du d\u00e9veloppement d'un op\u00e9rateur sous Kubernetes, de la conception de son architecture et des principes fondamentaux de son fonctionnement.<\/p>\n<p><\/p>\n<p>Dans la premi\u00e8re partie du rapport, nous examinerons :<\/p>\n<p><\/p>\n<ul>\n<li>ce qu'est un op\u00e9rateur dans Kubernetes et \u00e0 quoi il sert ;<\/li>\n<li>comment un op\u00e9rateur simplifie la gestion des syst\u00e8mes complexes ;<\/li>\n<li>ce que l'op\u00e9rateur peut faire, et ce qu'il ne peut pas faire.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ensuite, nous aborderons la structure interne de l'op\u00e9rateur. Nous examinerons l'architecture et le fonctionnement de l'op\u00e9rateur \u00e9tape par \u00e9tape. Nous analyserons en d\u00e9tail :<\/p>\n<p><\/p>\n<ul>\n<li>l'interaction entre l'op\u00e9rateur et Kubernetes ;<\/li>\n<li>quelles fonctions l'op\u00e9rateur assume, et ce qu'il d\u00e9l\u00e8gue \u00e0 Kubernetes.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nous examinerons la gestion des shards et des r\u00e9pliques de bases de donn\u00e9es sous Kubernetes.<br \/>\nEnsuite, nous discuterons des questions de stockage des donn\u00e9es :<\/p>\n<p><\/p>\n<ul>\n<li>comment travailler avec le stockage persistant du point de vue de l'op\u00e9rateur ;<\/li>\n<li>les pi\u00e8ges de l'utilisation du stockage local.<\/li>\n<\/ul>\n<p><\/p>\n<p>Dans la partie finale du rapport, nous examinerons des exemples pratiques d'application <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">du clickhouse-operator<\/a><\/noindex> avec Amazon ou Google Cloud Service. Le rapport se fonde sur l'exemple du d\u00e9veloppement et de l'exploitation de l'op\u00e9rateur pour ClickHouse.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Vid\u00e9o :<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"z2aARjKDg4w\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/z2aARjKDg4w\/hqdefault.jpg\" alt=\"Lire la vid\u00e9o\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Je m'appelle Vladislav Klimenko. Aujourd'hui, je voudrais parler de notre exp\u00e9rience dans le d\u00e9veloppement et l'exploitation d'un op\u00e9rateur, en particulier d'un op\u00e9rateur sp\u00e9cialis\u00e9 pour la gestion des clusters de bases de donn\u00e9es. \u00c0 titre d'exemple, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">le ClickHouse-operator<\/a><\/noindex> pour g\u00e9rer le cluster ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cc297a3edb3b2a5e30d0dc2725de4011.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pourquoi avons-nous la possibilit\u00e9 de parler de l'op\u00e9rateur et de ClickHouse ?<\/p>\n<p><\/p>\n<ul>\n<li>Nous soutenons et d\u00e9veloppons ClickHouse. <\/li>\n<li>Actuellement, nous essayons d'apporter notre contribution au d\u00e9veloppement de ClickHouse. Et nous sommes les deuxi\u00e8mes apr\u00e8s Yandex en termes de volume de changements apport\u00e9s \u00e0 ClickHouse. <\/li>\n<li>Nous essayons de cr\u00e9er des projets suppl\u00e9mentaires pour l'\u00e9cosyst\u00e8me ClickHouse. <\/li>\n<\/ul>\n<p><\/p>\n<p>Je voudrais parler de l'un de ces projets. Il s'agit du ClickHouse-operator pour Kubernetes. <\/p>\n<p><\/p>\n<p>Dans mon rapport, je voudrais aborder deux sujets : <\/p>\n<p><\/p>\n<ul>\n<li>Le premier sujet est de savoir comment notre op\u00e9rateur g\u00e8re les bases de donn\u00e9es ClickHouse sous Kubernetes. <\/li>\n<li>Le deuxi\u00e8me sujet est de savoir comment fonctionnent les op\u00e9rateurs en g\u00e9n\u00e9ral, c'est-\u00e0-dire comment ils interagissent avec Kubernetes. <\/li>\n<\/ul>\n<p><\/p>\n<p>Ces deux questions seront entrecrois\u00e9es tout au long de mon rapport. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4cc9790e18e70ae1ccde2cf39ef4ef00.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui pourrait \u00eatre int\u00e9ress\u00e9 par ce que j'essaie de raconter ?<\/p>\n<p><\/p>\n<ul>\n<li>Cela int\u00e9ressera surtout ceux qui exploitent des op\u00e9rateurs. <\/li>\n<li>Ou ceux qui veulent cr\u00e9er le leur, afin de comprendre comment cela fonctionne en interne, comment l'op\u00e9rateur interagit avec Kubernetes et quels pi\u00e8ges peuvent surgir. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/07545f7a0171b610697c519d4aa9cd43.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pour bien comprendre ce dont nous allons discuter aujourd'hui, il serait bon de savoir comment fonctionne Kubernetes et d'avoir une formation de base sur les technologies cloud. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/eff56cc3e83fde3d3e64d73d41b07417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qu'est-ce que ClickHouse ? C'est une base de donn\u00e9es en colonnes sp\u00e9cialis\u00e9e dans le traitement en ligne des requ\u00eates analytiques. Et elle est enti\u00e8rement open source. <\/p>\n<p><\/p>\n<p>Et nous devons conna\u00eetre seulement deux choses. Il faut savoir que c'est une base de donn\u00e9es, donc ce que je vais d\u00e9crire sera applicable \u00e0 pratiquement n'importe quelle base de donn\u00e9es. Et que le SGBD ClickHouse se scalabilit\u00e9 tr\u00e8s bien, offrant pratiquement une scalabilit\u00e9 lin\u00e9aire. Par cons\u00e9quent, l'\u00e9tat du cluster est un \u00e9tat naturel pour ClickHouse. Nous sommes donc particuli\u00e8rement int\u00e9ress\u00e9s \u00e0 discuter de la mani\u00e8re de g\u00e9rer un cluster ClickHouse dans Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5eb1ff5026c492117bf2467b10de7053.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pourquoi est-il n\u00e9cessaire dans ce contexte ? Pourquoi ne pouvons-nous pas continuer \u00e0 l'exploiter de fa\u00e7on autonome ? Les r\u00e9ponses sont en partie techniques et en partie organisationnelles. <\/p>\n<p><\/p>\n<ul>\n<li>Dans la pratique, nous rencontrons de plus en plus souvent cette situation o\u00f9, dans les grandes entreprises, presque tous les composants sont d\u00e9j\u00e0 dans Kubernetes. Les bases de donn\u00e9es restent \u00e0 l'ext\u00e9rieur. <\/li>\n<li>Et de plus en plus, la question est pos\u00e9e : \u00ab Peut-on les int\u00e9grer \u00e0 l'int\u00e9rieur ? \u00bb. Par cons\u00e9quent, les grandes entreprises tentent de maximiser l'unification de la gestion afin de pouvoir g\u00e9rer rapidement leurs entrep\u00f4ts de donn\u00e9es. <\/li>\n<li>Cela est particuli\u00e8rement utile s'il est n\u00e9cessaire de reproduire au maximum la m\u00eame chose \u00e0 un nouvel endroit, c'est-\u00e0-dire une portabilit\u00e9 maximale.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/99312e74bd7ed4031128c7ec872f6a68.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c0 quel point cela est-il simple ou difficile ? Bien s\u00fbr, cela peut \u00eatre fait manuellement. Mais ce n'est pas si simple, car nous avons \u00e0 g\u00e9rer la complexit\u00e9 de Kubernetes lui-m\u00eame, et cela s'ajoute \u00e0 la sp\u00e9cificit\u00e9 de ClickHouse. C'est donc une agr\u00e9gation. <\/p>\n<p><\/p>\n<p>Et tout cela ensemble constitue un ensemble de technologies assez vaste, dont la gestion devient d\u00e9j\u00e0 assez complexe, car Kubernetes apporte ses propres questions quotidiennes d'exploitation, tandis que ClickHouse am\u00e8ne ses questions d'exploitation quotidienne. Surtout si nous avons plusieurs instances de ClickHouse, et que nous devons constamment intervenir. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ca10b805b2744d1a5283f96b0ac1cc11.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse, avec une configuration dynamique, pose un certain nombre de questions qui cr\u00e9ent une charge constante sur le DevOps :<\/p>\n<p><\/p>\n<ul>\n<li>Lorsque nous souhaitons modifier quelque chose dans ClickHouse, par exemple, ajouter une r\u00e9plique ou un shard, nous devons g\u00e9rer la configuration. <\/li>\n<li>Ensuite, il faut changer le sch\u00e9ma de donn\u00e9es, car ClickHouse a une m\u00e9thode sp\u00e9cifique de sharding. Il faut organiser le sch\u00e9ma de donn\u00e9es et configurer les param\u00e8tres. <\/li>\n<li>Il faut configurer la surveillance. <\/li>\n<li>Collecte des journaux pour les nouveaux shards, pour les nouvelles r\u00e9pliques. <\/li>\n<li>Il faut s'occuper de la restauration.<\/li>\n<li>Et du red\u00e9marrage. <\/li>\n<\/ul>\n<p><\/p>\n<p>Ce sont des t\u00e2ches routini\u00e8res qu'il serait souhaitable d'all\u00e9ger dans l'exploitation.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2461e861ca1d2f2344ead9decf85a97e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kubernetes aide bien \u00e0 l'exploitation, mais dans les t\u00e2ches syst\u00e8me de base. <\/p>\n<p><\/p>\n<p>Kubernetes facilite et automatise des activit\u00e9s telles que :<\/p>\n<p><\/p>\n<ul>\n<li>Restauration.<\/li>\n<li>Red\u00e9marrage. <\/li>\n<li>Gestion du syst\u00e8me de stockage.<\/li>\n<\/ul>\n<p><\/p>\n<p>C'est bien, c'est la bonne direction, mais il n'a pas une compr\u00e9hension compl\u00e8te de l'exploitation d'un cluster de bases de donn\u00e9es. <\/p>\n<p><\/p>\n<p>On esp\u00e8re obtenir davantage, on souhaite faire fonctionner l'ensemble de la base de donn\u00e9es sous Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6564e9f29d5d518925c8593bca978345.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>On aimerait avoir quelque chose comme un grand bouton rouge magique, sur lequel vous appuyez et cela d\u00e9ploie et maintient un cluster tout au long de son cycle de vie, avec les t\u00e2ches quotidiennes \u00e0 r\u00e9soudre. Un cluster ClickHouse sur Kubernetes.<\/p>\n<p><\/p>\n<p>Nous avons tent\u00e9 de cr\u00e9er une solution qui aiderait \u00e0 faciliter le travail. C'est l'op\u00e9rateur ClickHouse pour Kubernetes de la soci\u00e9t\u00e9 Altinity.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ff80c6fc59069ec900d545096ad978d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un op\u00e9rateur est un programme dont la t\u00e2che principale est de g\u00e9rer d'autres programmes, c'est-\u00e0-dire un gestionnaire. <\/p>\n<p><\/p>\n<p>Il contient des mod\u00e8les de comportement. On peut appeler cela des connaissances codifi\u00e9es sur le domaine. <\/p>\n<p><\/p>\n<p>Sa t\u00e2che principale est d'all\u00e9ger la vie des DevOps et de r\u00e9duire le micromanagement, permettant ainsi au DevOps de penser en termes de haut niveau, c'est-\u00e0-dire qu'il ne s'occupe pas du micromanagement et ne configure pas tous les d\u00e9tails manuellement. <\/p>\n<p><\/p>\n<p>L'op\u00e9rateur est justement un robot assistant qui lutte contre les micro-t\u00e2ches et aide les DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0824a1fa710e8c4f45406aa7f596b977.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pourquoi avoir besoin d'un op\u00e9rateur ? Il se montre particuli\u00e8rement efficace sur deux points :<\/p>\n<p><\/p>\n<ul>\n<li>Lorsque le sp\u00e9cialiste qui s'occupe de ClickHouse manque d'exp\u00e9rience, mais qu'il faut d\u00e9j\u00e0 exploiter ClickHouse, l'op\u00e9rateur facilite l'exploitation et permet de g\u00e9rer un cluster ClickHouse avec une configuration relativement complexe, sans vraiment se soucier des d\u00e9tails du fonctionnement interne. Il re\u00e7oit simplement des t\u00e2ches de haut niveau, et cela fonctionne. <\/li>\n<li>La deuxi\u00e8me t\u00e2che dans laquelle il excelle particuli\u00e8rement est celle de l'automatisation d'un grand nombre de t\u00e2ches r\u00e9p\u00e9titives. Il soulage les administrateurs syst\u00e8me des micro-t\u00e2ches. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f1cb11156d57f560d0b6c82700ac6ff8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cela est surtout n\u00e9cessaire pour ceux qui commencent leur parcours ou pour ceux qui doivent se concentrer sur l'automatisation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/128e7d9ff1ce0c535f98be66aedb1060.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quelle est donc la diff\u00e9rence entre une approche bas\u00e9e sur des op\u00e9rateurs et d'autres syst\u00e8mes\u00a0? Il y a aussi Helm, qui aide \u00e0 installer ClickHouse et qui permet de dessiner des chartes Helm qui peuvent m\u00eame d\u00e9ployer un cluster entier de ClickHouse. Quelle est donc la diff\u00e9rence entre un op\u00e9rateur et Helm par exemple\u00a0?<\/p>\n<p><\/p>\n<p>La principale diff\u00e9rence fondamentale est que Helm g\u00e8re des paquets, tandis que l'op\u00e9rateur va plus loin. Cela implique le suivi de tout le cycle de vie. Ce n'est pas juste une installation, mais des t\u00e2ches quotidiennes qui incluent le dimensionnement, le sharding, c'est-\u00e0-dire tout ce qui doit \u00eatre fait dans le cycle de vie (y compris la suppression si n\u00e9cessaire) \u2013 tout cela est g\u00e9r\u00e9 par l'op\u00e9rateur. Il tente d'automatiser et de maintenir l'ensemble du cycle de vie des logiciels. C'est cela sa diff\u00e9rence fondamentale par rapport aux autres solutions disponibles. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e26b57c8caf8437f683d7afbfa127ebd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'\u00e9tait la partie d'introduction, passons \u00e0 la suite. <\/p>\n<p><\/p>\n<p>Comment construisons-nous notre op\u00e9rateur\u00a0? Nous essayons d'aborder la question en g\u00e9rant le cluster ClickHouse comme une seule ressource. <\/p>\n<p><\/p>\n<p>Ici, \u00e0 gauche, nous avons les donn\u00e9es d'entr\u00e9e. C'est un YAML avec la sp\u00e9cification du cluster, qui est traditionnellement transmis \u00e0 Kubernetes via kubectl. L'op\u00e9rateur le capte, fait sa magie et \u00e0 la sortie nous obtenons un sch\u00e9ma comme celui-ci. C'est l'impl\u00e9mentation de ClickHouse dans Kubernetes.<\/p>\n<p><\/p>\n<p>Nous allons ensuite examiner progressivement comment fonctionne l'op\u00e9rateur, quelles t\u00e2ches typiques peuvent \u00eatre r\u00e9solues. Nous ne traiterons que les t\u00e2ches typiques, car notre temps est limit\u00e9. Nous ne parlerons pas de tout ce que l'op\u00e9rateur peut r\u00e9soudre. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b40401931b58988058419d4495dbb1bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Partons de la pratique. Notre projet est enti\u00e8rement open source, donc vous pouvez voir sur GitHub comment il fonctionne. Si vous voulez simplement lancer, vous pouvez commencer avec le Quick Start Guide.<\/p>\n<p><\/p>\n<p>Si vous souhaitez vous plonger dans les d\u00e9tails, nous essayons de maintenir la documentation dans un \u00e9tat raisonnablement correct. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9414d7c3aa94b6ad999e150f0ac25a97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Commen\u00e7ons par un exercice pratique. Le premier d\u00e9fi, par lequel nous voulons tous commencer, est de lancer le premier exemple d'une mani\u00e8re ou d'une autre. Comment lancer ClickHouse \u00e0 l'aide d'un op\u00e9rateur, m\u00eame sans vraiment savoir comment il fonctionne ? Nous r\u00e9digeons un manifeste, car toute communication avec k8s se fait via des manfestes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3e97cd235827460693ed95fb3598d31d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voici un manifeste assez complexe. Ce que nous avons surlign\u00e9 en rouge est ce sur quoi il faut mettre l'accent. Nous demandons \u00e0 l'op\u00e9rateur de cr\u00e9er un cluster nomm\u00e9 demo.<\/p>\n<p><\/p>\n<p>Pour l'instant, ce sont des exemples de base. Le stockage n'est pas encore d\u00e9crit, mais nous reviendrons au stockage un peu plus tard. Pour l'instant, nous allons observer le d\u00e9veloppement du cluster en dynamique.<\/p>\n<p><\/p>\n<p>Nous avons cr\u00e9\u00e9 ce manifeste. Nous le donnons \u00e0 notre op\u00e9rateur. Il a travaill\u00e9, fait sa magie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/502e64fbe6ed7d04b2aecb7d51abc7f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous regardons dans la console. Trois composants suscitent notre int\u00e9r\u00eat : le Pod, deux Services, et le StatefulSet.<\/p>\n<p><\/p>\n<p>L'op\u00e9rateur a fonctionn\u00e9, et nous pouvons voir ce qu'il a cr\u00e9\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/67faf120e21e5113680ccff9c71b00f1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il cr\u00e9e \u00e0 peu pr\u00e8s ce sch\u00e9ma. Nous avons un StatefulSet, un Pod, un ConfigMap pour chaque r\u00e9plique, un ConfigMap pour l'ensemble du cluster. Des services sont indispensables comme points d'entr\u00e9e dans le cluster. <\/p>\n<p><\/p>\n<p>Les services sont le Load Balancer Service central et \u00e9ventuellement un pour chaque r\u00e9plique, pour chaque shard. <\/p>\n<p><\/p>\n<p>Voici \u00e0 quoi ressemble un cluster de base. Il est constitu\u00e9 d'un seul n\u0153ud. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f235ada45ee58b517c0e041f795ae122.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Allons plus loin, compliquons les choses. Il faut sharder le cluster.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/992836a00434c64fb4616c1c4cc4df97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nos t\u00e2ches augmentent, et la dynamique commence. Nous voulons ajouter un shard. Nous suivons le d\u00e9veloppement. Nous changeons notre sp\u00e9cification. Nous indiquons que nous voulons deux shards. <\/p>\n<p><\/p>\n<p>C'est le m\u00eame fichier qui se d\u00e9veloppe dynamiquement avec la croissance du syst\u00e8me. Il n'y a pas de stockage, le stockage sera abord\u00e9 plus tard, c'est un sujet distinct.<\/p>\n<p><\/p>\n<p>Nous donnons le YAML \u00e0 l'op\u00e9rateur et voyons ce que cela donne. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8ddb5845cae160098470208f51b5da7c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'op\u00e9rateur a r\u00e9fl\u00e9chi et a cr\u00e9\u00e9 les entit\u00e9s suivantes. Nous avons d\u00e9j\u00e0 deux Pods, trois Services, et, soudainement, 2 StatefulSets. Pourquoi 2 StatefulSets ?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/26eb734ff1a195de2ceaab842b472ee4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sur le sch\u00e9ma, c'\u00e9tait comme \u00e7a \u2013 c'est notre \u00e9tat initial, lorsque nous avions un pod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/657838b0d378121fdd66ad3ff8168600.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cela devient ainsi. Pour l'instant, tout est simple, cela a \u00e9t\u00e9 dupliqu\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f039a7046f1c56fbdad6b5a26a519b10.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et pourquoi y a-t-il deux StatefulSets ? Il faut s'arr\u00eater un moment et discuter de la mani\u00e8re dont Kubernetes g\u00e8re les Pods.<\/p>\n<p><\/p>\n<p>Il existe un objet appel\u00e9 StatefulSet, qui permet de cr\u00e9er un ensemble de Pods \u00e0 partir d'un mod\u00e8le. Le facteur cl\u00e9 ici est le mod\u00e8le. Et il est possible de lancer plusieurs Pods \u00e0 partir d'un m\u00eame mod\u00e8le dans un StatefulSet. La phrase cl\u00e9 ici est \u00ab plusieurs Pods \u00e0 partir d'un m\u00eame mod\u00e8le \u00bb.<\/p>\n<p><\/p>\n<p>Il y avait une grande tentation de faire tout le cluster en l' empaquetant dans un seul StatefulSet. Cela fonctionnerait, il n'y a aucun probl\u00e8me \u00e0 cela. Mais il y a un d\u00e9tail. Si nous voulons cr\u00e9er un cluster h\u00e9t\u00e9rog\u00e8ne, c'est-\u00e0-dire avec plusieurs versions de ClickHouse, alors nous commen\u00e7ons \u00e0 avoir des questions. Oui, StatefulSet peut effectuer une mise \u00e0 jour progressive, et il est possible d'appliquer une nouvelle version, en pr\u00e9cisant qu'il ne faut pas essayer d'avoir plus de cette quantit\u00e9 de n\u0153uds \u00e0 la fois.<\/p>\n<p><\/p>\n<p>Mais si nous extrapolons la t\u00e2che et disons que nous voulons cr\u00e9er un cluster compl\u00e8tement h\u00e9t\u00e9rog\u00e8ne et que nous ne souhaitons pas remplacer une ancienne version par une nouvelle \u00e0 l'aide de la mise \u00e0 jour progressive, mais que nous voulons simplement cr\u00e9er un cluster h\u00e9t\u00e9rog\u00e8ne tant en termes de diff\u00e9rentes versions de ClickHouse que de diff\u00e9rents types de stockage. Nous souhaitons, par exemple, que certaines r\u00e9pliques soient sur des disques s\u00e9par\u00e9s, sur des disques lents, en gros construire compl\u00e8tement un cluster h\u00e9t\u00e9rog\u00e8ne. Et \u00e0 cause du fait que StatefulSet propose une solution standardis\u00e9e \u00e0 partir d'un seul mod\u00e8le, il n'est donc pas possible de faire cela. <\/p>\n<p><\/p>\n<p>Apr\u00e8s r\u00e9flexion, il a \u00e9t\u00e9 d\u00e9cid\u00e9 de proc\u00e9der comme suit. Chaque r\u00e9plique a son propre StatefulSet. Cette solution pr\u00e9sente certains inconv\u00e9nients, mais pratiquement, elle encapsule compl\u00e8tement l'op\u00e9rateur. Et il y a de nombreux avantages. Nous pouvons construire compl\u00e8tement le type de cluster que nous voulons, par exemple compl\u00e8tement h\u00e9t\u00e9rog\u00e8ne. Ainsi, dans le cluster o\u00f9 nous avons deux shards avec une r\u00e9plique chacun, nous aurons 2 StatefulSets et 2 Pods pr\u00e9cis\u00e9ment parce que nous avons choisi cette approche en raison des raisons mentionn\u00e9es pr\u00e9c\u00e9demment pour la possibilit\u00e9 de construire un cluster h\u00e9t\u00e9rog\u00e8ne. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b7ae92a545f9bb6cc5f0136df87207f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Revenons \u00e0 des t\u00e2ches pratiques. Dans notre cluster, il est n\u00e9cessaire de configurer les utilisateurs, c'est-\u00e0-dire qu'il faut produire une certaine configuration de ClickHouse dans Kubernetes. L'op\u00e9rateur fournit toutes les possibilit\u00e9s \u00e0 cet \u00e9gard. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6a65aa78293c0b40230cf24efc58e55a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous pouvons directement \u00e9crire dans le YAML ce que nous voulons. Toutes les options de configuration se mappent directement depuis ce YAML vers les configs ClickHouse, qui sont ensuite r\u00e9parties dans tout le cluster.<\/p>\n<p><\/p>\n<p>Nous pouvons aussi \u00e9crire de cette mani\u00e8re. C'est juste un exemple. Le mot de passe peut \u00eatre chiffr\u00e9. Toutes les options de configuration de ClickHouse sont absolument support\u00e9es. C'est seulement un exemple. <\/p>\n<p><\/p>\n<p>La configuration du cluster est diffus\u00e9e sous forme de ConfigMap. En pratique, la mise \u00e0 jour de ConfigMap ne se fait pas instantan\u00e9ment, donc si le cluster est grand, le processus de propagation de la configuration prend un certain temps. Mais tout cela est tr\u00e8s pratique \u00e0 utiliser.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2e42d19d7a558e3b8d4bbb51fe5bd08b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous compliquons la t\u00e2che. Le cluster se d\u00e9veloppe. Nous voulons r\u00e9pliquer des donn\u00e9es. Autrement dit, nous avons d\u00e9j\u00e0 deux shards, avec une r\u00e9plique chacun, et les utilisateurs sont configur\u00e9s. Nous grandissons et souhaitons nous consacrer \u00e0 la r\u00e9plication.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c97e5e6ca9cb66d3a94fb8cfe610186.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Que nous faut-il pour la r\u00e9plication? <\/p>\n<p><\/p>\n<p>Nous avons besoin de ZooKeeper. Dans ClickHouse, la r\u00e9plication est construite en utilisant ZooKeeper. ZooKeeper est n\u00e9cessaire pour que diff\u00e9rentes r\u00e9pliques de ClickHouse aient un consensus sur les blocs de donn\u00e9es pr\u00e9sents dans chaque ClickHouse. <\/p>\n<p><\/p>\n<p>Vous pouvez utiliser n'importe quel ZooKeeper. Si l'entreprise dispose d'un ZooKeeper externe, il peut \u00eatre utilis\u00e9. Sinon, vous pouvez l'installer \u00e0 partir de notre r\u00e9f\u00e9rentiel. Il existe un installateur qui facilite tout cela. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6cc40951a19b982abf578836edf569d3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et le sch\u00e9ma d'interaction de l'ensemble du syst\u00e8me est le suivant. Nous avons Kubernetes comme plateforme. Sur celui-ci s'ex\u00e9cute l'op\u00e9rateur ClickHouse. J'ai repr\u00e9sent\u00e9 ZooKeeper ici. Et l'op\u00e9rateur interagit \u00e0 la fois avec ClickHouse et avec ZooKeeper. Cela signifie qu'il y a interaction. <\/p>\n<p><\/p>\n<p>Et tout cela est n\u00e9cessaire pour que ClickHouse puisse r\u00e9pliquer des donn\u00e9es avec succ\u00e8s dans k8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4fc37aee850acd20517fa3d7562f0165.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voyons maintenant la t\u00e2che elle-m\u00eame, la fa\u00e7on dont le manifeste de r\u00e9plication sera pr\u00e9sent\u00e9.<\/p>\n<p><\/p>\n<p>Nous ajoutons deux sections \u00e0 notre manifeste. La premi\u00e8re concerne la source de ZooKeeper, qui peut \u00eatre \u00e0 la fois interne \u00e0 Kubernetes ou externe. C'est juste une description. Et nous commandons des r\u00e9pliques. Autrement dit, nous voulons deux r\u00e9pliques. Au total, nous devrions avoir 4 pod. Nous nous souvenons que le stockage sera abord\u00e9 un peu plus tard. Le stockage est une histoire \u00e0 part. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb8c974d0587a4ad87d6ba36bbe5e3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'\u00e9tait comme \u00e7a.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/909ffd258dbce718ddf529a1a753de6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cela devient ainsi. Des r\u00e9pliques sont ajout\u00e9es. La quatri\u00e8me ne rentrait pas, nous croyons qu'il peut y en avoir beaucoup. Et sur le c\u00f4t\u00e9, ZooKeeper est ajout\u00e9. Les sch\u00e9mas se complexifient. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c33b37fc7fc72f51276e5e98b9ec2134.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il est temps d'ajouter la t\u00e2che suivante. Nous allons ajouter un stockage persistant. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f28d14901a713eca413a52ec6ea21ac5.jpeg\" style=\"display:block;margin: 0 auto;\" \/>Pour le stockage persistant, nous avons diff\u00e9rentes options d'impl\u00e9mentation.<\/p>\n<p><\/p>\n<p>Dans le cas o\u00f9 nous nous ex\u00e9cutons chez un fournisseur cloud, par exemple, en utilisant Amazon, Google, il y a une grande tentation d'utiliser un stockage cloud. C'est tr\u00e8s pratique, c'est bon. <\/p>\n<p><\/p>\n<p>Et il y a une deuxi\u00e8me option. C'est pour le stockage local, lorsque nous avons des disques locaux sur chaque n\u0153ud. Cette option est beaucoup plus complexe \u00e0 ex\u00e9cuter, mais elle est plus performante. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/483ee5c08b62e987620bf54fd32a44b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voyons ce que nous avons concernant le stockage cloud.<\/p>\n<p><\/p>\n<p>Il y a des avantages. C'est tr\u00e8s simple \u00e0 configurer. Nous commandons simplement \u00e0 notre fournisseur cloud de nous donner, s'il vous pla\u00eet, un stockage de telle capacit\u00e9, de telle classe. Les classes sont d\u00e9finies par les fournisseurs eux-m\u00eames. <\/p>\n<p><\/p>\n<p>Il y a un inconv\u00e9nient. Pour certains, cela n'est pas critique. Bien s\u00fbr, il y aura des probl\u00e8mes de performance. C'est tr\u00e8s pratique au travail, fiable, mais il existe certaines baisses de performance potentielles.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8e82430b64477f91640078ff4eacb47e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et comme ClickHouse met l'accent sur la performance, on peut m\u00eame dire qu'il extrait le maximum possible, c'est pourquoi de nombreux clients essaient d'optimiser leurs performances.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8638fe37b848a98ce8326218d368baa3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pour tirer le meilleur parti, nous avons besoin d'un stockage local.<\/p>\n<p><\/p>\n<p>Kubernetes fournit trois abstractions pour utiliser le stockage local. Ce sont : <\/p>\n<p><\/p>\n<ul>\n<li>EmptyDir<\/li>\n<li>HostPath.<\/li>\n<li>Local<\/li>\n<\/ul>\n<p><\/p>\n<p>Consid\u00e9rons comment ils diff\u00e8rent et se ressemblent. <\/p>\n<p><\/p>\n<p>Tout d'abord, dans les trois approches, le stockage est constitu\u00e9 de disques locaux situ\u00e9s sur le m\u00eame n\u0153ud physique Kubernetes. Mais ils ont certaines diff\u00e9rences.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79afb620a0c9a1552b47240b405fedc9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Commen\u00e7ons par le plus simple, c'est-\u00e0-dire emptyDir. Qu'est-ce que c'est en pratique ? C'est quand dans notre sp\u00e9cification, nous demandons au syst\u00e8me de conteneurisation (la plupart du temps, c'est Docker) de nous donner acc\u00e8s \u00e0 un dossier sur le disque local.<\/p>\n<p><\/p>\n<p>En pratique, Docker cr\u00e9e quelque part, sur ses propres chemins, un dossier temporaire, le nommant avec un long hachage. Et il fournit une interface d'acc\u00e8s \u00e0 celui-ci. <\/p>\n<p><\/p>\n<p>Comment cela fonctionnera-t-il en termes de performance ? Cela fonctionnera \u00e0 la vitesse du disque local, c'est-\u00e0-dire que c'est un acc\u00e8s complet \u00e0 votre disque. <\/p>\n<p><\/p>\n<p>Mais cela a son inconv\u00e9nient. La persistance est assez douteuse dans ce cas. \u00c0 la premi\u00e8re action de Docker avec des conteneurs, la persistance est perdue. Si Kubernetes d\u00e9cide pour une raison quelconque de d\u00e9placer ce Pod sur un autre disque, les donn\u00e9es seront perdues. <\/p>\n<p><\/p>\n<p>Cette approche est bonne pour les tests, car elle montre d\u00e9j\u00e0 une vitesse satisfaisante, mais pour quelque chose de s\u00e9rieux, cette option n'est pas ad\u00e9quate. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0b60f80fc9ea0e2c1820021bcd9e1382.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'est pourquoi il existe une deuxi\u00e8me approche. C'est le hostPath. Si nous regardons les diapositives pr\u00e9c\u00e9dentes et celle-ci, nous pouvons voir une seule diff\u00e9rence. Notre dossier a \u00e9t\u00e9 d\u00e9plac\u00e9 du Docker vers le n\u0153ud Kubernetes. C'est un peu plus simple. Nous inscrivons directement le chemin dans le syst\u00e8me de fichiers local o\u00f9 nous souhaitons stocker nos donn\u00e9es. <\/p>\n<p><\/p>\n<p>Ce moyen pr\u00e9sente des avantages. C'est une v\u00e9ritable persistance, et en plus, c'est classique. Les donn\u00e9es seront enregistr\u00e9es sur le disque \u00e0 une certaine adresse. <\/p>\n<p><\/p>\n<p>Il y a aussi des inconv\u00e9nients. C'est la complexit\u00e9 de la gestion. Notre Kubernetes peut vouloir d\u00e9placer un Pod vers un autre n\u0153ud physique. Et c'est l\u00e0 qu'intervient DevOps. Il doit bien expliquer \u00e0 tout le syst\u00e8me que ces Pods ne peuvent \u00eatre d\u00e9plac\u00e9s que sur des n\u0153uds o\u00f9 tu as quelque chose mont\u00e9 sur ces chemins, et pas plus d'un n\u0153ud \u00e0 la fois. C'est assez compliqu\u00e9. <\/p>\n<p><\/p>\n<p>Sp\u00e9cifiquement pour ces besoins, nous avons cr\u00e9\u00e9 des mod\u00e8les chez notre op\u00e9rateur pour cacher toute cette complexit\u00e9. On pouvait simplement dire : \u00ab Je veux qu'il y ait une instance de ClickHouse sur chaque n\u0153ud physique et sur tel chemin \u00bb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f64c19bccc8b187d6af112eda896b25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais ce besoin n'est pas seulement le n\u00f4tre, donc les messieurs de Kubernetes comprennent aussi que les gens veulent acc\u00e9der aux disques physiques, c'est pourquoi ils offrent un troisi\u00e8me niveau.<\/p>\n<p><\/p>\n<p>Cela s'appelle local. La diff\u00e9rence avec la diapositive pr\u00e9c\u00e9dente est pratiquement nulle. Auparavant, il fallait le faire manuellement, dire que ces Pods ne peuvent pas \u00eatre d\u00e9plac\u00e9s d'un n\u0153ud \u00e0 un autre, parce qu'ils doivent \u00eatre attach\u00e9s \u00e0 un chemin sp\u00e9cifique d'un disque physique local, et maintenant toutes ces connaissances sont encapsul\u00e9es dans Kubernetes lui-m\u00eame. Et donc, c'est beaucoup plus facile \u00e0 configurer.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/140c43be34dd7015c0bf4cfd0a0bb384.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Revenons \u00e0 notre t\u00e2che pratique. Revenons au mod\u00e8le YAML. Ici, nous avons un vrai stockage. Nous sommes revenus \u00e0 cela. Nous d\u00e9finissons un mod\u00e8le classique VolumeClaim comme dans k8s. Et nous d\u00e9crivons quel stockage nous voulons.<\/p>\n<p><\/p>\n<p>Apr\u00e8s cela, k8s demandera du stockage. Il nous en attribuera dans le StatefulSet. Et finalement, cela sera \u00e0 la disposition de ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/960e666486ed09cebd83235d43f83970.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avions un sch\u00e9ma comme ceci. Notre stockage persistant \u00e9tait rouge, ce qui sugg\u00e9rait qu'il fallait le faire. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a989df489e3a9fef6a4fbf7b93c489a6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et il devient vert. Maintenant, le sch\u00e9ma du cluster ClickHouse sur k8s est compl\u00e8tement finalis\u00e9. Nous avons des shards, des r\u00e9pliques, ZooKeeper, il y a un vrai persistant, r\u00e9alis\u00e9 d'une mani\u00e8re ou d'une autre. Le sch\u00e9ma est d\u00e9j\u00e0 enti\u00e8rement op\u00e9rationnel. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c409ee5da6309a67904394d968ed4906.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nouscontinuons \u00e0 avancer. Notre cluster \u00e9volue. Et Alexey s'efforce, il sort une nouvelle version de ClickHouse.<\/p>\n<p><\/p>\n<p>Une t\u00e2che pratique se pose - tester la nouvelle version de ClickHouse sur notre cluster. \u00c9videmment, on ne veut pas tout mettre \u00e0 jour, on veut peut-\u00eatre installer la nouvelle version dans un coin \u00e9loign\u00e9 sur une r\u00e9plique, ou peut-\u00eatre pas une nouvelle version, mais deux, car elles sortent fr\u00e9quemment. <\/p>\n<p><\/p>\n<p>Que pouvons-nous en dire ?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48ed52d393d977d0cfaa9320bd02ed1e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ici, nous avons justement cette possibilit\u00e9. Ce sont des mod\u00e8les de pod. On peut d\u00e9tailler comment notre op\u00e9rateur permet de construire un cluster h\u00e9t\u00e9rog\u00e8ne. C\u2019est-\u00e0-dire configur\u00e9, allant de toutes les r\u00e9pliques en tas, jusqu'\u00e0 chaque r\u00e9plique personnelle, avec quelle version de ClickHouse nous souhaitons, quelle version de stockage nous voulons. Nous pouvons compl\u00e8tement configurer un cluster de cette configuration comme nous en avons besoin. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4949ecd8119cb4ec0f4bad9bf27fa74e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous allons maintenant approfondir un peu. Auparavant, nous avons parl\u00e9 du fonctionnement de l'op\u00e9rateur ClickHouse en relation avec la sp\u00e9cificit\u00e9 de ClickHouse.<\/p>\n<p><\/p>\n<p>Maintenant, j'aimerais dire quelques mots sur le fonctionnement de n'importe quel op\u00e9rateur, ainsi que sur la mani\u00e8re dont il interagit avec K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ca9c2a23c54b2a81ac0a8bba88d5e65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Commen\u00e7ons par examiner l'interaction avec K8s. Que se passe-t-il lorsque nous faisons un kubectl apply ? Nos objets apparaissent via l'API dans etcd. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b9eaedeb0f34d10398ba0187f09fef9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Par exemple, les objets de base de Kubernetes : pod, StatefulSet, service, etc. <\/p>\n<p><\/p>\n<p>\u00c0 ce stade, rien de physique ne se produit encore. Ces objets doivent \u00eatre mat\u00e9rialis\u00e9s dans le cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3c49dc1b0067347d5fc415ef9b87642d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pour cela, un contr\u00f4leur appara\u00eet. Le contr\u00f4leur est un composant sp\u00e9cial de k8s qui sait comment mat\u00e9rialiser ces descriptions. Il sait comment et ce qu'il faut faire physiquement. Il sait comment ex\u00e9cuter des conteneurs, ce qu'il faut configurer pour que le serveur fonctionne. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d951eb0f7bacf519566b0ef6cf9bc100.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et il mat\u00e9rialise nos objets dans K8s.<\/p>\n<p><\/p>\n<p>Mais nous voulons op\u00e9rer non seulement avec des pods et des StatefulSets, nous voulons cr\u00e9er une ClickHouseInstallation, c'est-\u00e0-dire un objet de type ClickHouse, pour l'op\u00e9rer comme un tout. Pour l'instant, cette possibilit\u00e9 n'existe pas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1594921ac5dd9384ce81ceae92f5cda9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais K8s a une autre chose sympa. Nous souhaitons qu'il y ait quelque part cette entit\u00e9 complexe, qui serait constitu\u00e9e de pods et de StatefulSets pour notre cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/04f86706f506fa91e365d45537dd9def.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et que faut-il faire pour cela ? Tout d'abord, la Custom Resource Definition entre en jeu. Qu'est-ce que c'est ? C'est une description pour K8s indiquant que vous aurez un autre type de donn\u00e9es, que nous souhaitons ajouter une ressource personnalis\u00e9e complexe aux pods et StatefulSets. C'est une description de la structure des donn\u00e9es. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f02ae12ef3ab5db974234b14e38792ac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous l'envoyons \u00e9galement via kubectl apply. Kubernetes l'a joyeusement accept\u00e9. <\/p>\n<p><\/p>\n<p>Et maintenant, nous avons dans le stockage, dans l'objet dans etcd, la possibilit\u00e9 d'enregistrer une ressource personnalis\u00e9e appel\u00e9e ClickHouseInstallation.<\/p>\n<p><\/p>\n<p>Mais pour l'instant, rien d'autre ne se produira. C'est-\u00e0-dire que si nous cr\u00e9ons maintenant un fichier YAML que nous avons examin\u00e9, contenant la description des shards, des r\u00e9pliques, et que nous ex\u00e9cutons \u00ab kubectl apply \u00bb, Kubernetes l'acceptera, le mettra dans etcd et dira : \u00ab Tr\u00e8s bien, mais je ne sais pas quoi en faire. Je ne sais pas comment g\u00e9rer ClickHouseInstallation. \u00bb <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7c2f9f3f81b83c987a3bd72a881d0d91.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Par cons\u00e9quent, nous avons besoin de quelqu'un pour aider Kubernetes \u00e0 g\u00e9rer un nouveau type de donn\u00e9es. \u00c0 gauche, nous avons le contr\u00f4leur Kubernetes par d\u00e9faut, qui travaille avec des types de donn\u00e9es standard. \u00c0 droite, nous devrions avoir un contr\u00f4leur personnalis\u00e9 qui sait travailler avec des types de donn\u00e9es personnalis\u00e9s. <\/p>\n<p><\/p>\n<p>Et autrement dit, cela s'appelle un op\u00e9rateur. Je l'ai ici sp\u00e9cifiquement mis en dehors de Kubernetes, car il peut fonctionner en dehors de K8s. Le plus souvent, tous les op\u00e9rateurs fonctionnent dans Kubernetes, mais rien ne l'emp\u00eache de fonctionner \u00e0 l'ext\u00e9rieur, c'est pourquoi il est sp\u00e9cifiquement mis \u00e0 l'ext\u00e9rieur ici. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7aa3a1b67d0def5ba752dff56baeebbf.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et d\u00e9j\u00e0 \u00e0 son tour, le contr\u00f4leur personnalis\u00e9, aussi appel\u00e9 op\u00e9rateur, interagit avec Kubernetes via l'API. Il sait d\u00e9j\u00e0 interagir avec l'API. Et il sait d\u00e9j\u00e0 comment mat\u00e9rialiser un sch\u00e9ma complexe \u00e0 partir d'une ressource personnalis\u00e9e que nous voulons cr\u00e9er. C'est pr\u00e9cis\u00e9ment ce que fait l'op\u00e9rateur. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a5f773ddc3663f24d5379955da9c3037.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Comment fonctionne un op\u00e9rateur ? Regardons la partie droite pour savoir comment il fait cela. D\u00e9couvrons comment l'op\u00e9rateur mat\u00e9rialise tout cela et comment se d\u00e9roule ensuite l'interaction avec K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/08a8d8dbcb35117a0eb3320589c6ff8d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'op\u00e9rateur est un programme. Il est orient\u00e9 \u00e9v\u00e9nements. L'op\u00e9rateur s'abonne aux \u00e9v\u00e9nements via l'API Kubernetes. Dans l'API Kubernetes, il existe des points d'entr\u00e9e o\u00f9 l'on peut s'abonner aux \u00e9v\u00e9nements. Et si quelque chose change dans K8s, Kubernetes envoie des \u00e9v\u00e9nements \u00e0 tous ceux qui le souhaitent, c'est-\u00e0-dire que ceux qui se sont abonn\u00e9s \u00e0 ce point API recevront des notifications.<\/p>\n<p><\/p>\n<p>L'op\u00e9rateur s'abonne aux \u00e9v\u00e9nements et doit effectuer une certaine r\u00e9action. Sa t\u00e2che est de r\u00e9agir aux \u00e9v\u00e9nements qui apparaissent. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f0664a4151e6e7f6f8575a3e54372e9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Les \u00e9v\u00e9nements sont g\u00e9n\u00e9r\u00e9s par certaines mises \u00e0 jour. Notre fichier YAML avec la description de ClickHouseInstallation arrive. Il passe par kubectl apply et va dans etcd. Un \u00e9v\u00e9nement a alors \u00e9t\u00e9 d\u00e9clench\u00e9, et cet \u00e9v\u00e9nement est finalement arriv\u00e9 au ClickHouse-operator. L'op\u00e9rateur a re\u00e7u cette description. Et il doit faire quelque chose. Si une mise \u00e0 jour de l'objet ClickHouseInstallation arrive, il faut mettre \u00e0 jour le cluster. Et la t\u00e2che de l'op\u00e9rateur est de mettre \u00e0 jour le cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0952bdd391a72aa15bf66af4ce69f4af.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Que fait-il ? Tout d'abord, il faut \u00e9tablir un plan d'action pour d\u00e9terminer ce que nous allons faire avec cette mise \u00e0 jour. Les mises \u00e0 jour peuvent \u00eatre tr\u00e8s petites, c'est-\u00e0-dire de petites ex\u00e9cutions YAML, mais elles peuvent entra\u00eener des changements tr\u00e8s importants dans le cluster. Par cons\u00e9quent, l'op\u00e9rateur cr\u00e9e un plan et s'y tient ensuite.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79caaa43b6fd9f3e2eb1afe44ecb2df9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il commence \u00e0 travailler en conformit\u00e9 avec ce plan pour mat\u00e9rialiser les pod, les services, c'est-\u00e0-dire pour faire ce qui est sa t\u00e2che principale. C'est comme construire un cluster ClickHouse dans Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e91576a26d6b758a68ae0b35cbe01897.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00e9sormais, abordons une question int\u00e9ressante. Il s'agit de la r\u00e9partition des responsabilit\u00e9s entre Kubernetes et l'op\u00e9rateur, c'est-\u00e0-dire ce que fait Kubernetes, ce que fait l'op\u00e9rateur et comment ils interagissent entre eux. <\/p>\n<p><\/p>\n<p>Kubernetes s'occupe des \u00e9l\u00e9ments syst\u00e8me, c'est-\u00e0-dire du jeu d'objets de base qui peut \u00eatre interpr\u00e9t\u00e9 comme un ensemble \u00e0 port\u00e9e syst\u00e8me. Kubernetes sait comment lancer des pod, red\u00e9marrer des conteneurs, monter des volumes, travailler avec ConfigMap, c'est-\u00e0-dire tout ce qui peut \u00eatre qualifi\u00e9 de syst\u00e8me. <\/p>\n<p><\/p>\n<p>Les op\u00e9rateurs op\u00e8rent dans des domaines d'application. Chaque op\u00e9rateur est con\u00e7u pour son domaine d'application. Nous avons cr\u00e9\u00e9 celui pour ClickHouse.<\/p>\n<p><\/p>\n<p>Et l'op\u00e9rateur interagit pr\u00e9cis\u00e9ment dans les termes du domaine d'application, tels que l'ajout d'une r\u00e9plique, la cr\u00e9ation d'un sch\u00e9ma, la configuration de la surveillance. Il en r\u00e9sulte une telle r\u00e9partition.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9dc07d9c29d5dfd538343aadb751e4c0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Examinons un exemple pratique de la fa\u00e7on dont cette r\u00e9partition des responsabilit\u00e9s se produit lorsque nous effectuons l'action d'ajout d'une r\u00e9plique. <\/p>\n<p><\/p>\n<p>L'op\u00e9rateur re\u00e7oit la t\u00e2che d'ajouter une r\u00e9plique. Que fait-il ? L'op\u00e9rateur calcule qu'il faut cr\u00e9er un nouveau StatefulSet, dans lequel il doit d\u00e9crire certains mod\u00e8les et les r\u00e9clamations de volumes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7a31f2f76a3bdda87e4bccf0e04fe4a8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il pr\u00e9pare tout cela et le transmet ensuite \u00e0 K8s. Il indique qu'il a besoin d'une ConfigMap, d'un StatefulSet, d'un Volume. Kubernetes ex\u00e9cute cela. Il mat\u00e9rialise les unit\u00e9s de base avec lesquelles il fonctionne. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2be6892234cc12b056962265c13dba07.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et ensuite, le ClickHouse-operator entre \u00e0 nouveau en jeu. Il a d\u00e9j\u00e0 un pod physique sur lequel il peut travailler. Et le ClickHouse-operator travaille \u00e0 nouveau dans les termes du domaine d'application. C'est-\u00e0-dire que pour inclure une r\u00e9plique dans le cluster ClickHouse, il faut d'abord configurer le sch\u00e9ma de donn\u00e9es existant dans ce cluster. Deuxi\u00e8mement, cette r\u00e9plique doit \u00eatre int\u00e9gr\u00e9e dans la surveillance afin d'\u00eatre bien suivie. L'op\u00e9rateur s'en occupe d\u00e9j\u00e0. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/790616342b98b347fa67e0100754c8b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et ce n'est qu'ensuite que ClickHouse entre en jeu, c'est-\u00e0-dire une autre entit\u00e9 de niveau sup\u00e9rieur. C'est d\u00e9j\u00e0 une base de donn\u00e9es. Elle dispose de sa propre instance, d'une nouvelle r\u00e9plique configur\u00e9e, pr\u00eate \u00e0 rejoindre le cluster.<\/p>\n<p><\/p>\n<p>On obtient une cha\u00eene d'ex\u00e9cution et de r\u00e9partition des responsabilit\u00e9s lors de l'ajout d'une r\u00e9plique qui est assez longue.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ec79cfa2b45fadbe25f4d9fe8d2ec5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Continuons nos t\u00e2ches pratiques. Si le cluster existe d\u00e9j\u00e0, il est possible d'effectuer la migration de la configuration. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a52aee0d4350b8da00cdb4b525df80ad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avons fait en sorte que dans le XML existant, que ClickHouse comprend, on puisse passer \u00e0 travers.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/91abb1d3b0a14f2118361403a74e14c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il est possible de faire un r\u00e9glage fin de ClickHouse. En fait, le d\u00e9ploiement zon\u00e9 est ce dont j'ai parl\u00e9 en expliquant hostPath, le stockage local. C'est comment r\u00e9aliser correctement un d\u00e9ploiement zon\u00e9.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fde502f30223e04a918f4fd598c3dd9f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La prochaine t\u00e2che pratique concerne la surveillance.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4e685fba7883075105c0164a778c51e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si notre cluster change, il est n\u00e9cessaire de configurer p\u00e9riodiquement la surveillance. <\/p>\n<p><\/p>\n<p>Examinons le sch\u00e9ma. Nous avons d\u00e9j\u00e0 \u00e9tudi\u00e9 les fl\u00e8ches vertes ici. Maintenant, regardons les fl\u00e8ches rouges. C'est ainsi que nous voulons surveiller notre cluster. Comment les m\u00e9triques du cluster ClickHouse vont dans Prometheus, puis dans Grafana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1210c1423f99d48a20e06e855bf48a72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quelle est la difficult\u00e9 li\u00e9e \u00e0 la surveillance ? Pourquoi cela est-il consid\u00e9r\u00e9 comme un accomplissement ? La complexit\u00e9 r\u00e9side dans la dynamique. Lorsque nous avons un cluster unique et qu'il est statique, il est possible de configurer une fois pour toutes la surveillance et de ne plus s'en pr\u00e9occuper.<\/p>\n<p><\/p>\n<p>Mais si nous avons plusieurs clusters, ou si quelque chose change constamment, le processus devient dynamique. Et s'occuper en permanence de la reconfiguration de la surveillance est une perte de ressources et de temps, c'est-\u00e0-dire m\u00eame simplement de l'ennui. Il faut automatiser cela. La complexit\u00e9 r\u00e9side pr\u00e9cis\u00e9ment dans la dynamique du processus. Et l'op\u00e9rateur l'automatise tr\u00e8s bien. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48a7264f1228671e0c483c8211a71eb3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Comment notre cluster a-t-il \u00e9volu\u00e9 ? Au d\u00e9but, il \u00e9tait comme \u00e7a.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8a8c7b6cd5562deb315368e1e8e1c976.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ensuite, il est devenu comme \u00e7a.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1a3e915fbadf3aa5f3b33d337f36e76e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Au final, il est devenu comme \u00e7a. <\/p>\n<p><\/p>\n<p>Et la surveillance est automatiquement effectu\u00e9e par l'op\u00e9rateur. Un point d'entr\u00e9e unique. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e079e65bf8deff43a81d8ffde938a709.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous regardons simplement dans le tableau de bord Grafana pour voir comment la vie de notre cluster s'anime \u00e0 l'int\u00e9rieur. <\/p>\n<p><\/p>\n<p>Au fait, le tableau de bord Grafana est \u00e9galement distribu\u00e9 avec notre op\u00e9rateur directement dans le code source. Vous pouvez le connecter et l'utiliser. Ce screenshot m'a \u00e9t\u00e9 donn\u00e9 par nos DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ad1c2899dd845d0ba4185bdf758468c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O\u00f9 voudrions-nous avancer ? C'est :<\/p>\n<p><\/p>\n<ul>\n<li>D\u00e9velopper l'automatisation des tests. L'objectif principal est le test automatis\u00e9 des nouvelles versions. <\/li>\n<li>Nous voulons \u00e9galement automatiser l'int\u00e9gration avec ZooKeeper. Et nous pr\u00e9voyons de nous int\u00e9grer avec ZooKeeper-operator. C'est-\u00e0-dire qu'un op\u00e9rateur a \u00e9t\u00e9 \u00e9crit pour ZooKeeper et il est logique que les deux op\u00e9rateurs commencent \u00e0 s'int\u00e9grer pour cr\u00e9er une solution plus conviviale. <\/li>\n<li>Nous souhaitons effectuer des contr\u00f4les de sant\u00e9 plus complexes. <\/li>\n<li>En vert, j'ai soulign\u00e9 que nous avons l'h\u00e9ritage des Templates en cours - FAIT, c'est-\u00e0-dire qu'avec la prochaine version de l'op\u00e9rateur, nous aurons d\u00e9j\u00e0 l'h\u00e9ritage des mod\u00e8les. C'est un outil puissant qui permet de construire des configurations complexes \u00e0 partir de morceaux. <\/li>\n<li>Et nous voulons automatiser des t\u00e2ches complexes. La principale est le Re-sharding. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f232c0aab389be5069e5c7886e265c01.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Faisons le point interm\u00e9diaire. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/62f7814994af0441ba5a82de4e9780d7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qu'obtenons-nous \u00e0 la sortie ? Et vaut-il la peine de s'en occuper ou non ? Devons-nous vraiment essayer d'int\u00e9grer la base de donn\u00e9es dans Kubernetes et d'appliquer l'op\u00e9rateur en g\u00e9n\u00e9ral, et l'op\u00e9rateur Alitnity en particulier ?<\/p>\n<p><\/p>\n<p>\u00c0 la sortie, nous obtenons :<\/p>\n<p><\/p>\n<ul>\n<li>Une simplification significative et une automatisation de la configuration, du d\u00e9ploiement, ainsi que du support. <\/li>\n<li>Surveillance int\u00e9gr\u00e9e imm\u00e9diatement. <\/li>\n<li>Et des mod\u00e8les codifi\u00e9s pr\u00eats \u00e0 l'emploi pour des situations complexes. Il n'est plus n\u00e9cessaire d'ajouter une r\u00e9plique manuellement. Cela est g\u00e9r\u00e9 par l'op\u00e9rateur. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/aebccd7a2dc55f14645f79f89f7b7458.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il reste une derni\u00e8re question. Nous avons d\u00e9j\u00e0 une base de donn\u00e9es dans Kubernetes, de la virtualisation. Quelle est la performance de cette solution, surtout en tenant compte du fait que ClickHouse est optimis\u00e9 pour la performance ?<\/p>\n<p><\/p>\n<p>La r\u00e9ponse - tout est normal ! Je ne vais pas d\u00e9tailler cela, c'est un sujet pour une pr\u00e9sentation s\u00e9par\u00e9e. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ffc230941f0ae24926186db4d8d68ade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais il existe un projet, appel\u00e9 TSBS. Quel est son objectif principal ? C'est un test de bases de donn\u00e9es pour la performance. C'est une tentative de comparer le chaud avec le chaud, le doux avec le doux. <\/p>\n<p><\/p>\n<p>Comment cela fonctionne-t-il ? Un ensemble de donn\u00e9es est g\u00e9n\u00e9r\u00e9. Ensuite, cet ensemble de donn\u00e9es est ex\u00e9cut\u00e9 sur le m\u00eame ensemble de tests sur diff\u00e9rentes bases de donn\u00e9es. Chaque base de donn\u00e9es r\u00e9sout un probl\u00e8me comme elle sait le faire. Et ensuite, les r\u00e9sultats peuvent \u00eatre compar\u00e9s. <\/p>\n<p><\/p>\n<p>Il prend d\u00e9j\u00e0 en charge un grand nombre de bases de donn\u00e9es. J'ai mis en avant trois principales. Ce sont :<\/p>\n<p><\/p>\n<ul>\n<li>TimescaleDB.<\/li>\n<li>InfluxDB.<\/li>\n<li>ClickHouse.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5b4733534a4e6e36fb7788127adc6e86.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Une comparaison a \u00e9galement \u00e9t\u00e9 men\u00e9e avec une autre solution similaire. Une comparaison avec RedShift. La comparaison a \u00e9t\u00e9 faite sur Amazon. ClickHouse devance \u00e9galement tous dans ce domaine. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/44cc8dedc07a02fe1ed5aad3e17a579c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Que peut-on conclure de ce que je viens de dire ?<\/p>\n<p><\/p>\n<ul>\n<li>Il est possible d'utiliser une base de donn\u00e9es dans Kubernetes. Peut-\u00eatre que n'importe quelle base de donn\u00e9es est utilisable, mais globalement, cela semble possible. Il est certainement possible d'utiliser ClickHouse dans Kubernetes gr\u00e2ce \u00e0 notre op\u00e9rateur. <\/li>\n<li>L'op\u00e9rateur aide \u00e0 automatiser les processus et rend la vie vraiment plus simple.<\/li>\n<li>La performance est correcte.<\/li>\n<li>Et il nous semble que cela peut et doit \u00eatre utilis\u00e9. <\/li>\n<\/ul>\n<p><\/p>\n<p>Open source \u2013 rejoignez-nous !<\/p>\n<p><\/p>\n<p>Comme je l'ai d\u00e9j\u00e0 mentionn\u00e9, l'op\u00e9rateur est un produit enti\u00e8rement open source, donc ce serait formidable si le plus grand nombre de personnes possible l'utilisait. Rejoignez-nous ! Nous vous attendons tous !<\/p>\n<p><\/p>\n<p>Merci \u00e0 tous !<\/p>\n<p><\/p>\n<p>Questions<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Op\u00e9rateur dans Kubernetes pour g\u00e9rer des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4afe8b10c4f103c2a9a295511e4eb69a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Merci pour la pr\u00e9sentation ! Je m'appelle Anton. Je viens de l'entreprise SEMrush. Je suis curieux de savoir ce qu'il en est de la journalisation. On entend parler de surveillance, mais pas de journalisation, quand on parle de tout le cluster. Par exemple, nous avons install\u00e9 un cluster sur du mat\u00e9riel. Et nous utilisons la journalisation centralis\u00e9e, en rassemblant les donn\u00e9es avec des outils standard dans un tout commun. Et puis nous en extrayons les donn\u00e9es qui nous int\u00e9ressent.<\/em> <\/p>\n<p><\/p>\n<p>C'est une bonne question, c'est-\u00e0-dire que la journalisation figure sur la liste des choses \u00e0 faire. Pour l'instant, notre op\u00e9rateur ne l'automatise pas. Il est encore en d\u00e9veloppement, le projet est encore assez jeune. Nous comprenons la n\u00e9cessit\u00e9 de la journalisation. C'est aussi un sujet tr\u00e8s important. Et il est probablement tout aussi crucial que la surveillance. Mais la surveillance \u00e9tait en t\u00eate de liste pour la mise en \u0153uvre. La journalisation viendra. Nous essayons \u00e9videmment d'automatiser tous les aspects de la vie du cluster. Donc, la r\u00e9ponse est qu'\u00e0 l'heure actuelle, l'op\u00e9rateur ne peut malheureusement pas le faire, mais c'est pr\u00e9vu, nous allons le faire. Si vous avez envie de participer, n'h\u00e9sitez pas \u00e0 faire un pull request.<\/p>\n<p><\/p>\n<p><em>Bonjour ! Merci pour la pr\u00e9sentation ! J'ai une question standard li\u00e9e aux Persistent Volumes. Lorsque nous cr\u00e9ons une configuration avec cet op\u00e9rateur, comment l'op\u00e9rateur d\u00e9termine-t-il sur quel n\u0153ud un disque ou un dossier est mont\u00e9 ? Devons-nous lui expliquer au pr\u00e9alable, s'il vous pla\u00eet, de placer notre ClickHouse uniquement sur ces n\u0153uds o\u00f9 il y a un disque ?<\/em><\/p>\n<p><\/p>\n<p>D'apr\u00e8s ce que je comprends, cette question est une prolongation du stockage local, en particulier de la partie sur hostPath. C'est comme expliquer \u00e0 tout le syst\u00e8me qu'il faut que le pod soit lanc\u00e9 pr\u00e9cis\u00e9ment sur un n\u0153ud o\u00f9 nous avons un disque connect\u00e9s physiquement qui est mont\u00e9 \u00e0 un certain chemin. C'est un sujet que j'ai abord\u00e9 tr\u00e8s superficiellement, car la r\u00e9ponse est assez longue. <\/p>\n<p><\/p>\n<p>En r\u00e9sum\u00e9, cela ressemble \u00e0 ceci. Bien s\u00fbr, nous devons effectuer le provisioning de ces volumes. \u00c0 l'heure actuelle, il n'y a pas de provisioning dynamique dans le stockage local, donc les DevOps doivent d\u00e9couper les disques eux-m\u00eames, ces volumes. Ils doivent expliquer \u00e0 Kubernetes le provisioning, que vous aurez des volumes persistants d'une certaine classe, qui se trouvent sur certains n\u0153uds. Ensuite, il faudra expliquer \u00e0 Kubernetes que les pods qui exigent une certaine classe de stockage local doivent \u00eatre programm\u00e9s uniquement sur certains n\u0153uds selon les labels. Pour ces objectifs, l'op\u00e9rateur a la possibilit\u00e9 d'assigner un certain label et un par instance h\u00f4te. Ainsi, il en r\u00e9sultera que les pods seront rout\u00e9s par Kubernetes pour ne s'ex\u00e9cuter que sur des n\u0153uds r\u00e9pondant aux exigences, en termes de labels, pour parler simplement. Les administrateurs attribuent des labels et effectuent le provisioning des disques manuellement. Ainsi, cela se dimensionne.<\/p>\n<p><\/p>\n<p>Et justement, la troisi\u00e8me option locale aide \u00e0 faciliter cela. Comme je l'ai soulign\u00e9, c'est un travail minutieux de configuration, qui aide \u00e0 obtenir des performances maximales en sortie.<\/p>\n<p><\/p>\n<p><em>J'ai une deuxi\u00e8me question \u00e0 ce sujet. Kubernetes a \u00e9t\u00e9 con\u00e7u de mani\u00e8re \u00e0 ce que la perte d'un n\u0153ud ne soit pas un probl\u00e8me pour nous. Que faire si nous perdons le n\u0153ud o\u00f9 se trouve notre shard ?<\/em><\/p>\n<p><\/p>\n<p>Oui, Kubernetes \u00e9tait initialement positionn\u00e9 de sorte que notre relation avec nos pods soit celle du b\u00e9tail, mais ici, chaque disque devient quelque chose comme un animal de compagnie. Il y a un probl\u00e8me, c'est que nous ne pouvons pas simplement les jeter. L'\u00e9volution de Kubernetes va dans le sens o\u00f9 il n'est pas possible de traiter cela de mani\u00e8re totalement philosophique, comme s'il s'agissait de ressources compl\u00e8tement interchangeables.<\/p>\n<p><\/p>\n<p>Maintenant, une question pratique. Que faire si vous avez perdu le n\u0153ud sur lequel se trouvait le disque ? Ici, le probl\u00e8me doit \u00eatre r\u00e9solu \u00e0 un niveau sup\u00e9rieur. Dans le cas de ClickHouse, nous avons des r\u00e9pliques qui fonctionnent \u00e0 un niveau sup\u00e9rieur, c'est-\u00e0-dire au niveau de ClickHouse.<\/p>\n<p><\/p>\n<p>Quelle est donc la disposition ? C'est \u00e0 DevOps que revient la responsabilit\u00e9 de ne pas perdre les donn\u00e9es. Ils doivent correctement configurer la r\u00e9plication et veiller \u00e0 ce que celle-ci s'ex\u00e9cute. Les donn\u00e9es doivent \u00eatre dupliqu\u00e9es dans la r\u00e9plique au niveau de ClickHouse. Ce n'est pas la t\u00e2che d'un op\u00e9rateur. Et ce n'est pas non plus la t\u00e2che de Kubernetes lui-m\u00eame. C'est au niveau de ClickHouse.<\/p>\n<p><\/p>\n<p>Que faire si vous avez un n\u0153ud physique qui a \u00e9chou\u00e9 ? Il faudra en installer un second, et correctement y provisionner un disque, appliquer des labels. Apr\u00e8s cela, il r\u00e9pondra aux exigences permettant \u00e0 Kubernetes de lancer une instance de pod dessus. Kubernetes l'initialisera. Vous avez en effet un nombre de pods insuffisant pour atteindre l'objectif. Cela passera par le cycle que j'ai montr\u00e9. Et au plus haut niveau, ClickHouse comprendra qu'une r\u00e9plique est entr\u00e9e, qu'elle est encore vide et qu'il faut commencer \u00e0 y transf\u00e9rer des donn\u00e9es. Ce processus est encore mal automatis\u00e9. <\/p>\n<p><\/p>\n<p><em>Merci pour votre pr\u00e9sentation ! Lorsque des incidents se produisent, que l'op\u00e9rateur tombe et red\u00e9marre, tout en recevant des \u00e9v\u00e9nements, comment traitez-vous cela ?<\/em><\/p>\n<p><\/p>\n<p>Que se passe-t-il si l'op\u00e9rateur est tomb\u00e9 et red\u00e9marr\u00e9, n'est-ce pas ? <\/p>\n<p><\/p>\n<p><em>Oui. Et \u00e0 ce moment-l\u00e0, des \u00e9v\u00e9nements sont apparus.<\/em> <\/p>\n<p><\/p>\n<p>La t\u00e2che de g\u00e9rer cette situation est en partie partag\u00e9e entre l'op\u00e9rateur et Kubernetes. Kubernetes a la capacit\u00e9 de rejouer l'\u00e9v\u00e9nement qui s'est produit. Il le rejoue. La t\u00e2che de l'op\u00e9rateur est de s'assurer que lorsque le replay du log d'\u00e9v\u00e9nements est effectu\u00e9, ces \u00e9v\u00e9nements soient idempotents. Ainsi, la r\u00e9p\u00e9tition de la m\u00eame entr\u00e9e d'\u00e9v\u00e9nement ne d\u00e9truira pas notre syst\u00e8me. Et notre op\u00e9rateur g\u00e8re cette t\u00e2che. <\/p>\n<p><\/p>\n<p><em>Bonjour ! Merci pour votre pr\u00e9sentation ! Dmitry Zavyalov, entreprise<\/em> <em>Smedova. Envisagez-vous d'ajouter la possibilit\u00e9 de configurer l'op\u00e9rateur avec haproxy ? Un autre \u00e9quilibreur de charge en plus de l'option standard serait int\u00e9ressant, pour qu'il soit intelligent et comprenne que c'est v\u00e9ritablement ClickHouse.<\/em> <\/p>\n<p><\/p>\n<p>Parlez-vous de Ingress ?<\/p>\n<p><\/p>\n<p><em>Oui, remplacer Ingress par haproxy. Dans haproxy, vous pouvez sp\u00e9cifier la topologie du cluster, o\u00f9 se trouvent ses r\u00e9pliques.<\/em><\/p>\n<p><\/p>\n<p>Pour l'instant, nous n'y avons pas r\u00e9fl\u00e9chi. Si c'est n\u00e9cessaire pour vous et que vous pouvez expliquer pourquoi, nous pourrions le mettre en \u0153uvre, surtout si vous souhaitez participer. Nous examinerons avec plaisir cette option. En r\u00e9sum\u00e9, non, nous n'avons pas cette fonctionnalit\u00e9 actuellement. Merci pour la suggestion, nous y jetterons un \u0153il. Et si vous pouvez aussi expliquer le cas d'utilisation et pourquoi c'est n\u00e9cessaire en pratique, par exemple en cr\u00e9ant des issues sur GitHub, ce serait parfait.<\/p>\n<p><\/p>\n<p><em>C'est d\u00e9j\u00e0 fait.<\/em><\/p>\n<p><\/p>\n<p>Bien. Nous sommes ouverts \u00e0 toutes les propositions. Et haproxy est sur la liste des t\u00e2ches \u00e0 faire. La liste des t\u00e2ches s'allonge, elle ne diminue pas pour l'instant. Mais c'est une bonne chose, cela signifie que le produit est demand\u00e9.<\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/523378\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0414\u043e\u043a\u043b\u0430\u0434 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0432 Kubernetes, \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c: \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432 Kubernetes \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d; \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438; \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442, \u0430 \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442. \u0414\u0430\u043b\u0435\u0435, \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":96966,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-96965","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=\"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\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019\" \/>\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\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432 Kubernetes \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c\u0438 \u0411\u0414. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019\" \/>\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-10-15T12:42:53+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-15T12:42:53+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\udd47Op\u00e9rateur dans Kubernetes pour la gestion des clusters de bases de donn\u00e9es. Vladislav Klimenko (Altinity, 2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","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\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432 Kubernetes \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c\u0438 \u0411\u0414. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019) | ProHoster","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","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-10-15T12:42:53+00:00","article:modified_time":"2020-10-15T12:42:53+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"96965","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 10:29:25","updated":"2022-09-30 17:40:21","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\/96965","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=96965"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/96965\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/96966"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=96965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=96965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=96965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}