{"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\/de\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","title":{"rendered":"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/56e002c7408c4708e39ece867f84171e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der Bericht behandelt praktische Fragen zur Entwicklung von Operatoren in Kubernetes, zur Gestaltung ihrer Architektur und zu den grundlegenden Funktionsprinzipien.<\/p>\n<p><\/p>\n<p>Im ersten Teil des Berichts werden wir er\u00f6rtern:<\/p>\n<p><\/p>\n<ul>\n<li>was ein Operator in Kubernetes ist und wozu er ben\u00f6tigt wird;<\/li>\n<li>wie der Operator das Management komplexer Systeme vereinfacht;<\/li>\n<li>was der Operator kann und was nicht.<\/li>\n<\/ul>\n<p><\/p>\n<p>Dann wenden wir uns der Diskussion \u00fcber die interne Struktur des Operators zu. Wir betrachten die Architektur und die Funktionsweise des Operators Schritt f\u00fcr Schritt. Wir werden detailliert untersuchen:<\/p>\n<p><\/p>\n<ul>\n<li>die Interaktion zwischen dem Operator und Kubernetes;<\/li>\n<li>welche Funktionen der Operator \u00fcbernimmt und was er an Kubernetes delegiert.<\/li>\n<\/ul>\n<p><\/p>\n<p>Wir werden das Management von Shards und Replikaten von Datenbanken in Kubernetes betrachten.<br \/>\nAnschlie\u00dfend werden wir die Fragen zur Datenspeicherung diskutieren:<\/p>\n<p><\/p>\n<ul>\n<li>wie man persistenten Speicher aus der Sicht des Operators nutzt;<\/li>\n<li>die Fallstricke bei der Verwendung von lokalem Speicher.<\/li>\n<\/ul>\n<p><\/p>\n<p>Im abschlie\u00dfenden Teil des Berichts werden wir praktische Anwendungsbeispiele betrachten <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">clickhouse-operator<\/a><\/noindex> mit Amazon oder Google Cloud Service. Der Bericht st\u00fctzt sich auf die Entwicklung und Erfahrungen mit dem Operator f\u00fcr ClickHouse.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Video:<\/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=\"Video abspielen\" 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>Ich bin Wladislaw Klimenko. Heute m\u00f6chte ich \u00fcber unsere Erfahrungen in der Entwicklung und dem Betrieb des Operators sprechen, und zwar \u00fcber einen spezialisierten Operator zur Verwaltung von Datenbank-Clustern. Am Beispiel von <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">ClickHouse-operator<\/a><\/noindex> zur Verwaltung des ClickHouse-Clusters.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cc297a3edb3b2a5e30d0dc2725de4011.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Warum sind wir in der Lage, \u00fcber den Operator und ClickHouse zu sprechen?<\/p>\n<p><\/p>\n<ul>\n<li>Wir k\u00fcmmern uns um die Unterst\u00fctzung und Weiterentwicklung von ClickHouse. <\/li>\n<li>Momentan versuchen wir, schrittweise unseren Teil zur Entwicklung von ClickHouse beizutragen. Wir sind nach Yandex die zweitgr\u00f6\u00dfte Quelle f\u00fcr \u00c4nderungen an ClickHouse. <\/li>\n<li>Wir bem\u00fchen uns, zus\u00e4tzliche Projekte f\u00fcr das \u00d6kosystem von ClickHouse zu realisieren. <\/li>\n<\/ul>\n<p><\/p>\n<p>\u00dcber eines dieser Projekte m\u00f6chte ich sprechen. Es handelt sich um den ClickHouse-Operator f\u00fcr Kubernetes. <\/p>\n<p><\/p>\n<p>In meinem Bericht m\u00f6chte ich zwei Themen ansprechen: <\/p>\n<p><\/p>\n<ul>\n<li>Das erste Thema ist, wie unser Operator zur Verwaltung der ClickHouse-Datenbanken in Kubernetes funktioniert. <\/li>\n<li>Das zweite Thema ist, wie jeder Operator funktioniert, d. h. wie er mit Kubernetes interagiert. <\/li>\n<\/ul>\n<p><\/p>\n<p>Diese beiden Fragen werden sich durch meinen gesamten Bericht ziehen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4cc9790e18e70ae1ccde2cf39ef4ef00.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wer interessiert sich daf\u00fcr, was ich zu erz\u00e4hlen versuche?<\/p>\n<p><\/p>\n<ul>\n<li>Besonders interessant wird es f\u00fcr diejenigen sein, die Operatoren betreiben. <\/li>\n<li>Oder f\u00fcr diejenigen, die ihren eigenen Operator entwickeln m\u00f6chten, um zu verstehen, wie er intern arbeitet, wie der Operator mit Kubernetes interagiert und welche Fallstricke auftreten k\u00f6nnen. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/07545f7a0171b610697c519d4aa9cd43.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um das, was wir heute besprechen werden, besser zu verstehen, w\u00e4re es hilfreich zu wissen, wie Kubernetes funktioniert und \u00fcber Grundkenntnisse in Cloud-Technologien zu verf\u00fcgen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/eff56cc3e83fde3d3e64d73d41b07417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was ist ClickHouse? Es ist eine spaltenbasierte Datenbank, die speziell f\u00fcr die Online-Verarbeitung analytischer Abfragen ausgelegt ist. Und sie ist vollst\u00e4ndig Open Source. <\/p>\n<p><\/p>\n<p>Und wir m\u00fcssen nur zwei Dinge wissen. Erstens, dass es sich um eine Datenbank handelt, sodass das, was ich erz\u00e4hlen werde, praktisch auf jede Datenbank zutrifft. Und zweitens, dass das DBMS ClickHouse sehr gut skalierbar ist und praktisch eine lineare Skalierbarkeit bietet. Daher ist der Zustand des Clusters f\u00fcr ClickHouse ein nat\u00fcrlicher Zustand. Und wir sind besonders daran interessiert, zu diskutieren, wie man einen ClickHouse-Cluster in Kubernetes verwaltet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5eb1ff5026c492117bf2467b10de7053.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Warum ist es dort notwendig? Warum k\u00f6nnen wir es nicht selbstst\u00e4ndig betreiben? Die Antworten sind teilweise technischer und teilweise organisatorischer Natur. <\/p>\n<p><\/p>\n<ul>\n<li>In der Praxis begegnen wir immer h\u00e4ufiger der Situation, dass in gro\u00dfen Unternehmen fast alle Komponenten bereits in Kubernetes laufen. Die Datenbanken sind jedoch au\u00dfen vor. <\/li>\n<li>Und immer \u00f6fter wird die Frage gestellt: \u201eKann man das integrieren?\u201c. Daher versuchen gro\u00dfe Unternehmen, das Management so weit wie m\u00f6glich zu standardisieren, um schnell ihre Datenspeicher verwalten zu k\u00f6nnen. <\/li>\n<li>Und das hilft besonders, wenn es maximale M\u00f6glichkeiten zur Wiederholung am neuen Standort erforderlich sind, d.h. maximale Portabilit\u00e4t.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/99312e74bd7ed4031128c7ec872f6a68.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie einfach oder schwierig ist das? Es ist nat\u00fcrlich m\u00f6glich, es manuell zu tun. Aber es ist nicht so einfach, weil wir es mit der Komplexit\u00e4t der Verwaltung von Kubernetes zu tun haben, die sich mit den spezifischen Anforderungen von ClickHouse verbindet. Und es entsteht eine Aggregation. <\/p>\n<p><\/p>\n<p>Und all dies zusammen ergibt einen recht gro\u00dfen Technologiebereich, dessen Verwaltung bereits recht kompliziert wird, da Kubernetes seine allt\u00e4glichen Betriebsfragen mitbringt und ClickHouse seine eigenen Anforderungen an den t\u00e4glichen Betrieb hat. Insbesondere, wenn wir mehrere ClickHouse-Datenbanken haben und st\u00e4ndig mit ihnen etwas tun m\u00fcssen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. 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 hat bei dynamischer Konfiguration eine Vielzahl von Fragen, die eine st\u00e4ndige Belastung f\u00fcr DevOps darstellen:<\/p>\n<p><\/p>\n<ul>\n<li>Wenn wir etwas in ClickHouse \u00e4ndern wollen, zum Beispiel einen Replikat oder Shard hinzuf\u00fcgen, m\u00fcssen wir das Konfigurationsmanagement durchf\u00fchren. <\/li>\n<li>Danach das Datenbankschema \u00e4ndern, denn ClickHouse hat einen spezifischen Sharding-Mechanismus. Dort muss das Datenbankschema aufgeteilt und die Konfigurationen verteilt werden. <\/li>\n<li>Es muss ein Monitoring eingerichtet werden. <\/li>\n<li>Sammlung von Logs f\u00fcr neue Shards, f\u00fcr neue Replikate. <\/li>\n<li>Sich um die Wiederherstellung k\u00fcmmern.<\/li>\n<li>Und um den Neustart. <\/li>\n<\/ul>\n<p><\/p>\n<p>Das sind allt\u00e4gliche Arbeiten, deren Handhabung in der Praxis man sich w\u00fcnscht, dass sie erleichtert wird.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. 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 hilft gut bei der Betriebshandhabung, aber nur bei grundlegenden Systemfragen. <\/p>\n<p><\/p>\n<p>Kubernetes erleichtert und automatisiert solche Dinge wie:<\/p>\n<p><\/p>\n<ul>\n<li>Wiederherstellung.<\/li>\n<li>Neustart. <\/li>\n<li>Verwaltung des Speichersystems.<\/li>\n<\/ul>\n<p><\/p>\n<p>Das ist gut, das ist der richtige Ansatz, aber es hat kein vollst\u00e4ndiges Verst\u00e4ndnis daf\u00fcr, wie man einen Datenbankcluster betreibt. <\/p>\n<p><\/p>\n<p>Man w\u00fcnscht sich mehr, man m\u00f6chte, dass unsere gesamte Datenbank in Kubernetes l\u00e4uft.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6564e9f29d5d518925c8593bca978345.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Man m\u00f6chte etwas schaffen, das wie ein gro\u00dfer, magischer roter Knopf ist, auf den man dr\u00fcckt und der einen Cluster mit allt\u00e4glichen Aufgaben bereitstellt und \u00fcber den gesamten Lebenszyklus aufrechterh\u00e4lt. Ein ClickHouse-Cluster in Kubernetes.<\/p>\n<p><\/p>\n<p>Und wir haben uns bem\u00fcht, eine L\u00f6sung zu entwickeln, die die Arbeit erleichtert. Das ist der ClickHouse-Operator f\u00fcr Kubernetes von Altinity.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ff80c6fc59069ec900d545096ad978d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein Operator ist ein Programm, dessen Hauptaufgabe es ist, andere Programme zu verwalten, d. h. es ist ein Verwalter. <\/p>\n<p><\/p>\n<p>Und er enth\u00e4lt Verhaltensmuster. Man kann das als kodifiziertes Wissen \u00fcber das Fachgebiet bezeichnen. <\/p>\n<p><\/p>\n<p>Sein Hauptziel ist es, das Leben der DevOps zu erleichtern und das Mikromanagement zu verringern, damit er (DevOps) in h\u00f6heren Begriffen denkt, d. h. damit er (DevOps) sich nicht mit Mikromanagement besch\u00e4ftigt und nicht alle Details manuell einstellen muss. <\/p>\n<p><\/p>\n<p>Und genau das ist der Operator \u2013 ein Hilfsroboter, der sich um Mikrounter Aufgaben k\u00fcmmert und DevOps unterst\u00fctzt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0824a1fa710e8c4f45406aa7f596b977.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Warum braucht man einen Operator? Er zeigt sich besonders in zwei Aspekten als effektiv:<\/p>\n<p><\/p>\n<ul>\n<li>Wenn der Spezialist, der sich mit ClickHouse besch\u00e4ftigt, nicht gen\u00fcgend Erfahrung hat, aber ClickHouse bereits betrieben werden muss, erleichtert der Operator den Betrieb und erm\u00f6glicht die Verwaltung eines ClickHouse-Clusters mit einer ziemlich komplexen Konfiguration, ohne sich allzu sehr mit den inneren Abl\u00e4ufen zu befassen. Man gibt ihm einfach Aufgaben auf hohem Niveau, und das funktioniert. <\/li>\n<li>Und die zweite Aufgabe, in der er sich am besten beweist, ist, wenn es darum geht, eine gro\u00dfe Anzahl standardisierter Aufgaben zu automatisieren. Er nimmt die Mikroaufgaben von den Systemadministratoren ab. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f1cb11156d57f560d0b6c82700ac6ff8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das ist am meisten n\u00f6tig f\u00fcr diejenigen, die gerade erst ihren Weg anfangen, oder f\u00fcr diejenigen, die viel mit Automatisierung zu tun haben m\u00fcssen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/128e7d9ff1ce0c535f98be66aedb1060.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was unterscheidet den auf Operatoren basierenden Ansatz von anderen Systemen? Es gibt doch Helm. Das hilft auch, ClickHouse zu installieren, man kann Helm-Charts erstellen, die sogar einen gesamten ClickHouse-Cluster aufsetzen. Was ist also der Unterschied zwischen einem Operator und zum Beispiel Helm?<\/p>\n<p><\/p>\n<p>Der grundlegende fundamentale Unterschied ist, dass Helm ein Paketmanagement-Tool ist, w\u00e4hrend der Operator weiter geht. Es geht um die Begleitung des gesamten Lebenszyklus. Es ist nicht nur die Installation, sondern t\u00e4gliche Aufgaben, die Skalierung, Sharding usw. umfassen, das hei\u00dft, all das, was im Verlauf des Lebenszyklus erledigt werden muss (wenn n\u00f6tig, auch die Deinstallation) \u2013 all das l\u00f6st der Operator. Er versucht, den gesamten Lebenszyklus der Software zu automatisieren und zu unterst\u00fctzen. Das ist der fundamentale Unterschied zu anderen L\u00f6sungen, die es gibt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e26b57c8caf8437f683d7afbfa127ebd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das war der einf\u00fchrende Teil, lassen Sie uns weitermachen. <\/p>\n<p><\/p>\n<p>Wie bauen wir unseren Operator? Wir versuchen, das Cluster von ClickHouse als eine Ressource zu verwalten. <\/p>\n<p><\/p>\n<p>Hier auf der linken Seite des Bildes haben wir die Eingabedaten. Das ist YAML mit der Spezifikation f\u00fcr den Cluster, das auf die klassische Weise \u00fcber kubectl an Kubernetes \u00fcbergeben wird. Dort ergreift der Operator das, macht seine Magie und am Ende haben wir so ein Schema. Das ist die Implementierung von ClickHouse in Kubernetes.<\/p>\n<p><\/p>\n<p>Und dann werden wir langsam schauen, wie der Operator funktioniert, welche typischen Aufgaben gel\u00f6st werden k\u00f6nnen. Wir werden nur typische Aufgaben behandeln, da wir nur begrenzte Zeit haben. Es wird nicht alles besprochen, was der Operator leisten kann. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b40401931b58988058419d4495dbb1bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns von der Praxis ausgehen. Unser Projekt ist vollst\u00e4ndig Open Source, daher kann man sich auf GitHub ansehen, wie es funktioniert. Und man kann mit dem Quick Start Guide einfach anfangen, wenn man gleich starten m\u00f6chte.<\/p>\n<p><\/p>\n<p>Wenn man detailliert einsteigen m\u00f6chte, bem\u00fchen wir uns, die Dokumentation in einem mehr oder weniger ansprechenden Zustand zu halten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9414d7c3aa94b6ad999e150f0ac25a97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lass uns mit einer praktischen Aufgabe beginnen. Die erste Aufgabe, mit der wir alle anfangen wollen, ist das Starten des ersten Beispiels, egal wie. Wie startet man ClickHouse mit dem Operator, ohne genau zu wissen, wie er funktioniert? Wir schreiben ein Manifest, da die gesamte Kommunikation mit k8s \u00fcber Manifeste erfolgt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3e97cd235827460693ed95fb3598d31d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hier ist ein komplexes Manifest. Das, was wir rot hervorgehoben haben, ist das, worauf man achten sollte. Wir bitten den Operator, ein Cluster namens demo zu erstellen.<\/p>\n<p><\/p>\n<p>Bis jetzt sind das grundlegende Beispiele. Storage wird noch nicht beschrieben, aber wir werden sp\u00e4ter darauf zur\u00fcckkommen. Momentan beobachten wir die Entwicklung des Clusters in Echtzeit.<\/p>\n<p><\/p>\n<p>Wir haben dieses Manifest erstellt. Wir f\u00fcttern es unserem Operator. Er hat gearbeitet, seine Magie vollbracht.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/502e64fbe6ed7d04b2aecb7d51abc7f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir schauen in die Konsole. Drei Komponenten sind von Interesse \u2013 das sind Pod, zwei Services und ein StatefulSet.<\/p>\n<p><\/p>\n<p>Der Operator hat das erledigt, und wir k\u00f6nnen sehen, was genau er erstellt hat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/67faf120e21e5113680ccff9c71b00f1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Er erstellt ungef\u00e4hr folgendes Schema. Wir haben ein StatefulSet, einen Pod, ConfigMap f\u00fcr jede Replik und eine ConfigMap f\u00fcr das gesamte Cluster. Unbedingt Dienste als Einstiegspunkte in das Cluster. <\/p>\n<p><\/p>\n<p>Die Dienste sind der zentrale Load Balancer Service und zus\u00e4tzlich kann es f\u00fcr jede Replik, f\u00fcr jedes Shard einen weiteren geben. <\/p>\n<p><\/p>\n<p>So sieht unser Basis-Cluster ungef\u00e4hr aus. Er besteht aus genau einem einzigen Node. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f235ada45ee58b517c0e041f795ae122.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lass uns weitermachen und es komplizierter machen. Wir m\u00fcssen das Cluster sharden.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/992836a00434c64fb4616c1c4cc4df97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Unsere Aufgaben wachsen, die Dynamik beginnt. Wir m\u00f6chten ein Shard hinzuf\u00fcgen. Wir beobachten die Entwicklung. Wir \u00e4ndern unsere Spezifikation und geben an, dass wir zwei Shards wollen. <\/p>\n<p><\/p>\n<p>Das ist dieselbe Datei, die sich dynamisch mit dem Wachstum des Systems entwickelt. Storage gibt es nicht, das wird sp\u00e4ter behandelt, es ist ein separates Thema.<\/p>\n<p><\/p>\n<p>Wir f\u00fcttern den YAML-Operator und schauen, was herauskommt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8ddb5845cae160098470208f51b5da7c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der Operator hat nachgedacht und die folgenden Entit\u00e4ten erstellt. Wir haben bereits zwei Pods, drei Services und pl\u00f6tzlich 2 StatefulSets. Warum 2 StatefulSets?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/26eb734ff1a195de2ceaab842b472ee4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Auf dem Diagramm sah es so aus \u2013 das ist unser urspr\u00fcnglicher Zustand, als wir einen Pod hatten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/657838b0d378121fdd66ad3ff8168600.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es sieht jetzt so aus. Bis jetzt ist alles einfach, es wurde dupliziert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f039a7046f1c56fbdad6b5a26a519b10.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und warum wurden die StatefulSets zwei? Hier muss man ablenken und dar\u00fcber diskutieren, wie in Kubernetes die Pods verwaltet werden.<\/p>\n<p><\/p>\n<p>Es gibt ein Objekt namens StatefulSet, das es erm\u00f6glicht, eine Menge von Pods aus einer Vorlage zu erstellen. Der Schl\u00fcssel dazu ist das Template. Und man kann in einem StatefulSet viele Pods aus einem einzigen Template starten. Der entscheidende Satz hier ist: \u201eviele Pods aus einem einzigen Template\u201c.<\/p>\n<p><\/p>\n<p>Es gab einen gro\u00dfen Anreiz, das gesamte Cluster in einem einzigen StatefulSet zu erstellen. Das w\u00fcrde funktionieren, da gibt es keine Probleme. Aber es gibt einen Punkt. Wenn wir ein heterogenes Cluster zusammenstellen wollen, d. h. aus mehreren Versionen von ClickHouse, dann stellt sich die Frage. Ja, StatefulSet kann ein Rolling Update durchf\u00fchren, ja, dort kann eine neue Version eingespielt werden, und es wird erkl\u00e4rt, dass man nicht mehr als so und so viele Nodes gleichzeitig ausprobieren sollte.<\/p>\n<p><\/p>\n<p>Aber wenn wir das Problem extrapolieren und sagen, dass wir ein vollst\u00e4ndig heterogenes Cluster erstellen m\u00f6chten und nicht von einer alten Version auf eine neue mittels Rolling Update wechseln m\u00f6chten, sondern einfach ein heterogenes Cluster mit verschiedenen Versionen von ClickHouse und unterschiedlichen Speichern aufbauen wollen. Wir m\u00f6chten zum Beispiel einige Replikate auf separaten, langsameren Festplatten erstellen, insgesamt ein vollst\u00e4ndig heterogenes Cluster aufbauen. Und da StatefulSet eine standardisierte L\u00f6sung aus einer Vorlage erstellt, ist das nicht m\u00f6glich. <\/p>\n<p><\/p>\n<p>Nach einigem \u00dcberlegen wurde entschieden, dass wir es so machen. Jede Replikate befindet sich in ihrem eigenen StatefulSet. Es gibt einige Nachteile bei dieser L\u00f6sung, aber in der Praxis fasst der Operator alles vollst\u00e4ndig ein. Es gibt viele Vorteile. Wir k\u00f6nnen ein vollst\u00e4ndig heterogenes Cluster nach unseren W\u00fcnschen aufbauen. Deshalb haben wir in einem Cluster, in dem wir zwei Shards mit einer Replikate haben, 2 StatefulSets und 2 Pods, genau weil wir diesen Ansatz aus den oben genannten Gr\u00fcnden gew\u00e4hlt haben, um ein heterogenes Cluster aufbauen zu k\u00f6nnen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b7ae92a545f9bb6cc5f0136df87207f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zur\u00fcck zu den praktischen Aufgaben. In unserem Cluster m\u00fcssen wir Benutzer konfigurieren, d. h. wir m\u00fcssen eine Art Konfiguration von ClickHouse in Kubernetes vornehmen. Der Operator bietet daf\u00fcr alle M\u00f6glichkeiten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6a65aa78293c0b40230cf24efc58e55a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir k\u00f6nnen direkt im YAML schreiben, was wir m\u00f6chten. Alle Konfigurationsoptionen werden direkt aus diesem YAML in die ClickHouse-Konfigurationen gemappt, die dann im gesamten Cluster verteilt werden.<\/p>\n<p><\/p>\n<p>Das kann man auch so schreiben. Das ist nur ein Beispiel. Das Passwort kann verschl\u00fcsselt werden. Alle Konfigurationsoptionen von ClickHouse werden vollst\u00e4ndig unterst\u00fctzt. Dies ist nur ein Beispiel. <\/p>\n<p><\/p>\n<p>Die Konfiguration wird als ConfigMap im Cluster verteilt. In der Praxis erfolgt das Update der ConfigMap nicht sofort, deshalb kann es in einem gro\u00dfen Cluster einige Zeit in Anspruch nehmen, die Konfiguration zu propagieren. Aber das ist alles sehr praktisch im Betrieb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2e42d19d7a558e3b8d4bbb51fe5bd08b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir erschweren die Aufgabe. Der Cluster entwickelt sich weiter. Wir m\u00f6chten Daten replizieren. Das hei\u00dft, wir haben bereits zwei Shards, jeweils mit einer Replik, und es sind Benutzer eingerichtet. Wir wachsen und wollen uns mit der Replikation besch\u00e4ftigen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c97e5e6ca9cb66d3a94fb8cfe610186.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was ben\u00f6tigen wir f\u00fcr die Replikation? <\/p>\n<p><\/p>\n<p>Wir ben\u00f6tigen ZooKeeper. In ClickHouse basiert die Replikation auf ZooKeeper. ZooKeeper wird ben\u00f6tigt, damit verschiedene Replikate von ClickHouse einen Konsens dar\u00fcber haben, welche Datenbl\u00f6cke auf welchem ClickHouse vorhanden sind. <\/p>\n<p><\/p>\n<p>Jeden ZooKeeper k\u00f6nnen wir verwenden. Wenn das Unternehmen einen externen ZooKeeper hat, kann er verwendet werden. Wenn nicht, kann man ihn aus unserem Repository installieren. Es gibt einen Installer, der das ganze Verfahren erleichtert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6cc40951a19b982abf578836edf569d3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und das Schema f\u00fcr die Interaktion des gesamten Systems sieht so aus. Wir haben Kubernetes als Plattform. Darauf l\u00e4uft der ClickHouse-Operator. ZooKeeper habe ich hier dargestellt. Der Operator interagiert sowohl mit ClickHouse als auch mit ZooKeeper. Das hei\u00dft, es findet eine Interaktion statt. <\/p>\n<p><\/p>\n<p>Und all das ist notwendig, damit ClickHouse Daten erfolgreich in k8s replizieren kann.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4fc37aee850acd20517fa3d7562f0165.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns nun die eigentliche Aufgabe betrachten, n\u00e4mlich wie das Manifest f\u00fcr die Replikation aussehen wird.<\/p>\n<p><\/p>\n<p>Wir f\u00fcgen unserem Manifest zwei Abschnitte hinzu. Der erste \u2013 woher wir ZooKeeper beziehen, der sowohl innerhalb von Kubernetes als auch extern sein kann. Das ist einfach eine Beschreibung. Und wir bestellen Replikate. Das hei\u00dft, wir m\u00f6chten zwei Replikate. Insgesamt sollten wir 4 Pods erhalten. An den Speicher denken wir, er wird sp\u00e4ter zur\u00fcckkommen. Speicher ist ein separates Thema. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb8c974d0587a4ad87d6ba36bbe5e3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es war so.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/909ffd258dbce718ddf529a1a753de6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es wird so. Es werden Replikate hinzugef\u00fcgt. Die 4. passte nicht, wir glauben, dass es dort viele geben kann. Und daneben wird ZooKeeper hinzugef\u00fcgt. Die Schemas werden komplizierter. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c33b37fc7fc72f51276e5e98b9ec2134.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und es ist Zeit, die n\u00e4chste Aufgabe hinzuzuf\u00fcgen. Wir werden einen Persistent Storage hinzuf\u00fcgen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f28d14901a713eca413a52ec6ea21ac5.jpeg\" style=\"display:block;margin: 0 auto;\" \/>F\u00fcr Persistent Storage haben wir verschiedene Ausf\u00fchrungsvarianten.<\/p>\n<p><\/p>\n<p>Falls wir in einem Cloud-Anbieter aktiv sind, etwa bei Amazon oder Google, besteht die gro\u00dfe Versuchung, Cloud-Speicher zu nutzen. Das ist sehr bequem und gut. <\/p>\n<p><\/p>\n<p>Und es gibt eine zweite Variante. Das ist f\u00fcr den lokalen Speicher, wenn wir lokale Festplatten auf jeder Node haben. Diese Variante ist viel schwieriger umzusetzen, aber daf\u00fcr leistungsf\u00e4higer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/483ee5c08b62e987620bf54fd32a44b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns ansehen, was wir im Hinblick auf Cloud-Speicher haben.<\/p>\n<p><\/p>\n<p>Es gibt Vorteile. Es ist sehr einfach zu konfigurieren. Wir bestellen einfach beim Cloud-Anbieter, bitte gib uns einen Speicher dieser Kapazit\u00e4t und dieser Klasse. Die Klassen sind von den Anbietern selbst beschrieben. <\/p>\n<p><\/p>\n<p>Und es gibt einen Nachteil. F\u00fcr manche ist das kein kritischer Nachteil. Nat\u00fcrlich wird es einige Einbu\u00dfen bei der Leistung geben. Es ist sehr praktisch in der Anwendung, zuverl\u00e4ssig, aber es gibt einige potenzielle Leistungseinbu\u00dfen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8e82430b64477f91640078ff4eacb47e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Da ClickHouse speziell auf Leistung ausgerichtet ist, kann man sogar sagen, dass es alles herauskitzelt, was m\u00f6glich ist, weshalb viele Kunden versuchen, die maximale Leistung herauszuholen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8638fe37b848a98ce8326218d368baa3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um das Maximum herauszuholen, ben\u00f6tigen wir lokalen Speicher.<\/p>\n<p><\/p>\n<p>Kubernetes bietet drei Abstraktionen zur Nutzung von lokalem Speicher in Kubernetes. Diese sind: <\/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>Lassen Sie uns betrachten, wie sie sich unterscheiden und \u00e4hnlich sind. <\/p>\n<p><\/p>\n<p>Zun\u00e4chst haben wir in allen drei Ans\u00e4tzen den Speicher \u2013 das sind lokale Festplatten, die sich auf demselben physischen k8s-Knoten befinden. Aber es gibt einige Unterschiede.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79afb620a0c9a1552b47240b405fedc9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Beginnen wir mit dem einfachsten, n\u00e4mlich emptyDir. Was ist das in der Praxis? Wir bitten unser Spezifikationssystem (meistens ist das Docker), uns Zugriff auf einen Ordner auf der lokalen Festplatte zu gew\u00e4hren.<\/p>\n<p><\/p>\n<p>In der Praxis erstellt Docker irgendwo auf seinen eigenen Pfaden einen tempor\u00e4ren Ordner, nennt ihn mit einem langen Hash und gew\u00e4hrt Zugang zu ihm. <\/p>\n<p><\/p>\n<p>Wie wird das in Bezug auf die Leistung funktionieren? Es wird mit der Geschwindigkeit der lokalen Festplatte arbeiten, d.h. es ist ein vollst\u00e4ndiger Zugriff auf das eigene Laufwerk. <\/p>\n<p><\/p>\n<p>Aber diese Methode hat ihren Nachteil. Persistent in diesem Fall ist ziemlich fraglich. Bei der ersten Bewegung von Docker mit Containern geht die Persistenz verloren. Wenn Kubernetes aus irgendeinem Grund diesen Pod auf eine andere Festplatte verschieben m\u00f6chte, gehen die Daten verloren. <\/p>\n<p><\/p>\n<p>Dieser Ansatz eignet sich gut f\u00fcr Tests, weil er bereits eine angemessene Geschwindigkeit zeigt, aber f\u00fcr etwas Ernsthaftes ist diese Option nicht geeignet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0b60f80fc9ea0e2c1820021bcd9e1382.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Deshalb gibt es den zweiten Ansatz. Das ist hostPath. Wenn man sich die vorherige Folie und diese ansieht, sieht man nur einen Unterschied. Unser Ordner ist aus Docker direkt auf den Kubernetes-Knoten gewandert. Hier ist es etwas einfacher. Wir geben den Pfad im lokalen Dateisystem an, an dem wir unsere Daten speichern m\u00f6chten. <\/p>\n<p><\/p>\n<p>Die Vorteile dieser Methode sind vorhanden. Es handelt sich bereits um echte Persistenz, und zwar eine klassische. Unsere Daten werden an einer bestimmten Adresse auf der Festplatte gespeichert. <\/p>\n<p><\/p>\n<p>Es gibt auch Nachteile. Dazu geh\u00f6rt die Komplexit\u00e4t des Managements. Unser Kubernetes k\u00f6nnte sich entscheiden, einen Pod auf einen anderen physischen Knoten zu verschieben. Und hier kommt DevOps ins Spiel. Er muss der gesamten Architektur richtig erkl\u00e4ren, dass diese Pods nur auf solche Knoten verschoben werden d\u00fcrfen, auf denen etwas unter diesen Pfaden montiert ist, und niemals mehr als einen Knoten auf einmal. Das ist ziemlich kompliziert. <\/p>\n<p><\/p>\n<p>Speziell f\u00fcr diese Zwecke haben wir in unserem Operator Vorlagen entwickelt, um all diese Komplexit\u00e4t zu verbergen. Und man k\u00f6nnte einfach sagen: \u201eIch m\u00f6chte, dass ich einen ClickHouse-Instanz auf jedem physischen Knoten und auf diesem bestimmten Pfad habe.\u201c <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f64c19bccc8b187d6af112eda896b25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aber dieses Bed\u00fcrfnis besteht nicht nur f\u00fcr uns, daher verstehen auch die Herren vom Kubernetes, dass die Menschen Zugang zu physischen Festplatten haben m\u00f6chten, weshalb sie eine dritte Ebene bereitstellen.<\/p>\n<p><\/p>\n<p>Sie wird local genannt. Der Unterschied zum vorherigen Slide ist praktisch nicht vorhanden. Fr\u00fcher musste man manuell daf\u00fcr sorgen, dass wir diese Pods nicht von Knoten zu Knoten verschieben konnten, weil sie an einem bestimmten Pfad an die lokale physische Festplatte angeschlossen sein mussten. Jetzt werden all diese Kenntnisse in Kubernetes selbst gekapselt. Es wird deutlich einfacher zu konfigurieren.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/140c43be34dd7015c0bf4cfd0a0bb384.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kehren wir zu unserer praktischen Aufgabe zur\u00fcck. Wir wenden uns der YAML-Vorlage zu. Hier haben wir echten Speicher. Wir sind zur\u00fcckgekehrt zu diesem Punkt. Wir definieren eine klassische VolumeClaim-Vorlage wie in k8s. Und wir beschreiben, welchen Speicher wir m\u00f6chten.<\/p>\n<p><\/p>\n<p>Danach wird k8s Speicher anfordern. Er wird uns diesen im StatefulSet zuweisen. Und letztendlich wird dies ClickHouse zur Verf\u00fcgung stehen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/960e666486ed09cebd83235d43f83970.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir hatten ein solches Schema. Unser Persistent Storage war rot, was andeutet, dass wir ihn erstellen sollten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a989df489e3a9fef6a4fbf7b93c489a6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und er wird gr\u00fcn. Jetzt ist das Schema des ClickHouse-Clusters auf k8s vollst\u00e4ndig finalisiert. Wir haben Shards, Replikate, ZooKeeper, und es gibt einen echten Persistent Storage, der auf die eine oder andere Weise realisiert ist. Das Schema ist bereits vollst\u00e4ndig funktionsf\u00e4hig. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c409ee5da6309a67904394d968ed4906.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir machen weiter. Unser Cluster entwickelt sich weiter. Und Alexey gibt sich M\u00fche und ver\u00f6ffentlicht eine neue Version von ClickHouse.<\/p>\n<p><\/p>\n<p>Es entsteht die praktische Aufgabe, die neue Version von ClickHouse in unserem Cluster zu testen. Und nat\u00fcrlich m\u00f6chte man nicht alles darauf zu aktualisieren, sondern lieber in einer abgelegenen Ecke eine Replik mit der neuen Version betreiben, oder vielleicht sogar nicht nur eine neue Version, sondern gleich zwei, weil sie ziemlich h\u00e4ufig erscheinen. <\/p>\n<p><\/p>\n<p>Was k\u00f6nnen wir dazu sagen?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48ed52d393d977d0cfaa9320bd02ed1e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hier haben wir genau die M\u00f6glichkeit. Das sind die Vorlagen von Pods. Man kann festlegen, unser Operator erlaubt es vollst\u00e4ndig, einen heterogenen Cluster aufzubauen. D.h. konfiguriert von allen Replikaten in einer Gruppe bis hin zu jeder einzelnen Replik, welche Version von ClickHouse und welche Version von Storage wir haben m\u00f6chten. Wir k\u00f6nnen den Cluster in der ben\u00f6tigten Konfiguration komplett einrichten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4949ecd8119cb4ec0f4bad9bf27fa74e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir werden jetzt etwas tiefer eintauchen. Zuvor haben wir dar\u00fcber gesprochen, wie der ClickHouse-Operator im Hinblick auf die spezifischen Eigenschaften von ClickHouse funktioniert.<\/p>\n<p><\/p>\n<p>Jetzt m\u00f6chte ich ein paar Worte dar\u00fcber sagen, wie jeder Operator im Allgemeinen funktioniert und wie er mit K8s interagiert.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ca9c2a23c54b2a81ac0a8bba88d5e65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns zuerst die Interaktion mit K8s betrachten. Was passiert, wenn wir kubectl apply ausf\u00fchren? Durch die API erscheinen unsere Objekte in etcd. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b9eaedeb0f34d10398ba0187f09fef9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Beispielsweise die grundlegenden Kubernetes-Objekte: Pod, StatefulSet, Service und so weiter. <\/p>\n<p><\/p>\n<p>Dabei passiert physisch noch nichts. Diese Objekte m\u00fcssen im Cluster materialisiert werden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3c49dc1b0067347d5fc415ef9b87642d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Daf\u00fcr kommt ein Controller ins Spiel. Der Controller ist eine spezielle K8s-Komponente, die diese Beschreibungen materialisieren kann. Er wei\u00df, was physisch zu tun ist. Er wei\u00df, wie man Container startet und was eingestellt werden muss, damit der Server funktioniert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d951eb0f7bacf519566b0ef6cf9bc100.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und er materialisiert unsere Objekte in K8s.<\/p>\n<p><\/p>\n<p>Aber wir m\u00f6chten nicht nur mit Pods und StatefulSets arbeiten, wir m\u00f6chten eine ClickHouseInstallation erstellen, d.h. ein Objekt vom Typ ClickHouse, um damit als Einheit zu arbeiten. Bisher gibt es diese M\u00f6glichkeit nicht. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1594921ac5dd9384ce81ceae92f5cda9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aber K8s hat eine weitere angenehme Eigenschaft. Wir m\u00f6chten, dass irgendwo eine so komplexe Entit\u00e4t entsteht, in der unser Cluster aus Pods und StatefulSets zusammengefasst ist. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/04f86706f506fa91e365d45537dd9def.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was muss also daf\u00fcr getan werden? Zuerst tritt die Custom Resource Definition auf den Plan. Was ist das? Es ist eine Beschreibung f\u00fcr K8s, dass es einen weiteren Datentyp geben wird, dass wir zu Pod, StatefulSet eine benutzerdefinierte Ressource hinzuf\u00fcgen m\u00f6chten, die komplex ist. Dies ist eine Beschreibung der Datenstruktur. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f02ae12ef3ab5db974234b14e38792ac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir senden es ebenfalls \u00fcber kubectl apply dorthin. Kubernetes hat es erfreut aufgenommen. <\/p>\n<p><\/p>\n<p>Und jetzt haben wir im Speicher, beim Objekt in etcd die M\u00f6glichkeit, eine benutzerdefinierte Ressource mit dem Namen ClickHouseInstallation zu registrieren.<\/p>\n<p><\/p>\n<p>Aber bisher wird nichts weiter passieren. D. h., wenn wir jetzt die YAML-Datei erstellen, die wir mit der Beschreibung der Shards, Replikate und sagen \u201ekubectl apply\u201c betrachtet haben, wird Kubernetes sie akzeptieren, in etcd ablegen und sagen: \u201eSuper, aber was damit zu tun ist, wei\u00df ich nicht. Wie man ClickHouseInstallation verwaltet, wei\u00df ich nicht.\u201c <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7c2f9f3f81b83c987a3bd72a881d0d91.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das hei\u00dft, wir brauchen jemanden, der Kubernetes hilft, den neuen Datentyp zu verwalten. Links haben wir einen nativen Kubernetes-Controller, der mit den nativen Datentypen arbeitet. Rechts sollte ein benutzerdefinierter Controller erscheinen, der mit benutzerdefinierten Datentypen arbeiten kann. <\/p>\n<p><\/p>\n<p>Und er wird anders als Operator bezeichnet. Ich habe ihn hier absichtlich au\u00dferhalb von Kubernetes platziert, weil er auch au\u00dferhalb von K8s ausgef\u00fchrt werden kann. Die meisten Operatoren laufen nat\u00fcrlich in Kubernetes, aber nichts hindert ihn daran, au\u00dfen zu stehen, deshalb ist er hier speziell nach au\u00dfen verschoben. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7aa3a1b67d0def5ba752dff56baeebbf.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der benutzerdefinierte Controller, auch Operator genannt, interagiert \u00fcber die API mit Kubernetes. Er kann bereits mit der API interagieren. Und er wei\u00df bereits, wie man aus einer benutzerdefinierten Ressource ein komplexes Schema materialisiert, das wir erstellen m\u00f6chten. Genau das tut der Operator. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a5f773ddc3663f24d5379955da9c3037.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie funktioniert der Operator? Lassen Sie uns in den rechten Teil schauen, um zu erfahren, wie er das macht. Wir erfahren, wie der Operator all dies materialisiert und wie die Interaktion mit K8s weitergeht.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/08a8d8dbcb35117a0eb3320589c6ff8d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der Operator ist ein Programm. Es ist ereignisorientiert. Der Operator meldet sich mit Hilfe der Kubernetes API auf Ereignisse an. In der Kubernetes API gibt es Einstiegspunkte, an denen man sich auf Ereignisse anmelden kann. Und wenn sich etwas in K8s \u00e4ndert, sendet Kubernetes Ereignisse an alle Interessierten, d. h. wer sich an diesen API-Punkt angemeldet hat, erh\u00e4lt die Benachrichtigungen.<\/p>\n<p><\/p>\n<p>Der Operator meldet sich auf Ereignisse, und er muss darauf reagieren. Seine Aufgabe ist es, auf die auftretenden Ereignisse zu reagieren. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f0664a4151e6e7f6f8575a3e54372e9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ereignisse werden durch bestimmte Updates erzeugt. Unsere YAML-Datei mit der Beschreibung der ClickHouseInstallation kommt an. Sie geht \u00fcber kubectl apply nach etcd. Dort trat ein Ereignis ein, das letztendlich dieses Ereignis an den ClickHouse-Operator gesendet hat. Der Operator hat diese Beschreibung erhalten. Und er muss etwas tun. Wenn ein Update des Objekts ClickHouseInstallation eintrifft, muss der Cluster aktualisiert werden. Und die Aufgabe des Operators besteht darin, den Cluster zu aktualisieren. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0952bdd391a72aa15bf66af4ce69f4af.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was macht er? Zun\u00e4chst einmal m\u00fcssen wir einen Aktionsplan erstellen, was wir mit diesem Update machen werden. Updates k\u00f6nnen sehr klein sein, also klein in der YAML-Implementierung, k\u00f6nnen aber sehr gro\u00dfe \u00c4nderungen im Cluster nach sich ziehen. Daher erstellt der Operator einen Plan und h\u00e4lt sich dann daran.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79caaa43b6fd9f3e2eb1afe44ecb2df9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Er beginnt gem\u00e4\u00df diesem Plan, diese Struktur intern zu erstellen, um Pods und Dienste zu materialisieren, also das zu tun, was seine Hauptaufgabe ist. Es ist, als w\u00fcrde man ein ClickHouse-Cluster in Kubernetes aufbauen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e91576a26d6b758a68ae0b35cbe01897.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jetzt lassen Sie uns ein interessantes Thema ansprechen. Das ist die Aufteilung der Verantwortlichkeiten zwischen Kubernetes und dem Operator, d.h. was Kubernetes tut, was der Operator tut und wie sie untereinander interagieren. <\/p>\n<p><\/p>\n<p>Kubernetes ist f\u00fcr systematische Dinge zust\u00e4ndig, also f\u00fcr eine grundlegende Sammlung von Objekten, die man als systemscope interpretieren kann. Kubernetes wei\u00df, wie man Pods startet, wie man Container neu startet, wie man Volumes anbindet, wie man mit ConfigMaps arbeitet, also alles, was man als System bezeichnen kann. <\/p>\n<p><\/p>\n<p>Operatoren betreiben in Fachbereichen. Jeder Operator ist f\u00fcr seinen eigenen Fachbereich konzipiert. Wir haben einen f\u00fcr ClickHouse erstellt.<\/p>\n<p><\/p>\n<p>Der Operator interagiert genau in den Begriffen des Fachbereichs, wie beispielsweise eine Replikation hinzuf\u00fcgen, ein Schema erstellen, Monitoring einrichten. So ergibt sich eine solche Teilung.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9dc07d9c29d5dfd538343aadb751e4c0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns am praktischen Beispiel betrachten, wie diese Aufteilung der Verantwortlichkeiten erfolgt, wenn wir die Aktion \"Replik hinzuf\u00fcgen\" durchf\u00fchren. <\/p>\n<p><\/p>\n<p>Im Operator kommt die Aufgabe \u2013 eine Replik hinzuzuf\u00fcgen. Was macht der Operator? Der Operator berechnet, dass ein neuer StatefulSet erstellt werden muss, in dem bestimmte Vorlagen und Volume-Claims beschrieben werden m\u00fcssen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7a31f2f76a3bdda87e4bccf0e04fe4a8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Er hat alles vorbereitet und \u00fcbergibt es weiter an K8s. Er sagt, dass er eine ConfigMap, einen StatefulSet, ein Volume ben\u00f6tigt. Kubernetes bearbeitet es. Es materialisiert die grundlegenden Einheiten, mit denen es arbeitet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2be6892234cc12b056962265c13dba07.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und dann tritt erneut der ClickHouse-Operator in Aktion. Er hat bereits einen physischen Pod, auf dem er etwas tun kann. Und der ClickHouse-Operator arbeitet erneut in den Begriffen des Fachbereichs. Das hei\u00dft, um eine Replik in das Cluster einzuf\u00fcgen, muss man zun\u00e4chst das Datenschema, das in diesem Cluster existiert, einrichten. Und zweitens muss diese Replik in das Monitoring aufgenommen werden, damit sie gut nachverfolgt werden kann. Dies richtet der Operator ein. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/790616342b98b347fa67e0100754c8b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und erst dann kommt ClickHouse selbst ins Spiel, d.h. eine weitere, h\u00f6herstufige Entit\u00e4t. Das ist bereits eine Datenbank. Sie hat ihre eigene Instanz, eine konfigurierte Replik, die bereit ist, einem Cluster beizutreten.<\/p>\n<p><\/p>\n<p>Es ergibt sich eine recht lange Kette von Ausf\u00fchrungen und der Verteilung der Verantwortlichkeiten bei der Hinzuf\u00fcgung einer Replik.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ec79cfa2b45fadbe25f4d9fe8d2ec5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Behalten wir unsere praktischen Aufgaben im Auge. Wenn ein Cluster bereits existiert, kann die Konfiguration migriert werden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a52aee0d4350b8da00cdb4b525df80ad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir haben es so gemacht, dass in die bestehende XML, die ClickHouse versteht, hindurchgeschoben werden kann.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/91abb1d3b0a14f2118361403a74e14c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Man kann ClickHouse fein abstimmen. Gerade zonierte Bereitstellungen sind das, was ich bei der Erkl\u00e4rung von hostPath und lokalem Speicher erl\u00e4utert habe. So wird eine zonierte Bereitstellung korrekt gemacht.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fde502f30223e04a918f4fd598c3dd9f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die n\u00e4chste praktische Aufgabe ist das Monitoring.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4e685fba7883075105c0164a778c51e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn sich unser Cluster \u00e4ndert, m\u00fcssen wir das Monitoring regelm\u00e4\u00dfig einstellen. <\/p>\n<p><\/p>\n<p>Lassen Sie uns das Schema betrachten. Die gr\u00fcnen Pfeile haben wir bereits betrachtet. Jetzt schauen wir uns die roten Pfeile an. So wollen wir unser Cluster \u00fcberwachen. Wie die Metriken aus dem ClickHouse-Cluster in Prometheus gelangen und dann in Grafana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1210c1423f99d48a20e06e855bf48a72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und was ist die Schwierigkeit beim Monitoring? Warum wird das als eine Art Errungenschaft angesehen? Die Schwierigkeit liegt genau in der Dynamik. Wenn wir einen Cluster haben und dieser statisch ist, kann das Monitoring einmalig eingerichtet werden und dann k\u00fcmmert man sich nicht mehr darum.<\/p>\n<p><\/p>\n<p>Aber wenn wir viele Cluster haben oder sich st\u00e4ndig etwas \u00e4ndert, dann ist der Prozess dynamisch. Und st\u00e4ndig das Monitoring umzustellen, ist ein Ressourcen- und Zeitaufwand, d.h. auch einfach Faulheit. Das muss automatisiert werden. Die Schwierigkeit liegt genau in der Dynamik des Prozesses. Und der Operator automatisiert das sehr gut. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48a7264f1228671e0c483c8211a71eb3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie hat sich unser Cluster entwickelt? Am Anfang war er so.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8a8c7b6cd5562deb315368e1e8e1c976.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dann war er so.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1a3e915fbadf3aa5f3b33d337f36e76e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Schlie\u00dflich wurde er so. <\/p>\n<p><\/p>\n<p>Und das Monitoring wird automatisch vom Operator durchgef\u00fchrt. Ein einziger Zugangspunkt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e079e65bf8deff43a81d8ffde938a709.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und wir schauen nur am Ausgang in das Grafana-Dashboard, wie das Leben in unserem Cluster pulsiert. <\/p>\n<p><\/p>\n<p>\u00dcbrigens wird das Grafana-Dashboard auch zusammen mit unserem Operator direkt im Quellcode bereitgestellt. Es kann angeschlossen und genutzt werden. Dieses Screenshot haben mir unsere DevOps gegeben.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ad1c2899dd845d0ba4185bdf758468c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wohin m\u00f6chten wir als n\u00e4chstes gehen? Das ist:<\/p>\n<p><\/p>\n<ul>\n<li>Die Automatisierung von Tests weiterentwickeln. Die Hauptaufgabe besteht in der automatisierten Testung neuer Versionen. <\/li>\n<li>Wir m\u00f6chten auch die Integration mit ZooKeeper automatisieren. Wir planen, uns mit dem ZooKeeper-Operator zu integrieren. Das bedeutet, dass ein Operator f\u00fcr ZooKeeper geschrieben wurde, und es ist logisch, dass zwei Operatoren beginnen, sich zu integrieren, um eine benutzerfreundlichere L\u00f6sung zu entwickeln. <\/li>\n<li>Wir wollen komplexere Gesundheitspr\u00fcfungen durchf\u00fchren. <\/li>\n<li>Ich habe in Gr\u00fcn hervorgehoben, dass wir mit der Vererbung von Templates \u2013 DONE \u2013 kurz davor stehen, d. h. mit der n\u00e4chsten Version des Operators wird die Vererbung von Vorlagen verf\u00fcgbar sein. Das ist ein leistungsstarkes Werkzeug, das es erm\u00f6glicht, komplexe Konfigurationen aus Einzelteilen zu erstellen. <\/li>\n<li>Und wir wollen die Automatisierung komplexer Aufgaben. Die Hauptaufgabe ist das Re-Sharding. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f232c0aab389be5069e5c7886e265c01.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns ein Zwischenfazit ziehen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/62f7814994af0441ba5a82de4e9780d7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was erhalten wir am Ende? Und sollten wir uns damit besch\u00e4ftigen oder nicht? Ist es notwendig, die Datenbank in Kubernetes zu integrieren und den Operator im Allgemeinen sowie den Alitnity-Operator im Besonderen einzusetzen?<\/p>\n<p><\/p>\n<p>Am Ende erhalten wir:<\/p>\n<p><\/p>\n<ul>\n<li>Eine wesentliche Vereinfachung und Automatisierung der Konfiguration, Bereitstellung sowie Wartung. <\/li>\n<li>Sofort integrierte \u00dcberwachung. <\/li>\n<li>Und einsatzbereite, kodifizierte Vorlagen f\u00fcr komplexe Situationen. Aktionen wie das Hinzuf\u00fcgen eines Replikats m\u00fcssen nicht mehr manuell durchgef\u00fchrt werden. Das \u00fcbernimmt der Operator. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/aebccd7a2dc55f14645f79f89f7b7458.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es bleibt nur noch eine letzte Frage. Wir haben bereits die Datenbank in Kubernetes und Virtualisierung. Wie steht es um die Leistung einer solchen L\u00f6sung, insbesondere im Hinblick darauf, dass ClickHouse f\u00fcr Leistung optimiert ist?<\/p>\n<p><\/p>\n<p>Die Antwort lautet: alles in Ordnung! Ich werde das nicht im Detail ausf\u00fchren, das w\u00e4re das Thema eines separaten Vortrags. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ffc230941f0ae24926186db4d8d68ade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es gibt jedoch ein Projekt namens TSBS. Was ist dessen Hauptaufgabe? Es ist ein Leistungstest f\u00fcr Datenbanken. Es ist ein Versuch, \u00e4hnliches zu vergleichen. <\/p>\n<p><\/p>\n<p>Wie funktioniert es? Ein Datensatz wird generiert. Dann wird dieser Datensatz auf einem identischen Testset in verschiedenen Datenbanken getestet. Und jede Datenbank l\u00f6st die gleiche Aufgabe auf ihre Weise. Anschlie\u00dfend k\u00f6nnen die Ergebnisse verglichen werden. <\/p>\n<p><\/p>\n<p>Es werden bereits viele Datenbanken unterst\u00fctzt. Ich habe drei Hauptdatenbanken hervorgehoben. Das sind:<\/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=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5b4733534a4e6e36fb7788127adc6e86.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es wurde auch ein Vergleich mit einer \u00e4hnlichen L\u00f6sung durchgef\u00fchrt. Ein Vergleich mit RedShift. Dieser Vergleich fand auf Amazon statt. ClickHouse \u00fcbertrifft in diesem Bereich ebenfalls alle. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/44cc8dedc07a02fe1ed5aad3e17a579c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Welche Schlussfolgerungen k\u00f6nnen aus dem, was ich erz\u00e4hlt habe, gezogen werden?<\/p>\n<p><\/p>\n<ul>\n<li>DB in Kubernetes ist m\u00f6glich. Wahrscheinlich kann man alles M\u00f6gliche verwenden, aber insgesamt sieht es so aus, als ob es funktioniert. ClickHouse in Kubernetes kann auf jeden Fall mit Hilfe unseres Operators betrieben werden. <\/li>\n<li>Der Operator hilft, Prozesse zu automatisieren und erleichtert das Leben wirklich.<\/li>\n<li>Die Leistung ist normal.<\/li>\n<li>Und wir glauben, dass es m\u00f6glich ist und genutzt werden sollte. <\/li>\n<\/ul>\n<p><\/p>\n<p>Open Source \u2013 schlie\u00dfen Sie sich uns an!<\/p>\n<p><\/p>\n<p>Wie ich bereits gesagt habe, ist der Operator ein vollst\u00e4ndig Open Source Produkt, daher w\u00e4re es sehr gut, wenn m\u00f6glichst viele Menschen ihn verwenden. Schlie\u00dfen Sie sich uns an! Wir freuen uns auf euch alle!<\/p>\n<p><\/p>\n<p>Vielen Dank an alle!<\/p>\n<p><\/p>\n<p>Fragen<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ein Operator in Kubernetes zur Verwaltung von Datenbank-Clustern. 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>Danke f\u00fcr den Vortrag! Mein Name ist Anton. Ich bin von der Firma SEMrush. Mich interessiert das Thema Logging. \u00dcber das Monitoring h\u00f6rt man viel, aber \u00fcber das Logging wei\u00df man nichts, wenn man \u00fcber den gesamten Cluster spricht. Bei uns beispielsweise l\u00e4uft der Cluster auf Hardware. Wir nutzen zentrales Logging und sammeln mit den standardm\u00e4\u00dfigen Mitteln in einem gemeinsamen Pool. Und dann holen wir dort die f\u00fcr uns interessanten Daten heraus.<\/em> <\/p>\n<p><\/p>\n<p>Gute Frage, das hei\u00dft, Logging steht auf der To-Do-Liste. Unser Operator automatisiert das derzeit noch nicht. Er entwickelt sich noch, das Projekt ist noch recht jung. Wir verstehen die Notwendigkeit des Loggings. Es ist auch ein sehr wichtiges Thema. Und es ist wahrscheinlich nicht weniger wichtig als das Monitoring. Aber das Monitoring stand zuerst auf der Liste zur Umsetzung. Logging wird es geben. Wir bem\u00fchen uns nat\u00fcrlich, alle Aspekte des Clusterlebens zu automatisieren. Daher die Antwort \u2013 momentan kann der Operator das leider noch nicht, aber es ist in den Pl\u00e4nen, wir werden das umsetzen. Wenn jemand Lust hat mitzumachen, dann bitte Pull Request.<\/p>\n<p><\/p>\n<p><em>Hallo! Vielen Dank f\u00fcr den Vortrag! Ich habe eine Standardfrage zu den Persistent Volumes. Wenn wir mit diesem Operator eine Konfiguration erstellen, wie bestimmt der Operator, auf welchem Knoten eine Festplatte oder ein Ordner gemountet ist? M\u00fcssen wir ihm vorher erkl\u00e4ren, dass er bitte unser ClickHouse genau auf diesen Knoten platzieren soll, auf denen eine Festplatte vorhanden ist?<\/em><\/p>\n<p><\/p>\n<p>Soweit ich das verstehe, ist diese Frage eine Fortsetzung des lokalen Speichers, insbesondere des Teils \u00fcber den hostPath. Es geht darum, der gesamten Systemarchitektur zu erkl\u00e4ren, dass der Pod genau auf diesem Knoten gestartet werden muss, an dem wir eine physisch angeschlossene Festplatte haben, die an einem bestimmten Pfad gemountet ist. Das ist ein ganz gro\u00dfer Abschnitt, den ich hier nur sehr oberfl\u00e4chlich angesprochen habe, da die Antwort ziemlich umfangreich ist. <\/p>\n<p><\/p>\n<p>Kurz gesagt sieht es so aus. Wir m\u00fcssen nat\u00fcrlich das Provisioning dieser Volumes durchf\u00fchren. Momentan gibt es im lokalen Speicher kein dynamisches Provisioning, weshalb die DevOps-Teams die Festplatten selbst erstellen m\u00fcssen, also diese Volumes. Sie m\u00fcssen Kubernetes das Provisioning erkl\u00e4ren, dass es Persistent Volumes dieser Klasse gibt, die auf bestimmten Nodes liegen. Dann muss kubernetes erkl\u00e4rt werden, dass Pods, die einen bestimmten Typ von local storage ben\u00f6tigen, nur auf bestimmten Nodes anhand von Labels geplant werden sollen. Zu diesem Zweck gibt es im Operator die M\u00f6glichkeit, einen bestimmten Label und einen pro Host-Instanz zuzuweisen. Das f\u00fchrt dazu, dass die Pods von Kubernetes ausschlie\u00dflich auf Nodes gestartet werden, die den Anforderungen entsprechen, vereinfacht gesagt. Die Administratoren vergeben Labels und f\u00fchren das Provisioning der Festplatten manuell durch. Und dann skaliert es.<\/p>\n<p><\/p>\n<p>Und genau die dritte Variante von local hilft, dies ein wenig zu vereinfachen. Wie ich bereits betont habe, ist es eine m\u00fchsame Arbeit, die bei der Umsetzung hilft, die maximale Leistung zu erzielen.<\/p>\n<p><\/p>\n<p><em>Ich habe eine zweite Frage, die damit zusammenh\u00e4ngt. Kubernetes wurde so konzipiert, dass es uns egal ist, ob wir einen Node verlieren oder nicht. Was sollen wir in diesem Fall tun, wenn wir den Node verloren haben, an dem unsere Shard h\u00e4ngt?<\/em><\/p>\n<p><\/p>\n<p>Ja, Kubernetes wurde urspr\u00fcnglich so positioniert, dass unsere Beziehung zu unseren Pods wie zu Vieh ist, und hier wird jede Festplatte zu einer Art Haustier. Es gibt dieses Problem, dass wir sie nicht einfach wegwerfen k\u00f6nnen. Die Entwicklung von Kubernetes geht in die Richtung, dass man nicht vollst\u00e4ndig solidarisch mit diesem philosophisch umgehen kann, wie mit vollst\u00e4ndig wegwerfbaren Ressourcen.<\/p>\n<p><\/p>\n<p>Jetzt zur praktischen Frage. Was tun, wenn Sie einen Node verloren haben, auf dem die Festplatte war? Hier wird das Problem auf einer h\u00f6heren Ebene gel\u00f6st. Im Falle von ClickHouse haben wir Replikate, die auf einer h\u00f6heren Ebene arbeiten, d.h. auf der ClickHouse-Ebene.<\/p>\n<p><\/p>\n<p>Was ergibt sich daraus? F\u00fcr den Verlust von Daten ist DevOps verantwortlich. Er muss die Replikation richtig konfigurieren und sicherstellen, dass die Replikation durchgef\u00fchrt wird. In der Replik auf der ClickHouse-Ebene m\u00fcssen die Daten dupliziert sein. Das ist nicht die Aufgabe, die der Operator l\u00f6st. Und das ist nicht die Aufgabe, die Kubernetes selbst l\u00f6st. Das liegt auf der ClickHouse-Ebene.<\/p>\n<p><\/p>\n<p>Was tun, wenn Ihnen ein Eisenknoten abgerissen ist? Man muss also einen zweiten setzen, richtig den Disk provisionieren, Labels anbringen. Und danach wird sie die Anforderungen erf\u00fcllen, damit Kubernetes darauf ein Pod-Instance starten kann. Kubernetes wird es starten. Ihnen fehlen ja die Anzahl an Pods bis zur festgelegten Anzahl. Es wird durch den Zyklus gehen, den ich gezeigt habe. Und auf der obersten Ebene wird ClickHouse verstehen, dass uns eine Replica eingegangen ist, sie ist noch leer und man muss anfangen, Daten dorthin zu \u00fcbertragen. Das hei\u00dft, dieser Prozess ist noch schlecht automatisiert. <\/p>\n<p><\/p>\n<p><em>Danke f\u00fcr den Vortrag! Wenn verschiedene Probleme auftreten, der Operator abst\u00fcrzt und neu gestartet wird, w\u00e4hrend in diesem Moment Ereignisse eintreffen, verarbeiten Sie das irgendwie?<\/em><\/p>\n<p><\/p>\n<p>Was passiert, wenn der Operator abgest\u00fcrzt ist und neu gestartet wurde, ja? <\/p>\n<p><\/p>\n<p><em>Ja. Und in diesem Moment sind Ereignisse eingegangen.<\/em> <\/p>\n<p><\/p>\n<p>Die Aufgabe, was in diesem Fall zu tun ist, teilt sich teilweise zwischen dem Operator und Kubernetes auf. Kubernetes hat die M\u00f6glichkeit, das eingetretene Ereignis zu wiederholen. Er spielt es nach. Die Aufgabe des Operators besteht darin, sicherzustellen, dass, wenn ihm die Ereignisprotokolle erneut abgespielt werden, diese Ereignisse idempotent sind. Und dass das wiederholte Eintreffen desselben Ereignisses unser System nicht kaputt macht. Und unser Operator bew\u00e4ltigt diese Aufgabe. <\/p>\n<p><\/p>\n<p><em>Hallo! Danke f\u00fcr den Vortrag! Dmitrij Sawjalow, Unternehmen<\/em> <em>Smedova. Ist die M\u00f6glichkeit, die Konfiguration mit Haproxy in den Operator aufzunehmen, geplant? Interessiert mich ein anderer Load Balancer als der Standard, damit er intelligent ist und versteht, dass dort wirklich ClickHouse ist.<\/em> <\/p>\n<p><\/p>\n<p>Sprechen Sie von Ingress?<\/p>\n<p><\/p>\n<p><em>Ja, Ingress durch Haproxy ersetzen. In Haproxy kann man die Cluster-Topologie angeben, wo seine Replikas sind.<\/em><\/p>\n<p><\/p>\n<p>Bisher haben wir noch nicht dar\u00fcber nachgedacht. Wenn Sie das brauchen und erkl\u00e4ren k\u00f6nnen, warum das notwendig ist, k\u00f6nnte es umgesetzt werden, insbesondere, wenn Sie teilnehmen m\u00f6chten. Wir betrachten gerne die Option. Kurze Antwort \u2013 nein, wir haben momentan diese Funktionalit\u00e4t nicht. Danke f\u00fcr den Hinweis, wir werden uns das ansehen. Und wenn Sie uns noch den Anwendungsfall erkl\u00e4ren und warum es in der Praxis notwendig ist, zum Beispiel, wenn Sie Issues auf GitHub erstellen, w\u00e4re das wundervoll.<\/p>\n<p><\/p>\n<p><em>Gibt es bereits.<\/em><\/p>\n<p><\/p>\n<p>Gut. Wir sind offen f\u00fcr alle Vorschl\u00e4ge. Und Haproxy steht auf der To-Do-Liste. Die To-Do-Liste w\u00e4chst zurzeit, sie verringert sich nicht. Aber das ist gut, das hei\u00dft, dass das Produkt gefragt ist.<\/p>\n<p>Quelle: <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.1.1 - 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\/de\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47Operator in Kubernetes zur Verwaltung von DB-Clustern. Vladislav Klimenko (Altinity, 2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/96965","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=96965"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/96965\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/96966"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=96965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=96965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=96965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}