{"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\/sl\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","title":{"rendered":"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/56e002c7408c4708e39ece867f84171e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poro\u010dilo se osredoto\u010da na prakti\u010dna vpra\u0161anja razvoja operatorjev v Kubernetesu, oblikovanju njihove arhitekture in osnovnih na\u010del delovanja.<\/p>\n<p><\/p>\n<p>V prvem delu poro\u010dila bomo obravnavali:<\/p>\n<p><\/p>\n<ul>\n<li>kaj je operator v Kubernetesu in zakaj je potreben;<\/li>\n<li>kako operator poenostavi upravljanje zapletenih sistemov;<\/li>\n<li>kaj operator lahko, in kaj operator ne more.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nato se bomo posvetili notranji zgradbi operatorja. Oglejna si bomo arhitekturo in delovanje operatorja korak za korakom. Podrobno bomo obravnavali:<\/p>\n<p><\/p>\n<ul>\n<li>interakcijo med operatorjem in Kubernetesom;<\/li>\n<li>katere funkcije prevzame operator in katere delegira v Kubernetes.<\/li>\n<\/ul>\n<p><\/p>\n<p>Poglejmo upravljanje fragmentov in replik baz podatkov v Kubernetes.<br \/>\nNato se bomo pogovorili o vpra\u0161anjih hrambe podatkov:<\/p>\n<p><\/p>\n<ul>\n<li>kako delati s Persistent Storage z vidika operatorja;<\/li>\n<li>skriti izzivi uporabe Local Storage.<\/li>\n<\/ul>\n<p><\/p>\n<p>V zaklju\u010dnem delu poro\u010dila bomo obravnavali prakti\u010dne primere uporabe <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">clickhouse-operator<\/a><\/noindex> z uporabo Amazon ali Google Cloud Service. Poro\u010dilo temelji na razvoju in izku\u0161njah z obratovanjem operatorja za 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=\"Predvajaj video\" 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>Moje ime je Vladislav Klimenko. Danes bi rad spregovoril o na\u0161ih izku\u0161njah z razvojem in obratovanjem operatorja, in to je specializirani operator za upravljanje baz podatkovnih grozdov. Na primeru <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">ClickHouse-operator<\/a><\/noindex> za upravljanje grozda ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cc297a3edb3b2a5e30d0dc2725de4011.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zakaj imamo mo\u017enost govoriti o operatorju in ClickHouse?<\/p>\n<p><\/p>\n<ul>\n<li>Zaposleni smo v podpori in razvoju ClickHouse. <\/li>\n<li>Trenutno se trudimo po\u010dasi prispevati svoj dele\u017e v razvoju ClickHouse. In smo drugi po Yandexu po obsegu izvedenih sprememb v ClickHouse. <\/li>\n<li>Trudimo se izvajati dodatne projekte za ekosistem ClickHouse. <\/li>\n<\/ul>\n<p><\/p>\n<p>O enem tak\u0161nem projektu bi rad spregovoril. To je ClickHouse-operator za Kubernetes. <\/p>\n<p><\/p>\n<p>V svojem poro\u010dilu bi rad obravnaval dve temi: <\/p>\n<p><\/p>\n<ul>\n<li>Prva tema \u2013 kako na\u0161 operator za upravljanje baz podatkov ClickHouse v Kubernetes deluje. <\/li>\n<li>Druga tema \u2013 kako deluje kateri koli operator, torej kako deluje z Kubernetesom. <\/li>\n<\/ul>\n<p><\/p>\n<p>Pri tem bosta ti dve vpra\u0161anji \u010dez celotno moje poro\u010dilo prepletena. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4cc9790e18e70ae1ccde2cf39ef4ef00.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Koga bi to zanimalo poslu\u0161ati?<\/p>\n<p><\/p>\n<ul>\n<li>Najbolj bo zanimivo tistim, ki upravljajo operatorje. <\/li>\n<li>Ali tistim, ki \u017eelijo razviti svojega, da bi razumeli, kako deluje notranjost, kako interagira operator s Kubernetesom in kateri skriti izzivi se lahko pojavijo. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/07545f7a0171b610697c519d4aa9cd43.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Da bi bolje razumeli ono o \u010demu \u0107emo danas govoriti, bilo bi dobro poznavati osnove Kubernetes-a i imati osnovno poznavanje cloud tehnologija. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/eff56cc3e83fde3d3e64d73d41b07417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0160ta je ClickHouse? To je kolumna baza podataka specijalizovana za online obradu analiti\u010dkih upita. A potpuno je otvorenog koda. <\/p>\n<p><\/p>\n<p>Va\u017eno je znati samo dve stvari. Treba znati da je to baza podataka, tako da \u0107e ono o \u010demu \u0107u govoriti biti primenljivo prakti\u010dno na svaku bazu podataka. I da se ClickHouse vrlo dobro skalira, pru\u017eaju\u0107i skoro linijsku skalabilnost. Zato je stanje klastera prirodno za ClickHouse. Najvi\u0161e nas zanima kako odr\u017eavati ClickHouse klaster u Kubernetes-u.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5eb1ff5026c492117bf2467b10de7053.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za\u0161to je to potrebno? Za\u0161to ne mo\u017eemo nastaviti sa samostalnom eksploatacijom? Odgovori su delimi\u010dno tehni\u010dki, a delimi\u010dno organizacioni. <\/p>\n<p><\/p>\n<ul>\n<li>U praksi sve \u010de\u0161\u0107e nailazimo na situaciju u kojoj su u velikim kompanijama ve\u0107 gotovo svi komponenti u Kubernetes-u. Baze podataka ostaju napolju. <\/li>\n<li>I sve vi\u0161e se postavlja pitanje: \"Mo\u017ee li se to unutra staviti?\" Zbog toga velike kompanije nastoje maksimalno unifikovati upravljanje kako bi brzo mogle upravljati svojim skladi\u0161tima podataka. <\/li>\n<li>To posebno poma\u017ee kada je potrebna maksimalna mogu\u0107nost ponovnog postavljanja istog na novom mestu, tj. maksimalna prenosivost.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/99312e74bd7ed4031128c7ec872f6a68.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Koliko je to jednostavno ili slo\u017eeno? To se naravno mo\u017ee raditi ru\u010dno. Ali nije ba\u0161 jednostavno jer imamo slo\u017eenost upravljanja samim Kubernetes-om, a istovremeno i specifi\u010dnost ClickHouse-a. Rezultat je takva agregacija. <\/p>\n<p><\/p>\n<p>I sve to zajedno stvara prili\u010dno veliki skup tehnologija kojima je upravljanje postalo prili\u010dno slo\u017eeno, jer Kubernetes donosi pitanja svakodnevnog odr\u017eavanja, a ClickHouse donosi svoja pitanja dnevnog rada. Pogotovo ako imamo nekoliko ClickHouse-a i moramo stalno raditi ne\u0161to s njima. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ca10b805b2744d1a5283f96b0ac1cc11.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse sa dinami\u010dkom konfiguracijom ima prili\u010dan broj pitanja koja stvaraju stalno optere\u0107enje na DevOps:<\/p>\n<p><\/p>\n<ul>\n<li>Kada \u017eelimo promeniti ne\u0161to u ClickHouse-u, na primer dodati repliku ili shard, potrebno je upravljati konfiguracijom. <\/li>\n<li>Nato je potrebno spremeniti podatkovno shemo, saj ClickHouse uporablja poseben na\u010din sharding-a. Treba je razporediti podatkovno shemo in nastavitve. <\/li>\n<li>Potrebno je nastaviti nadzor. <\/li>\n<li>Zbiranje logov za nove sharde in nove replikacije. <\/li>\n<li>Poskrbite za obnovitev.<\/li>\n<li>In znova zagnati. <\/li>\n<\/ul>\n<p><\/p>\n<p>To so rutinska dela, ki bi jih \u017eeleli olaj\u0161ati pri obratovanju.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2461e861ca1d2f2344ead9decf85a97e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kubernetes dobro pomaga pri obratovanju, vendar pri osnovnih sistemskih stvareh. <\/p>\n<p><\/p>\n<p>Kubernetes dobro poenostavi in avtomatizira stvari, kot so:<\/p>\n<p><\/p>\n<ul>\n<li>Obnovitev.<\/li>\n<li>Ponovni zagon. <\/li>\n<li>Upravljanje sistema shranjevanja.<\/li>\n<\/ul>\n<p><\/p>\n<p>To je dobro, to je pravilna smer, vendar nima povsem predstave o tem, kako obratovati podatkovni sklop. <\/p>\n<p><\/p>\n<p>\u017delimo ve\u010d, da bi celoten podatkovni sklop deloval v Kubernetesu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6564e9f29d5d518925c8593bca978345.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u017deleli bi imeti nekaj podobnega veliki \u010darobni rde\u010di tipki, na katero pritisne\u0161, in se ti razvije ter vzdr\u017euje celoten sklop v vsej \u017eivljenjski dobi, z vsakodnevnimi nalogami, ki jih je treba re\u0161iti. Sklop ClickHouse v Kubernetesu.<\/p>\n<p><\/p>\n<p>Poskusili smo ustvariti re\u0161itev, ki bi olaj\u0161ala delo. To je ClickHouse-operator za Kubernetes podjetja Altinity.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ff80c6fc59069ec900d545096ad978d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Operator je program, katerega glavna naloga je upravljanje drugih programov, torej je upravljavski program. <\/p>\n<p><\/p>\n<p>Vsebuje vzorce obna\u0161anja. To lahko imenujemo kodificirano znanje o predmetni oblasti. <\/p>\n<p><\/p>\n<p>Njegova glavna naloga je olaj\u0161ati \u017eivljenje DevOpsu in zmanj\u0161ati mikroupravljanje, da lahko razmi\u0161lja v visokih nivojih, torej da se ne ukvarja z mikroupravljanjem in ne nastavlja vseh podrobnosti ro\u010dno. <\/p>\n<p><\/p>\n<p>In prav operator je roboti pomo\u010dnik, ki se bori z mikronaloge in pomaga DevOpsu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0824a1fa710e8c4f45406aa7f596b977.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zakaj je operator potreben? \u0160e posebej dobro se izka\u017ee pri dveh vpra\u0161anjih:<\/p>\n<p><\/p>\n<ul>\n<li>Ko strokovnjaku, ki se ukvarja s ClickHouse, primanjkuje izku\u0161enj, a je ClickHouse \u017ee treba obratovati, operator poenostavi obratovanje in omogo\u010da upravljanje sklopa ClickHouse z dovolj zapleteno konfiguracijo, brez prekomernega poglabljanja v podrobnosti, kako vse to deluje znotraj. Preprosto mu da\u0161 naloge na vi\u0161ji ravni in to deluje. <\/li>\n<li>In the second task, where he shows himself best, it's when a large number of routine tasks need to be automated. It frees sysadmins from micro-tasks. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f1cb11156d57f560d0b6c82700ac6ff8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>This is most needed either by those just starting out or by those who need to focus heavily on automation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/128e7d9ff1ce0c535f98be66aedb1060.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>What is the difference between an operator-based approach and other systems? There's Helm. It also helps install ClickHouse, and you can draw helm charts that even set up an entire ClickHouse cluster. So, what's the difference between an operator and something like Helm?<\/p>\n<p><\/p>\n<p>The fundamental difference is that Helm is package management, while an operator goes further. It oversees the entire lifecycle. It's not just installation; it includes daily tasks such as scaling and sharding, meaning everything that needs to be done throughout the lifecycle (and if necessary, deletion as well) is all handled by the operator. It aims to automate and manage the entire software lifecycle. This is its fundamental distinction from other available solutions. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e26b57c8caf8437f683d7afbfa127ebd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>That was the introductory part; let's move on. <\/p>\n<p><\/p>\n<p>How do we build our operator? We aim to manage the ClickHouse cluster as a single resource. <\/p>\n<p><\/p>\n<p>On the left side of the picture, we have the input data. This is a YAML with the cluster specification, which is traditionally passed into Kubernetes via kubectl. There, our operator picks it up and does its magic. And what we get out at the end is this diagram. This is the implementation of ClickHouse in Kubernetes.<\/p>\n<p><\/p>\n<p>Next, we will gradually look at how the operator actually works, what typical tasks can be solved. We will only cover typical tasks because we have limited time. Not everything that an operator can solve will be discussed. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b40401931b58988058419d4495dbb1bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Let's start from practice. Our project is completely open source, so you can check out how it works on GitHub. And you can consider that if you just want to get started, the Quick Start Guide is a good place to begin.<\/p>\n<p><\/p>\n<p>If you want to dive into details, we strive to maintain the documentation in a reasonably good state. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9414d7c3aa94b6ad999e150f0ac25a97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za\u010dnemo s prakti\u010dno nalogo. Prva naloga, s \u010dimer \u017eelimo za\u010deti, je zagnati prvi primer na kakr\u0161enkoli na\u010din. Kako z operaterjem zagnati ClickHouse, tudi brez posebnega znanja o tem, kako deluje? Pi\u0161emo manifest, saj je vsa komunikacija z k8s komunikacija preko manifestov.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3e97cd235827460693ed95fb3598d31d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tukaj imamo tak kompleksni manifest. To, kar imamo ozna\u010deno rde\u010de, je tisto, na kar je treba opozoriti. Operaterja prosimo, da ustvari klaster z imenom demo.<\/p>\n<p><\/p>\n<p>Za zdaj so to osnovni primeri. Shranjevanje \u0161e ni opisano, a se bomo ob shranjevanju vrnili nekoliko pozneje. Za zdaj bomo opazovali razvoj klustra v dinamiki.<\/p>\n<p><\/p>\n<p>Ta manifest smo ustvarili. Napravimo ga na\u0161em operaterju. On je delal, naredil je \u010darovnijo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/502e64fbe6ed7d04b2aecb7d51abc7f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ogledujemo si konzolo. Zanimajo nas trije elementi \u2013 to je Pod, dva Servisa, StatefulSet.<\/p>\n<p><\/p>\n<p>Operater je deloval in lahko si ogledamo, kaj to\u010dno je ustvaril. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/67faf120e21e5113680ccff9c71b00f1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ustvari pribli\u017eno tak\u0161no shemo. Imamo StatefulSet, Pod, ConfigMap za vsako repliko, ConfigMap za celoten kluster. Obvezni so servisi kot dostopne to\u010dke do klustra. <\/p>\n<p><\/p>\n<p>Servisi so centralni Load Balancer Service in \u0161e za vsako repliko, za vsak shard. <\/p>\n<p><\/p>\n<p>Na\u0161 osnovni kluster izgleda pribli\u017eno takole. Sestavljen je iz ene same nod. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f235ada45ee58b517c0e041f795ae122.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gremo naprej, bomo zapletli. Treba je sharding klustra.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/992836a00434c64fb4616c1c4cc4df97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na\u0161e naloge nara\u0161\u010dajo, dinamika se za\u010dne. \u017delimo dodati shard. Spremljamo razvoj. Spreminjamo na\u0161o specifikacijo. Oznanjamo, da \u017eelimo dva sharda. <\/p>\n<p><\/p>\n<p>To je isti datoteka, ki se dinami\u010dno razvija z rastjo sistema. Shranjevanje ni, shranjevanje bo obravnavano pozneje, to je lo\u010dena tema.<\/p>\n<p><\/p>\n<p>Napravimo YAML-operater in pogledamo, kaj se zgodi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8ddb5845cae160098470208f51b5da7c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Operater je razmislil in naredil naslednje entitete. Imamo \u017ee dva Pod, tri Servise in nenadoma, 2 StatefulSet-a. Zakaj 2 StatefulSet-a?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/26eb734ff1a195de2ceaab842b472ee4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na shemi je bilo tako \u2013 to je na\u0161e prvotno stanje, ko smo imeli en pod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/657838b0d378121fdd66ad3ff8168600.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sedaj je tako. Za zdaj je vse preprosto, podvojilo se je. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f039a7046f1c56fbdad6b5a26a519b10.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In zakaj sta zdaj dva StatefulSet-a? Tukaj se je treba oditi in razpravljati o vpra\u0161anju, kako v Kubernetesu poteka upravljanje s Pod-ji.<\/p>\n<p><\/p>\n<p>Obstaja objekt, imenovan StatefulSet, ki omogo\u010da ustvarjanje niza Pod-ov iz predloge. Klju\u010dni dejavnik tukaj je Template. V enem StatefulSetu lahko za\u017eenemo veliko Pod-ov po eni predlogi. Klju\u010dna fraza tukaj je 'po eni predlogi veliko Pod-ov'.<\/p>\n<p><\/p>\n<p>Obstaja velika \u017eelja, da bi celoten gru\u010di zapakirali v en StatefulSet. To bo delovalo, s tem ni nobenih te\u017eav. Vendar pa je ena podrobnost. \u010ce \u017eelimo zgraditi heterogeno gru\u010di, tj. iz ve\u010d razli\u010dic ClickHouse, se tukaj pojavijo vpra\u0161anja. Da, StatefulSet lahko izvede rolling update, da lahko namestimo novo razli\u010dico in razlo\u017eimo, da ne bi smeli poskusiti ve\u010d kot toliko vozli\u0161\u010d hkrati.<\/p>\n<p><\/p>\n<p>Toda \u010de extrapoliramo nalogo in re\u010demo, da \u017eelimo ustvariti popolnoma heterogeno gru\u010di in \u017eelimo ne zamenjati stare razli\u010dice z novo s pomo\u010djo rolling update, ampak preprosto \u017eelimo ustvariti heterogeno gru\u010di tako v smislu razli\u010dnih razli\u010dic ClickHouse kot tudi razli\u010dnih shranjevanj. Na primer, nekateri replikati bi morali biti na lo\u010denih diskih, na po\u010dasnih, na splo\u0161no, popolnoma zgraditi heterogeno gru\u010di. Zaradi tega, ker StatefulSet naredi standardizirano re\u0161itev iz enega predloge, zato to ni mogo\u010de. <\/p>\n<p><\/p>\n<p>Po nekaj premi\u0161ljevanju smo se odlo\u010dili, da to storimo tako. Vsaka replika ima svoj StatefulSet. Ta re\u0161itev ima nekatera pomanjkljivosti, vendar v praksi to v celoti inkapsulira operator. In obstaja cela vrsta prednosti. Zgradimo lahko popolnoma tak\u0161no gru\u010di, kot jo \u017eelimo, na primer popolnoma heterogeno. Zato bo v gru\u010di, kjer imamo dva sharda z eno repliko, 2 StatefulSet-a in 2 Pod-a ravno zato, ker smo izbrali ta pristop zaradi zgoraj navedenih razlogov, da bi lahko zgradili heterogeno gru\u010di. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b7ae92a545f9bb6cc5f0136df87207f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vrnimo se k prakti\u010dnim nalogam. V na\u0161i gru\u010di je potrebno nastaviti uporabnike, tj. potrebno je nekako konfigurirati ClickHouse v Kubernetes. Operator za to ponuja vse mo\u017enosti. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6a65aa78293c0b40230cf24efc58e55a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lahko neposredno v YAML napi\u0161emo, kar \u017eelimo. Vse konfiguracijske mo\u017enosti se neposredno preslikajo iz tega YAML v nastavitve ClickHouse, ki se nato razporedijo po celotni gru\u010di.<\/p>\n<p><\/p>\n<p>Lahko pa pi\u0161emo tudi takole. To je za primer. Geslo lahko naredite \u0161ifrirano. Podpirajo se vse konfiguracijske mo\u017enosti ClickHouse. Tukaj je le primer. <\/p>\n<p><\/p>\n<p>Konfiguracija po gru\u010di se \u0161iri kot ConfigMap. V praksi se posodobitev ConfigMap ne zgodi takoj, zato \u010de je gru\u010da velika, postopek prehajanja konfiguracije traja nekaj \u010dasa. Toda vse to je zelo udobno za uporabo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2e42d19d7a558e3b8d4bbb51fe5bd08b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zahtevamo kompleksnost. Klaster se razvija. \u017delimo da repliciramo podatke. Odnosno, ve\u0107 imamo dva shard-a, po jednom replikatu, korisnici su pode\u0161eni. Rasti \u0107emo i baviti se replikacijom.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c97e5e6ca9cb66d3a94fb8cfe610186.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0160ta nam je potrebno za replikaciju? <\/p>\n<p><\/p>\n<p>Potrebni su nam ZooKeeper. U ClickHouse replikacija se gradi koriste\u0107i ZooKeeper. ZooKeeper je potreban kako bi razli\u010dite replikate ClickHouse imale konsenzus o tome koji su podaci na kojem ClickHouse. <\/p>\n<p><\/p>\n<p>Mo\u017eete koristiti bilo koji ZooKeeper. Ako preduze\u0107e ima spolja\u0161nji ZooKeeper, mo\u017ee ga koristiti. Ako nema, mo\u017eemo ga postaviti iz na\u0161eg repozitorijuma. Postoji instalater koji olak\u0161ava celu stvar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6cc40951a19b982abf578836edf569d3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I shema interakcije celog sistema izgleda ovako. Imamo Kubernetes kao platformu. Na njemu se izvr\u0161ava ClickHouse operator. ZooKeeper je ovde prikazan. Operator interaguje i sa ClickHouse i sa ZooKeeper. Odnosno, dolazi do interakcije. <\/p>\n<p><\/p>\n<p>I sve to je potrebno da ClickHouse uspe\u0161no replikira podatke u k8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4fc37aee850acd20517fa3d7562f0165.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pogledajmo sada samu zadatak, kako \u0107e izgledati manifest za replikaciju.<\/p>\n<p><\/p>\n<p>Dodajemo dve sekcije na\u0161em manifestu. Prva \u2013 odakle uzeti ZooKeeper, koji mo\u017ee biti unutar Kubernetes-a ili spolja\u0161nji. Ovo je samo opis. I naru\u010dujemo replikate. Odnosno, \u017eelimo dve replikate. Tako da na izlazu treba da imamo 4 pod-a. \u0160to se ti\u010de skladi\u0161ta, toga se se\u0107amo, vrati\u0107e se malo kasnije. Skladi\u0161te je posebna tema. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb8c974d0587a4ad87d6ba36bbe5e3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bilo je ovako.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/909ffd258dbce718ddf529a1a753de6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Postaje ovako. Dodaju se replikati. \u010cetvrti se nije uklapao, verujemo da ih mo\u017ee biti mnogo. A sa strane se dodaje ZooKeeper. \u0160eme postaju slo\u017eenije. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c33b37fc7fc72f51276e5e98b9ec2134.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I do\u0161ao je trenutak da dodamo slede\u0107i zadatak. Doda\u0107emo Persistent Storage. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f28d14901a713eca413a52ec6ea21ac5.jpeg\" style=\"display:block;margin: 0 auto;\" \/>Imamo razli\u010dite opcije za Persistent Storage.<\/p>\n<p><\/p>\n<p>U slu\u010daju da se izvr\u0161avamo u cloud provajderu, na primer, koriste\u0107i Amazon, Google, postoji velika isku\u0161enje da iskoristimo cloud skladi\u0161te. To je veoma zgodno, to je dobro. <\/p>\n<p><\/p>\n<p>I postoji druga opcija. To je za lokalno skladi\u0161te, kada su nam diskovi lokalni na svakoj nodi. Ova opcija je mnogo slo\u017eenija za izvr\u0161enje, ali je pritom i produktivnija. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/483ee5c08b62e987620bf54fd32a44b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pogledajmo \u0161ta imamo u vezi sa cloud skladi\u0161tem.<\/p>\n<p><\/p>\n<p>Postoje prednosti. Veoma je jednostavno konfigurirati. Jednostavno naru\u010dimo od cloud provajdera da nam da skladi\u0161te odre\u0111enog kapaciteta, odre\u0111ene klase. Klase su opisane od strane provajdera. <\/p>\n<p><\/p>\n<p>Obstaja pa tudi pomanjkljivost. Za nekatere to morda ni kriti\u010dna pomanjkljivost. Seveda so lahko prisotne nekatere te\u017eave z zmogljivostjo. To je zelo priro\u010dno za delo, zanesljivo, a so prisotna nekatera potencialna zmanj\u0161anja zmogljivosti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8e82430b64477f91640078ff4eacb47e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ker se ClickHouse osredoto\u010da prav na zmogljivost, bi lahko celo rekli, da iztisne vse kar se da, zato mnogi naro\u010dniki posku\u0161ajo iztisniti maksimum zmogljivosti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8638fe37b848a98ce8326218d368baa3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Da bi dosegli maksimum, potrebujemo lokalni spomin.<\/p>\n<p><\/p>\n<p>Kubernetes nudi tri abstrakcije za uporabo lokalnega pomnilnika v Kubernetesu. To so: <\/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>Poglejmo, kako se razlikujejo in kako so si podobni. <\/p>\n<p><\/p>\n<p>Prvi\u010d, pri vseh treh pristopih imamo storage \u2013 to so lokalni diski, ki se nahajajo na istem fizi\u010dnem k8s vozli\u0161\u010du. A obstajajo nekatere razlike.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79afb620a0c9a1552b47240b405fedc9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za\u010dnimo z najpreprostej\u0161im, torej z emptyDir. Kaj to v praksi pomeni? Prosim na\u0161o specifikacijo, da sistemu kontejnerizacije (ve\u010dinoma je to Docker) omogo\u010dimo dostop do mape na lokalnem disku.<\/p>\n<p><\/p>\n<p>V praksi Docker nekje v svojih lastnih poteh ustvari za\u010dasno mapo, jo poimenuje z dolgim ha\u0161em. In omogo\u010di dostop do nje. <\/p>\n<p><\/p>\n<p>Kako bo to vplivalo na zmogljivost? Delo bo potekalo s hitrostjo lokalnega diska, torej imamo popoln dostop do svojega diska. <\/p>\n<p><\/p>\n<p>Toda ta pristop ima svoje pomanjkljivosti. Trajno ohranjanje podatkov v tem primeru je precej vpra\u0161ljivo. Pri prvem premiku Dockra s kontejnerji se trajni podatki izgubijo. \u010ce bo Kubernetes iz kakr\u0161nega koli razloga \u017eelel preseliti to Pod na drug disk, se bodo podatki izgubili. <\/p>\n<p><\/p>\n<p>Ta pristop je dober za teste, ker \u017ee poka\u017ee normalno hitrost, vendar ta razli\u010dica ni primerna za resnej\u0161e projekte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0b60f80fc9ea0e2c1820021bcd9e1382.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zato obstaja drugi pristop. To je hostPath. \u010ce primerjate prej\u0161nji diapozitiv in ta, lahko opazite zgolj eno razliko. Na\u0161a mapa je pri\u0161la iz Dockra neposredno na Kubernetes nod. <\/p>\n<p><\/p>\n<p>Ta na\u010din ima svoje prednosti. To je \u017ee pravi trajni pomnilnik, klasi\u010den. Na disku bodo podatki shranjeni na dolo\u010denem naslovu. <\/p>\n<p><\/p>\n<p>Obstajajo tudi slabosti. To je zahtevnost upravljanja. Na\u0161 Kubernetes morda \u017eeli premakniti Pod na drugo fizi\u010dno vozli\u0161\u010de. In tu vstopi DevOps. Morajo pravilno razlo\u017eiti celotni sistem, da se lahko ti podi premikajo samo na tista vozli\u0161\u010da, na katerih ima\u0161 po teh poteh nekaj montiranega, in ne ve\u010d kot na eno vozli\u0161\u010de naenkrat. To je precej zapleteno. <\/p>\n<p><\/p>\n<p>Zato smo za te namene v na\u0161em operaterju pripravili predloge, da to zapletenost skrijemo. In tako bi lahko enostavno rekli: \u201e\u017delim, da imam en instance ClickHouse na vsako fizi\u010dno vozli\u0161\u010de in po tak\u0161ni poti.\u201c <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f64c19bccc8b187d6af112eda896b25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Toda ta potreba ni pomembna samo za nas, zato gospodje iz samega Kubernetesa tudi razumejo, da si ljudje \u017eelijo imeti dostop do fizi\u010dnih diskov, zato nudijo tretjo raven.<\/p>\n<p><\/p>\n<p>Ta se imenuje local. Razlika od prej\u0161njega diapozitiva je prakti\u010dno nobena. Le da je prej bilo treba ro\u010dno spremljati, da teh podov ni mogo\u010de prena\u0161ati z vozli\u0161\u010da na vozli\u0161\u010de, ker morajo biti pritrjeni po tak\u0161ni poti na lokalni fizi\u010dni disk, zdaj pa se vse te informacije inkapsulirajo v samo Kubernetes. In vse skupaj postane veliko la\u017eje za konfiguriranje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/140c43be34dd7015c0bf4cfd0a0bb384.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vrnimo se k na\u0161i prakti\u010dni nalogi. Vrnimo se k YAML predlogi. Tukaj imamo pravi storage. Spet smo se vrnili k temu. Dolo\u010damo klasi\u010den VolumeClaim predlogo, kot v k8s. In opisujemo, kak\u0161en storage \u017eelimo.<\/p>\n<p><\/p>\n<p>Po tem bo k8s zahteval storage. Dodelil nam ga bo v StatefulSet. In na koncu bo to na voljo ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/960e666486ed09cebd83235d43f83970.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Imeli smo tak\u0161no shemo. Na\u0161 Persistent Storage je bil rde\u010d, kar nam je namigovalo, da bi ga bilo treba narediti. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a989df489e3a9fef6a4fbf7b93c489a6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In zdaj postane zelen. Shema klasterja ClickHouse na k8s je zdaj v celoti kon\u010dana. Imamo sharde, replikate, ZooKeeper, imamo pravi Persistent, ki je realiziran na ta ali oni na\u010din. Shema je \u017ee popolnoma delujo\u010da. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c409ee5da6309a67904394d968ed4906.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nadaljujemo naprej. Na\u0161 klaster se razvija. In Aleksej se trudi in izdaja novo razli\u010dico ClickHouse.<\/p>\n<p><\/p>\n<p>Pojavi se prakti\u010dna naloga \u2013 testirati novo razli\u010dico ClickHouse na na\u0161em klasterju. Seveda si ne \u017eelimo, da bi jo takoj namestili na celoten klaster, ampak bi jo \u017eeleli nekje v oddaljenem kotu namestiti v eno replikato, morda pa ne eno novo razli\u010dico, temve\u010d kar dve, ker pogosto izhajajo. <\/p>\n<p><\/p>\n<p>Kaj lahko o tem povemo?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48ed52d393d977d0cfaa9320bd02ed1e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tuk imamo prav tako mo\u017enost. To so predloge podov. Lahko jih konfiguriramo, na\u0161 operater omogo\u010da popolno gradnjo heterogenih klastrov. To pomeni, da lahko konfiguriramo vse replike skupaj ali vsako posamezno repliko z razli\u010dicami ClickHouse in shranjevanja, ki jih \u017eelimo. Popolnoma lahko konfiguriramo na\u0161 klaster tako, kot potrebujemo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4949ecd8119cb4ec0f4bad9bf27fa74e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sedaj se bomo malo poglobili v podrobnosti. Do sedaj smo govorili, kako ClickHouse-operator deluje v kontekstu ClickHouse.<\/p>\n<p><\/p>\n<p>Zdaj bi rad povedal nekaj besed o tem, kako deluje vsak operator in kako interagira s K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ca9c2a23c54b2a81ac0a8bba88d5e65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Najprej poglejmo interakcijo s K8s. Kaj se zgodi, ko izvedemo kubectl apply? Na\u0161i objekti se prek API-ja pojavijo v etcd. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b9eaedeb0f34d10398ba0187f09fef9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na primer, osnovni objekti Kubernetes: pod, StatefulSet, storitev in tako dalje. <\/p>\n<p><\/p>\n<p>Hkrati se fizi\u010dno \u0161e ni\u010d ne dogaja. Te objekte je treba materializirati v klastru. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3c49dc1b0067347d5fc415ef9b87642d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za to nastane kontroler. Kontroler je poseben komponent K8s, ki zna materializirati te opise. Ve, kako in kaj je treba fizi\u010dno storiti. Ve, kako zagnati kontejnerje in kaj je treba nastaviti, da stre\u017enik deluje. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d951eb0f7bacf519566b0ef6cf9bc100.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In materializira na\u0161e objekte v K8s.<\/p>\n<p><\/p>\n<p>Ampak \u017eelimo upravljati ne le s podi in StatefulSeti, temve\u010d \u017eelimo ustvariti ClickHouseInstallation, torej objekt tipa ClickHouse, da bi z njim upravljali kot z enoto. Zaenkrat taka mo\u017enost ne obstaja. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1594921ac5dd9384ce81ceae92f5cda9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vendar pa ima K8s eno prijetno lastnost. \u017delimo, da imamo nekje to kompleksno entiteto, ki bi bila sestavljena iz podov in StatefulSetov na\u0161ega klasterja. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/04f86706f506fa91e365d45537dd9def.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kaj je torej potrebno storiti? Prvi\u010d, na sceno stopi Custom Resource Definition. Kaj to pomeni? To je opis za K8s, da bo\u0161 imel \u0161e en tip podatkov, saj \u017eelimo dodati prilagojen vir k podu in StatefulSetu, ki bo notranje kompleksen. To je opis strukture podatkov. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f02ae12ef3ab5db974234b14e38792ac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tudi to po\u0161ljemo tja prek kubectl apply. Kubernetes ga je veselo sprejel. <\/p>\n<p><\/p>\n<p>In zdaj imamo v shranjevanju, pri objektu v etcd, mo\u017enost zapisati prilagojen vir z imenom ClickHouseInstallation.<\/p>\n<p><\/p>\n<p>\u041d\u043e \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442. \u0422\u043e \u0435\u0441\u0442\u044c, \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c YAML-\u0444\u0430\u0439\u043b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0448\u0430\u0440\u0434, \u0440\u0435\u043f\u043b\u0438\u043a \u0438 \u0441\u043a\u0430\u0436\u0435\u043c \u00abkubectl apply\u00bb, \u0442\u043e Kubernetes \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0442, \u043f\u043e\u043b\u043e\u0436\u0438\u0442 \u0432 etcd \u0438 \u0441\u043a\u0430\u0436\u0435\u0442: \u00ab\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u043d\u043e \u0447\u0442\u043e \u0441 \u043d\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c, \u044f \u043d\u0435 \u0437\u043d\u0430\u044e. \u041a\u0430\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c ClickHouseInstallation, \u044f \u043d\u0435 \u0437\u043d\u0430\u044e\u00bb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7c2f9f3f81b83c987a3bd72a881d0d91.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043a\u0442\u043e-\u0442\u043e, \u043a\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 Kubernetes \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u043b\u0435\u0432\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 Kubernetes, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0410 \u0441\u043f\u0440\u0430\u0432\u0430 \u0443 \u043d\u0430\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<p><\/p>\n<p>\u0418 \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043e\u043d \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440. \u042f \u0435\u0433\u043e \u0437\u0434\u0435\u0441\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u043d\u0435\u0441 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b Kubernetes, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0438 \u0432\u043d\u0435 K8s. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 Kubernetes, \u043d\u043e \u043d\u0438\u0447\u0442\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043d\u0430\u0440\u0443\u0436\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0435\u043d \u043d\u0430\u0440\u0443\u0436\u0443. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7aa3a1b67d0def5ba752dff56baeebbf.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0418 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u043e\u043d \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 Kubernetes \u0447\u0435\u0440\u0435\u0437 API. \u041e\u043d \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 API. \u0418 \u043e\u043d \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a \u0438\u0437 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0438\u043c \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a5f773ddc3663f24d5379955da9c3037.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0433\u043b\u044f\u043d\u0435\u043c \u0432 \u043f\u0440\u0430\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a \u043e\u043d \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442. \u0423\u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u0441\u0435 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438 \u043a\u0430\u043a \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/08a8d8dbcb35117a0eb3320589c6ff8d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430. \u041e\u043d\u0430 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Kubernetes API \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0412 Kubernetes API \u0435\u0441\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0418 \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432 K8s \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0442\u043e Kubernetes \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u043d\u0430 \u044d\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0441\u044f, \u0442.\u0435. \u043a\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0441\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 API, \u0442\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p><\/p>\n<p>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0438\u0445. \u0415\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u2013 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f0664a4151e6e7f6f8575a3e54372e9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0448 YAML-\u0444\u0430\u0439\u043b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c ClickHouseInstallation. \u041e\u043d \u0447\u0435\u0440\u0435\u0437 kubectl apply \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 etcd. \u0422\u0430\u043c \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u044d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 ClickHouse-operator. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0448\u043b\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 ClickHouseInstallation, \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u0418 \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u2013 \u044d\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0952bdd391a72aa15bf66af4ce69f4af.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kaj stori? Najprej je treba izdelati na\u010drti, kako bomo ravnali s to posodobitvijo. Posodobitve so lahko zelo majhne, tj. majhne v YAML-izvedbi, a lahko povzro\u010dijo zelo velike spremembe v grozdu. Zato operater ustvari na\u010drt in se ga nato dr\u017ei.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79caaa43b6fd9f3e2eb1afe44ecb2df9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za\u010dne opravljati to strukturo v skladu s tem na\u010drtom, da materializira pod-ove, storitve, tj. po\u010dne tisto, kar je njegova glavna naloga. To je podobno gradnji ClickHouse grozda v Kubernetesu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e91576a26d6b758a68ae0b35cbe01897.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zdaj se dotaknimo zanimive stvari. To je razdelitev odgovornosti med Kubernetesom in operaterjem, tj. kaj dela Kubernetes, kaj dela operater in kako medsebojno sodelujeta. <\/p>\n<p><\/p>\n<p>Kubernetes je odgovoren za sistemske stvari, tj. za osnovni niz objektov, ki jih lahko interpretiramo kot predmetni obseg sistema. Kubernetes ve, kako zagnati pod-e, kako ponovno zagnati vsebnike, kako narediti mount volumes, kako delati s ConfigMap, tj. vse, kar lahko imenujemo sistem. <\/p>\n<p><\/p>\n<p>Operaterji delujejo v predmetnih podro\u010djih. Vsak operater je zasnovan za svoje predmetno podro\u010dje. Mi smo ga ustvarili za ClickHouse.<\/p>\n<p><\/p>\n<p>In operater deluje natan\u010dno v pogojih predmetnega podro\u010dja, kot so dodajanje replike, ustvarjanje sheme, nastavitev nadzora. Izvaja se tak\u0161na razdelitev.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9dc07d9c29d5dfd538343aadb751e4c0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poglejmo prakti\u010den primer, kako se ta razdelitev odgovornosti uresni\u010duje, ko izvedemo dejanje dodajanja replike. <\/p>\n<p><\/p>\n<p>Operaterju prispe naloga \u2013 dodati repliko. Kaj operater stori? Operater izra\u010duna, da mora ustvariti nov StatefulSet, v katerem mora opisati dolo\u010dene predloge, volume claim. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7a31f2f76a3bdda87e4bccf0e04fe4a8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vse to pripravi in nadaljuje v K8s. Pove, da potrebuje ConfigMap, StatefulSet, Volume. Kubernetes to obdeluje. Materializira osnovne enote, s katerimi deluje. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2be6892234cc12b056962265c13dba07.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In nato ponovno vstopi ClickHouse-operator. \u017de ima fizi\u010dni pod, na katerem je mogo\u010de nekaj po\u010deti. In ClickHouse-operator spet deluje v pogojih predmetnega podro\u010dja. Tj. Specifi\u010dno ClickHouse za vklju\u010ditev replike v grozd, je najprej treba nastaviti shemo podatkov, ki obstaja v tem grozdu. In drugi\u010d, to repliko je treba vklju\u010diti v nadzor, da jo je mogo\u010de dobro spremljati. To nastavi operater. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/790616342b98b347fa67e0100754c8b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In this way, ClickHouse comes into play, meaning another higher-level entity. This is now a database. It has its own instance, a configured replica that is ready to join the cluster.<\/p>\n<p><\/p>\n<p>Thus, the execution chain and the division of responsibilities when adding a replica is quite long.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ec79cfa2b45fadbe25f4d9fe8d2ec5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Let's continue with our practical tasks. If a cluster already exists, one can carry out a configuration migration. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a52aee0d4350b8da00cdb4b525df80ad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>We have made it possible to pass through the existing XML that ClickHouse understands.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/91abb1d3b0a14f2118361403a74e14c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse can be finely tuned. Zoned deployment is precisely what I talked about when explaining hostPath and local storage. This is how to properly implement zoned deployment.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fde502f30223e04a918f4fd598c3dd9f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>The next practical task is monitoring.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4e685fba7883075105c0164a778c51e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>If our cluster changes, we need to periodically adjust the monitoring. <\/p>\n<p><\/p>\n<p>Let's look at the diagram. We have already reviewed the green arrows. Now let's examine the red arrows. This is how we want to monitor our cluster. How metrics from the ClickHouse cluster get into Prometheus and then into Grafana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1210c1423f99d48a20e06e855bf48a72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>What is the challenge with monitoring? Why is it considered some kind of achievement? The difficulty lies in the dynamics. When we have one static cluster, monitoring can be set up once and not thought about again.<\/p>\n<p><\/p>\n<p>However, if we have many clusters or if something is constantly changing, the process is dynamic. Constantly reconfiguring monitoring is a waste of resources and time, or even just laziness. This needs to be automated. The complexity lies in the dynamics of the process, and the operator automates this very well. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48a7264f1228671e0c483c8211a71eb3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>How did our cluster evolve? Initially, it looked like this.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8a8c7b6cd5562deb315368e1e8e1c976.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Then it looked like this.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1a3e915fbadf3aa5f3b33d337f36e76e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In the end, it became like this. <\/p>\n<p><\/p>\n<p>Monitoring is automated by the operator. A single point of entry. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e079e65bf8deff43a81d8ffde938a709.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>And we simply look at the Grafana dashboard to see how the internal life of our cluster is progressing. <\/p>\n<p><\/p>\n<p>By the way, the Grafana dashboard is also distributed with our operator directly in the source. It can be connected and used. Our DevOps team provided this screenshot.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ad1c2899dd845d0ba4185bdf758468c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Where would we like to move next? It is to:<\/p>\n<p><\/p>\n<ul>\n<li>Develop automation for testing. The main task is automated testing of new versions. <\/li>\n<li>Poleg tega si zelo \u017eelimo avtomatizirati integracijo z ZooKeeperjem. In planiramo integracijo z ZooKeeper-operatorjem. To pomeni, da je za ZooKeeper napisan operator in logi\u010dno je, da bi se ti dva operatorja za\u010dela integrirati za ustvarjanje bolj udobne re\u0161itve. <\/li>\n<li>\u017delimo izvesti bolj zapletene preglede \u017eivljenjske dobe. <\/li>\n<li>V zelenem sem ozna\u010dil to, da imamo na voljo dedovanje predlog \u2013 KON\u010cANO, torej z naslednjo razli\u010dico operatorja bomo \u017ee imeli dedovanje predlog. To je mo\u010dno orodje, ki omogo\u010da sestavljanje zapletenih konfiguracij iz kosov. <\/li>\n<li>In \u017eelimo avtomatizacijo zapletenih nalog. Glavna med njimi je Re-sharding. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f232c0aab389be5069e5c7886e265c01.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Opravimo vmesne rezultate. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/62f7814994af0441ba5a82de4e9780d7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kaj dobimo na izhodu? In ali se spla\u010da ukvarjati s tem ali ne? Je sploh smiselno poskusiti prenesti podatkovno bazo v Kubernetes in uporabiti operator na splo\u0161no ter Alitnity-operatorja posebej.<\/p>\n<p><\/p>\n<p>Na izhodu dobimo:<\/p>\n<p><\/p>\n<ul>\n<li>Znatno poenostavitev in avtomatizacijo konfiguracije, uvajanja ter vzdr\u017eevanja. <\/li>\n<li>Takoj vklju\u010deno spremljanje. <\/li>\n<li>In pripravljene za uporabo kodificirane predloge za zapletene situacije. To pomeni, da dodajanje replike ni ve\u010d potrebno opravljati ro\u010dno. To opravi operator. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/aebccd7a2dc55f14645f79f89f7b7458.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ostalo je le \u0161e eno vpra\u0161anje. Imamo \u017ee podatkovno bazo v Kubernetesu, virtualizacijo. Kak\u0161na je zmogljivost te re\u0161itve, \u0161e posebej glede na to, da je ClickHouse optimiziran za zmogljivost?<\/p>\n<p><\/p>\n<p>Odgovor \u2013 vse je v redu! Ne bom podrobno razlagal, to je tema za posebno poro\u010dilo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ffc230941f0ae24926186db4d8d68ade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Obstaja pa projekt, imenovan TSBS. Kak\u0161en je njegov glavni cilj? To je testiranje podatkovnih baz za zmogljivost. To je poskus primerjave toplega s toplim, mehkega z mehkimi. <\/p>\n<p><\/p>\n<p>Kako deluje? Generira se en niz podatkov. Nato se ta niz podatkov na enakem naboru testov preizku\u0161a na razli\u010dnih podatkovnih bazah. In vsaka podatkovna baza re\u0161uje en problem tako, kot zna. Potem lahko rezultate primerjamo. <\/p>\n<p><\/p>\n<p>\u017de podpira \u0161tevilne podatkovne baze. Osvetlil sem tri glavne. To so:<\/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=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5b4733534a4e6e36fb7788127adc6e86.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prav tako je bilo izvedeno primerjavo z drugo podobno re\u0161itvijo. Primerjava z RedShift. Primerjava je bila izvedena na Amazonu. ClickHouse tudi dobro premaga vse v tej zadevi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/44cc8dedc07a02fe1ed5aad3e17a579c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kak\u0161ne zaklju\u010dke lahko izpeljemo iz tega, kar sem povedal?<\/p>\n<p><\/p>\n<ul>\n<li>DB v Kubernetes je mo\u017en\u00fd. Mo\u017en\u00e1 jak\u00fdkoliv, ale celkov\u011b to vypad\u00e1, \u017ee to mo\u017en\u00e9 je. ClickHouse v Kubernetes ur\u010dit\u011b pou\u017e\u00edt lze silami na\u0161eho oper\u00e1tora. <\/li>\n<li>Oper\u00e1tor pom\u00e1h\u00e1 automatizovat procesy a skute\u010dn\u011b zjednodu\u0161uje \u017eivot.<\/li>\n<li>V\u00fdkon je norm\u00e1ln\u00ed.<\/li>\n<li>A, m\u00e1me pocit, \u017ee to je mo\u017en\u00e9 a m\u011blo by se to pou\u017e\u00edvat. <\/li>\n<\/ul>\n<p><\/p>\n<p>Open source \u2013 p\u0159idejte se!<\/p>\n<p><\/p>\n<p>Jak jsem ji\u017e zm\u00ednil, oper\u00e1tor je zcela open source produkt, tak\u017ee by bylo skv\u011bl\u00e9, kdyby ho co nejv\u00edce lid\u00ed pou\u017e\u00edvalo. P\u0159idejte se! \u010cek\u00e1me na v\u00e1s v\u0161echny!<\/p>\n<p><\/p>\n<p>D\u011bkuji v\u0161em!<\/p>\n<p><\/p>\n<p>Vpra\u0161anja<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\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 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4afe8b10c4f103c2a9a295511e4eb69a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>D\u011bkuji za prezentaci! Jmenuji se Anton. Jsem ze spole\u010dnosti SEMrush. Zaj\u00edm\u00e1 m\u011b, co s logov\u00e1n\u00edm. O monitorov\u00e1n\u00ed jsme sly\u0161eli, ale o logov\u00e1n\u00ed nic, pokud hovo\u0159\u00edme o cel\u00e9m klastru. U n\u00e1s nap\u0159\u00edklad b\u011b\u017e\u00ed klastr na hardwaru. A pou\u017e\u00edv\u00e1me centralizovan\u00e9 logov\u00e1n\u00ed, standardn\u00edmi prost\u0159edky shroma\u017e\u010fujeme do spole\u010dn\u00e9ho m\u00edsta. A potom odtud z\u00edsk\u00e1v\u00e1me zaj\u00edmav\u00e1 data.<\/em> <\/p>\n<p><\/p>\n<p>Dobr\u00fd dotaz, t.j. logov\u00e1n\u00ed je na seznamu todo. N\u00e1\u0161 oper\u00e1tor to zat\u00edm automatizovat neum\u00ed. Je to je\u0161t\u011b v rozvoji, projekt je st\u00e1le dost mlad\u00fd. Ch\u00e1peme pot\u0159ebu logov\u00e1n\u00ed. To je tak\u00e9 velmi d\u016fle\u017eit\u00e9 t\u00e9ma. A je to asi nem\u00e9n\u011b d\u016fle\u017eit\u00e9 ne\u017e monitorov\u00e1n\u00ed. Ale prvn\u00ed v seznamu realizace bylo monitorov\u00e1n\u00ed. Logov\u00e1n\u00ed bude. Samoz\u0159ejm\u011b se sna\u017e\u00edme automatizovat v\u0161echny str\u00e1nky \u017eivotnosti klastru. Proto odpov\u011b\u010f \u2013 v sou\u010dasnosti oper\u00e1tor, ob\u00e1v\u00e1m se, to neum\u00ed, ale je to v pl\u00e1nu, budeme to d\u011blat. Pokud m\u00e1te z\u00e1jem se p\u0159ipojit, tak pros\u00edm pull request.<\/p>\n<p><\/p>\n<p><em>Dobr\u00fd den! D\u011bkuji za prezentaci! M\u00e1m standardn\u00ed ot\u00e1zku, t\u00fdkaj\u00edc\u00ed se Persistent Volumes. Kdy\u017e vytv\u00e1\u0159\u00edme konfiguraci t\u00edmto oper\u00e1torem, jak oper\u00e1tor ur\u010duje, na kter\u00e9 nody m\u00e1me p\u0159ipojen\u00fd n\u011bjak\u00fd disk nebo slo\u017eku? Mus\u00edme mu p\u0159edem vysv\u011btlit, \u017ee pros\u00edm um\u00edst\u011bte n\u00e1\u0161 ClickHouse pr\u00e1v\u011b na t\u011bch nodech, kde je disk?<\/em><\/p>\n<p><\/p>\n<p>Pokud spr\u00e1vn\u011b rozum\u00edm, tato ot\u00e1zka je pokra\u010dov\u00e1n\u00edm local storage, zejm\u00e9na jeho \u010d\u00e1sti o hostPath. Je to jako vysv\u011btlovat cel\u00e9mu syst\u00e9mu, \u017ee pod by m\u011bl b\u00fdt spu\u0161t\u011bn pr\u00e1v\u011b na takov\u00e9 nod\u011b, na kterou m\u00e1me fyzicky p\u0159ipojen\u00fd disk, kter\u00fd je p\u0159ipojen na takov\u00e9 cest\u011b. To je cel\u00e1 sekce, kterou jsem dotknul velmi povrchn\u011b, proto\u017ee odpov\u011b\u010f je docela obs\u00e1hl\u00e1. <\/p>\n<p><\/p>\n<p>Na kratko, to izgleda tako. Seveda moramo zagotoviti te volumne. Trenutno v lokalnem shranjevanju ni dinami\u010dnega zagotavljanja, zato morajo DevOps sami odrezati diske, torej te volumne. In morajo razlo\u017eiti Kubernetesu o zagotavljanju, da bodo imeli trdni volumni dolo\u010dene klase, ki se nahajajo na dolo\u010denih vozli\u0161\u010dih. Nato je treba razlo\u017eiti Kubernetesu, da se podi, ki zahtevajo to\u010dno to lokalno shranjevanje, morajo glede na oznake na\u010drtovati le na ta vozli\u0161\u010da. Za te namene ima operator mo\u017enost dodeliti dolo\u010deno oznako in eno za vsako instanco gostitelja. Tako se bo zgodilo, da bodo podi usmerjeni s Kubernetesom za zagon samo na vozli\u0161\u010da, ki ustrezajo zahtevam, oznakam, enostavno povedano. Administratori dodelijo oznake in ro\u010dno izvedejo zagotavljanje diskov. Tako se to lahko raz\u0161iri.<\/p>\n<p><\/p>\n<p>In prav tretja mo\u017enost lokalnega shranjevanja to nekoliko olaj\u0161a. Kot sem \u017ee poudaril, je to potrpe\u017eljivo delo na nastavitvah, ki na koncu pomaga dose\u010di najve\u010djo zmogljivost.<\/p>\n<p><\/p>\n<p><em>Imam drugo vpra\u0161anje, povezano s tem. Kubernetes je zasnovan tako, da ni pomembno, ali izgubimo vozli\u0161\u010de ali ne. Kaj naj v tem primeru storimo, \u010de izgubimo vozli\u0161\u010de, kjer imamo shard?<\/em><\/p>\n<p><\/p>\n<p>Da, Kubernetes je bil prvotno zasnovan tako, da imamo do na\u0161ih podov odnos kot do goveda, tukaj pa vsak disk postane nekaj podobnega hi\u0161nemu ljubljencu. Obstaja te\u017eava, da jih ne moremo kar tako zavre\u010di. Razvoj Kubernetes se odvija v smeri, da se tega ne moremo popolnoma filozofsko lotiti, kot da bi bili to popolnoma zavr\u017eeni viri.<\/p>\n<p><\/p>\n<p>Zdaj pa prakti\u010dno vpra\u0161anje. Kaj storiti, \u010de ste izgubili vozli\u0161\u010de, na katerem je bil disk? Tukaj se naloga re\u0161uje na vi\u0161ji ravni. V primeru ClickHouse imamo replikate, ki delujejo na vi\u0161ji ravni, tj. na ravni ClickHouse.<\/p>\n<p><\/p>\n<p>Kak\u0161na je torej postavitev? Za to, da se podatki ne izgubijo, je odgovoren DevOps. Pravilno mora nastaviti replikacijo in mora spremljati, da se replikacija izvaja. V repliki na ravni ClickHouse morajo biti podatki podvojeni. To ni naloga, ki jo re\u0161uje operator. In ni naloga, ki jo re\u0161uje sam Kubernetes. To je na ravni ClickHouse.<\/p>\n<p><\/p>\n<p>Kaj narediti, \u010de vam je padla \u017eelezna vozli\u0161\u010da? Izgleda, da bo treba postaviti drugo, pravilno pripisati disk in nanesti oznake. Potem bo izpolnjevala zahteve, da lahko Kubernetes na njej za\u017eene instanco pod-a. Kubernetes jo bo zagnal. Va\u0161emu \u0161tevilu pod-ov namre\u010d ne zadostuje do zahtevanega. Pre\u0161la bo skozi cikel, ki sem ga prikazal. Na najvi\u0161ji ravni bo ClickHouse razumel, da je pri\u0161la replikacija, ki je \u0161e prazna in nanjo je treba za\u010deti prena\u0161ati podatke. T. j. ta postopek \u0161e ni dobro avtomatiziran. <\/p>\n<p><\/p>\n<p><em>Hvala za va\u0161 govor! Ko pride do te\u017eav, operater pade in se ponovno za\u017eene, hkrati pa prihajajo dogodki, kako jih obdelujete?<\/em><\/p>\n<p><\/p>\n<p>Kaj se zgodi, \u010de operater pade in se ponovno za\u017eene, ja? <\/p>\n<p><\/p>\n<p><em>Da. In hkrati so pri\u0161li dogodki.<\/em> <\/p>\n<p><\/p>\n<p>Naloga, kaj narediti v tem primeru, se delno deli med operaterja in Kubernetes. Kubernetes ima mo\u017enost predvajati zgodnje dogodke. To predvaja. Naloga operaterja je, da poskrbi, da so ti dogodki idempotentni, ko se izvede predvajanje dnevnika dogodkov. In da ponovni vstop istega dogodka ne zlomi na\u0161ega sistema. In na\u0161 operater obvladuje to nalogo. <\/p>\n<p><\/p>\n<p><em>Pozdravljeni! Hvala za va\u0161 govor! Dmitrij Zavjalov, podjetje<\/em> <em>Smedova. Ali je predvideno dodajanje mo\u017enosti konfiguracije operatorja s haproxy? Interesira me kak\u0161en drug uravnote\u017eevalnik poleg standardnega, ki bi bil pameten in bi razumel, da je ClickHouse.<\/em> <\/p>\n<p><\/p>\n<p>Govori\u0161 o Ingressu?<\/p>\n<p><\/p>\n<p><em>Da, zamenjati Ingress s haproxy. V haproxy lahko navedete topologijo klasterja, kjer ima replikacije.<\/em><\/p>\n<p><\/p>\n<p>Zaenkrat o tem nismo razmi\u0161ljali. \u010ce vam je to potrebno in lahko razlo\u017eite, zakaj je to potrebno, bi to lahko uresni\u010dili, \u0161e posebej, \u010de \u017eelite sodelovati. Z veseljem bomo preu\u010dili to mo\u017enost. Kratek odgovor - ne, trenutno tak\u0161ne funkcionalnosti nimamo. Hvala za namig, to bomo preu\u010dili. \u010ce pa \u0161e razlo\u017eite use case in zakaj je to v praksi potrebno, na primer, \u010de ustvarite te\u017eave na GitHubu, bi bilo to odli\u010dno.<\/p>\n<p><\/p>\n<p><em>\u017de je.<\/em><\/p>\n<p><\/p>\n<p>Dobro. Odprti smo za vse predloge. Haproxy je na seznamu, ki ga je treba urediti. Seznam opravil se \u0161iri, ne zmanj\u0161uje za zdaj. Ampak to je dobro, to pomeni, da je izdelek iskan.<\/p>\n<p>Izvor: <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.4 - 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\/sl\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\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\/sl\/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 v Kubernetes za upravljanje bazami podatkov. Vladislav Klimenko (Altinity, 2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sl\/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":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/96965","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=96965"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/96965\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/96966"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=96965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=96965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=96965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}