{"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\/no\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","title":{"rendered":"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/56e002c7408c4708e39ece867f84171e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Foredraget handler om praktiske sp\u00f8rsm\u00e5l knyttet til utviklingen av en operator i Kubernetes, design av dens arkitektur og grunnleggende prinsipper for funksjon.<\/p>\n<p><\/p>\n<p>I den f\u00f8rste delen av foredraget vil vi se p\u00e5:<\/p>\n<p><\/p>\n<ul>\n<li>hva en operator i Kubernetes er og hvorfor den er n\u00f8dvendig;<\/li>\n<li>hvordan operatoren forenkler administrasjonen av komplekse systemer;<\/li>\n<li>hva en operator kan gj\u00f8re og hva den ikke kan gj\u00f8re.<\/li>\n<\/ul>\n<p><\/p>\n<p>Deretter g\u00e5r vi videre til diskusjonen om den indre strukturen til operatoren. Vi vil se p\u00e5 arkitekturen og funksjonen til operatoren steg for steg. Vi vil g\u00e5 n\u00f8ye gjennom:<\/p>\n<p><\/p>\n<ul>\n<li>interaksjon mellom operatoren og Kubernetes;<\/li>\n<li>hvilke funksjoner operatoren tar p\u00e5 seg, og hva den delegerer til Kubernetes.<\/li>\n<\/ul>\n<p><\/p>\n<p>Vi vil se p\u00e5 forvaltning av shards og replikater av databaser i Kubernetes.<br \/>\nVidere vil vi diskutere dataoppbevaringssp\u00f8rsm\u00e5l:<\/p>\n<p><\/p>\n<ul>\n<li>hvordan jobbe med Persistent Storage fra operatorens perspektiv;<\/li>\n<li>feller ved bruk av Local Storage.<\/li>\n<\/ul>\n<p><\/p>\n<p>I den avsluttende delen av foredraget vil vi se p\u00e5 praktiske eksempler p\u00e5 anvendelse av <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">clickhouse-operator<\/a><\/noindex> med Amazon eller Google Cloud Service. Foredraget er bygget p\u00e5 utviklingen og erfaringen med \u00e5 drive en operator for 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=\"Spill 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>Mitt navn er \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e. I dag skulle jeg gjerne fortelle om v\u00e5r erfaring med utvikling og drift av operat\u00f8ren, som er en spesialisert operator for administrasjon av databaseklynger. Vi tar utgangspunkt i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">ClickHouse-operator<\/a><\/noindex> for \u00e5 administrere en ClickHouse-klynge.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cc297a3edb3b2a5e30d0dc2725de4011.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvorfor har vi muligheten til \u00e5 snakke om operatoren og ClickHouse?<\/p>\n<p><\/p>\n<ul>\n<li>Vi jobber med st\u00f8tte og utvikling av ClickHouse. <\/li>\n<li>For tiden pr\u00f8ver vi gradvis \u00e5 bidra s\u00e5 mye vi kan til utviklingen av ClickHouse. Vi er nummer to etter Yandex i volumet av endringer vi har gjort i ClickHouse. <\/li>\n<li>Vi pr\u00f8ver \u00e5 lage ekstra prosjekter for ClickHouse-\u00f8kosystemet. <\/li>\n<\/ul>\n<p><\/p>\n<p>Om et slikt prosjekt vil jeg gjerne fortelle. Det handler om ClickHouse-operatoren for Kubernetes. <\/p>\n<p><\/p>\n<p>I mitt foredrag vil jeg ber\u00f8re to temaer: <\/p>\n<p><\/p>\n<ul>\n<li>Det f\u00f8rste temaet er hvordan v\u00e5r operator fungerer for \u00e5 administrere ClickHouse databaser i Kubernetes. <\/li>\n<li>Det andre temaet er hvordan enhver operator fungerer, det vil si hvordan den interagerer med Kubernetes. <\/li>\n<\/ul>\n<p><\/p>\n<p>Disse to sp\u00f8rsm\u00e5lene vil krysse hverandre gjennom hele mitt foredrag. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4cc9790e18e70ae1ccde2cf39ef4ef00.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvem vil v\u00e6re interessert i \u00e5 h\u00f8re det jeg pr\u00f8ver \u00e5 fortelle?<\/p>\n<p><\/p>\n<ul>\n<li>Det vil v\u00e6re mest interessant for de som drifter operat\u00f8rer. <\/li>\n<li>Eller de som \u00f8nsker \u00e5 lage sin egen for \u00e5 forst\u00e5 hvordan det fungerer internt, hvordan operatoren interagerer med Kubernetes og hvilke feller som kan oppst\u00e5. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/07545f7a0171b610697c519d4aa9cd43.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>For a better understanding of what we will discuss today, it would be helpful to know how Kubernetes works and have a basic background in cloud technologies. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/eff56cc3e83fde3d3e64d73d41b07417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>What is ClickHouse? It is a column-oriented database designed for online analytical processing of queries. And it is completely open source. <\/p>\n<p><\/p>\n<p>And we need to know just two things. First, we must understand that this is a database, so what I will explain will apply to practically any database. And second, ClickHouse scales very well, providing almost linear scalability. Therefore, a cluster's state is a natural state for ClickHouse. Our main interest is to discuss how to maintain the ClickHouse cluster in Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5eb1ff5026c492117bf2467b10de7053.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Why is it needed there? Why can't we continue to operate it independently? The answers are partly technical and partly organizational. <\/p>\n<p><\/p>\n<ul>\n<li>In practice, we increasingly encounter situations where, in large companies, almost all components are already in Kubernetes. Databases remain outside. <\/li>\n<li>And the question is being asked more and more often: \"Can this be brought inside?\" Therefore, large companies strive for maximum standardization of management in order to quickly be able to manage their data stores. <\/li>\n<li>This is especially helpful if we need maximum repeatability in a new location, i.e., maximum portability.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/99312e74bd7ed4031128c7ec872f6a68.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>How simple or complex is it? Of course, it can be done manually. But it's not that simple, because we have the added complexity of managing Kubernetes itself, along with the specifics of ClickHouse. It results in such aggregation. <\/p>\n<p><\/p>\n<p>And all together, this creates a sufficiently large set of technologies that become quite challenging to manage, because Kubernetes brings its daily operational issues, while ClickHouse brings its own daily operational challenges. Especially if we have multiple ClickHouse instances that we need to constantly manage. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ca10b805b2744d1a5283f96b0ac1cc11.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse, with dynamic configuration, presents quite a number of issues that create a constant workload for DevOps:<\/p>\n<p><\/p>\n<ul>\n<li>When we want to change something in ClickHouse, for example, adding a replica or shard, we need to conduct configuration management. <\/li>\n<li>S\u00e5 m\u00e5 du endre dataskjemaet, fordi ClickHouse har en spesifikk m\u00e5te \u00e5 sharde data p\u00e5. Det er n\u00f8dvendig \u00e5 organisere dataskjemaet og konfigurasjonene. <\/li>\n<li>Monitoring m\u00e5 settes opp. <\/li>\n<li>Loggsamling for nye shard-er, for nye replikaer. <\/li>\n<li>Ta seg av gjenoppretting.<\/li>\n<li>Og omstart. <\/li>\n<\/ul>\n<p><\/p>\n<p>Dette er rutinearbeid som man veldig gjerne vil forenkle i driften.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2461e861ca1d2f2344ead9decf85a97e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kubernetes hjelper godt med driften, men p\u00e5 grunnleggende systemniv\u00e5. <\/p>\n<p><\/p>\n<p>Kubernetes letter og automatiserer blant annet slike ting som:<\/p>\n<p><\/p>\n<ul>\n<li>Gjenoppretting.<\/li>\n<li>Omstart. <\/li>\n<li>H\u00e5ndtering av lagringssystemet.<\/li>\n<\/ul>\n<p><\/p>\n<p>Det er bra, det er riktig retning, men det har overhodet ikke noen forst\u00e5else for hvordan man skal drifte en databasklynge. <\/p>\n<p><\/p>\n<p>Man \u00f8nsker mer, man vil at hele databasen skal fungere i Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6564e9f29d5d518925c8593bca978345.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Man \u00f8nsker \u00e5 ha noe som ligner en stor, magisk r\u00f8d knapp, som man kan trykke p\u00e5, og s\u00e5 rulles det ut og opprettholdes en klynge gjennom hele livssyklusen med daglige oppgaver som m\u00e5 l\u00f8ses. ClickHouse-klynge i Kubernetes.<\/p>\n<p><\/p>\n<p>Og vi har fors\u00f8kt \u00e5 lage en l\u00f8sning som ville gj\u00f8re arbeidet enklere. Dette er ClickHouse-operatoren for Kubernetes fra Altinity.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ff80c6fc59069ec900d545096ad978d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En operator er et program hvis hovedoppgave er \u00e5 administrere andre programmer, alts\u00e5 en forvalter. <\/p>\n<p><\/p>\n<p>Og det inneholder atferdsm\u00f8nstre. Man kan kalle dette kodifiserte kunnskaper om fagfeltet. <\/p>\n<p><\/p>\n<p>Og dens hovedoppgave er \u00e5 gj\u00f8re livet lettere for DevOps og redusere mikrostyring, slik at han (DevOps) kan tenke i h\u00f8yniv\u00e5termer, det vil si at han (DevOps) ikke trenger \u00e5 gj\u00f8re mikrostyring og manuelt konfigurere alle detaljer. <\/p>\n<p><\/p>\n<p>Og nettopp operatoren er en robotassistent som tar tak i mikrouppgaver og hjelper DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0824a1fa710e8c4f45406aa7f596b977.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvorfor trenger man en operator? Den viser seg spesielt godt i to sp\u00f8rsm\u00e5l:<\/p>\n<p><\/p>\n<ul>\n<li>N\u00e5r en spesialist som jobber med ClickHouse har utilstrekkelig erfaring, men man allerede m\u00e5 drifte ClickHouse, letter operatoren driften og gj\u00f8r det mulig \u00e5 administrere en ClickHouse-klynge med en relativt kompleks konfigurasjon, uten \u00e5 g\u00e5 for mye i detalj om hvordan alt fungerer innad. Man gir bare h\u00f8yniv\u00e5oppgaver, og s\u00e5 fungerer det. <\/li>\n<li>Og den andre oppgaven hvor han utmerker seg best, er n\u00e5r det er n\u00f8dvendig \u00e5 automatisere mange standardoppgaver. Han fjerner mikroadministrative oppgaver fra systemadministratorene. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f1cb11156d57f560d0b6c82700ac6ff8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dette er mest nyttig for de som nettopp begynner sin vei, eller for de som trenger \u00e5 jobbe mye med automatisering. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/128e7d9ff1ce0c535f98be66aedb1060.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hva er forskjellen mellom tiln\u00e6rmingen basert p\u00e5 operat\u00f8rer og andre systemer? Det finnes jo Helm. Det hjelper ogs\u00e5 med \u00e5 sette opp ClickHouse, man kan lage helm charts som til og med kan sette opp et helt ClickHouse-kluster. Hva er da forskjellen mellom operat\u00f8ren og for eksempel Helm?<\/p>\n<p><\/p>\n<p>Hovedforskjellen er at Helm er en pakkebehandling, mens operat\u00f8ren g\u00e5r videre. Det handler om \u00e5 f\u00f8lge hele livssyklusen. Det er ikke bare installasjon, men daglige oppgaver som inkluderer skalering, sharding, det vil si alt som m\u00e5 gj\u00f8res i l\u00f8pet av livssyklusen (hvis n\u00f8dvendig, ogs\u00e5 sletting) \u2013 alt dette h\u00e5ndterer operat\u00f8ren. Han pr\u00f8ver \u00e5 automatisere og vedlikeholde hele livssyklusen til programvaren. Dette er hans fundamentale skille fra andre l\u00f8sninger som er tilgjengelige. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e26b57c8caf8437f683d7afbfa127ebd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det var innledningen, la oss g\u00e5 videre. <\/p>\n<p><\/p>\n<p>Hvordan bygger vi v\u00e5r operat\u00f8r? Vi pr\u00f8ver \u00e5 tiln\u00e6rme oss sp\u00f8rsm\u00e5let om hvordan vi kan administrere et ClickHouse-kluster som en enkelt ressurs. <\/p>\n<p><\/p>\n<p>Her har vi i venstre del av bildet inngangsdataene. Dette er YAML med spesifikasjonen for klusteret, som p\u00e5 klassisk m\u00e5te blir overf\u00f8rt til Kubernetes via kubectl. Der tar operat\u00f8ren tak i dette, gj\u00f8r sin magi. Og ut ved de f\u00e5r vi et slikt skjema. Dette er implementeringen av ClickHouse i Kubernetes.<\/p>\n<p><\/p>\n<p>Og videre skal vi sakte se p\u00e5 hvordan operat\u00f8ren fungerer, hvilke standardoppgaver man kan l\u00f8se. Vi vil bare se p\u00e5 standardoppgaver, fordi vi har begrenset tid. Og ikke alt hva operat\u00f8ren kan l\u00f8se vil bli diskutert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b40401931b58988058419d4495dbb1bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss ta utgangspunkt i praksis. Prosjektet v\u00e5rt er helt open source, s\u00e5 man kan se p\u00e5 GitHub hvordan det fungerer. Og man kan ta utgangspunkt i at, hvis man bare \u00f8nsker \u00e5 starte, kan man begynne med Quick Start Guide.<\/p>\n<p><\/p>\n<p>Hvis man \u00f8nsker \u00e5 forst\u00e5 det i detalj, pr\u00f8ver vi \u00e5 opprettholde dokumentasjonen i en mer eller mindre anstendig tilstand. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9414d7c3aa94b6ad999e150f0ac25a97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss begynne med en praktisk oppgave. Den f\u00f8rste oppgaven, som vi alle \u00f8nsker \u00e5 starte med, er \u00e5 kj\u00f8re det f\u00f8rste eksemplet p\u00e5 en eller annen m\u00e5te. Hvordan kan vi starte ClickHouse ved hjelp av operat\u00f8ren, selv uten \u00e5 vite hvordan det fungerer? Vi skriver et manifest, ettersom all kommunikasjon med k8s skjer gjennom manifestene.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3e97cd235827460693ed95fb3598d31d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Her er et slikt komplisert manifest. Det som er uthevet i r\u00f8dt, er det vi m\u00e5 fokusere p\u00e5. Vi ber operat\u00f8ren om \u00e5 lage en klynge med navnet demo.<\/p>\n<p><\/p>\n<p>S\u00e5 langt er dette grunnleggende eksempler. Storage er enn\u00e5 ikke beskrevet, men vi kommer tilbake til storage senere. For n\u00e5 vil vi observere utviklingen av klyngen i dynamikk.<\/p>\n<p><\/p>\n<p>Vi har laget dette manifestet. Vi mater det inn til operat\u00f8ren v\u00e5r. Han jobbet, gjorde sin magi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/502e64fbe6ed7d04b2aecb7d51abc7f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi ser p\u00e5 konsollen. Tre komponenter vekker interesse \u2013 det er Pod, to tjenester, StatefulSet.<\/p>\n<p><\/p>\n<p>Operat\u00f8ren har jobbet og vi kan se hva han har opprettet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/67faf120e21e5113680ccff9c71b00f1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Han lager omtrent et slikt skjema. Vi har StatefulSet, Pod, ConfigMap for hver replikk, ConfigMap for hele klyngen. Tjenestene er n\u00f8dvendigvis som inngangspunkter til klyngen. <\/p>\n<p><\/p>\n<p>Tjenester \u2013 det er den sentrale Load Balancer-tjenesten, og det kan ogs\u00e5 v\u00e6re en for hver replikk, for hver shard. <\/p>\n<p><\/p>\n<p>Slik ser v\u00e5r grunnleggende klynge ut. Den best\u00e5r av \u00e9n enkelt node. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f235ada45ee58b517c0e041f795ae122.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss g\u00e5 videre, vi skal komplisere det. Klyngen m\u00e5 sharding.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/992836a00434c64fb4616c1c4cc4df97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V\u00e5re oppgaver vokser, dynamikken begynner. Vi \u00f8nsker \u00e5 legge til en shard. Vi f\u00f8lger med p\u00e5 utviklingen. Vi endrer spesifikasjonen v\u00e5r. Vi angir at vi \u00f8nsker to shards. <\/p>\n<p><\/p>\n<p>Dette er den samme filen som dynamisk utvikler seg med systemets vekst. Storage er ikke nevnt, det vil bli behandlet senere, dette er et eget tema.<\/p>\n<p><\/p>\n<p>Vi mater YAML-operat\u00f8ren og ser hva som skjer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8ddb5845cae160098470208f51b5da7c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Operat\u00f8ren tenkte og lagde f\u00f8lgende enheter. Vi har allerede to Pods, tre tjenester og, plutselig, to StatefulSets. Hvorfor to StatefulSets?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/26eb734ff1a195de2ceaab842b472ee4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00e5 skjemaet var det slik \u2013 dette er v\u00e5r opprinnelige tilstand, n\u00e5r vi hadde \u00e9n pod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/657838b0d378121fdd66ad3ff8168600.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det har blitt slik. S\u00e5 langt er alt enkelt, det er duplisert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f039a7046f1c56fbdad6b5a26a519b10.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og hvorfor har StatefulSet blitt to? Her m\u00e5 vi avbryte og diskutere hvordan pod-er styres i Kubernetes.<\/p>\n<p><\/p>\n<p>Det finnes et objekt kalt StatefulSet, som lar deg lage en gruppe Pod-er fra en mal. Her er den n\u00f8kkelfaktoren \u2013 det er malen. Og i ett StatefulSet kan du kj\u00f8re mange Pod-er med \u00e9n mal. Og den n\u00f8kkelfrasen her er 'mange Pod-er fra \u00e9n mal'.<\/p>\n<p><\/p>\n<p>Det var en stor fristelse \u00e5 lage hele klyngen i \u00e9n StatefulSet. Dette vil fungere, det er det ingen problemer med. Men det er ett problem. Hvis vi \u00f8nsker \u00e5 sette sammen en heterogen klynge, alts\u00e5 fra flere versjoner av ClickHouse, s\u00e5 begynner vi \u00e5 f\u00e5 sp\u00f8rsm\u00e5l. Ja, StatefulSet kan gj\u00f8re rolling update, ja, der kan man rulle ut en ny versjon og forklare at man m\u00e5 pr\u00f8ve ikke mer enn s\u00e5 mange noder samtidig.<\/p>\n<p><\/p>\n<p>Men hvis vi ekstrapolerer oppgaven og sier at vi vil lage en helt heterogen klynge, og at vi ikke vil gj\u00f8re en oppgradering fra gammel til ny versjon ved hjelp av rolling update, men rett og slett vil skape en heterogen klynge b\u00e5de n\u00e5r det gjelder forskjellige versjoner av ClickHouse og n\u00e5r det gjelder ulik lagring. For eksempel \u00f8nsker vi \u00e5 lage noen replikater p\u00e5 separate disker, p\u00e5 langsomme, generelt sett, bygg helt en heterogen klynge. Og fordi StatefulSet lager en standardisert l\u00f8sning fra \u00e9n mal, er det derfor ikke mulig \u00e5 gj\u00f8re det. <\/p>\n<p><\/p>\n<p>Etter litt ettertanke ble det besluttet at vi gj\u00f8r det slik. Hver replika har sin egen StatefulSet. Det er noen ulemper med denne l\u00f8sningen, men i praksis inkapsler dette alt operat\u00f8ren. Og det er mange fordeler. Vi kan bygge helt den klyngen vi \u00f8nsker, for eksempel helt heterogen. Derfor, i en klynge der vi har to shards med \u00e9n replika hver, vil vi ha 2 StatefulSet-er og 2 Pods nettopp fordi vi har valgt en s\u00e5dan tiln\u00e6rming av de nevnte grunnene for muligheten til \u00e5 bygge en heterogen klynge. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b7ae92a545f9bb6cc5f0136df87207f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss g\u00e5 tilbake til praktiske oppgaver. I v\u00e5r klynge m\u00e5 vi konfigurere brukere, alts\u00e5 m\u00e5 vi gj\u00f8re noe konfigurasjon av ClickHouse i Kubernetes. Operat\u00f8ren gir alle muligheter for dette. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6a65aa78293c0b40230cf24efc58e55a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi kan skrive direkte i YAML hva vi \u00f8nsker. Alle konfigurasjonsalternativer mappes direkte fra denne YAML til ClickHouse-konfigurasjoner, som deretter distribueres over hele klyngen.<\/p>\n<p><\/p>\n<p>Vi kan ogs\u00e5 skrive slik. Dette er et eksempel. Passordet kan gj\u00f8res kryptert. Absolutt alle konfigurasjonsalternativer for ClickHouse st\u00f8ttes. Her er det bare et eksempel. <\/p>\n<p><\/p>\n<p>Konfigurasjonen for klyngen distribueres som ConfigMap. I praksis skjer oppdatering av ConfigMap ikke umiddelbart, s\u00e5 hvis det er en stor klynge, tar det litt tid \u00e5 pushe konfigurasjonen. Men alt dette er veldig praktisk i drift.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2e42d19d7a558e3b8d4bbb51fe5bd08b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi kompliserer oppgaven. Klyngen utvikler seg. Vi \u00f8nsker \u00e5 replikere data. Det vil si at vi allerede har to shards, med en replika hver, og brukerne er satt opp. Vi vokser og \u00f8nsker \u00e5 jobbe med replikering.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c97e5e6ca9cb66d3a94fb8cfe610186.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hva trenger vi for replikering? <\/p>\n<p><\/p>\n<p>Vi trenger ZooKeeper. I ClickHouse er replikering bygget med bruk av ZooKeeper. ZooKeeper er n\u00f8dvendig for at de ulike replikaene av ClickHouse skal ha en konsensus om hvilke datablokker som finnes p\u00e5 hvilken ClickHouse. <\/p>\n<p><\/p>\n<p>Du kan bruke hvilken som helst ZooKeeper. Hvis det finnes en ekstern ZooKeeper hos bedriften, kan den brukes. Hvis ikke, kan man installere fra v\u00e5rt repository. Det finnes en installer som gj\u00f8r dette enklere. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6cc40951a19b982abf578836edf569d3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og interaksjonsskjemaet for hele systemet ser slik ut. Vi har Kubernetes som plattform. P\u00e5 den kj\u00f8rer ClickHouse-operat\u00f8ren. ZooKeeper er her representert. Operat\u00f8ren samhandler med b\u00e5de ClickHouse og ZooKeeper. Det vil si at det blir en interaksjon. <\/p>\n<p><\/p>\n<p>Og alt dette er n\u00f8dvendig for at ClickHouse skal replikere data vellykket i k8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4fc37aee850acd20517fa3d7562f0165.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss n\u00e5 se p\u00e5 selve oppgaven, hvordan manifestet for replikering vil se ut.<\/p>\n<p><\/p>\n<p>Vi legger til to seksjoner i manifestet v\u00e5rt. Den f\u00f8rste er hvor vi skal hente ZooKeeper, som kan v\u00e6re b\u00e5de internt i Kubernetes og ekstern. Dette er bare en beskrivelse. Og vi ber om replikene. Det vil si at vi \u00f8nsker to replikas. Totalt skal vi ha 4 pod'er. N\u00e5r det gjelder lagring, husker vi, det kommer litt senere. Lagring er en egen sang. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb8c974d0587a4ad87d6ba36bbe5e3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det var slik.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/909ffd258dbce718ddf529a1a753de6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det blir slik. Replikaene legges til. Den fjerde fikk ikke plass, men vi tror at det kan v\u00e6re mange der. Og ZooKeeper legges til p\u00e5 siden. Skjematikkene blir mer kompliserte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c33b37fc7fc72f51276e5e98b9ec2134.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og tiden har kommet for \u00e5 legge til neste oppgave. Vi skal legge til Persistent Storage. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f28d14901a713eca413a52ec6ea21ac5.jpeg\" style=\"display:block;margin: 0 auto;\" \/>N\u00e5r det gjelder Persistent Storage, har vi ulike implementasjonsalternativer.<\/p>\n<p><\/p>\n<p>I tilfelle vi kj\u00f8rer i en cloud-leverand\u00f8r, for eksempel Amazon eller Google, er det fristende \u00e5 bruke skytjenester for lagring. Det er veldig praktisk, det er bra. <\/p>\n<p><\/p>\n<p>Og det finnes et annet alternativ. Dette er for lokal lagring, n\u00e5r vi har lokale disker p\u00e5 hver node. Dette alternativet er mye mer komplekst \u00e5 implementere, men samtidig mer effektivt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/483ee5c08b62e987620bf54fd32a44b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss se p\u00e5 hva vi har med hensyn til cloud-lagring.<\/p>\n<p><\/p>\n<p>Det er fordeler. Det er veldig enkelt \u00e5 konfigurere. Vi ber bare sky-leverand\u00f8ren om \u00e5 gi oss lagring av en bestemt kapasitet, av en bestemt klasse. Klassene er beskrevet av leverand\u00f8rene selv. <\/p>\n<p><\/p>\n<p>Og det er en ulempe. For noen er dette en uvesentlig ulempe. Selvf\u00f8lgelig vil det v\u00e6re noen performance-overbelastninger. Det er veldig praktisk \u00e5 jobbe med, p\u00e5litelig, men det finnes noen potensielle ytelsesproblemer.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8e82430b64477f91640078ff4eacb47e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og siden ClickHouse fokuserer nettopp p\u00e5 ytelse, kan man til og med si at det trekker ut alt som er mulig, derfor pr\u00f8ver mange kunder \u00e5 f\u00e5 maksimalt ut av ytelsen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8638fe37b848a98ce8326218d368baa3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og for \u00e5 f\u00e5 maksimalt ut av det, trenger vi local storage.<\/p>\n<p><\/p>\n<p>Kubernetes tilbyr tre abstraksjoner for bruk av local storage i Kubernetes. Disse er: <\/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>La oss se p\u00e5 hvordan de skiller seg fra hverandre, og hva de har til felles. <\/p>\n<p><\/p>\n<p>For det f\u00f8rste, i alle tre tiln\u00e6rmingene har vi storage \u2013 lokale disker som ligger p\u00e5 den samme fysiske k8s noden. Men de har noen forskjeller.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79afb620a0c9a1552b47240b405fedc9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss begynne med det enkleste, det vil si med emptyDir. Hva er dette i praksis? Det er at vi ber systemet for containere (oftest er det Docker) om \u00e5 gi oss tilgang til en mappe p\u00e5 den lokale disken.<\/p>\n<p><\/p>\n<p>I praksis oppretter Docker et sted der borte med sine egne stier en midlertidig mappe, navn gitt som en lang hash. Og den gir tilgangsgrensesnitt til den. <\/p>\n<p><\/p>\n<p>Hvordan vil dette fungere med ytelsen? Dette vil fungere med hastigheten til den lokale disken, dvs. det er full tilgang til sin egen harddisk. <\/p>\n<p><\/p>\n<p>Men dette har en ulempe. Persistensen er ganske tvilsom. Ved den f\u00f8rste bevegelsen av Docker med containerne g\u00e5r persistensen tapt. Hvis Kubernetes av en eller annen grunn \u00f8nsker \u00e5 flytte denne Pod-en til en annen disk, vil dataene g\u00e5 tapt. <\/p>\n<p><\/p>\n<p>Denne tiln\u00e6rmingen er bra for tester, fordi den viser grei hastighet, men for noe seri\u00f8st er ikke dette alternativet passende. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0b60f80fc9ea0e2c1820021bcd9e1382.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Derfor er det en annen tiln\u00e6rming. Dette er hostPath. Hvis vi ser p\u00e5 det forrige lyset og dette, kan vi se \u00e9n eneste forskjell. Mappen v\u00e5r har g\u00e5tt fra Docker direkte til Kubernetes-noden. Her er det litt enklere. Vi skriver rett ut hvilken sti vi \u00f8nsker \u00e5 bruke p\u00e5 det lokale filsystemet for \u00e5 lagre v\u00e5re data. <\/p>\n<p><\/p>\n<p>Fordelene med denne metoden er reelle. Dette er allerede ekte persistering, og dessuten klassisk. Vi vil ha data lagret p\u00e5 disken et bestemt sted. <\/p>\n<p><\/p>\n<p>Det finnes ogs\u00e5 ulemper. Dette er kompleksiteten ved administrasjon. V\u00e5r Kubernetes kan \u00f8nske \u00e5 flytte en Pod til en annen fysisk node. Og da kommer DevOps inn i bildet. Han m\u00e5 forklare systemet korrekt at disse pod'ene bare kan flyttes til noder der du har noe montert p\u00e5 disse stiene, og ikke mer enn en node av gangen. Dette er ganske komplisert. <\/p>\n<p><\/p>\n<p>Spesielt for disse form\u00e5lene har vi laget maler for \u00e5 skjule all denne kompleksiteten. Man kunne enkelt si: \u00abJeg \u00f8nsker at det skal v\u00e6re \u00e9n instans av ClickHouse p\u00e5 hver fysisk node og p\u00e5 denne stien\u00bb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f64c19bccc8b187d6af112eda896b25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men dette behovet gjelder ikke bare oss, derfor forst\u00e5r gutta i Kubernetes ogs\u00e5 at folk \u00f8nsker tilgang til fysiske disker, s\u00e5 de tilbyr et tredje niv\u00e5.<\/p>\n<p><\/p>\n<p>Det kalles lokal. Forskjellen fra forrige lysbilde er praktisk talt ingen. Tidligere m\u00e5tte man gj\u00f8re det manuelt, at pod'ene ikke kan flyttes fra node til node fordi de m\u00e5 v\u00e6re festet til en bestemt sti til en lokal fysisk disk, men n\u00e5 er all denne kunnskapen innkapslet i Kubernetes selv. Og det blir mye enklere \u00e5 konfigurere.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/140c43be34dd7015c0bf4cfd0a0bb384.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss g\u00e5 tilbake til v\u00e5r praktiske oppgave. La oss g\u00e5 tilbake til YAML-malen. Her har vi f\u00e5tt en ekte lagring. Vi har kommet tilbake til dette. Vi definerer en klassisk VolumeClaim-mal som i k8s. Og beskriver hvilken lagring vi \u00f8nsker.<\/p>\n<p><\/p>\n<p>Etter dette vil k8s be om lagring. Den vil tildele oss det i StatefulSet. Og til slutt vil det bli tilgjengelig for ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/960e666486ed09cebd83235d43f83970.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi hadde et slikt skjema. V\u00e5r Persistent Storage var r\u00f8d, noe som antydet at det burde gj\u00f8res noe med det. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a989df489e3a9fef6a4fbf7b93c489a6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og det blir gr\u00f8nt. N\u00e5 er skjemaet for ClickHouse-klyngen p\u00e5 k8s helt ferdigstilt. Vi har shard, replikaer, ZooKeeper, og det er ekte Persistent, som er implementert p\u00e5 en eller annen m\u00e5te. Skjemaet er allerede helt operativt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c409ee5da6309a67904394d968ed4906.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi fortsetter \u00e5 leve videre. Klyngen v\u00e5r utvikler seg. Og Alexey jobber hardt og slipper en ny versjon av ClickHouse.<\/p>\n<p><\/p>\n<p>Det oppst\u00e5r en praktisk oppgave \u2013 \u00e5 teste den nye versjonen av ClickHouse p\u00e5 v\u00e5r klynge. Og selvf\u00f8lgelig \u00f8nsker vi ikke \u00e5 rulle den ut helt, vi \u00f8nsker \u00e5 sette en ny versjon i et hj\u00f8rne, og kanskje ikke bare \u00e9n ny versjon, men to samtidig, fordi de lanseres ganske ofte. <\/p>\n<p><\/p>\n<p>Hva kan vi si om dette?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48ed52d393d977d0cfaa9320bd02ed1e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Her har vi nettopp en slik mulighet. Dette er maler for pod\u2019er. Man kan spesifisere, v\u00e5r operator lar oss fullt ut bygge et heterogent kluster. Dvs. konfigurere, fra alle replikene sammen, til hver enkelt replik som hvilken versjon av ClickHouse vi \u00f8nsker, hvilken versjon av lagring vi \u00f8nsker. Vi kan fullstendig konfigurere klusteret i den konfigurasjonen vi trenger. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4949ecd8119cb4ec0f4bad9bf27fa74e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi skal dykke litt dypere. F\u00f8r dette snakket vi om hvordan ClickHouse-operatoren fungerer spesifikt for ClickHouse.<\/p>\n<p><\/p>\n<p>N\u00e5 vil jeg gjerne si noen ord om hvordan hvilken som helst operator fungerer, samt hvordan den interagerer med K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ca9c2a23c54b2a81ac0a8bba88d5e65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss f\u00f8rst se p\u00e5 interaksjonen med K8s. Hva skjer n\u00e5r vi kj\u00f8rer kubectl apply? V\u00e5re objekter dukker opp i etcd via API. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b9eaedeb0f34d10398ba0187f09fef9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>For eksempel de grunnleggende Kubernetes-objektene: pod, StatefulSet, service og s\u00e5 videre. <\/p>\n<p><\/p>\n<p>Samtidig skjer det ingen fysiske endringer enn\u00e5. Disse objektene m\u00e5 materialiseres i klusteret. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3c49dc1b0067347d5fc415ef9b87642d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>For dette dukker det opp en kontroller. Kontrolleren er en spesialkomponent i k8s, som kan materialisere disse beskrivelsene. Den vet hva som m\u00e5 gj\u00f8res fysisk. Den vet hvordan man starter containere, hva som m\u00e5 settes opp for at serveren skal fungere. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d951eb0f7bacf519566b0ef6cf9bc100.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og den materialiserer v\u00e5re objekter i K8s.<\/p>\n<p><\/p>\n<p>Men vi \u00f8nsker \u00e5 operere ikke bare med pod\u2019er, StatefulSet\u2019er, vi \u00f8nsker \u00e5 opprette ClickHouseInstallation, alts\u00e5 et objekt av typen ClickHouse, s\u00e5 vi kan operere med det som en helhet. Forel\u00f8pig finnes det ikke en slik mulighet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1594921ac5dd9384ce81ceae92f5cda9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men K8s har en annen nyttig funksjon. Vi \u00f8nsker at det skal oppst\u00e5 en slik kompleks enhet, der v\u00e5rt kluster er samlet fra pod\u2019er og StatefulSet\u2019er. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/04f86706f506fa91e365d45537dd9def.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hva m\u00e5 vi gj\u00f8re for dette? F\u00f8rst og fremst kommer Custom Resource Definition inn p\u00e5 scenen. Hva er dette? Dette er en beskrivelse for K8s, som sier at du vil ha en annen datatyper, at vi \u00f8nsker \u00e5 legge til en tilpasset ressurs til pod, StatefulSet, som vil v\u00e6re kompleks innvendig. Dette er beskrivelsen av dataskrukturen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f02ae12ef3ab5db974234b14e38792ac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi sender det ogs\u00e5 dit via kubectl apply. Kubernetes tok det med glede. <\/p>\n<p><\/p>\n<p>Og n\u00e5 har vi i lagringen, for objektet i etcd, muligheten til \u00e5 registrere den tilpassede ressursen med navnet ClickHouseInstallation.<\/p>\n<p><\/p>\n<p>Men inntil videre skjer det ikke noe mer. Det vil si, hvis vi n\u00e5 lager en YAML-fil som vi har diskutert med beskrivelse av shards, replikaer, og sier \u00abkubectl apply\u00bb, s\u00e5 vil Kubernetes godta den, lagre den i etcd og si: \u00abFlott, men hva skal jeg gj\u00f8re med den? Jeg vet ikke hvordan jeg skal h\u00e5ndtere ClickHouseInstallation\u00bb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7c2f9f3f81b83c987a3bd72a881d0d91.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Derfor trenger vi noen som kan hjelpe Kubernetes med \u00e5 h\u00e5ndtere en ny type data. Til venstre har vi den innebygde Kubernetes-kontrolleren som arbeider med innebygde datatyper. Og til h\u00f8yre m\u00e5 vi ha en egendefinert kontroller som kan arbeide med egendefinerte datatyper. <\/p>\n<p><\/p>\n<p>Og den kalles ogs\u00e5 en operator. Jeg har spesifikt plassert den utenfor Kubernetes her, fordi den kan kj\u00f8re ogs\u00e5 utenfor K8s. Ofte kj\u00f8rer selvf\u00f8lgelig alle operatorene i Kubernetes, men ingenting hindrer den fra \u00e5 st\u00e5 utenfor, s\u00e5 derfor er den spesifikt plassert utenfor. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7aa3a1b67d0def5ba752dff56baeebbf.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Den egendefinerte kontrolleren, som er operat\u00f8ren, interagerer med Kubernetes via API. Den vet allerede hvordan den skal interagere med API-en. Og den vet allerede hvordan man kan materialisere den komplekse strukturen fra den egendefinerte ressursen som vi \u00f8nsker. Det er nettopp dette operat\u00f8ren gj\u00f8r. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a5f773ddc3663f24d5379955da9c3037.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvordan fungerer operat\u00f8ren? La oss se til h\u00f8yre for \u00e5 finne ut hvordan den gj\u00f8r dette. Vi vil finne ut hvordan operat\u00f8ren materialiserer alt dette, og hvordan interaksjonen med K8s fortsetter.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/08a8d8dbcb35117a0eb3320589c6ff8d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En operat\u00f8r er et program. Den er hendelsesdrevet. Operat\u00f8ren abonnerer p\u00e5 hendelser ved hjelp av Kubernetes API. I Kubernetes API finnes det tilgangspunkter hvor man kan abonnere p\u00e5 hendelser. Og hvis noe endres i K8s, s\u00e5 sender Kubernetes hendelser til alle som \u00f8nsker det, det vil si, de som abonnerte p\u00e5 dette API-punktet vil motta varsler.<\/p>\n<p><\/p>\n<p>Operat\u00f8ren abonnerer p\u00e5 hendelser og m\u00e5 reagere p\u00e5 dem. Dens oppgave er \u00e5 reagere p\u00e5 de nye hendelsene som dukker opp. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f0664a4151e6e7f6f8575a3e54372e9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hendelsene genereres av oppdateringer. V\u00e5r YAML-fil med beskrivelsen av ClickHouseInstallation kommer inn. Den g\u00e5r gjennom kubectl apply til etcd. Der trer det inn en hendelse, og denne hendelsen kommer til ClickHouse-operat\u00f8ren. Operat\u00f8ren mottar denne beskrivelsen. Og den m\u00e5 gj\u00f8re noe. Hvis det kommer en oppdatering p\u00e5 ClickHouseInstallation-objektet, s\u00e5 m\u00e5 klusteret oppdateres. Og operat\u00f8rens oppgave er \u00e5 oppdatere klusteret. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0952bdd391a72aa15bf66af4ce69f4af.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hva gj\u00f8r han? For det f\u00f8rste m\u00e5 vi lage en handlingsplan for hva vi skal gj\u00f8re med denne oppdateringen. Oppdateringer kan v\u00e6re veldig sm\u00e5, dvs. sm\u00e5 i YAML-implementeringen, men kan f\u00f8re til store endringer i klusteret. Derfor lager operat\u00f8ren en plan, og s\u00e5 f\u00f8lger han den.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79caaa43b6fd9f3e2eb1afe44ecb2df9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Han begynner i henhold til denne planen \u00e5 lage strukturen internt for \u00e5 materialisere podder, tjenester, dvs. gj\u00f8re det som er hans hovedoppgave. Det er som \u00e5 bygge et ClickHouse-kluster i Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e91576a26d6b758a68ae0b35cbe01897.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss n\u00e5 se p\u00e5 noe interessant. Dette er ansvarsdelingen mellom Kubernetes og operat\u00f8ren, dvs. hva Kubernetes gj\u00f8r, hva operat\u00f8ren gj\u00f8r og hvordan de samhandler. <\/p>\n<p><\/p>\n<p>Kubernetes h\u00e5ndterer systemrelaterte ting, dvs. den grunnleggende sett med objekter som kan tolkes som systemomfang. Kubernetes vet hvordan man kj\u00f8rer podder, hvordan man restart containerne, hvordan man monterer volumer, hvordan man arbeider med ConfigMap, dvs. alt som kan kalles systemet. <\/p>\n<p><\/p>\n<p>Operat\u00f8rer opererer innenfor spesifikke domener. Hver operat\u00f8r er laget for sitt spesifikke domene. Vi har laget for ClickHouse.<\/p>\n<p><\/p>\n<p>Og operat\u00f8ren samhandler nettopp i termer av det spesifikke domenet, som \u00e5 legge til en replika, lage et skjema, sette opp overv\u00e5kning. Det blir en slik inndeling.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9dc07d9c29d5dfd538343aadb751e4c0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss se p\u00e5 et praktisk eksempel p\u00e5 hvordan denne ansvarsdelingen skjer n\u00e5r vi utf\u00f8rer oppgaven med \u00e5 legge til en replika. <\/p>\n<p><\/p>\n<p>Operat\u00f8ren f\u00e5r i oppgave \u2013 \u00e5 legge til en replika. Hva gj\u00f8r operat\u00f8ren? Operat\u00f8ren beregner at det m\u00e5 lages en ny StatefulSet, hvor vi m\u00e5 beskrive bestemte maler, volumkrav. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7a31f2f76a3bdda87e4bccf0e04fe4a8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Han forbereder alt dette og sender det videre til K8s. Han sier at han trenger ConfigMap, StatefulSet, Volum. Kubernetes utf\u00f8rer oppgaven. Han materialiserer de grunnleggende enhetene som han opererer med. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2be6892234cc12b056962265c13dba07.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og s\u00e5 kommer ClickHouse-operat\u00f8ren inn i bildet igjen. Han har allerede en fysisk pod, hvor det kan gj\u00f8res noe. Og ClickHouse-operat\u00f8ren jobber igjen i termer av det spesifikke domenet. For \u00e5 aktivere en replika i klusteret m\u00e5 ClickHouse, for det f\u00f8rste, konfigurere datamodellen som finnes i dette klusteret. Og for det andre, m\u00e5 denne replikas overv\u00e5king settes opp slik at den kan spores godt. Det er operat\u00f8ren som konfigurerer dette. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/790616342b98b347fa67e0100754c8b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og f\u00f8rst etter dette kommer ClickHouse inn i bildet, det vil si en annen mer avansert enhet. Dette er allerede en database. Den har sin egen instans, en ny konfigurasjon av replikasjonen, klar til \u00e5 bli med i klyngen.<\/p>\n<p><\/p>\n<p>Dermed blir kjeden av utf\u00f8relse og ansvarsfordeling ved tillegging av replikas ganske lang.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ec79cfa2b45fadbe25f4d9fe8d2ec5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss fortsette med v\u00e5re praktiske oppgaver. Hvis klyngen allerede eksisterer, kan vi utf\u00f8re migrering av konfigurasjonen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a52aee0d4350b8da00cdb4b525df80ad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi har gjort det slik at vi kan legge inn data i den eksisterende XML-filen som ClickHouse forst\u00e5r.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/91abb1d3b0a14f2118361403a74e14c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det er mulig \u00e5 gj\u00f8re en finjustering av ClickHouse. Nettopp zoned deployment \u2013 det er hva jeg snakket om da jeg forklarte hostPath, lokal lagring. Det handler om hvordan man gj\u00f8r zoned deployment riktig.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fde502f30223e04a918f4fd598c3dd9f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Neste praktiske oppgave er overv\u00e5king.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4e685fba7883075105c0164a778c51e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvis klyngen v\u00e5r endres, m\u00e5 overv\u00e5kingen justeres regelmessig. <\/p>\n<p><\/p>\n<p>La oss se p\u00e5 diagrammet. Vi har allerede vurdert de gr\u00f8nne pilene. N\u00e5 la oss se p\u00e5 de r\u00f8de pilene. Dette viser hvordan vi \u00f8nsker \u00e5 overv\u00e5ke klyngen v\u00e5r. Hvordan metrikker fra ClickHouse-klyngen kommer inn i Prometheus og deretter til Grafana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1210c1423f99d48a20e06e855bf48a72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hva er utfordringen med overv\u00e5king? Hvorfor betraktes det som en prestasjon? Utfordringen ligger nettopp i dynamikken. N\u00e5r vi har \u00e9n klynge som er statisk, kan vi sette opp overv\u00e5kingen \u00e9n gang og s\u00e5 glemme den.<\/p>\n<p><\/p>\n<p>Men hvis vi har mange klynger, eller hvis noe stadig endres, er prosessen dynamisk. Og \u00e5 stadig m\u00e5tte justere overv\u00e5kingen er en ressurs- og tidskrevende oppgave, det vil si selv det krever litt latskap. Dette m\u00e5 automatiseres. Utfordringen ligger nettopp i prosessens dynamikk. Og operat\u00f8ren automatiserer dette veldig godt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48a7264f1228671e0c483c8211a71eb3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvordan har klyngen v\u00e5r utviklet seg? I begynnelsen var den slik.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8a8c7b6cd5562deb315368e1e8e1c976.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u00e5 var den slik.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1a3e915fbadf3aa5f3b33d337f36e76e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Til slutt ble den slik. <\/p>\n<p><\/p>\n<p>Og overv\u00e5kingen gj\u00f8res automatisk av operat\u00f8ren. En inngangspunkt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e079e65bf8deff43a81d8ffde938a709.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og vi ser bare p\u00e5 utgangen i Grafana-dashbordet, hvordan livet i klyngen v\u00e5r pulserer. <\/p>\n<p><\/p>\n<p>For \u00f8vrig blir Grafana-dashbordet ogs\u00e5 distribuert med operat\u00f8ren v\u00e5r rett fra kildekoden. Det er mulig \u00e5 koble til og bruke. Dette skjermbildet fikk jeg fra v\u00e5r DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ad1c2899dd845d0ba4185bdf758468c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvor \u00f8nsker vi \u00e5 g\u00e5 videre? Det er:<\/p>\n<p><\/p>\n<ul>\n<li>\u00c5 utvikle automatisering av testing. Hovedoppgaven er automatisk testing av nye versjoner. <\/li>\n<li>Vi \u00f8nsker ogs\u00e5 \u00e5 automatisere integrasjonen med ZooKeeper. Planene inkluderer integrasjon med ZooKeeper-operatoren. Det vil si at det er skrevet en operator for ZooKeeper, og det er logisk at de to operat\u00f8rene b\u00f8r begynne \u00e5 integreres for \u00e5 bygge en mer brukervennlig l\u00f8sning. <\/li>\n<li>Vi \u00f8nsker \u00e5 gj\u00f8re mer avanserte livssykluskontroller. <\/li>\n<li>Jeg har markert gr\u00f8nt det som er i anmarsj: arven fra Templates \u2013 FERTIG, det vil si at med neste utgivelse av operat\u00f8ren vil vi allerede ha arving av maler. Dette er et kraftig verkt\u00f8y som lar oss bygge komplekse konfigurasjoner fra biter. <\/li>\n<li>Og vi \u00f8nsker automatisering av komplekse oppgaver. Den viktigste av disse er Re-sharding. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f232c0aab389be5069e5c7886e265c01.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La oss oppsummere s\u00e5 langt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/62f7814994af0441ba5a82de4e9780d7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hva f\u00e5r vi ut av dette? Og er det verdt innsatsen eller ikke? Skulle vi i det hele tatt pr\u00f8ve \u00e5 integrere databasen i Kubernetes og bruke operat\u00f8ren generelt og Alitnity-operat\u00f8ren spesielt?<\/p>\n<p><\/p>\n<p>Utgangen blir:<\/p>\n<p><\/p>\n<ul>\n<li>Betydelig forenkling og automatisering av konfigurasjon, distribusjon og vedlikehold. <\/li>\n<li>Umiddelbart innebygd overv\u00e5king. <\/li>\n<li>Og klare, kodifiserte maler for komplekse situasjoner. Det er ikke lenger n\u00f8dvendig \u00e5 legge til en replika manuelt. Dette gj\u00f8res av operat\u00f8ren. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/aebccd7a2dc55f14645f79f89f7b7458.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det er bare ett sp\u00f8rsm\u00e5l igjen. Vi har allerede databasen i Kubernetes, virtualisering. Hvordan st\u00e5r det til med ytelsen til en slik l\u00f8sning, spesielt med tanke p\u00e5 at ClickHouse er optimalisert for ytelse?<\/p>\n<p><\/p>\n<p>Svaret er \u2013 alt er i orden! Jeg vil ikke g\u00e5 inn p\u00e5 detaljene, dette er et eget tema for en presentasjon. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ffc230941f0ae24926186db4d8d68ade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men det finnes et prosjekt som heter TSBS. Hva er hovedoppgaven? Det er en ytelsestesting av databaser. Det er et fors\u00f8k p\u00e5 \u00e5 sammenligne varme med varme, myk med myk. <\/p>\n<p><\/p>\n<p>Hvordan fungerer det? Det genereres et datasett. Deretter kj\u00f8res dette datasettet gjennom et identisk sett med tester p\u00e5 forskjellige databaser. Hver database l\u00f8ser en oppgave p\u00e5 sitt eget m\u00e5te. Deretter kan man sammenligne resultatene. <\/p>\n<p><\/p>\n<p>Det st\u00f8tter allerede mange databaser. Jeg har markert tre hovedtyper. Disse er:<\/p>\n<p><\/p>\n<ul>\n<li>TimescaleDB.<\/li>\n<li>InfluxDB.<\/li>\n<li>ClickHouse.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5b4733534a4e6e36fb7788127adc6e86.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det ble ogs\u00e5 gjort en sammenligning med en annen lignende l\u00f8sning. Sammenligningen med RedShift. Sammenligningen ble gjort p\u00e5 Amazon. ClickHouse overg\u00e5r ogs\u00e5 alle i denne sammenhengen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/44cc8dedc07a02fe1ed5aad3e17a579c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvilke konklusjoner kan vi trekke fra det jeg har fortalt?<\/p>\n<p><\/p>\n<ul>\n<li>DB i Kubernetes er mulig. Kanskje alle kan v\u00e6re det, men generelt ser det ut til at det er mulig. ClickHouse i Kubernetes er absolutt mulig med hjelp fra v\u00e5r operator. <\/li>\n<li>Operatoren hjelper med \u00e5 automatisere prosesser og gj\u00f8r livet enklere.<\/li>\n<li>Ytelsen er normal.<\/li>\n<li>Og vi mener at dette kan og b\u00f8r brukes. <\/li>\n<\/ul>\n<p><\/p>\n<p>Open source \u2013 bli med!<\/p>\n<p><\/p>\n<p>Som jeg allerede har sagt, er operatoren et helt open source produkt, s\u00e5 det ville v\u00e6rt veldig bra om s\u00e5 mange som mulig bruker det. Bli med! Vi venter p\u00e5 dere alle!<\/p>\n<p><\/p>\n<p>Takk til alle!<\/p>\n<p><\/p>\n<p>Sp\u00f8rsm\u00e5l<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes for \u00e5 administrere DB-klynger. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4afe8b10c4f103c2a9a295511e4eb69a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Takk for presentasjonen! Jeg heter Anton. Jeg er fra SEMrush. Jeg er interessert i logging. Vi h\u00f8rer om overv\u00e5king, men ingenting om logging n\u00e5r vi snakker om hele klyngen. Vi har for eksempel satt opp en klynge p\u00e5 eget utstyr. Og vi bruker sentralisert logging, samler med standardverkt\u00f8y i en felles logg, og deretter henter vi ut interessante data.<\/em> <\/p>\n<p><\/p>\n<p>Godt sp\u00f8rsm\u00e5l, alts\u00e5 logging st\u00e5r p\u00e5 todo-listen. V\u00e5r operator automatiserer ikke dette for \u00f8yeblikket. Den er fortsatt under utvikling, prosjektet er fortsatt relativt ungt. Vi forst\u00e5r n\u00f8dvendigheten av logging. Dette er ogs\u00e5 et veldig viktig tema. Og det er kanskje ikke mindre viktig enn overv\u00e5king. Men det f\u00f8rste p\u00e5 listen for implementering var overv\u00e5king. Logging vil komme. Vi gj\u00f8r selvf\u00f8lgelig v\u00e5rt beste for \u00e5 automatisere alle aspekter av klyngens livssyklus. S\u00e5 svaret er \u2013 i \u00f8yeblikket kan ikke operatoren dette, men det er p\u00e5 planen, og vi vil gj\u00f8re det. Hvis noen har lyst til \u00e5 bidra, s\u00e5 send inn en pull request, v\u00e6r s\u00e5 snill.<\/p>\n<p><\/p>\n<p><em>Hei! Takk for presentasjonen! Jeg har et standardsp\u00f8rsm\u00e5l knyttet til Persistent Volumes. N\u00e5r vi oppretter en konfigurasjon med denne operatoren, hvordan bestemmer operatoren hvilken node vi har montert en disk eller mappe p\u00e5? M\u00e5 vi p\u00e5 forh\u00e5nd forklare at vi \u00f8nsker \u00e5 plassere v\u00e5r ClickHouse nettopp p\u00e5 de nodene der det finnes disk?<\/em><\/p>\n<p><\/p>\n<p>S\u00e5 vidt jeg forst\u00e5r, er dette sp\u00f8rsm\u00e5let en fortsettelse av lokal lagring, spesielt delen som gjelder hostPath. Det er som \u00e5 forklare hele systemet at pod'en m\u00e5 kj\u00f8re p\u00e5 en spesifikk node hvor vi har en fysisk tilkoblet disk som er montert p\u00e5 en spesifikk sti. Dette er en hel seksjon som jeg ber\u00f8rte veldig overfladisk fordi svaret er ganske omfattende. <\/p>\n<p><\/p>\n<p>Kort sagt ser det slik ut. Vi m\u00e5 selvf\u00f8lgelig gj\u00f8re provisioning av disse volumene. Per n\u00e5 finnes det ingen dynamisk provisioning i local storage, s\u00e5 DevOps m\u00e5 selv opprette diskene, disse volumene. De m\u00e5 forklare Kubernetes provisioning at du vil ha Persistent volumes av en bestemt klasse, som ligger p\u00e5 bestemte noder. Deretter m\u00e5 de forklare Kubernetes at pod'er som krever en bestemt klasse local storage, kun skal planlegges p\u00e5 de bestemte nodene basert p\u00e5 labels. For dette form\u00e5let har operat\u00f8ren muligheten til \u00e5 tildele en bestemt label og en per host-instans. Dermed vil pod'ene bli rutet av Kubernetes for \u00e5 kj\u00f8re kun p\u00e5 noder som oppfyller kravene, labels, for \u00e5 si det enkelt. Administratorene tildeler labels og gj\u00f8r provisioning av diskene manuelt. Og s\u00e5 kan det skaleres.<\/p>\n<p><\/p>\n<p>Og nettopp det tredje alternativet for local storage hjelper litt med dette. Som jeg allerede har p\u00e5pekt, er det et tidkrevende arbeid med konfigurasjon som ved sluttresultatet hjelper \u00e5 oppn\u00e5 maksimal ytelse.<\/p>\n<p><\/p>\n<p><em>Jeg har et annet sp\u00f8rsm\u00e5l relatert til dette. Kubernetes var tenkt slik at vi ikke bryr oss om vi mister en node eller ikke. Hva gj\u00f8r vi i dette tilfellet hvis vi mister noden der shard'en v\u00e5r ligger?<\/em><\/p>\n<p><\/p>\n<p>Ja, Kubernetes ble opprinnelig posisjonert p\u00e5 den m\u00e5ten at vi behandler v\u00e5re pod'er som storfe, mens her blir hver disk noe som ligner p\u00e5 et kj\u00e6ledyr. Det er et problem at vi ikke bare kan kaste dem bort. Utviklingen av Kubernetes g\u00e5r i retning av at vi ikke kan forholde oss helt filosofisk til dette, som til helt avhendte ressurser.<\/p>\n<p><\/p>\n<p>N\u00e5 et praktisk sp\u00f8rsm\u00e5l. Hva gj\u00f8r du hvis du har mistet en node der disken var? Dette problemet l\u00f8ses allerede p\u00e5 et h\u00f8yere niv\u00e5. I tilfellet med ClickHouse har vi replikater som fungerer p\u00e5 et h\u00f8yere niv\u00e5, dvs. p\u00e5 ClickHouse-niv\u00e5.<\/p>\n<p><\/p>\n<p>Hva blir s\u00e5 disposisjonen? Det er DevOps som har ansvaret for at dataene ikke g\u00e5r tapt. Han m\u00e5 korrekt konfigurere replikasjonen og s\u00f8rge for at replikasjonen utf\u00f8res. Dataene m\u00e5 v\u00e6re duplisert i replikene p\u00e5 ClickHouse-niv\u00e5. Dette er ikke en oppgave som operat\u00f8ren l\u00f8ser. Og det er ikke en oppgave som Kubernetes selv l\u00f8ser. Det er p\u00e5 ClickHouse-niv\u00e5.<\/p>\n<p><\/p>\n<p>Hva skal man gj\u00f8re hvis den fysiske noden din faller av? Det viser seg at du m\u00e5 sette opp en ny, riktig provisjonere en disk, og p\u00e5f\u00f8re etiketter. Etter dette vil den oppfylle kravene om at Kubernetes kan starte en instans av en pod p\u00e5 den. Kubernetes vil starte den. Antall pod-er dine er jo ikke tilstrekkelig i henhold til spesifikasjonene. Den vil g\u00e5 gjennom syklusen som jeg viste. Og p\u00e5 det \u00f8verste niv\u00e5et for ClickHouse vil det forst\u00e5 at v\u00e5r replika er kommet inn, den er fortsatt tom, og vi m\u00e5 begynne \u00e5 overf\u00f8re data til den. Det vil si at denne prosessen fortsatt er lite automatisert. <\/p>\n<p><\/p>\n<p><em>Takk for foredraget! N\u00e5r det skjer uventede hendelser, faller operat\u00f8ren og starter p\u00e5 nytt, mens hendelser inntreffer, hvordan h\u00e5ndterer dere dette?<\/em><\/p>\n<p><\/p>\n<p>Hva skjer hvis operat\u00f8ren faller og starter p\u00e5 nytt, ikke sant? <\/p>\n<p><\/p>\n<p><em>Ja. Og i dette \u00f8yeblikket kom det hendelser.<\/em> <\/p>\n<p><\/p>\n<p>Oppgaven om hva man skal gj\u00f8re i dette tilfellet deles delvis mellom operat\u00f8ren og Kubernetes. Kubernetes har muligheten til \u00e5 spille av den skjede hendelsen. Den spiller av. Og det er oppgaven til operat\u00f8ren \u00e5 s\u00f8rge for at n\u00e5r hendelsene blir spilt p\u00e5 nytt, s\u00e5 er disse hendelsene idempotente. Og at en gjentatt inntreden av den samme hendelsen ikke bryter systemet v\u00e5rt. Og v\u00e5r operat\u00f8r h\u00e5ndterer denne oppgaven. <\/p>\n<p><\/p>\n<p><em>Hei! Takk for foredraget! Dmitrij Zavyalov, selskapet<\/em> <em>Smedova. Er det planlagt \u00e5 legge til muligheten for \u00e5 konfigurere med haproxy i operat\u00f8ren? Det ville v\u00e6rt interessant med en annen balanseh\u00e5ndterer enn standarden, slik at den er smart og forst\u00e5r hva ClickHouse faktisk er.<\/em> <\/p>\n<p><\/p>\n<p>Snakker du om Ingress?<\/p>\n<p><\/p>\n<p><em>Ja, \u00e5 erstatte Ingress med haproxy. I haproxy kan man spesifisere topologien til klyngen, hvor replikene befinner seg.<\/em><\/p>\n<p><\/p>\n<p>Forel\u00f8pig har vi ikke tenkt p\u00e5 dette. Hvis dette er n\u00f8dvendig for deg og du kan forklare hvorfor det er n\u00f8dvendig, kan det realiseres, spesielt hvis du \u00f8nsker \u00e5 delta. Vi vurderer det gjerne. Kort svar \u2013 nei, vi har ikke denne funksjonaliteten for \u00f8yeblikket. Takk for innspill, vi vil se p\u00e5 det. Og hvis du ogs\u00e5 forklarer bruksomr\u00e5det og hvorfor det er n\u00f8dvendig i praksis, for eksempel ved \u00e5 opprette issues p\u00e5 GitHub, vil det v\u00e6re flott.<\/p>\n<p><\/p>\n<p><em>Det er allerede gjort.<\/em><\/p>\n<p><\/p>\n<p>Bra. Vi er \u00e5pne for alle forslag. Og haproxy legges til todo-listen. Todo-listen vokser, ikke minker enn\u00e5. Men det er bra, det betyr at produktet er etterspurt.<\/p>\n<p>Kilde: <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.5 - 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\/no\/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.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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\udd47Kubernetes-operator for managing database clusters. Vladislav Klimenko (Altinity, 2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/no\/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":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/96965","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=96965"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/96965\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/96966"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=96965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=96965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=96965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}