{"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\/pl\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","title":{"rendered":"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/56e002c7408c4708e39ece867f84171e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Referat dotyczy praktycznych kwestii zwi\u0105zanych z rozwojem operatora w Kubernetes, projektowaniem jego architektury oraz podstawowych zasad funkcjonowania.<\/p>\n<p><\/p>\n<p>W pierwszej cz\u0119\u015bci referatu om\u00f3wimy:<\/p>\n<p><\/p>\n<ul>\n<li>czym jest operator w Kubernetes i dlaczego jest potrzebny;<\/li>\n<li>w jaki spos\u00f3b operator upraszcza zarz\u0105dzanie z\u0142o\u017conymi systemami;<\/li>\n<li>co operator mo\u017ce zrobi\u0107, a co jest poza jego zakresem.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nast\u0119pnie przejdziemy do om\u00f3wienia wewn\u0119trznej struktury operatora. Przeanalizujemy architektur\u0119 i dzia\u0142anie operatora krok po kroku. Szczeg\u00f3\u0142owo om\u00f3wimy:<\/p>\n<p><\/p>\n<ul>\n<li>interakcj\u0119 mi\u0119dzy operatorem a Kubernetes;<\/li>\n<li>jakie funkcje operator przejmuje na siebie, a co deleguje do Kubernetes.<\/li>\n<\/ul>\n<p><\/p>\n<p>Przyjrzymy si\u0119 zarz\u0105dzaniu shardami i replikami bazy danych w Kubernetes.<br \/>\nNast\u0119pnie om\u00f3wimy kwestie przechowywania danych:<\/p>\n<p><\/p>\n<ul>\n<li>jak pracowa\u0107 z Persistent Storage z perspektywy operatora;<\/li>\n<li>pu\u0142apki zwi\u0105zane z u\u017cywaniem Local Storage.<\/li>\n<\/ul>\n<p><\/p>\n<p>W ko\u0144cowej cz\u0119\u015bci referatu przedstawimy praktyczne przyk\u0142ady zastosowania <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">clickhouse-operator<\/a><\/noindex> w Amazon lub Google Cloud Service. Referat oparty jest na przyk\u0142adzie rozwoju i do\u015bwiadcze\u0144 z eksploatacji operatora dla ClickHouse.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Wideo:<\/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=\"Odtwarzaj wideo\" 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>Nazywam si\u0119 W\u0142adys\u0142aw Klime\u0144ko. Dzi\u015b chcia\u0142em opowiedzie\u0107 o naszym do\u015bwiadczeniu w zakresie rozwoju i eksploatacji operatora, b\u0119d\u0105cego specjalizowanym operatorem do zarz\u0105dzania klastrami baz danych. Na przyk\u0142adzie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">ClickHouse-operator<\/a><\/noindex> do zarz\u0105dzania klastrem ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cc297a3edb3b2a5e30d0dc2725de4011.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dlaczego mamy prawo m\u00f3wi\u0107 o operatorze i ClickHouse?<\/p>\n<p><\/p>\n<ul>\n<li>Zajmujemy si\u0119 wsparciem i rozwojem ClickHouse. <\/li>\n<li>Obecnie staramy si\u0119 stopniowo wnosi\u0107 nasz skromny wk\u0142ad w rozw\u00f3j ClickHouse. Jeste\u015bmy drug\u0105 firm\u0105 po Yandexie pod wzgl\u0119dem liczby wprowadzonych zmian w ClickHouse. <\/li>\n<li>Starali\u015bmy si\u0119 realizowa\u0107 dodatkowe projekty dla ekosystemu ClickHouse. <\/li>\n<\/ul>\n<p><\/p>\n<p>O jednym z takich projekt\u00f3w chcia\u0142em opowiedzie\u0107. Dotyczy on ClickHouse-operatora dla Kubernetes. <\/p>\n<p><\/p>\n<p>W moim referacie chcia\u0142bym poruszy\u0107 dwie tematy: <\/p>\n<p><\/p>\n<ul>\n<li>Pierwszy temat \u2013 to jak dzia\u0142a nasz operator do zarz\u0105dzania bazami danych ClickHouse w Kubernetes. <\/li>\n<li>Drugi temat \u2013 jak dzia\u0142a dowolny operator, tzn. jak wsp\u00f3\u0142dzia\u0142a z Kubernetes. <\/li>\n<\/ul>\n<p><\/p>\n<p>Te dwa zagadnienia b\u0119d\u0105 si\u0119 przenika\u0107 przez ca\u0142y m\u00f3j referat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4cc9790e18e70ae1ccde2cf39ef4ef00.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kto mo\u017ce by\u0107 zainteresowany tym, co pr\u00f3buj\u0119 przedstawi\u0107?<\/p>\n<p><\/p>\n<ul>\n<li>Najbardziej zainteresowane b\u0119d\u0105 osoby eksploatuj\u0105ce operator\u00f3w. <\/li>\n<li>Lub ci, kt\u00f3rzy chc\u0105 stworzy\u0107 w\u0142asnego, aby zrozumie\u0107, jak to dzia\u0142a w \u015brodku, jak operator wsp\u00f3\u0142dzia\u0142a z Kubernetes i jakie pu\u0142apki mog\u0105 si\u0119 pojawi\u0107. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/07545f7a0171b610697c519d4aa9cd43.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aby lepiej zrozumie\u0107 to, o czym dzisiaj b\u0119dziemy rozmawia\u0107, warto wiedzie\u0107, jak dzia\u0142a Kubernetes i mie\u0107 podstawow\u0105 wiedz\u0119 na temat technologii chmurowych. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/eff56cc3e83fde3d3e64d73d41b07417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Czym jest ClickHouse? To kolumnowa baza danych, skoncentrowana na online'owym przetwarzaniu zapyta\u0144 analitycznych. Jest ca\u0142kowicie open source. <\/p>\n<p><\/p>\n<p>Musimy wiedzie\u0107 tylko dwie rzeczy. Po pierwsze, jest to baza danych, wi\u0119c to, o czym b\u0119d\u0119 m\u00f3wi\u0107, dotyczy w zasadzie ka\u017cdej bazy danych. Po drugie, system zarz\u0105dzania bazami danych ClickHouse skaluj\u0119 bardzo dobrze, prawie w spos\u00f3b liniowy. Dlatego stan klastra jest naturalnym stanem dla ClickHouse. Najbardziej interesuje nas om\u00f3wienie, jak zarz\u0105dza\u0107 klastrem ClickHouse w Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5eb1ff5026c492117bf2467b10de7053.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Po co jest tam potrzebny? Dlaczego nie mo\u017cemy kontynuowa\u0107 jego eksploatacji samodzielnie? Odpowiedzi s\u0105 cz\u0119\u015bciowo techniczne, a cz\u0119\u015bciowo organizacyjne. <\/p>\n<p><\/p>\n<ul>\n<li>W praktyce coraz cz\u0119\u015bciej spotykamy sytuacj\u0119, w kt\u00f3rej w du\u017cych firmach praktycznie wszystkie komponenty s\u0105 ju\u017c w Kubernetes. Bazy danych pozostaj\u0105 poza nim. <\/li>\n<li>Coraz cz\u0119\u015bciej pojawia si\u0119 pytanie: \u201eCzy mo\u017cna to umie\u015bci\u0107 wewn\u0105trz?\u201d. Dlatego du\u017ce firmy staraj\u0105 si\u0119 maksymalnie ujednolici\u0107 zarz\u0105dzanie, aby szybko m\u00f3c zarz\u0105dza\u0107 swoimi magazynami danych. <\/li>\n<li>Pomaga to szczeg\u00f3lnie, gdy potrzebna jest maksymalna zdolno\u015b\u0107 do powt\u00f3rzenia tego samego w nowym miejscu, tzn. maksymalna przeno\u015bno\u015b\u0107.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/99312e74bd7ed4031128c7ec872f6a68.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak trudne lub \u0142atwe to jest? Mo\u017cna to oczywi\u015bcie robi\u0107 r\u0119cznie. Ale nie jest to takie proste, poniewa\u017c mamy dodatkow\u0105 z\u0142o\u017cono\u015b\u0107 zarz\u0105dzania samym Kubernetes, a tak\u017ce specyfik\u0119 ClickHouse. Powstaje agregacja. <\/p>\n<p><\/p>\n<p>Wszystko razem daje do\u015b\u0107 du\u017c\u0105 liczb\u0119 technologii, kt\u00f3rymi zarz\u0105dzanie staje si\u0119 do\u015b\u0107 skomplikowane, poniewa\u017c Kubernetes wprowadza codzienne pytania dotycz\u0105ce eksploatacji, a ClickHouse wprowadza w\u0142asne pytania zwi\u0105zane z codzienn\u0105 eksploatacj\u0105. Szczeg\u00f3lnie je\u015bli mamy kilka instancji ClickHouse i musimy ci\u0105gle co\u015b z nimi robi\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ca10b805b2744d1a5283f96b0ac1cc11.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse w przypadku dynamicznej konfiguracji ma liczne pytania, kt\u00f3re staj\u0105 si\u0119 sta\u0142ym obci\u0105\u017ceniem dla DevOps:<\/p>\n<p><\/p>\n<ul>\n<li>Kiedy chcemy co\u015b zmieni\u0107 w ClickHouse, na przyk\u0142ad doda\u0107 replik\u0119 lub shard, musimy przeprowadzi\u0107 zarz\u0105dzanie konfiguracj\u0105. <\/li>\n<li>Nast\u0119pnie nale\u017cy zmieni\u0107 schemat danych, poniewa\u017c ClickHouse ma specyficzny spos\u00f3b shardowania. Nale\u017cy roz\u0142o\u017cy\u0107 schemat danych oraz skonfigurowa\u0107 go. <\/li>\n<li>Nale\u017cy skonfigurowa\u0107 monitorowanie. <\/li>\n<li>Zbieranie log\u00f3w dla nowych shard\u00f3w, dla nowych replik. <\/li>\n<li>Zaj\u0105\u0107 si\u0119 przywracaniem.<\/li>\n<li>I ponownym uruchomieniem. <\/li>\n<\/ul>\n<p><\/p>\n<p>To s\u0105 rutynowe prace, kt\u00f3re bardzo chcia\u0142oby si\u0119 upro\u015bci\u0107 w eksploatacji.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2461e861ca1d2f2344ead9decf85a97e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sam Kubernetes dobrze wspomaga eksploatacj\u0119, ale w podstawowych systemowych kwestiach. <\/p>\n<p><\/p>\n<p>Kubernetes dobrze upraszcza i automatyzuje takie rzeczy, jak:<\/p>\n<p><\/p>\n<ul>\n<li>Przywracanie.<\/li>\n<li>Ponowne uruchomienie. <\/li>\n<li>Zarz\u0105dzanie systemem pami\u0119ci.<\/li>\n<\/ul>\n<p><\/p>\n<p>To dobre i w\u0142a\u015bciwy kierunek, ale ca\u0142kowicie nie ma poj\u0119cia o tym, jak eksploatowa\u0107 klaster bazy danych. <\/p>\n<p><\/p>\n<p>Chcia\u0142oby si\u0119 wi\u0119cej, chcia\u0142oby si\u0119, aby ca\u0142a baza danych dzia\u0142a\u0142a w Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6564e9f29d5d518925c8593bca978345.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Chcia\u0142oby si\u0119 mie\u0107 co\u015b w rodzaju du\u017cego, magicznego czerwonego przycisku, na kt\u00f3ry si\u0119 naciska i rozwija oraz utrzymuje przez ca\u0142y cykl \u017cycia klaster z codziennymi zadaniami do rozwi\u0105zania. Klaster ClickHouse w Kubernetes.<\/p>\n<p><\/p>\n<p>I starali\u015bmy si\u0119 stworzy\u0107 takie rozwi\u0105zanie, kt\u00f3re mia\u0142oby u\u0142atwi\u0107 prac\u0119. To ClickHouse-operator dla Kubernetes od firmy Altinity.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ff80c6fc59069ec900d545096ad978d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Operator to program, kt\u00f3rego g\u0142\u00f3wnym zadaniem jest zarz\u0105dzanie innymi programami, czyli jest to mened\u017cer. <\/p>\n<p><\/p>\n<p>Zawiera on wzorce zachowa\u0144. Mo\u017cna to nazwa\u0107 skodyfikowan\u0105 wiedz\u0105 o danej dziedzinie. <\/p>\n<p><\/p>\n<p>A jego g\u0142\u00f3wnym zadaniem jest u\u0142atwienie \u017cycia DevOps i zmniejszenie mikrozarz\u0105dzania, aby my\u015bla\u0142 on w kategoriach wysokiego poziomu, czyli aby nie zajmowa\u0142 si\u0119 mikrozarz\u0105dzaniem i nie konfigurowa\u0142 wszystkich szczeg\u00f3\u0142\u00f3w r\u0119cznie. <\/p>\n<p><\/p>\n<p>Operator to robot asystent, kt\u00f3ry walczy z mikrozadaniami i wspiera DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0824a1fa710e8c4f45406aa7f596b977.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Po co potrzebny jest operator? Sprawdza si\u0119 on szczeg\u00f3lnie dobrze w dw\u00f3ch kwestiach:<\/p>\n<p><\/p>\n<ul>\n<li>Kiedy specjalista zajmuj\u0105cy si\u0119 ClickHouse'a ma niewystarczaj\u0105ce do\u015bwiadczenie, ale ju\u017c musi eksploatowa\u0107 ClickHouse, operator u\u0142atwia eksploatacj\u0119 i pozwala zarz\u0105dza\u0107 klastrem ClickHouse z do\u015b\u0107 skomplikowan\u0105 konfiguracj\u0105, nie wnikaj\u0105c w szczeg\u00f3\u0142y, jak to wszystko dzia\u0142a wewn\u0105trz. Po prostu otrzymuje wysokopoziomowe zadania i to dzia\u0142a. <\/li>\n<li>A drug\u0105 zadaniem, w kt\u00f3rym on najlepiej si\u0119 sprawdza, jest automatyzacja du\u017cej liczby typowych zada\u0144. Zdejmuje mikro-zadania z administracji systemu. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f1cb11156d57f560d0b6c82700ac6ff8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To jest szczeg\u00f3lnie potrzebne dla tych, kt\u00f3rzy dopiero zaczynaj\u0105 swoj\u0105 drog\u0119 lub dla tych, kt\u00f3rzy musz\u0105 zajmowa\u0107 si\u0119 du\u017c\u0105 automatyzacj\u0105. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/128e7d9ff1ce0c535f98be66aedb1060.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jaka jest wi\u0119c r\u00f3\u017cnica w podej\u015bciu opartym na operatorach a innymi systemami? Przecie\u017c jest Helm. On r\u00f3wnie\u017c pomaga zainstalowa\u0107 ClickHouse, mo\u017cna narysowa\u0107 wykresy helm, kt\u00f3re nawet zainstaluj\u0105 ca\u0142y klaster ClickHouse. Jakie jest w takim razie r\u00f3\u017cnica mi\u0119dzy operatorem a na przyk\u0142ad Helm?<\/p>\n<p><\/p>\n<p>Podstawowa fundamentalna r\u00f3\u017cnica polega na tym, \u017ce Helm to zarz\u0105dzanie pakietami, a operator idzie dalej. To wsparcie ca\u0142ego cyklu \u017cycia. To nie tylko instalacja, to codzienne zadania, kt\u00f3re obejmuj\u0105 skalowanie, sharding, czyli wszystko, co trzeba wykona\u0107 w trakcie cyklu \u017cycia (je\u015bli zajdzie taka potrzeba, to i usuni\u0119cie) \u2013 to wszystko rozwi\u0105zuje operator. D\u0105\u017cy do automatyzacji i zarz\u0105dzania ca\u0142ym cyklem \u017cycia oprogramowania. To jest jego fundamentalna r\u00f3\u017cnica w por\u00f3wnaniu do innych dost\u0119pnych rozwi\u0105za\u0144. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e26b57c8caf8437f683d7afbfa127ebd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To by\u0142a cz\u0119\u015b\u0107 wprowadzaj\u0105ca, przejd\u017amy dalej. <\/p>\n<p><\/p>\n<p>Jak budujemy swojego operatora? Staramy si\u0119 podej\u015b\u0107 do kwestii, aby zarz\u0105dza\u0107 klastrem ClickHouse jako jednym zasobem. <\/p>\n<p><\/p>\n<p>Po lewej stronie schematu mamy dane wej\u015bciowe. To YAML ze specyfikacj\u0105 klastra, kt\u00f3ry w klasyczny spos\u00f3b jest przesy\u0142any do Kubernetes przez kubectl. Operator przechwytuje to, wykonuje swoj\u0105 magi\u0119. A na wyj\u015bciu otrzymujemy taki schemat. To implementacja ClickHouse w Kubernetes.<\/p>\n<p><\/p>\n<p>I dalej b\u0119dziemy powoli przygl\u0105da\u0107 si\u0119, jak dok\u0142adnie dzia\u0142a operator, jakie typowe zadania mo\u017cna rozwi\u0105za\u0107. Rozwa\u017cymy tylko typowe zadania, poniewa\u017c mamy ograniczony czas. I nie b\u0119dzie opowiedziane o wszystkim, co mo\u017ce rozwi\u0105za\u0107 operator. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b40401931b58988058419d4495dbb1bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Opartym na praktyce. Nasz projekt jest ca\u0142kowicie open source, wi\u0119c mo\u017cna zobaczy\u0107, jak dzia\u0142a na GitHubie. Je\u015bli chce si\u0119 po prostu uruchomi\u0107, mo\u017cna zaczyna\u0107 z Quick Start Guide.<\/p>\n<p><\/p>\n<p>Je\u015bli chcesz dok\u0142adnie zrozumie\u0107, staramy si\u0119 utrzymywa\u0107 dokumentacj\u0119 w do\u015b\u0107 przyzwoitym stanie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9414d7c3aa94b6ad999e150f0ac25a97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zacznijmy od praktycznego zadania. Pierwszym krokiem, od kt\u00f3rego wszyscy chcemy zacz\u0105\u0107, jest uruchomienie pierwszego przyk\u0142adu w jakikolwiek spos\u00f3b. Jak uruchomi\u0107 ClickHouse za pomoc\u0105 operatora, nawet nie bardzo wiedz\u0105c, jak on dzia\u0142a? Piszemy manifest, poniewa\u017c ca\u0142e komunikowanie si\u0119 z k8s odbywa si\u0119 za po\u015brednictwem manifest\u00f3w.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3e97cd235827460693ed95fb3598d31d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oto tak z\u0142o\u017cony manifest. To, co mamy zaznaczone na czerwono, to na czym musimy si\u0119 skupi\u0107. Prosimy operatora o utworzenie klastra o nazwie demo.<\/p>\n<p><\/p>\n<p>Na razie to podstawowe przyk\u0142ady. Przechowywanie jeszcze nie jest opisane, ale do tematu przechowywania wr\u00f3cimy nieco p\u00f3\u017aniej. Na razie b\u0119dziemy na bie\u017c\u0105co \u015bledzi\u0107 rozw\u00f3j klastra.<\/p>\n<p><\/p>\n<p>Utworzyli\u015bmy ten manifest. Podajemy go naszemu operatorowi. On popracowa\u0142, zrobi\u0142 magi\u0119.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/502e64fbe6ed7d04b2aecb7d51abc7f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Patrzymy na konsol\u0119. Interesuj\u0105 nas trzy komponenty \u2013 to Pod, dwa Serwisy i StatefulSet.<\/p>\n<p><\/p>\n<p>Operator zako\u0144czy\u0142 prac\u0119 i mo\u017cemy zobaczy\u0107, co dok\u0142adnie stworzy\u0142. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/67faf120e21e5113680ccff9c71b00f1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tworzy on mniej wi\u0119cej tak\u0105 schem\u0119. Mamy StatefulSet, Pod, ConfigMap dla ka\u017cdej repliki, ConfigMap dla ca\u0142ego klastra. Niezb\u0119dne s\u0105 r\u00f3wnie\u017c serwisy jako punkty wej\u015bcia do klastra. <\/p>\n<p><\/p>\n<p>Serwisy \u2013 to centralny Load Balancer Service, a tak\u017ce mo\u017cna stworzy\u0107 dla ka\u017cdej repliki, dla ka\u017cdego sharda. <\/p>\n<p><\/p>\n<p>Nasz podstawowy klaster wygl\u0105da mniej wi\u0119cej w ten spos\u00f3b. Sk\u0142ada si\u0119 z jednej jedynej nody. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f235ada45ee58b517c0e041f795ae122.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Id\u017amy dalej, b\u0119dziemy to komplikuowa\u0107. Musimy shardowa\u0107 klaster.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/992836a00434c64fb4616c1c4cc4df97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nasze zadania rosn\u0105, zaczyna si\u0119 dynamika. Chcemy doda\u0107 shard. Obserwujemy rozw\u00f3j. Zmieniamy nasz\u0105 specyfikacj\u0119. Wskazujemy, \u017ce chcemy dwa shardy. <\/p>\n<p><\/p>\n<p>To ten sam plik, kt\u00f3ry dynamicznie rozwija si\u0119 wraz z rozwojem systemu. Przechowywanie nie jest jeszcze uwzgl\u0119dnione, przechowywanie zostanie om\u00f3wione p\u00f3\u017aniej, to osobny temat.<\/p>\n<p><\/p>\n<p>Podajemy YAML-operatorowi i sprawdzamy, co si\u0119 dzieje. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8ddb5845cae160098470208f51b5da7c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Operator pomy\u015bla\u0142 i stworzy\u0142 nast\u0119puj\u0105ce byty. Mamy ju\u017c dwa Pod, trzy Serwisy i niespodziewanie, 2 StatefulSet-y. Dlaczego 2 StatefulSet-y?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/26eb734ff1a195de2ceaab842b472ee4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na schemacie wygl\u0105da\u0142o to tak \u2013 to nasz stan pocz\u0105tkowy, kiedy mieli\u015bmy jeden pod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/657838b0d378121fdd66ad3ff8168600.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz wygl\u0105da to tak. Na razie wszystko jest proste, zosta\u0142o to skopiowane. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f039a7046f1c56fbdad6b5a26a519b10.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I dlaczego StatefulSet sta\u0142 si\u0119 dwa? Tutaj musimy si\u0119 oderwa\u0107 i om\u00f3wi\u0107, jak w Kubernetes odbywa si\u0119 zarz\u0105dzanie Pod\u2019ami.<\/p>\n<p><\/p>\n<p>Istnieje taki obiekt o nazwie StatefulSet, kt\u00f3ry pozwala tworzy\u0107 zestaw Pod\u2019\u00f3w z szablonu. Kluczem jest Template. Mo\u017cna w jednym StatefulSet uruchamia\u0107 wiele Pod\u2019\u00f3w z jednego szablonu. Kluczow\u0105 fraz\u0105 jest tutaj \u201ewiele Pod\u2019\u00f3w z jednego szablonu\u201d.<\/p>\n<p><\/p>\n<p>Istnia\u0142a pokusa, aby stworzy\u0107 ca\u0142y klaster, pakuj\u0105c go w jeden StatefulSet. To b\u0119dzie dzia\u0142a\u0107, nie ma co do tego w\u0105tpliwo\u015bci. Ale jest jeden szczeg\u00f3\u0142. Je\u015bli chcemy zbudowa\u0107 heterogeniczny klaster, tzn. z kilku wersji ClickHouse, to zaczynaj\u0105 si\u0119 pytania. Tak, StatefulSet mo\u017ce przeprowadzi\u0107 rolling update, mo\u017cna tam wprowadza\u0107 now\u0105 wersj\u0119, t\u0142umacz\u0105c, \u017ce nale\u017cy spr\u00f3bowa\u0107 nie wi\u0119cej ni\u017c tyle nod\u00f3w jednocze\u015bnie.<\/p>\n<p><\/p>\n<p>Jednak je\u015bli ekstrapolowa\u0107 zadanie i powiedzie\u0107, \u017ce chcemy stworzy\u0107 ca\u0142kowicie heterogeniczny klaster i chcemy nie zmienia\u0107 z wersji starej na now\u0105 za pomoc\u0105 rolling update, a po prostu chcemy stworzy\u0107 klaster heterogeniczny, zar\u00f3wno w kwestii r\u00f3\u017cnych wersji ClickHouse, jak i r\u00f3\u017cnego przechowywania. Chcemy na przyk\u0142ad, aby niekt\u00f3re repliki znajdowa\u0142y si\u0119 na oddzielnych dyskach, na wolnych, generalnie ca\u0142kowicie zbudowa\u0107 heterogeniczny klaster. I z powodu tego, \u017ce StatefulSet tworzy ustandaryzowane rozwi\u0105zanie z jednego szablonu, nie ma mo\u017cliwo\u015bci tego zrobi\u0107. <\/p>\n<p><\/p>\n<p>Po pewnym namy\u015ble podj\u0119to decyzj\u0119, \u017ce zrobimy to w ten spos\u00f3b. Ka\u017cda replika znajduje si\u0119 w swoim w\u0142asnym StatefulSet. To rozwi\u0105zanie ma pewne wady, ale w praktyce w pe\u0142ni inkapsuluje to operator. I jest wiele zalet. Mo\u017cemy budowa\u0107 dok\u0142adnie taki klaster, jaki chcemy, na przyk\u0142ad ca\u0142kowicie heterogeniczny. Dlatego w klastrze, w kt\u00f3rym mamy dwa shard'y z jedn\u0105 replik\u0105, b\u0119dziemy mie\u0107 2 StatefulSet'y i 2 Pod'y, w\u0142a\u015bnie dlatego, \u017ce wybrali\u015bmy takie podej\u015bcie z powodu wcze\u015bniej wymienionych powod\u00f3w, aby mie\u0107 mo\u017cliwo\u015b\u0107 zbudowania heterogenicznego klastra. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b7ae92a545f9bb6cc5f0136df87207f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wr\u00f3\u0107my do praktycznych zada\u0144. W naszym klastrze trzeba konfigurowa\u0107 u\u017cytkownik\u00f3w, tzn. trzeba wykona\u0107 pewn\u0105 konfiguracj\u0119 ClickHouse w Kubernetes. Operator do tego zapewnia wszystkie mo\u017cliwo\u015bci. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6a65aa78293c0b40230cf24efc58e55a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mo\u017cna bezpo\u015brednio w YAML pisa\u0107 to, co chcemy. Wszystkie opcje konfiguracyjne s\u0105 bezpo\u015brednio mapowane z tego YAML do konfiguracji ClickHouse, kt\u00f3re nast\u0119pnie s\u0105 rozk\u0142adane po ca\u0142ym klastrze.<\/p>\n<p><\/p>\n<p>Mo\u017cna te\u017c pisa\u0107 w ten spos\u00f3b. To tylko przyk\u0142ad. Has\u0142o mo\u017cna zrobi\u0107 zaszyfrowane. Wspierane s\u0105 absolutnie wszystkie opcje konfiguracyjne ClickHouse. To tylko przyk\u0142ad. <\/p>\n<p><\/p>\n<p>Konfiguracja w klastrze rozprzestrzenia si\u0119 jako ConfigMap. W praktyce aktualizacja ConfigMap nie przebiega natychmiast, dlatego je\u015bli klaster jest du\u017cy, proces wprowadzania konfiguracji zajmuje troch\u0119 czasu. Ale to wszystko jest bardzo wygodne w eksploatacji.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2e42d19d7a558e3b8d4bbb51fe5bd08b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Utrudniamy zadanie. Klaster si\u0119 rozwija. Chcemy replikowa\u0107 dane. To znaczy, mamy ju\u017c dwa shard'y, z jedn\u0105 replik\u0105, skonfigurowani u\u017cytkownicy. Ro\u015bniemy i chcemy zaj\u0105\u0107 si\u0119 replikacj\u0105.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c97e5e6ca9cb66d3a94fb8cfe610186.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Czego potrzebujemy do replikacji? <\/p>\n<p><\/p>\n<p>Potrzebujemy ZooKeepera. W ClickHouse replikacja oparta jest na ZooKeeperze. ZooKeeper jest potrzebny, aby r\u00f3\u017cne repliki ClickHouse mia\u0142y konsensus co do tego, jakie bloki danych s\u0105 dost\u0119pne w kt\u00f3rym ClickHouse. <\/p>\n<p><\/p>\n<p>Mo\u017cna u\u017cywa\u0107 dowolnego ZooKeepera. Je\u015bli firma ma zewn\u0119trznego ZooKeepera, mo\u017cna go wykorzysta\u0107. Je\u015bli nie, mo\u017cna zainstalowa\u0107 go z naszego repozytorium. Jest instalator, kt\u00f3ry to wszystko u\u0142atwia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6cc40951a19b982abf578836edf569d3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I schemat interakcji ca\u0142ego systemu wygl\u0105da tak. Mamy Kubernetes jako platform\u0119. Na nim dzia\u0142a operator ClickHouse. ZooKeeper przedstawi\u0142em tutaj. Operator wsp\u00f3\u0142dzia\u0142a zar\u00f3wno z ClickHouse, jak i z ZooKeeperem. To stworzy interakcj\u0119. <\/p>\n<p><\/p>\n<p>Wszystko to jest potrzebne, aby ClickHouse skutecznie replikowa\u0142 dane w k8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4fc37aee850acd20517fa3d7562f0165.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przyjrzyjmy si\u0119 teraz samej zadaniu, jak b\u0119dzie wygl\u0105da\u0142 manifest do replikacji.<\/p>\n<p><\/p>\n<p>Do naszego manifestu dodajemy dwie sekcje. Pierwsza \u2013 to miejsce, sk\u0105d bra\u0107 ZooKeepera, kt\u00f3ry mo\u017ce by\u0107 zar\u00f3wno wewn\u0105trz Kubernetes, jak i zewn\u0119trzny. To po prostu opis. I zamawiamy repliki. To znaczy, chcemy dwie repliki. W sumie na wyj\u015bciu powinni\u015bmy mie\u0107 4 pod'y. Pami\u0119tamy o storage, wr\u00f3ci on troch\u0119 p\u00f3\u017aniej. Storage \u2013 to osobna historia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb8c974d0587a4ad87d6ba36bbe5e3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>By\u0142o tak.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/909ffd258dbce718ddf529a1a753de6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Staje si\u0119 tak. Dodaj\u0105 si\u0119 repliki. 4-ta nie mie\u015bci\u0142a si\u0119, wierzymy, \u017ce mo\u017ce ich by\u0107 wiele. I z boku dodaje si\u0119 ZooKeeper. Schematy si\u0119 komplikujuj\u0105. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c33b37fc7fc72f51276e5e98b9ec2134.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nadesz\u0142a pora, aby doda\u0107 nast\u0119pne zadanie. B\u0119dziemy dodawa\u0107 Persistent Storage. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f28d14901a713eca413a52ec6ea21ac5.jpeg\" style=\"display:block;margin: 0 auto;\" \/>W przypadku Persistent Storage mamy r\u00f3\u017cne opcje realizacji.<\/p>\n<p><\/p>\n<p>W przypadku, gdy rozmieszczamy si\u0119 u dostawcy chmurowego, na przyk\u0142ad korzystaj\u0105c z Amazon, Google, istnieje du\u017ca pokusa, by skorzysta\u0107 z chmurowego storage. To bardzo wygodne, to dobrze. <\/p>\n<p><\/p>\n<p>I jest druga opcja. To dla lokalnego storage, gdy mamy lokalne dyski na ka\u017cdej w\u0119\u017ale. Ta opcja jest znacznie trudniejsza do zrealizowania, ale przy tym bardziej wydajna. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/483ee5c08b62e987620bf54fd32a44b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zobaczmy, co mamy w odniesieniu do cloud storage.<\/p>\n<p><\/p>\n<p>S\u0105 zalety. To bardzo proste w konfiguracji. Po prostu zamawiamy u dostawcy chmurowego, aby dostarczy\u0142 nam storage o okre\u015blonej pojemno\u015bci i klasie. Klasy s\u0105 okre\u015blone przez dostawc\u00f3w samodzielnie. <\/p>\n<p><\/p>\n<p>I jest to wada. Dla kogo\u015b jest to wada niekrytyczna. Oczywi\u015bcie b\u0119d\u0105 pewne ograniczenia wydajno\u015bci. Jest to bardzo wygodne w pracy, niezawodne, ale s\u0105 pewne potencjalne spadki wydajno\u015bci.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8e82430b64477f91640078ff4eacb47e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A poniewa\u017c ClickHouse koncentruje si\u0119 na wydajno\u015bci, mo\u017cna nawet powiedzie\u0107, \u017ce wyciska wszystko, co tylko mo\u017cliwe, dlatego wielu klient\u00f3w stara si\u0119 maksymalnie wykorzysta\u0107 wydajno\u015b\u0107.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8638fe37b848a98ce8326218d368baa3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aby uzyska\u0107 maksymalne wyniki, potrzebujemy lokalnego storage.<\/p>\n<p><\/p>\n<p>Kubernetes oferuje trzy abstrakcje do wykorzystania lokalnego storage w Kubernetes. S\u0105 to: <\/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>Zastan\u00f3wmy si\u0119, czym si\u0119 r\u00f3\u017cni\u0105, a czym s\u0105 podobne. <\/p>\n<p><\/p>\n<p>Przede wszystkim we wszystkich trzech podej\u015bciach mamy storage \u2013 to lokalne dyski, kt\u00f3re znajduj\u0105 si\u0119 na tej samej fizycznej nodzie k8s. Ale maj\u0105 pewne r\u00f3\u017cnice.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79afb620a0c9a1552b47240b405fedc9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zacznijmy od najprostszej, czyli emptyDir. Co to praktycznie oznacza? Prosimy nasz\u0105 specyfikacj\u0119 o to, by system konteneryzacji (najcz\u0119\u015bciej jest to Docker) zapewni\u0142 nam dost\u0119p do folderu na lokalnym dysku.<\/p>\n<p><\/p>\n<p>W praktyce Docker gdzie\u015b tam tworzy tymczasowy folder, nazywaj\u0105c go d\u0142ugim hashem, wed\u0142ug w\u0142asnych \u015bcie\u017cek. I zapewnia interfejs dost\u0119pu do niego. <\/p>\n<p><\/p>\n<p>Jak to b\u0119dzie dzia\u0142a\u0107 pod wzgl\u0119dem wydajno\u015bci? B\u0119dzie dzia\u0142a\u0107 z szybko\u015bci\u0105 lokalnego dysku, to znaczy, \u017ce to ca\u0142kowity dost\u0119p do w\u0142asnego dysku. <\/p>\n<p><\/p>\n<p>Ale ma to swoj\u0105 wad\u0119. Trwa\u0142o\u015b\u0107 w tym przypadku jest do\u015b\u0107 w\u0105tpliwa. Przy pierwszej zmianie Dockera z kontenerami trwa\u0142o\u015b\u0107 jest tracona. Je\u015bli Kubernetes z jakiego\u015b powodu zechce przenie\u015b\u0107 ten Pod na inny dysk, dane zostan\u0105 utracone. <\/p>\n<p><\/p>\n<p>Takie podej\u015bcie jest dobre do test\u00f3w, poniewa\u017c pokazuje ju\u017c odpowiedni\u0105 pr\u0119dko\u015b\u0107, ale na co\u015b powa\u017cnego ten wariant si\u0119 nie nadaje. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0b60f80fc9ea0e2c1820021bcd9e1382.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dlatego jest drugie podej\u015bcie. To HostPath. Gdyby spojrze\u0107 na poprzedni slajd i ten, mo\u017cna zauwa\u017cy\u0107 tylko jedno r\u00f3\u017cnic\u0119. Nasz folder pojawi\u0142 si\u0119 z Dockera bezpo\u015brednio na nodzie Kubernetes. Tutaj jest troch\u0119 pro\u015bciej. Bezpo\u015brednio zapisujemy \u015bcie\u017ck\u0119 w lokalnym systemie plik\u00f3w, gdzie chcieliby\u015bmy przechowywa\u0107 nasze dane. <\/p>\n<p><\/p>\n<p>Zalety tego sposobu s\u0105. To ju\u017c prawdziwa trwa\u0142o\u015b\u0107, wr\u0119cz klasyczna. Na dysku b\u0119d\u0105 zapisane dane pod jakim\u015b adresem. <\/p>\n<p><\/p>\n<p>S\u0105 r\u00f3wnie\u017c wady. To trudno\u015bci w zarz\u0105dzaniu. Nasz Kubernetes mo\u017ce chcie\u0107 przenie\u015b\u0107 Pod na inn\u0105 fizyczn\u0105 w\u0119ze\u0142. I tu do akcji wchodzi DevOps. Musi on poprawnie wyt\u0142umaczy\u0107 ca\u0142emu systemowi, \u017ce przenosi\u0107 te pod\u2019y mo\u017cna tylko na takie w\u0119z\u0142y, na kt\u00f3rych masz zamontowane co\u015b po tych \u015bcie\u017ckach, i nie wi\u0119cej ni\u017c jeden w\u0119ze\u0142 naraz. To do\u015b\u0107 skomplikowane. <\/p>\n<p><\/p>\n<p>Specjalnie w tym celu stworzyli\u015bmy w naszej firmie szablony, aby ukry\u0107 ca\u0142\u0105 t\u0119 z\u0142o\u017cono\u015b\u0107. Mo\u017cna by po prostu powiedzie\u0107: \u201eChc\u0119 mie\u0107 jeden instance ClickHouse na ka\u017cd\u0105 fizyczn\u0105 w\u0119ze\u0142 i po takiej \u015bcie\u017cce\u201d. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f64c19bccc8b187d6af112eda896b25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale ta potrzeba nie dotyczy tylko nas, dlatego panowie z samego Kubernetes tak\u017ce rozumiej\u0105, \u017ce ludzie chc\u0105 mie\u0107 dost\u0119p do fizycznych dysk\u00f3w, dlatego oferuj\u0105 trzeci poziom.<\/p>\n<p><\/p>\n<p>Nazywa si\u0119 on local. R\u00f3\u017cnice z poprzednim slajdem s\u0105 praktycznie \u017cadne. Tylko wcze\u015bniej trzeba by\u0142o r\u0119cznie przeprowadza\u0107, \u017ce tych pod\u2019\u00f3w nie mo\u017cna przenosi\u0107 z w\u0119z\u0142a na w\u0119ze\u0142, poniewa\u017c musz\u0105 by\u0107 podpi\u0119te po takiej \u015bcie\u017cce do lokalnego fizycznego dysku, a teraz ca\u0142a ta wiedza jest inkapsu\u0142owana w samym Kubernetes. I konfiguracja staje si\u0119 znacznie prostsza.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/140c43be34dd7015c0bf4cfd0a0bb384.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wracamy do naszego praktycznego zadania. Wracamy do szablonu YAML. Tutaj pojawi\u0142 si\u0119 prawdziwy storage. Wr\u00f3cili\u015bmy do tego. Zadajemy klasyczny szablon VolumeClaim jak w k8s. I opisujemy, jaki storage chcemy.<\/p>\n<p><\/p>\n<p>Po tym k8s poprosi o storage. Przydzieli go nam w StatefulSet. I w efekcie b\u0119dzie to w dyspozycji ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/960e666486ed09cebd83235d43f83970.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mieli\u015bmy tak\u0105 schem\u0119. Nasz Persistent Storage by\u0142 czerwony, co sugerowa\u0142o, \u017ce warto go poprawi\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a989df489e3a9fef6a4fbf7b93c489a6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I staje si\u0119 zielony. Teraz schemat klastra ClickHouse na k8s jest w pe\u0142ni finalizowany. Mamy shard'y, repliki, ZooKeeper, mamy prawdziwy Persistent, kt\u00f3ry jest zrealizowany w jaki\u015b spos\u00f3b. Schemat jest ju\u017c w pe\u0142ni funkcjonalny. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c409ee5da6309a67904394d968ed4906.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u017byjemy dalej. Nasz klaster si\u0119 rozwija. Andrey si\u0119 stara i wydaje now\u0105 wersj\u0119 ClickHouse.<\/p>\n<p><\/p>\n<p>Pojawia si\u0119 praktyczne zadanie \u2013 przetestowa\u0107 now\u0105 wersj\u0119 ClickHouse na naszym klastrze. Oczywi\u015bcie nie chcemy implementowa\u0107 jej w ca\u0142o\u015bci, chcemy umie\u015bci\u0107 now\u0105 wersj\u0119 w jakim\u015b dalekim k\u0105cie na jedn\u0105 replik\u0119, a mo\u017ce nawet nie jedn\u0105 now\u0105 wersj\u0119, a od razu dwie, poniewa\u017c cz\u0119sto si\u0119 pojawiaj\u0105. <\/p>\n<p><\/p>\n<p>Co mo\u017cemy na ten temat powiedzie\u0107?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48ed52d393d977d0cfaa9320bd02ed1e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tut mamy dok\u0142adnie tak\u0105 mo\u017cliwo\u015b\u0107. To s\u0105 szablony pod\u00f3w. Mo\u017cemy je opisa\u0107, nasz operator ca\u0142kowicie pozwala na budow\u0119 heterogenicznego klastra. Tzn. konfigurowa\u0107, zaczynaj\u0105c od wszystkich replik w grupie, ko\u0144cz\u0105c na ka\u017cdej osobistej replikacji i okre\u015blaj\u0105c, jak\u0105 wersj\u0119 ClickHouse, jak\u0105 wersj\u0119 magazynu chcemy. Mo\u017cemy ca\u0142kowicie skonfigurowa\u0107 klaster wed\u0142ug naszych potrzeb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4949ecd8119cb4ec0f4bad9bf27fa74e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nieco zg\u0142\u0119bimy temat. Wcze\u015bniej m\u00f3wili\u015bmy, jak dzia\u0142a ClickHouse-operator w kontek\u015bcie ClickHouse.<\/p>\n<p><\/p>\n<p>Teraz chcia\u0142bym powiedzie\u0107 kilka s\u0142\u00f3w o tym, jak w og\u00f3le dzia\u0142a jakikolwiek operator, a tak\u017ce o tym, jak wsp\u00f3\u0142dzia\u0142a z K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ca9c2a23c54b2a81ac0a8bba88d5e65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rozwa\u017cmy wsp\u00f3\u0142dzia\u0142anie z K8s na pocz\u0105tku. Co si\u0119 dzieje, gdy wykonujemy kubectl apply? Nasze obiekty pojawiaj\u0105 si\u0119 w etcd przez API. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b9eaedeb0f34d10398ba0187f09fef9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na przyk\u0142ad podstawowe obiekty Kubernetes: pod, StatefulSet, service i tak dalej. <\/p>\n<p><\/p>\n<p>Jednocze\u015bnie nic fizycznego jeszcze si\u0119 nie wydarzy\u0142o. Te obiekty musz\u0105 zosta\u0107 zmaterializowane w klastrze. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3c49dc1b0067347d5fc415ef9b87642d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W tym celu pojawia si\u0119 kontroler. Kontroler to specjalny komponent k8s, kt\u00f3ry umie zmaterializowa\u0107 te opisy. Wie, jak i co nale\u017cy zrobi\u0107 fizycznie. Wie, jak uruchomi\u0107 kontenery, co trzeba skonfigurowa\u0107, aby serwer dzia\u0142a\u0142. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d951eb0f7bacf519566b0ef6cf9bc100.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I on materializuje nasze obiekty w K8s.<\/p>\n<p><\/p>\n<p>Ale chcemy operowa\u0107 nie tylko podami, StatefulSetami, chcemy stworzy\u0107 ClickHouseInstallation, tzn. obiekt typu ClickHouse, aby operowa\u0107 nim jako ca\u0142o\u015bci\u0105. Na razie takiej mo\u017cliwo\u015bci nie ma. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1594921ac5dd9384ce81ceae92f5cda9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale K8s ma nast\u0119puj\u0105c\u0105 przyjemn\u0105 rzecz. Chcemy, aby pojawi\u0142a si\u0119 gdzie\u015b tam taka skomplikowana jednostka, kt\u00f3ra by\u0142aby zbudowana z pod\u00f3w i StatefulSet, naszego klastra. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/04f86706f506fa91e365d45537dd9def.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co nale\u017cy zatem zrobi\u0107? Po pierwsze, na scen\u0119 wychodzi Custom Resource Definition. Czym to jest? To opis dla K8s, \u017ce b\u0119dziesz mia\u0142 jeszcze jeden typ danych, \u017ce chcemy doda\u0107 do pod, StatefulSet niestandardowy zas\u00f3b, kt\u00f3ry b\u0119dzie skomplikowany w \u015brodku. To opis struktury danych. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f02ae12ef3ab5db974234b14e38792ac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>My r\u00f3wnie\u017c wysy\u0142amy go tam przez kubectl apply. Kubernetes z rado\u015bci\u0105 go przyj\u0105\u0142. <\/p>\n<p><\/p>\n<p>I teraz mamy w magazynie, przy obiekcie w etcd mo\u017cliwo\u015b\u0107 zapisania niestandardowego zasobu pod nazw\u0105 ClickHouseInstallation.<\/p>\n<p><\/p>\n<p>Ale na razie nic wi\u0119cej si\u0119 nie wydarzy. To znaczy, je\u015bli teraz stworzymy plik YAML, kt\u00f3ry omawiali\u015bmy z opisem shard\u00f3w, replik i powiemy \"kubectl apply\", to Kubernetes go przyjmie, umie\u015bci w etcd i powie: \"\u015awietnie, ale nie wiem, co z tym zrobi\u0107. Jak zarz\u0105dza\u0107 ClickHouseInstallation, nie wiem\". <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7c2f9f3f81b83c987a3bd72a881d0d91.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W zwi\u0105zku z tym potrzebujemy kogo\u015b, kto pomo\u017ce Kubernetesowi zarz\u0105dza\u0107 nowym typem danych. Po lewej mamy standardowy kontroler Kubernetes, kt\u00f3ry dzia\u0142a z standardowymi typami danych. A po prawej powinien pojawi\u0107 si\u0119 niestandardowy kontroler, kt\u00f3ry potrafi pracowa\u0107 z niestandardowymi typami danych. <\/p>\n<p><\/p>\n<p>I w inny spos\u00f3b nazywa si\u0119 to operatorem. Celowo umie\u015bci\u0142em go poza Kubernetes, poniewa\u017c mo\u017ce dzia\u0142a\u0107 tak\u017ce poza K8s. Najcz\u0119\u015bciej oczywi\u015bcie wszystkie operatory dzia\u0142aj\u0105 w Kubernetes, ale nic nie stoi na przeszkodzie, aby dzia\u0142a\u0142 na zewn\u0105trz, dlatego tutaj zosta\u0142 specjalnie wyr\u00f3\u017cniony. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7aa3a1b67d0def5ba752dff56baeebbf.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I z kolei niestandardowy kontroler, czyli operator, wsp\u00f3\u0142dzia\u0142a z Kubernetesem przez API. Ju\u017c potrafi wchodzi\u0107 w interakcj\u0119 z API. I wie, jak przekszta\u0142ci\u0107 niestandardowy zas\u00f3b w z\u0142o\u017con\u0105 struktur\u0119, kt\u00f3r\u0105 chcemy utworzy\u0107. Tym si\u0119 dok\u0142adnie zajmuje operator. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a5f773ddc3663f24d5379955da9c3037.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak dzia\u0142a operator? Przyjrzyjmy si\u0119 prawej cz\u0119\u015bci, aby dowiedzie\u0107 si\u0119, jak to robi. Zobaczymy, jak operator materializuje wszystko i jak p\u00f3\u017aniej wygl\u0105da interakcja z K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/08a8d8dbcb35117a0eb3320589c6ff8d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Operator to program. Jest zdarzeniowo zorientowany. Operator przy pomocy API Kubernetes zapisuje si\u0119 na wydarzenia. W API Kubernetes s\u0105 punkty wej\u015bcia, w kt\u00f3rych mo\u017cna si\u0119 zapisa\u0107 na wydarzenia. I je\u015bli co\u015b si\u0119 zmienia w K8s, to Kubernetes wysy\u0142a powiadomienia do wszystkich zainteresowanych, tj. kto zapisa\u0142 si\u0119 na ten punkt API, ten b\u0119dzie otrzymywa\u0142 powiadomienia.<\/p>\n<p><\/p>\n<p>Operator zapisuje si\u0119 na wydarzenia i powinien na nie reagowa\u0107. Jego zadaniem jest reagowa\u0107 na pojawiaj\u0105ce si\u0119 zdarzenia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f0664a4151e6e7f6f8575a3e54372e9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zdarzenia s\u0105 generowane przez pewne aktualizacje. Przybywa nasz plik YAML z opisem ClickHouseInstallation. Przeszed\u0142 przez kubectl apply do etcd. Tam zadzia\u0142a\u0142 event, w rezultacie ten event dotar\u0142 do ClickHouse-operatora. Operator otrzyma\u0142 ten opis. I musi co\u015b zrobi\u0107. Je\u015bli nadesz\u0142a aktualizacja obiektu ClickHouseInstallation, trzeba zaktualizowa\u0107 klaster. A zadaniem operatora jest aktualizowanie klastra. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0952bdd391a72aa15bf66af4ce69f4af.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co on robi? Po pierwsze, nale\u017cy opracowa\u0107 plan dzia\u0142a\u0144, co zamierzamy zrobi\u0107 w zwi\u0105zku z t\u0105 aktualizacj\u0105. Aktualizacje mog\u0105 by\u0107 bardzo ma\u0142e, tzn. ma\u0142e w realizacji YAML, ale mog\u0105 wi\u0105za\u0107 si\u0119 z bardzo du\u017cymi zmianami w klastrze. Dlatego operator tworzy plan, a nast\u0119pnie si\u0119 go trzyma.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79caaa43b6fd9f3e2eb1afe44ecb2df9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zgodnie z tym planem zaczyna konstruowa\u0107 t\u0119 struktur\u0119 wewn\u0119trznie, aby zmaterializowa\u0107 pod'y, us\u0142ugi, czyli robi to, co jest jego g\u0142\u00f3wnym zadaniem. To jak budowanie klastra ClickHouse w Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e91576a26d6b758a68ae0b35cbe01897.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz poruszmy interesuj\u0105cy temat. To podzia\u0142 odpowiedzialno\u015bci mi\u0119dzy Kubernetes a operatorem, tzn. co robi Kubernetes, co robi operator i jak wsp\u00f3\u0142dzia\u0142aj\u0105 ze sob\u0105. <\/p>\n<p><\/p>\n<p>Kubernetes odpowiada za rzeczy systemowe, tzn. za podstawowy zestaw obiekt\u00f3w, kt\u00f3re mo\u017cna interpretowa\u0107 jako zasi\u0119g systemu. Kubernetes wie, jak uruchamia\u0107 pod'y, jak restartowa\u0107 kontenery, jak montowa\u0107 wolumeny, jak pracowa\u0107 z ConfigMap, tzn. wszystko, co mo\u017cna nazwa\u0107 systemem. <\/p>\n<p><\/p>\n<p>Operatorzy operuj\u0105 w dziedzinach tematycznych. Ka\u017cdy operator jest tworzony dla swojej dziedziny tematycznej. U nas zrobili\u015bmy dla ClickHouse.<\/p>\n<p><\/p>\n<p>Operator dzia\u0142a w\u0142a\u015bnie w terminach dziedziny tematycznej, takich jak dodanie repliki, utworzenie schematu, skonfigurowanie monitoringu. Powstaje wi\u0119c taki podzia\u0142.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9dc07d9c29d5dfd538343aadb751e4c0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przyjrzyjmy si\u0119 praktycznemu przyk\u0142adzie, jak ten podzia\u0142 odpowiedzialno\u015bci dzia\u0142a, gdy wykonujemy dzia\u0142anie dodania repliki. <\/p>\n<p><\/p>\n<p>Do operatora trafia zadanie \u2013 doda\u0107 replik\u0119. Co operator robi? Operator oblicza, \u017ce nale\u017cy stworzy\u0107 nowy StatefulSet, w kt\u00f3rym nale\u017cy opisa\u0107 takie a takie szablony, zg\u0142oszenie wolumenu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7a31f2f76a3bdda87e4bccf0e04fe4a8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>On to wszystko przygotowuje i przekazuje dalej do K8s. M\u00f3wi, \u017ce potrzebuje ConfigMap, StatefulSet, Wolumen. Kubernetes to realizuje. Zmaterializuje podstawowe jednostki, kt\u00f3rymi operuje. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2be6892234cc12b056962265c13dba07.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I dalej ponownie wkracza ClickHouse-operator. Ma ju\u017c fizyczny pod, na kt\u00f3rym mo\u017cna co\u015b zrobi\u0107. I ClickHouse-operator ponownie dzia\u0142a w terminach dziedziny tematycznej. Tzn. aby w\u0142\u0105czy\u0107 replik\u0119 w klastrze ClickHouse, nale\u017cy najpierw skonfigurowa\u0107 schemat danych, kt\u00f3ry jest w tym klastrze. Po drugie, t\u0119 replik\u0119 nale\u017cy w\u0142\u0105czy\u0107 w monitoring, aby dobrze j\u0105 \u015bledzi\u0107. To ju\u017c operator ustawia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/790616342b98b347fa67e0100754c8b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I dopiero po tym wkracza sam ClickHouse, czyli kolejny, wy\u017cej poziomowy byt. To ju\u017c jest baza danych. Ma swoje instancje, kolejn\u0105 skonfigurowan\u0105 replik\u0119, kt\u00f3ra jest gotowa do\u0142\u0105czenia do klastra.<\/p>\n<p><\/p>\n<p>W ten spos\u00f3b \u0142a\u0144cuch wykonania i podzia\u0142u odpowiedzialno\u015bci przy dodawaniu repliki staje si\u0119 do\u015b\u0107 d\u0142ugi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ec79cfa2b45fadbe25f4d9fe8d2ec5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kontynuujemy nasze praktyczne zadania. Je\u015bli klaster ju\u017c istnieje, mo\u017cna wykona\u0107 migracj\u0119 konfiguracji. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a52aee0d4350b8da00cdb4b525df80ad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zrobili\u015bmy tak, \u017ce do istniej\u0105cego pliku XML, kt\u00f3ry rozumie ClickHouse, mo\u017cna przesy\u0142a\u0107 dane bezpo\u015brednio.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/91abb1d3b0a14f2118361403a74e14c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mo\u017cna przeprowadzi\u0107 dok\u0142adn\u0105 konfiguracj\u0119 ClickHouse. Akurat wdro\u017cenie strefowe \u2013 to w\u0142a\u015bnie to, o czym m\u00f3wi\u0142em podczas wyja\u015bniania hostPath, lokalnego magazynu. Jak prawid\u0142owo przeprowadzi\u0107 wdro\u017cenie strefowe.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fde502f30223e04a918f4fd598c3dd9f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nast\u0119pnym praktycznym zadaniem jest monitorowanie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4e685fba7883075105c0164a778c51e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je\u015bli nasz klaster si\u0119 zmienia, musimy okresowo ustawia\u0107 monitorowanie. <\/p>\n<p><\/p>\n<p>Zobaczmy schemat. Zielone strza\u0142ki ju\u017c om\u00f3wili\u015bmy. Teraz przyjrzyjmy si\u0119 czerwonym strza\u0142kom. To spos\u00f3b, w jaki chcemy monitorowa\u0107 nasz klaster. Jak metryki z klastra ClickHouse trafiaj\u0105 do Prometheus, a potem do Grafana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1210c1423f99d48a20e06e855bf48a72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A w czym tkwi trudno\u015b\u0107 w monitorowaniu? Dlaczego jest to traktowane jako jakie\u015b osi\u0105gni\u0119cie? Trudno\u015b\u0107 le\u017cy w\u0142a\u015bnie w dynamice. Kiedy mamy jeden klaster, kt\u00f3ry jest statyczny, mo\u017cna jednorazowo ustawi\u0107 monitorowanie i wi\u0119cej si\u0119 tym nie zajmowa\u0107.<\/p>\n<p><\/p>\n<p>Ale je\u015bli mamy wiele klastr\u00f3w, lub ci\u0105gle co\u015b si\u0119 zmienia, proces staje si\u0119 dynamiczny. Ci\u0105g\u0142e przestawianie monitorowania to strata zasob\u00f3w i czasu, czyli nawet zwyk\u0142e lenistwo. Trzeba to zautomatyzowa\u0107. Trudno\u015b\u0107 tkwi w\u0142a\u015bnie w dynamice procesu. I operator bardzo dobrze to automatyzuje. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48a7264f1228671e0c483c8211a71eb3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak rozwija\u0142 si\u0119 nasz klaster? Na pocz\u0105tku wygl\u0105da\u0142 tak.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8a8c7b6cd5562deb315368e1e8e1c976.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Potem by\u0142 taki.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1a3e915fbadf3aa5f3b33d337f36e76e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W ko\u0144cu sta\u0142 si\u0119 taki. <\/p>\n<p><\/p>\n<p>A monitorowanie jest automatycznie realizowane przez operatora. Jednolite miejsce wej\u015bcia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e079e65bf8deff43a81d8ffde938a709.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A my jedynie na wyj\u015bciu patrzymy na pulpit nawigacyjny Grafana, jak w \u015brodku toczy si\u0119 \u017cycie naszego klastra. <\/p>\n<p><\/p>\n<p>Swoj\u0105 drog\u0105, pulpit nawigacyjny Grafana r\u00f3wnie\u017c jest dostarczany z naszym operatorem bezpo\u015brednio w \u017ar\u00f3d\u0142ach. Mo\u017cna si\u0119 pod\u0142\u0105czy\u0107 i korzysta\u0107. Ten zrzut ekranu otrzyma\u0142em od naszych DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ad1c2899dd845d0ba4185bdf758468c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gdzie chcieliby\u015bmy i\u015b\u0107 dalej? To:<\/p>\n<p><\/p>\n<ul>\n<li>Rozwija\u0107 automatyzacj\u0119 testowania. G\u0142\u00f3wnym zadaniem jest automatyzacja testowania nowych wersji. <\/li>\n<li>Chcieliby\u015bmy r\u00f3wnie\u017c zautomatyzowa\u0107 integracj\u0119 z ZooKeeper. Planujemy zintegrowa\u0107 si\u0119 z ZooKeeper-operator. Tzn. dla ZooKeeper napisano operatora i logiczne jest, aby dwa operatorzy zacz\u0119li si\u0119 integrowa\u0107 w celu stworzenia bardziej wygodnego rozwi\u0105zania. <\/li>\n<li>Chcemy zrobi\u0107 bardziej zaawansowane kontrole \u017cywotno\u015bci. <\/li>\n<li>Na zielono wyr\u00f3\u017cni\u0142em to, co mamy na uko\u0144czeniu \u2014 dziedziczenie Template \u2013 ZREALIZOWANE, tzn. z nast\u0119pn\u0105 wersj\u0105 operatora b\u0119dziemy ju\u017c mie\u0107 dziedziczenie szablon\u00f3w. To pot\u0119\u017cne narz\u0119dzie, kt\u00f3re pozwala budowa\u0107 z\u0142o\u017cone konfiguracje z kawa\u0142k\u00f3w. <\/li>\n<li>I chcemy zautomatyzowa\u0107 skomplikowane zadania. G\u0142\u00f3wne z nich to Re-sharding. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f232c0aab389be5069e5c7886e265c01.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Podsumujmy dotychczasowe wyniki. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/62f7814994af0441ba5a82de4e9780d7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co otrzymujemy na wyj\u015bciu? Czy warto si\u0119 tym zajmowa\u0107, czy nie? Czy nale\u017cy w og\u00f3le pr\u00f3bowa\u0107 przenie\u015b\u0107 baz\u0119 danych do Kubernetes i zastosowa\u0107 operatora w og\u00f3le oraz operatora Alitnity w szczeg\u00f3lno\u015bci.<\/p>\n<p><\/p>\n<p>Na wyj\u015bciu uzyskujemy:<\/p>\n<p><\/p>\n<ul>\n<li>Znaczne uproszczenie i automatyzacj\u0119 konfiguracji, wdra\u017cania oraz utrzymania. <\/li>\n<li>Natychmiastowy, wbudowany monitoring. <\/li>\n<li>I gotowe do u\u017cycia, skodyfikowane szablony dla z\u0142o\u017conych sytuacji. Ju\u017c dzia\u0142ania typy dodanie repliki nie musz\u0105 by\u0107 wykonywane r\u0119cznie. To robi operator. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/aebccd7a2dc55f14645f79f89f7b7458.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pozosta\u0142o tylko jedno pytanie. Mamy ju\u017c baz\u0119 danych w Kubernetes, wirtualizacj\u0119. Jak wygl\u0105da wydajno\u015b\u0107 tego rozwi\u0105zania, szczeg\u00f3lnie w kontek\u015bcie tego, \u017ce ClickHouse jest zoptymalizowany pod k\u0105tem wydajno\u015bci?<\/p>\n<p><\/p>\n<p>Odpowied\u017a \u2013 wszystko w porz\u0105dku! Nie b\u0119d\u0119 szczeg\u00f3\u0142owo opisywa\u0142, to temat osobnego wyk\u0142adu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ffc230941f0ae24926186db4d8d68ade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jednak istnieje projekt, taki jak TSBS. Jakie jest jego g\u0142\u00f3wne zadanie? To test baz danych pod k\u0105tem wydajno\u015bci. To pr\u00f3ba por\u00f3wnania ciep\u0142ego z ciep\u0142ym, mi\u0119kkiego z mi\u0119kkim. <\/p>\n<p><\/p>\n<p>Jak to dzia\u0142a? Generowany jest jeden zestaw danych. Nast\u0119pnie ten zestaw danych jest testowany na r\u00f3\u017cnorodnych bazach danych przy u\u017cyciu tych samych test\u00f3w. I ka\u017cda baza danych rozwi\u0105zuj\u0105c jedn\u0105 zadanie robi to tak, jak potrafi. A potem mo\u017cna por\u00f3wnywa\u0107 wyniki. <\/p>\n<p><\/p>\n<p>Ju\u017c obs\u0142uguje wiele baz danych. Wyr\u00f3\u017cni\u0142em trzy g\u0142\u00f3wne. To:<\/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=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5b4733534a4e6e36fb7788127adc6e86.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przeprowadzono r\u00f3wnie\u017c por\u00f3wnanie z innym podobnym rozwi\u0105zaniem. Por\u00f3wnanie z RedShift. Por\u00f3wnanie mia\u0142o miejsce na Amazonie. ClickHouse r\u00f3wnie\u017c dobrze przeskakuje wszystkich w tej kwestii. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/44cc8dedc07a02fe1ed5aad3e17a579c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jakie wnioski mo\u017cna wyci\u0105gn\u0105\u0107 z tego, co powiedzia\u0142em?<\/p>\n<p><\/p>\n<ul>\n<li>Baza danych w Kubernetes jest mo\u017cliwa. Prawdopodobnie mo\u017cna u\u017cywa\u0107 r\u00f3\u017cnych baz, ale og\u00f3lnie wygl\u0105da na to, \u017ce to zadzia\u0142a. ClickHouse w Kubernetes na pewno mo\u017cna uruchomi\u0107 za pomoc\u0105 naszego operatora. <\/li>\n<li>Operator pomaga automatyzowa\u0107 procesy i naprawd\u0119 u\u0142atwia \u017cycie.<\/li>\n<li>Wydajno\u015b\u0107 jest normalna.<\/li>\n<li>I wydaje nam si\u0119, \u017ce to mo\u017cna i trzeba wykorzysta\u0107. <\/li>\n<\/ul>\n<p><\/p>\n<p>Open source \u2013 do\u0142\u0105cz do nas!<\/p>\n<p><\/p>\n<p>Jak ju\u017c wspomnia\u0142em, operator to ca\u0142kowicie produkt open source, dlatego by\u0142oby \u015bwietnie, gdyby jak najwi\u0119cej ludzi z niego korzysta\u0142o. Do\u0142\u0105czcie do nas! Czekamy na wszystkich!<\/p>\n<p><\/p>\n<p>Dzi\u0119kuj\u0119 wszystkim!<\/p>\n<p><\/p>\n<p>Pytania<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4afe8b10c4f103c2a9a295511e4eb69a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119 za prezentacj\u0119! Nazywam si\u0119 Anton. Jestem z firmy SEMrush. Interesuje mnie logging. O monitoringu s\u0142ycha\u0107, a o logowaniu nic, je\u015bli m\u00f3wimy o ca\u0142ym klastrze. U nas na przyk\u0142ad zbudowali\u015bmy klaster na sprz\u0119cie. I wykorzystujemy zcentralizowane logowanie, zbieraj\u0105c standardowymi narz\u0119dziami w jedn\u0105 ca\u0142o\u015b\u0107. A potem wyci\u0105gamy z niej interesuj\u0105ce nas dane.<\/em> <\/p>\n<p><\/p>\n<p>Dobre pytanie, tzn. logowanie jest na li\u015bcie do zrealizowania. Nasz operator obecnie tego nie automatyzuje. On jest jeszcze w fazie rozwoju, projekt jest stosunkowo m\u0142ody. Rozumiemy konieczno\u015b\u0107 logowania. To r\u00f3wnie\u017c bardzo wa\u017cny temat. I jest zapewne co najmniej tak samo wa\u017cny, jak monitoring. Jednak pierwszym elementem do realizacji by\u0142 monitoring. Logowanie b\u0119dzie. Oczywi\u015bcie staramy si\u0119 zautomatyzowa\u0107 wszystkie aspekty funkcjonowania klastra. Dlatego odpowied\u017a jest taka \u2013 w tej chwili operator, niestety, tego nie potrafi, ale to jest w planach, zamierzamy to zrobi\u0107. Je\u015bli jest ch\u0119\u0107, aby do\u0142\u0105czy\u0107, to prosz\u0119 o pull request.<\/p>\n<p><\/p>\n<p><em>Witam! Dzi\u0119kuj\u0119 za prezentacj\u0119! Mam standardowe pytanie zwi\u0105zane z Persistent Volumes. Kiedy tworzymy konfiguracj\u0119 za pomoc\u0105 tego operatora, jak operator okre\u015bla, na kt\u00f3rym w\u0119\u017ale mamy zamontowany dysk lub folder? Musimy mu wcze\u015bniej wyja\u015bni\u0107, \u017ce prosz\u0119 umie\u015bci\u0107 nasz ClickHouse w\u0142a\u015bnie na tych w\u0119z\u0142ach, na kt\u00f3rych jest dysk?<\/em><\/p>\n<p><\/p>\n<p>O ile rozumiem, to pytanie to kontynuacja local storage, szczeg\u00f3lnie jego cz\u0119\u015bci dotycz\u0105cej hostPath. To jak wyja\u015bni\u0107 ca\u0142emu systemowi, \u017ce pod powinien by\u0107 uruchomiony w\u0142a\u015bnie na takim w\u0119\u017ale, na kt\u00f3rym mamy fizycznie pod\u0142\u0105czony dysk, zamontowany w okre\u015blonej lokalizacji. To jest ca\u0142a sekcja, kt\u00f3r\u0105 poruszy\u0142em bardzo powierzchownie, poniewa\u017c odpowied\u017a jest do\u015b\u0107 obszerna. <\/p>\n<p><\/p>\n<p>W skr\u00f3cie wygl\u0105da to tak. Oczywi\u015bcie musimy dokona\u0107 provisioning tych wolumen\u00f3w. W tej chwili w lokalnej pami\u0119ci nie ma dynamicznego provisioningu, wi\u0119c DevOps musz\u0105 samodzielnie podzieli\u0107 dyski, te wolumeny. Musz\u0105 r\u00f3wnie\u017c wyja\u015bni\u0107 Kubernetesowi provisioning, \u017ce b\u0119d\u0105 mie\u0107 Persistent volumes okre\u015blonej klasy, kt\u00f3re znajduj\u0105 si\u0119 na takich a takich nodach. Nast\u0119pnie trzeba b\u0119dzie wyja\u015bni\u0107 Kubernetesowi, \u017ce pod\u2019y, kt\u00f3re potrzebuj\u0105 okre\u015blonej klasy lokalnej pami\u0119ci, musz\u0105 by\u0107 planowane tylko na takich a takich nodach. W tym celu operator ma mo\u017cliwo\u015b\u0107 przypisania jakiej\u015b etykiety i one per host instance. I oka\u017ce si\u0119, \u017ce pod\u2019y b\u0119d\u0105 routowane przez Kubernetes do uruchomienia tylko na nodach spe\u0142niaj\u0105cych wymagania, etykietami m\u00f3wi\u0105c prosto. Administratorzy przypisuj\u0105 etykiety, dokonuj\u0105 provisioning dysk\u00f3w r\u0119cznie. A wtedy mo\u017cna to skalowa\u0107.<\/p>\n<p><\/p>\n<p>I w\u0142a\u015bnie trzecia opcja lokalna pomaga to nieco u\u0142atwi\u0107. Jak ju\u017c podkre\u015bla\u0142em, to \u017cmudna praca nad konfiguracj\u0105, kt\u00f3ra na ko\u0144cu pomaga uzyska\u0107 maksymaln\u0105 wydajno\u015b\u0107.<\/p>\n<p><\/p>\n<p><em>Mam drugie pytanie zwi\u0105zane z tym. Kubernetes by\u0142 zaprojektowany w taki spos\u00f3b, \u017ce nie ma znaczenia, czy stracimy nod\u0119, czy nie. Co w takim przypadku nale\u017cy zrobi\u0107, je\u015bli utracimy nod\u0119, na kt\u00f3rej znajduje si\u0119 shard?<\/em><\/p>\n<p><\/p>\n<p>Tak, Kubernetes zosta\u0142 pocz\u0105tkowo zaprezentowany tak, \u017ce nasze relacje z pod\u2019ami \u2013 to jak byd\u0142o, a tutaj ka\u017cdy dysk staje si\u0119 czym\u015b w rodzaju zwierz\u0105tka domowego. Jest taki problem, \u017ce nie mo\u017cemy ich po prostu wyrzuci\u0107. Rozw\u00f3j Kubernetes zmierza w kierunku, \u017ce nie mo\u017cna ca\u0142kowicie podchodzi\u0107 do tego filozoficznie, jak do ca\u0142kowicie wyrzucanych zasob\u00f3w.<\/p>\n<p><\/p>\n<p>Teraz praktyczne pytanie. Co zrobi\u0107, je\u015bli stracisz nod\u0119, na kt\u00f3rej by\u0142 dysk? Tutaj problem ju\u017c rozwi\u0105zany jest na wy\u017cszym poziomie. W przypadku ClickHouse mamy repliki, kt\u00f3re dzia\u0142aj\u0105 na wy\u017cszym poziomie, tzn. na poziomie ClickHouse.<\/p>\n<p><\/p>\n<p>Jaka zanika dyspozycja? Za to, \u017ceby dane si\u0119 nie zgubi\u0142y, odpowiada DevOps. Musi on prawid\u0142owo skonfigurowa\u0107 replikacj\u0119 i musi kontrolowa\u0107, \u017ceby replikacja by\u0142a realizowana. W replikach na poziomie ClickHouse dane musz\u0105 by\u0107 zdublowane. To nie jest zadanie, kt\u00f3re rozwi\u0105zuj\u0105 operatorzy. I nie to zadanie, kt\u00f3re rozwi\u0105zuje sam Kubernetes. To na poziomie ClickHouse.<\/p>\n<p><\/p>\n<p>Co zrobi\u0107, je\u015bli tw\u00f3j w\u0119ze\u0142 serwerowy przesta\u0142 dzia\u0142a\u0107? Nale\u017cy zainstalowa\u0107 drugi, poprawnie skonfigurowa\u0107 dysk i doda\u0107 etykiety. Po tym procesie w\u0119ze\u0142 spe\u0142ni wymagania, by Kubernetes m\u00f3g\u0142 uruchomi\u0107 instancj\u0119 poda. Kubernetes go uruchomi. Liczba pod\u00f3w jest niewystarczaj\u0105ca do okre\u015blonej warto\u015bci. Przejdzie przez cykl, kt\u00f3ry pokaza\u0142em. A na najwy\u017cszym poziomie ClickHouse zrozumie, \u017ce dostarczono replik\u0119, kt\u00f3ra jest jeszcze pusta i nale\u017cy zacz\u0105\u0107 transfer danych. Innymi s\u0142owy, ten proces jest jeszcze s\u0142abo zautomatyzowany. <\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119 za prezentacj\u0119! Kiedy co\u015b z\u0142ego si\u0119 dzieje, operator si\u0119 zawiesza i restaruje, a w tym momencie pojawiaj\u0105 si\u0119 zdarzenia, czy w jaki\u015b spos\u00f3b to przetwarzacie?<\/em><\/p>\n<p><\/p>\n<p>Co si\u0119 stanie, je\u015bli operator zawiesi si\u0119 i zostanie zrestartowany, tak? <\/p>\n<p><\/p>\n<p><em>Tak. I w tym momencie pojawi\u0142y si\u0119 zdarzenia.<\/em> <\/p>\n<p><\/p>\n<p>Zadanie zwi\u0105zane z tym przypadkiem jest cz\u0119\u015bciowo rozdzielone mi\u0119dzy operatorem a Kubernetesem. Kubernetes ma mo\u017cliwo\u015b\u0107 odtworzenia zdarze\u0144, kt\u00f3re mia\u0142y miejsce. Odtwarza je. A zadaniem operatora jest zapewnienie, \u017ce gdy zostanie na niego odtworzone log zdarze\u0144, to zdarzenia te b\u0119d\u0105 idempotentne. Oznacza to, \u017ce ponowne wyst\u0105pienie tego samego zdarzenia nie z\u0142amie naszego systemu. I nasz operator dobrze radzi sobie z tym zadaniem. <\/p>\n<p><\/p>\n<p><em>Dzie\u0144 dobry! Dzi\u0119kuj\u0119 za prezentacj\u0119! Dmitrij Zawia\u0142ow, firma<\/em> <em>Smiedowa. Czy planowane jest dodanie do operatora mo\u017cliwo\u015bci konfiguracji z haproxy? Interesuje mnie jaki\u015b inny balancer opr\u00f3cz standardowego, kt\u00f3ry by\u0142by m\u0105dry i zrozumia\u0142, \u017ce to rzeczywi\u015bcie ClickHouse.<\/em> <\/p>\n<p><\/p>\n<p>Czy m\u00f3wisz o Ingress?<\/p>\n<p><\/p>\n<p><em>Tak, zamieni\u0107 Ingress na haproxy. W haproxy mo\u017cna okre\u015bli\u0107 topologi\u0119 klastra, gdzie znajduj\u0105 si\u0119 jego repliki.<\/em><\/p>\n<p><\/p>\n<p>Na razie o tym nie my\u015bleli\u015bmy. Je\u015bli potrzebujesz tego i mo\u017cesz wyja\u015bni\u0107, dlaczego to jest potrzebne, to mo\u017cliwe, \u017ce uda si\u0119 to zrealizowa\u0107, szczeg\u00f3lnie je\u015bli zechcesz wzi\u0105\u0107 w tym udzia\u0142. Kr\u00f3tk\u0105 odpowiedzi\u0105 jest \u2013 nie, w tej chwili nie mamy takiej funkcjonalno\u015bci. Dzi\u0119kujemy za sugesti\u0119, przyjrzymy si\u0119 temu. A je\u015bli jeszcze wyja\u015bnisz use case i dlaczego to jest potrzebne w praktyce, na przyk\u0142ad stworzysz zg\u0142oszenia na GitHubie, to b\u0119dzie wspaniale.<\/p>\n<p><\/p>\n<p><em>Ju\u017c jest.<\/em><\/p>\n<p><\/p>\n<p>Dobrze. Jeste\u015bmy otwarci na wszelkie propozycje. A haproxy zostanie dodane do listy zada\u0144 do wykonania. Lista zada\u0144 si\u0119 rozrasta, a nie zmniejsza jak dot\u0105d. Ale to dobrze, to oznacza, \u017ce produkt jest poszukiwany.<\/p>\n<p>\u0179r\u00f3d\u0142o: <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\/pl\/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=\"pl_PL\" \/>\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\/pl\/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 w Kubernetes do zarz\u0105dzania klastrami baz danych. W\u0142adys\u0142aw Klimenko (Altinity, 2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/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":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/96965","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=96965"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/96965\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/96966"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=96965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=96965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=96965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}