{"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\/da\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","title":{"rendered":"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/56e002c7408c4708e39ece867f84171e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pr\u00e6sentationen omhandler praktiske sp\u00f8rgsm\u00e5l vedr\u00f8rende udviklingen af operat\u00f8rer i Kubernetes, design af deres arkitektur og grundl\u00e6ggende driftsprincipper.<\/p>\n<p><\/p>\n<p>I den f\u00f8rste del af pr\u00e6sentationen vil vi diskutere:<\/p>\n<p><\/p>\n<ul>\n<li>hvad en operator i Kubernetes er, og hvorfor den er n\u00f8dvendig;<\/li>\n<li>hvordan en operator forenkler administrationen af komplekse systemer;<\/li>\n<li>hvad en operator kan, og hvad en operator ikke kan.<\/li>\n<\/ul>\n<p><\/p>\n<p>Derefter vil vi g\u00e5 videre til at diskutere den indre struktur af operat\u00f8ren. Vi vil se p\u00e5 arkitektur og funktionalitet af operat\u00f8ren trin for trin. Vi vil detaljeret gennemg\u00e5:<\/p>\n<p><\/p>\n<ul>\n<li>interaktionen mellem operat\u00f8ren og Kubernetes;<\/li>\n<li>hvilke funktioner operat\u00f8ren p\u00e5tager sig, og hvad den delegerer til Kubernetes.<\/li>\n<\/ul>\n<p><\/p>\n<p>Vi vil se p\u00e5 h\u00e5ndtering af shards og replikaer af databaser i Kubernetes.<br \/>\nDerefter vil vi diskutere sp\u00f8rgsm\u00e5l om datalagring:<\/p>\n<p><\/p>\n<ul>\n<li>hvordan man arbejder med Persistent Storage set fra operat\u00f8rens synspunkt;<\/li>\n<li>faldgruber ved brug af Local Storage.<\/li>\n<\/ul>\n<p><\/p>\n<p>I den afsluttende del af pr\u00e6sentationen vil vi se p\u00e5 praktiske eksempler p\u00e5 anvendelse af <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">clickhouse-operator<\/a><\/noindex> med Amazon eller Google Cloud Service. Pr\u00e6sentationen er bygget p\u00e5 eksemplet med udviklingen og driften af en operat\u00f8r til 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=\"Afspil 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>Mit navn er Vladislav Klimenko. Jeg vil i dag fort\u00e6lle om vores erfaring med at udvikle og drive en operat\u00f8r, som er en specialiseret operat\u00f8r til at styre databaser. For eksempel <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">ClickHouse-operator<\/a><\/noindex> til styring af et ClickHouse-klasse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 mulighed for at tale om operat\u00f8ren og ClickHouse?<\/p>\n<p><\/p>\n<ul>\n<li>Vi arbejder med support og udvikling af ClickHouse. <\/li>\n<li>I \u00f8jeblikket fors\u00f8ger vi langsomt at bidrage til udviklingen af ClickHouse. Vi er de n\u00e6stst\u00f8rste efter Yandex i forhold til det antal \u00e6ndringer, der er foretaget i ClickHouse. <\/li>\n<li>Vi fors\u00f8ger at lave yderligere projekter til ClickHouse-\u00f8kosystemet. <\/li>\n<\/ul>\n<p><\/p>\n<p>Om et af disse projekter vil jeg gerne fort\u00e6lle. Det handler om ClickHouse-operatoren til Kubernetes. <\/p>\n<p><\/p>\n<p>I min pr\u00e6sentation vil jeg ber\u00f8re to emner: <\/p>\n<p><\/p>\n<ul>\n<li>Det f\u00f8rste emne er, hvordan vores operat\u00f8r til styring af ClickHouse-databaser i Kubernetes fungerer. <\/li>\n<li>Det andet emne er, hvordan enhver operat\u00f8r fungerer, dvs. hvordan den interagerer med Kubernetes. <\/li>\n<\/ul>\n<p><\/p>\n<p>Disse to sp\u00f8rgsm\u00e5l vil krydse hinanden hele vejen igennem min pr\u00e6sentation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 finde det interessant at h\u00f8re om det, jeg pr\u00f8ver at fort\u00e6lle?<\/p>\n<p><\/p>\n<ul>\n<li>Det vil is\u00e6r v\u00e6re interessant for dem, der driver operat\u00f8rer. <\/li>\n<li>Eller til dem, der \u00f8nsker at lave deres egen, for at forst\u00e5, hvordan det fungerer internt, hvordan operat\u00f8ren interagerer med Kubernetes, og hvilke faldgruber der kan opst\u00e5. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 bedre at forst\u00e5 det, vi skal diskutere i dag, ville det v\u00e6re godt at vide, hvordan Kubernetes fungerer og have en grundl\u00e6ggende viden om cloud-teknologier. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/eff56cc3e83fde3d3e64d73d41b07417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvad er ClickHouse? Det er en kolonnebaseret database med fokus p\u00e5 online behandling af analytiske foresp\u00f8rgsler. Og den er helt open source. <\/p>\n<p><\/p>\n<p>Og vi skal kun vide to ting. Vi skal vide, at det er en database, s\u00e5 alt, hvad jeg vil fort\u00e6lle, vil v\u00e6re anvendeligt for praktisk talt enhver database. Og at databasesystemet ClickHouse skalerer meget godt, hvilket giver n\u00e6sten line\u00e6r skalerbarhed. Og derfor er tilstanden i klyngen en naturlig tilstand for ClickHouse. Vi er is\u00e6r interesserede i at diskutere, hvordan man vedligeholder ClickHouse-klyngen i Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5eb1ff5026c492117bf2467b10de7053.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvorfor er det n\u00f8dvendigt der? Hvorfor kan vi ikke forts\u00e6tte med at k\u00f8re det selv? Og svarene er delvist tekniske og delvist organisatoriske. <\/p>\n<p><\/p>\n<ul>\n<li>I praksis ser vi oftere og oftere en situation, hvor n\u00e6sten alle komponenter i store virksomheder allerede er i Kubernetes. Databasekomponenterne forbliver udenfor. <\/li>\n<li>Og sp\u00f8rgsm\u00e5let stilles oftere: \"Kan dette bringes ind?\". Derfor fors\u00f8ger store virksomheder at skabe maksimal ensartethed i administrationen for hurtigt at kunne h\u00e5ndtere deres datalagre. <\/li>\n<li>Og det hj\u00e6lper is\u00e6r, hvis der er brug for maksimal mulighed for at gentage det samme et nyt sted, dvs. maksimal b\u00e6rbarhed.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/99312e74bd7ed4031128c7ec872f6a68.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvor nemt eller sv\u00e6rt er det? Det kan selvf\u00f8lgelig g\u00f8res manuelt. Men det er ikke s\u00e5 simpelt, fordi vi f\u00e5r kompleksiteten ved at administrere Kubernetes blandet ind med ClickHouse's specifik. <\/p>\n<p><\/p>\n<p>Og alt dette giver et ret stort s\u00e6t teknologier, som det bliver ret sv\u00e6rt at h\u00e5ndtere, fordi Kubernetes bringer sine daglige driftssp\u00f8rgsm\u00e5l, mens ClickHouse bringer sine sp\u00f8rgsm\u00e5l til daglig drift. Is\u00e6r hvis vi har flere ClickHouse-instanser, og vi konstant skal g\u00f8re noget med dem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ca10b805b2744d1a5283f96b0ac1cc11.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I ClickHouse er der en betydelig m\u00e6ngde sp\u00f8rgsm\u00e5l vedr\u00f8rende dynamisk konfiguration, som konstant belaster DevOps:<\/p>\n<p><\/p>\n<ul>\n<li>N\u00e5r vi \u00f8nsker at \u00e6ndre noget i ClickHouse, for eksempel at tilf\u00f8je en replika eller en shard, skal vi gennemf\u00f8re konfigurationsstyring. <\/li>\n<li>Dern\u00e6st skal vi \u00e6ndre dataskemaet, fordi ClickHouse har en speciel m\u00e5de at shardere p\u00e5. Vi skal fordele dataskemaet og konfigurationerne. <\/li>\n<li>Vi skal indstille overv\u00e5gning. <\/li>\n<li>Indsamling af logs for nye shards og nye replikaer. <\/li>\n<li>S\u00f8rge for genopretning.<\/li>\n<li>Og genstart. <\/li>\n<\/ul>\n<p><\/p>\n<p>Det er s\u00e5danne rutineopgaver, som vi gerne vil lette i driftsmilj\u00f8et.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2461e861ca1d2f2344ead9decf85a97e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Selv Kubernetes hj\u00e6lper godt i driften, men kun med de grundl\u00e6ggende systemrelatede opgaver. <\/p>\n<p><\/p>\n<p>Kubernetes g\u00f8r det nemmere og automatiserer opgaver som:<\/p>\n<p><\/p>\n<ul>\n<li>Genopretning.<\/li>\n<li>Genstart. <\/li>\n<li>Styring af opbevaringssystemet.<\/li>\n<\/ul>\n<p><\/p>\n<p>Det er godt, det er den rigtige retning, men det har ikke en fuldst\u00e6ndig forst\u00e5else af, hvordan man driver en databasekluster. <\/p>\n<p><\/p>\n<p>Vi \u00f8nsker mere, vi vil have, at hele databasen k\u00f8rer i Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6564e9f29d5d518925c8593bca978345.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi vil have noget, der ligner en stor magisk r\u00f8d knap, som du trykker p\u00e5, og s\u00e5 f\u00e5r du udrullet og vedligeholdt et kluster med daglige opgaver, der skal l\u00f8ses. Et ClickHouse kluster i Kubernetes.<\/p>\n<p><\/p>\n<p>Og vi har fors\u00f8gt at lave en l\u00f8sning, der ville lette arbejdet. Det er ClickHouse-operatoren til Kubernetes fra firmaet Altinity.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 hovedopgave er at styre andre programmer, dvs. det er en manager. <\/p>\n<p><\/p>\n<p>Og den indeholder adf\u00e6rdsm\u00f8nstre. Man kan kalde det kodificerede viden om det relevante omr\u00e5de. <\/p>\n<p><\/p>\n<p>Og dens prim\u00e6re opgave er at lette livet for DevOps og reducere mikrostyring, s\u00e5 DevOps kan t\u00e6nke i h\u00f8jere niveauer, dvs. at de ikke skal besk\u00e6ftige sig med mikrostyring og manuelt indstille alle detaljer. <\/p>\n<p><\/p>\n<p>Og netop operatoren er en robotassistent, der k\u00e6mper med mikrouppgaver og hj\u00e6lper DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 har vi brug for en operator? Den er is\u00e6r effektiv i to sp\u00f8rgsm\u00e5l:<\/p>\n<p><\/p>\n<ul>\n<li>N\u00e5r en specialist, der arbejder med ClickHouse, har utilstr\u00e6kkelig erfaring, men ClickHouse alligevel skal anvendes, letter operat\u00f8ren driften og g\u00f8r det muligt at k\u00f8re et ClickHouse-klynge med en ret kompleks konfiguration, uden at man beh\u00f8ver at dykke for meget ned i detaljerne om, hvordan det hele fungerer indeni. Man giver dem bare opgaver p\u00e5 et overordnet niveau, og det fungerer. <\/li>\n<li>Og den anden opgave, hvor han klarer sig bedst, er, n\u00e5r der skal automatiseres et stort antal standardopgaver. Han fjerner mikrouppgaver fra systemadministratorerne. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f1cb11156d57f560d0b6c82700ac6ff8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det er mest n\u00f8dvendigt for dem, der lige er begyndt deres rejse, eller for dem, der har meget at g\u00f8re med automatisering. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/128e7d9ff1ce0c535f98be66aedb1060.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvad er forskellen mellem den operat\u00f8rbaserede tilgang og andre systemer? Der findes ogs\u00e5 Helm. Det hj\u00e6lper ogs\u00e5 med at installere ClickHouse, man kan tegne helm charts, som endda kan ops\u00e6tte en hel ClickHouse-klynge. Hvad er s\u00e5 forskellen mellem operat\u00f8ren og for eksempel Helm?<\/p>\n<p><\/p>\n<p>Den vigtigste fundamentale forskel er, at Helm er pakkeadministration, mens operat\u00f8ren g\u00e5r videre. Det handler om at st\u00f8tte hele livscyklussen. Det er ikke kun installationen, men ogs\u00e5 daglige opgaver, der inkluderer skalering, sharding, alts\u00e5 alt det, der skal udf\u00f8res i l\u00f8bet af livscyklussen (hvis n\u00f8dvendigt ogs\u00e5 sletning) \u2013 det hele l\u00f8ses af operat\u00f8ren. Han fors\u00f8ger at automatisere og vedligeholde hele livscyklussen for softwaren. Det er hans fundamentale forskel i forhold til de \u00f8vrige l\u00f8sninger, der findes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e26b57c8caf8437f683d7afbfa127ebd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dette var det indledende afsnit, lad os komme videre. <\/p>\n<p><\/p>\n<p>Hvordan bygger vi vores operat\u00f8r? Vi fors\u00f8ger at tage fat p\u00e5 sp\u00f8rgsm\u00e5let om at administrere ClickHouse-klyngen som en enkelt ressource. <\/p>\n<p><\/p>\n<p>Her til venstre er dataene. Det er YAML med specifikationen af klyngen, som klassisk overf\u00f8res til Kubernetes via kubectl. Her griber operat\u00f8ren ind, udf\u00f8rer sin magi, og vi ender med en skema. Det er implementeringen af ClickHouse i Kubernetes.<\/p>\n<p><\/p>\n<p>Og videre vil vi langsomt se p\u00e5, hvordan operat\u00f8ren fungerer, hvilke standardopgaver man kan l\u00f8se. Vi vil kun se p\u00e5 standardopgaverne, fordi vi har begr\u00e6nset tid. Og der vil blive fortalt om ikke alt, hvad operat\u00f8ren kan l\u00f8se. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b40401931b58988058419d4495dbb1bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os tage udgangspunkt i praksis. Vores projekt er helt open source, s\u00e5 man kan se p\u00e5 GitHub, hvordan det fungerer. Og man kan tage udgangspunkt i, hvis man blot \u00f8nsker at komme i gang, at man kan starte med Quick Start Guide.<\/p>\n<p><\/p>\n<p>Hvis man \u00f8nsker at dykke ned i detaljerne, fors\u00f8ger vi at holde dokumentationen i nogenlunde god stand. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9414d7c3aa94b6ad999e150f0ac25a97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os starte med en praktisk opgave. Den f\u00f8rste opgave, som vi alle \u00f8nsker at starte med, er at f\u00e5 det f\u00f8rste eksempel op at k\u00f8re p\u00e5 en eller anden m\u00e5de. Hvordan kan man starte ClickHouse ved hj\u00e6lp af operat\u00f8ren, selv uden at vide pr\u00e6cis, hvordan det fungerer? Vi skriver et manifest, da al kommunikation med k8s er gennem manifester.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 komplekst manifest. Det, vi har markeret med r\u00f8dt, er det, vi skal fokusere p\u00e5. Vi beder operat\u00f8ren om at oprette et cluster med navnet demo.<\/p>\n<p><\/p>\n<p>Indtil videre er dette grundl\u00e6ggende eksempler. Storage er endnu ikke beskrevet, men vi vender tilbage til storage lidt senere. Indtil videre vil vi f\u00f8lge udviklingen af clustret dynamisk.<\/p>\n<p><\/p>\n<p>Vi har oprettet dette manifest. Vi giver det til vores operat\u00f8r. Han har arbejdet, og lavet sin magi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 kigger i konsollen. Tre komponenter v\u00e6kker interesse - det er Pod, to Services, StatefulSet.<\/p>\n<p><\/p>\n<p>Operat\u00f8ren har arbejdet, og vi kan se, hvad han har oprettet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 skaber omtrent et s\u00e5dant schema. Vi har en StatefulSet, Pod, ConfigMap for hver replika, ConfigMap for hele clustret. Der skal naturligvis v\u00e6re services som indgangspunkter til clustret. <\/p>\n<p><\/p>\n<p>Services er den centrale Load Balancer Service, og man kan ogs\u00e5 have en for hver replika, for hver shard. <\/p>\n<p><\/p>\n<p>Her ser vores grundl\u00e6ggende cluster ud nogenlunde s\u00e5ledes. Det best\u00e5r af \u00e9n enkelt node. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f235ada45ee58b517c0e041f795ae122.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os g\u00e5 videre og g\u00f8re det mere komplekst. Vi skal shardere clustret.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/992836a00434c64fb4616c1c4cc4df97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vores opgaver vokser, dynamikken begynder. Vi \u00f8nsker at tilf\u00f8je en shard. Vi f\u00f8lger udviklingen. Vi \u00e6ndrer vores specifikation. Vi angiver, at vi \u00f8nsker to shards. <\/p>\n<p><\/p>\n<p>Dette er den samme fil, som dynamisk udvikler sig i takt med systemets v\u00e6kst. Storage er ikke til stede, det vil blive betragtet senere, det er et separat emne.<\/p>\n<p><\/p>\n<p>Vi giver YAML-operat\u00f8ren og ser, hvad der sker. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 overvejede og skabte f\u00f8lgende enheder. Vi har allerede to Pods, tre Services og, overraskende, 2 StatefulSets. Hvorfor 2 StatefulSets?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/26eb734ff1a195de2ceaab842b472ee4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I diagrammet var det s\u00e5dan her - dette var vores initiale tilstand, da vi havde \u00e9n pod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 er nu blevet s\u00e5dan her. Indtil videre er alt enkelt, det har blot duplikeret. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 er StatefulSet nu blevet to? Her m\u00e5 vi afbryde os selv og diskutere sp\u00f8rgsm\u00e5let om, hvordan Kubernetes h\u00e5ndterer Pods.<\/p>\n<p><\/p>\n<p>Der findes et objekt kaldet StatefulSet, som g\u00f8r det muligt at oprette en samling af Pods fra en skabelon. Den n\u00f8glefaktor her er skabelonen. Og man kan i et StatefulSet k\u00f8re mange Pods ud fra en enkelt skabelon. Den centrale s\u00e6tning her er \"mange Pods ud fra en enkelt skabelon\".<\/p>\n<p><\/p>\n<p>Der var en stor fristelse til at lave hele klyngen pakket ind i \u00e9t StatefulSet. Det ville fungere, der er ingen problemer med det. Men der er en nuance. Hvis vi \u00f8nsker at samle en heterogen klynge, alts\u00e5 fra flere versioner af ClickHouse, s\u00e5 begynder vi at f\u00e5 sp\u00f8rgsm\u00e5l. Ja, StatefulSet kan lave rolling updates, og her kan man rulle en ny version ud, men man skal forklare, at man ikke b\u00f8r opdatere mere end et vist antal noder ad gangen.<\/p>\n<p><\/p>\n<p>Men hvis vi ekstrapolerer opgaven og siger, at vi \u00f8nsker at lave en helt heterogen klynge, og vi ikke \u00f8nsker at skifte fra den gamle version til den nye ved hj\u00e6lp af rolling updates, men simpelthen vil skabe en heterogen klynge b\u00e5de hvad ang\u00e5r forskellige versioner af ClickHouse og forskellige lagringsmetoder. Vi \u00f8nsker for eksempel at ops\u00e6tte nogle replikaer p\u00e5 separate diske, p\u00e5 langsomme diske, i det hele taget bygge en helt heterogen klynge. Og fordi StatefulSet laver et standardiseret resultat ud fra \u00e9n skabelon, er der ikke mulighed for at g\u00f8re dette. <\/p>\n<p><\/p>\n<p>Efter lidt overvejelse blev det besluttet, at vi g\u00f8r det p\u00e5 denne m\u00e5de. Hver replika har sit eget StatefulSet. Der er nogle ulemper ved denne l\u00f8sning, men i praksis indkapsler det fuldst\u00e6ndig operat\u00f8ren. Og der er mange fordele. Vi kan bygge en helt s\u00e5dan klynge, som vi vil, for eksempel en helt heterogen en. Derfor, i en klynge hvor vi har to shards med \u00e9n replika hver, vil vi have 2 StatefulSets og 2 Pods netop fordi vi har valgt denne tilgang af de n\u00e6vnte grunde for at muligg\u00f8re opbygningen af en heterogen klynge. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b7ae92a545f9bb6cc5f0136df87207f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os vende tilbage til praktiske opgaver. I vores klynge skal vi konfigurere brugere, alts\u00e5 vi skal udf\u00f8re en form for konfiguration af ClickHouse i Kubernetes. Operat\u00f8ren giver alle muligheder for dette. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6a65aa78293c0b40230cf24efc58e55a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Man kan direkte i YAML skrive det, vi \u00f8nsker. Alle konfigurationsmuligheder kortl\u00e6gges direkte fra denne YAML til ClickHouse-konfigurationer, som derefter distribueres i hele klyngen.<\/p>\n<p><\/p>\n<p>Det er muligt at skrive s\u00e5dan her. Dette er et eksempel. Adgangskoden kan g\u00f8res krypteret. Alle konfigurationsmuligheder for ClickHouse underst\u00f8ttes. Dette er kun et eksempel. <\/p>\n<p><\/p>\n<p>Konfigurationen for klyngen distribueres som ConfigMap. I praksis opdateres ConfigMap ikke \u00f8jeblikkeligt, s\u00e5 hvis der er en stor klynge, kan processen med at implementere konfigurationen tage noget tid. Men alt dette er meget praktisk i drift.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 komplicerer opgaven. Klyngen udvikler sig. Vi \u00f8nsker at replikere data. Det vil sige, vi har allerede to shards med \u00e9n replik, og brugerne er konfigureret. Vi vokser og \u00f8nsker at h\u00e5ndtere replikationen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c97e5e6ca9cb66d3a94fb8cfe610186.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvad har vi brug for til replikation? <\/p>\n<p><\/p>\n<p>Vi har brug for ZooKeeper. I ClickHouse er replikation bygget ved hj\u00e6lp af ZooKeeper. ZooKeeper er n\u00f8dvendigt for, at de forskellige replikker i ClickHouse har enighed om, hvilke datablokke der er tilg\u00e6ngelige i hvilken ClickHouse. <\/p>\n<p><\/p>\n<p>Du kan bruge enhver ZooKeeper. Hvis virksomheden har en ekstern ZooKeeper, kan den bruges. Hvis ikke, kan vi installere en fra vores repository. Der er en installer, der g\u00f8r dette lettere. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 interaktionsskemaet for hele systemet ser s\u00e5ledes ud. Vi har Kubernetes som platform. ClickHouse-operatoren k\u00f8rer p\u00e5 den. ZooKeeper er tegnet her. Og operatoren interagerer b\u00e5de med ClickHouse og med ZooKeeper. Det vil sige, der opst\u00e5r interaktion. <\/p>\n<p><\/p>\n<p>Og alt dette er n\u00f8dvendigt, for at ClickHouse effektivt kan replikere data i k8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4fc37aee850acd20517fa3d7562f0165.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os nu se p\u00e5 selve opgaven, hvordan manifestet til replikation vil se ud.<\/p>\n<p><\/p>\n<p>Vi tilf\u00f8jer to sektioner til vores manifest. Den f\u00f8rste er, hvor vi skal tage ZooKeeper fra, som kan v\u00e6re internt i Kubernetes eller eksternt. Dette er blot en beskrivelse. Og vi bestiller replikker. Det vil sige, vi \u00f8nsker to replikker. I alt skal vi have 4 pods. Om storage husker vi, det kommer lidt senere. Storage er et eget kapitel. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 s\u00e5dan her.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 bliver s\u00e5dan her. Replikker tilf\u00f8jes. Den 4. kunne ikke v\u00e6re der, vi tror, at der kan v\u00e6re mange af dem. Og ZooKeeper tilf\u00f8jes fra siden. Skemaerne bliver mere komplicerede. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 er kommet til at tilf\u00f8je den n\u00e6ste opgave. Vi vil tilf\u00f8je Persistent Storage. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f28d14901a713eca413a52ec6ea21ac5.jpeg\" style=\"display:block;margin: 0 auto;\" \/>For Persistent Storage har vi forskellige implementeringsmuligheder.<\/p>\n<p><\/p>\n<p>I tilf\u00e6lde af, at vi k\u00f8rer i en cloud-udbyder, som for eksempel Amazon eller Google, er der en stor fristelse til at benytte sig af cloud storage. Det er meget praktisk, det er godt. <\/p>\n<p><\/p>\n<p>Der er en anden mulighed. Dette er til local storage, n\u00e5r vi har lokale diske p\u00e5 hver node. Denne mulighed er meget sv\u00e6rere at implementere, men samtidig er den mere effektiv. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/483ee5c08b62e987620bf54fd32a44b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os se p\u00e5, hvad vi har i forhold til cloud storage.<\/p>\n<p><\/p>\n<p>Der er fordele. Det er meget nemt at konfigurere. Vi bestiller blot fra en cloud-udbyder, og beder om, at f\u00e5 given storage med en bestemt kapacitet og klasse. Klasserne er beskrevet af udbyderne selv. <\/p>\n<p><\/p>\n<p>Og der er en ulempe. For nogen er dette en ikke-kritisk ulempe. Der vil selvf\u00f8lgelig v\u00e6re nogle neds\u00e6ttelser i pr\u00e6stationen. Det er meget praktisk at arbejde med, p\u00e5lideligt, men der er nogle potentielle fald i pr\u00e6stationen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8e82430b64477f91640078ff4eacb47e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Da ClickHouse fokuserer p\u00e5 pr\u00e6station, kan man endda sige, at det udnytter alt, hvad der er muligt, s\u00e5 mange kunder fors\u00f8ger at maksimere pr\u00e6stationen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8638fe37b848a98ce8326218d368baa3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>For at maksimere pr\u00e6stationen har vi brug for local storage.<\/p>\n<p><\/p>\n<p>Kubernetes tilvejebringer tre abstraktioner til brug af local storage i Kubernetes. Det 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>Lad os se p\u00e5, hvad der adskiller dem, og hvad der er ens. <\/p>\n<p><\/p>\n<p>For det f\u00f8rste, i alle tre tilgange har vi storage \u2013 det er lokale diske, der ligger p\u00e5 den samme fysiske k8s-node. Men de har nogle forskelle.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79afb620a0c9a1552b47240b405fedc9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os starte med den enkleste, dvs. emptyDir. Hvad er det i praksis? Det er, n\u00e5r vi beder vores specifikation om at give systemet til containerisering (oftest er det Docker) adgang til en mappe p\u00e5 den lokale disk.<\/p>\n<p><\/p>\n<p>I praksis opretter Docker et sted i sine egne stier en midlertidig mappe, kalder den et langt hash. Og giver adgangsgr\u00e6nsefladen til det. <\/p>\n<p><\/p>\n<p>Hvordan vil det fungere med hensyn til pr\u00e6station? Det vil fungere med hastigheden af den lokale disk, dvs. det er fuldst\u00e6ndig adgang til sin egen disk. <\/p>\n<p><\/p>\n<p>Men denne metode har sin ulempe. Persistent i denne sammenh\u00e6ng er ret tvivlsom. Ved den f\u00f8rste bev\u00e6gelse af Docker med containere g\u00e5r Persistent tabt. Hvis Kubernetes af en eller anden grund vil flytte denne Pod til en anden disk, bliver dataene tabt. <\/p>\n<p><\/p>\n<p>Denne tilgang er god til tests, fordi hastigheden er acceptabel, men til noget seri\u00f8st er denne mulighed ikke egnet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 findes der en anden tilgang. Dette er hostPath. Hvis vi ser p\u00e5 den tidligere slide og denne, kan vi bem\u00e6rke \u00e9n forskel. Vores mappe er flyttet fra Docker direkte til Kubernetes noden. Her er det lidt enklere. Vi angiver blot stien til det lokale filsystem, hvor vi \u00f8nsker at gemme vores data. <\/p>\n<p><\/p>\n<p>Der er fordele ved denne metode. Dette er allerede en \u00e6gte Persistent, en klassisk en. Vores data vil blive gemt p\u00e5 disken et bestemt sted. <\/p>\n<p><\/p>\n<p>Der er ogs\u00e5 ulemper. Det er vanskeligt at administrere. Vores Kubernetes kan beslutte at flytte en Pod til en anden fysisk node. Og her tr\u00e6der DevOps ind. De skal korrekt kommunikere til hele systemet, at disse pod'er kun kan flyttes til mandder, hvor der er noget monteret som angivet, og kun \u00e9n node ad gangen. Det er ret komplekst. <\/p>\n<p><\/p>\n<p>Specielt til dette form\u00e5l har vi i vores operat\u00f8r lavet skabeloner for at skjule al denne kompleksitet. Og man kunne simpelthen sige: \u00abJeg vil have, at der er \u00e9n instans af ClickHouse p\u00e5 hver fysisk node og p\u00e5 den angivne sti\u00bb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 behov g\u00e6lder ikke kun os, derfor forst\u00e5r herrerne fra Kubernetes ogs\u00e5, at folk gerne vil have adgang til fysiske diske, og derfor tilbyder de et tredje niveau.<\/p>\n<p><\/p>\n<p>Det kaldes local. Der er stort set ingen forskel fra den tidligere slide. Tidligere skulle vi manuelt s\u00f8rge for, at vi ikke kunne flytte disse pod'er fra node til node, fordi de skulle v\u00e6re knyttet til den specifikke sti til den lokale fysiske disk, men nu er al denne viden indkapslet i selve Kubernetes. Og det bliver meget nemmere at konfigurere.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/140c43be34dd7015c0bf4cfd0a0bb384.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os vende tilbage til vores praktiske opgave. Vi vender tilbage til YAML skabelonen. Her har vi f\u00e5et en \u00e6gte storage. Vi er tilbage til dette. Vi angiver en klassisk VolumeClaim skabelon som i k8s. Og beskriver, hvilken storage vi \u00f8nsker.<\/p>\n<p><\/p>\n<p>Derefter vil k8s anmode om storage. Den vil tildele os det i StatefulSet. Og i sidste ende vil det v\u00e6re til r\u00e5dighed for ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 havde en s\u00e5dan ordning. Vores Persistent Storage var r\u00f8d, hvilket ligesom antydede, at det burde g\u00f8res. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 den bliver gr\u00f8n. Nu er diagrammet for ClickHouse p\u00e5 k8s helt finaliseret. Vi har shards, replikaer, ZooKeeper, der er en \u00e6gte Persistent, der er implementeret p\u00e5 den ene eller anden m\u00e5de. Diagrammet er allerede fuldt operationelt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 forts\u00e6tter med at leve videre. Vores klynge udvikler sig. Og Alexey g\u00f8r en indsats og udsender en ny version af ClickHouse.<\/p>\n<p><\/p>\n<p>Der opst\u00e5r en praktisk opgave \u2013 at teste den nye version af ClickHouse p\u00e5 vores klynge. Og selvf\u00f8lgelig \u00f8nsker vi ikke at opdatere hele klyngen; vi vil helst placere den nye version et sted i et afsides hj\u00f8rne, og m\u00e5ske ikke bare \u00e9n ny version, men to, fordi de ofte bliver udgivet. <\/p>\n<p><\/p>\n<p>Hvad kan vi sige om dette emne?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 netop muligheden for det. Det er pod-skabeloner. Vi kan beskrive det, vores operator giver os mulighed for at opbygge en heterogen klynge. Dvs. at konfigurere fra alle repliker samlet, til hver individuel replika, hvilken version af ClickHouse vi \u00f8nsker, hvilken version af storage vi \u00f8nsker. Vi kan fuldt ud konfigurere en klynge af den konfiguration, som vi \u00f8nsker. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 vil nu dykke lidt dybere. Tidligere har vi talt om, hvordan ClickHouse-operat\u00f8ren fungerer i forhold til specifikationerne for ClickHouse.<\/p>\n<p><\/p>\n<p>Nu vil jeg gerne sige et par ord om, hvordan enhver operat\u00f8r generelt fungerer, samt hvordan den interagerer med K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ca9c2a23c54b2a81ac0a8bba88d5e65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os f\u00f8rst se p\u00e5 interaktionen med K8s. Hvad sker der, n\u00e5r vi k\u00f8rer kubectl apply? Vores objekter vises gennem API i etcd. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 grundl\u00e6ggende Kubernetes-objekter: pod, StatefulSet, service og s\u00e5 videre i r\u00e6kkef\u00f8lgen. <\/p>\n<p><\/p>\n<p>Men intet fysisk sker endnu. Disse objekter skal materialiseres i klyngen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 opst\u00e5r en controller. Controlleren er en speciel komponent i K8s, som kan materialisere disse beskrivelser. Den ved, hvordan og hvad der skal g\u00f8res fysisk. Den ved, hvordan man starter containere, og hvad der skal konfigureres for at f\u00e5 serveren til at k\u00f8re. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 vores objekter i K8s.<\/p>\n<p><\/p>\n<p>Men vi \u00f8nsker ikke kun at operere med pod-der og StatefulSet-der, vi \u00f8nsker at oprette en ClickHouseInstallation, dvs. et objekt af typen ClickHouse, s\u00e5 vi kan operere med det som \u00e9n helhed. I \u00f8jeblikket er der ikke s\u00e5dan en mulighed. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 anden rar funktion. Vi \u00f8nsker, at der skal opst\u00e5 en kompleks enhed, som ville v\u00e6re samlet af pod-der og StatefulSet, vores klynge. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/04f86706f506fa91e365d45537dd9def.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og hvad skal der til for dette? For det f\u00f8rste kommer Custom Resource Definition p\u00e5 scenen. Hvad er det? Det er en beskrivelse for K8s, som angiver, at du f\u00e5r en ny datatype, som vi \u00f8nsker at tilf\u00f8je en brugerdefineret ressource til pod, StatefulSet, der vil v\u00e6re kompleks indeni. Det er en beskrivelse af datakonstruktionen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 derhen via kubectl apply. Kubernetes har gl\u00e6deligt taget det til sig. <\/p>\n<p><\/p>\n<p>Og nu har vi i lageret, for objektet i etcd, mulighed for at registrere en brugerdefineret ressource kaldet ClickHouseInstallation.<\/p>\n<p><\/p>\n<p>Men indtil nu vil der ikke ske mere. Det vil sige, hvis vi nu opretter en YAML-fil, som vi har gennemg\u00e5et med beskrivelsen af shard, replikaer og siger \"kubectl apply\", s\u00e5 vil Kubernetes acceptere den, placere den i etcd og sige: \"Fint, men jeg ved ikke, hvad jeg skal g\u00f8re med den. Hvordan jeg skal h\u00e5ndtere ClickHouseInstallation, ved jeg ikke.\" <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 har vi brug for nogen, der kan hj\u00e6lpe Kubernetes med at h\u00e5ndtere den nye datatype. Til venstre har vi den indbyggede controller i Kubernetes, som arbejder med de indbyggede datatyper. Og til h\u00f8jre skal vi have en brugerdefineret controller, der kan arbejde med brugerdefinerede datatyper. <\/p>\n<p><\/p>\n<p>Og p\u00e5 en anden m\u00e5de kaldes den en operator. Jeg har bevidst flyttet den uden for Kubernetes, fordi den kan k\u00f8re uden for K8s. Ofte, selvf\u00f8lgelig, k\u00f8rer alle operat\u00f8rer i Kubernetes, men der er intet til hinder for, at den st\u00e5r udenfor, s\u00e5 derfor er den her bevidst flyttet udenfor. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7aa3a1b67d0def5ba752dff56baeebbf.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og i sin tur interagerer den brugerdefinerede controller, det vil sige operatoren, med Kubernetes gennem API'et. Den kan allerede interagere med API'et. Og den ved allerede, hvordan man materialiserer en kompleks struktur fra den brugerdefinerede ressource, som vi \u00f8nsker at skabe. Det er netop det, operatoren g\u00f8r. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 operatoren? Lad os kigge til h\u00f8jre for at finde ud af, hvordan den g\u00f8r det. Vi vil l\u00e6re, hvordan operatoren materialiserer alt dette, og hvordan interaktionen med K8s derefter foreg\u00e5r.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/08a8d8dbcb35117a0eb3320589c6ff8d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Operatoren er et program. Den er begivenhedsorienteret. Operatoren abonnerer ved hj\u00e6lp af Kubernetes API p\u00e5 begivenheder. I Kubernetes API'er er der indgange, hvor man kan abonnere p\u00e5 begivenheder. Og hvis noget \u00e6ndrer sig i K8s, sender Kubernetes begivenheder til alle, der \u00f8nsker det, det vil sige, den der har abonneret p\u00e5 denne API-punkt, vil modtage meddelelser.<\/p>\n<p><\/p>\n<p>Operatoren abonnerer p\u00e5 begivenheder og skal reagere. Dens opgave er at reagere p\u00e5 de fremkomne begivenheder. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f0664a4151e6e7f6f8575a3e54372e9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Begivenheder genereres af visse opdateringer. Vores YAML-fil med beskrivelsen af ClickHouseInstallation kommer ind. Den blev sendt til etcd via kubectl apply. Der blev udl\u00f8st en event, og denne event blev sendt til ClickHouse-operat\u00f8ren. Operat\u00f8ren modtog denne beskrivelse, og han skal g\u00f8re noget. Hvis der er kommet en opdatering p\u00e5 objektet ClickHouseInstallation, skal klyngen opdateres. Operat\u00f8rens opgave er at opdatere klyngen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0952bdd391a72aa15bf66af4ce69f4af.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvad g\u00f8r han? For det f\u00f8rste skal der udarbejdes en handlingsplan for, hvad vi vil g\u00f8re med denne opdatering. Opdateringer kan v\u00e6re meget sm\u00e5, det vil sige sm\u00e5 i YAML-udf\u00f8relsen, men de kan medf\u00f8re meget store \u00e6ndringer i klyngen. Derfor skaber operat\u00f8ren en plan, og s\u00e5 holder han sig til den.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 begynder i henhold til denne plan at fremstille strukturen internt for at materialisere pods, tjenester osv., det vil sige at g\u00f8re det, som er hans hovedopgave. Det er som at bygge en ClickHouse-klynge i Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e91576a26d6b758a68ae0b35cbe01897.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os nu ber\u00f8re en interessant ting. Det er ansvarsdelingen mellem Kubernetes og operat\u00f8ren, det vil sige hvad Kubernetes g\u00f8r, hvad operat\u00f8ren g\u00f8r, og hvordan de interagerer med hinanden. <\/p>\n<p><\/p>\n<p>Kubernetes st\u00e5r for systemiske ting, det vil sige et grundl\u00e6ggende s\u00e6t objekter, der kan fortolkes som system-omfang. Kubernetes ved, hvordan man starter pods, hvordan man genstarter containere, hvordan man mount'er volumener, hvordan man arbejder med ConfigMap, det vil sige alt, hvad man kan kalde systemet. <\/p>\n<p><\/p>\n<p>Operat\u00f8rer arbejder inden for specifikke dom\u00e6ner. Hver operat\u00f8r laves til sit specifikke dom\u00e6ne. Vi har lavet en til ClickHouse.<\/p>\n<p><\/p>\n<p>Og operat\u00f8ren interagerer netop i termer fra det specifikke dom\u00e6ne, som at tilf\u00f8je en replika, oprette et skema, konfigurere overv\u00e5gning. Der opst\u00e5r et s\u00e5dant skel.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9dc07d9c29d5dfd538343aadb751e4c0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os se p\u00e5 et praktisk eksempel p\u00e5, hvordan denne ansvarsdeling finder sted, n\u00e5r vi udf\u00f8rer handlingen \"tilf\u00f8je en replika\". <\/p>\n<p><\/p>\n<p>Operat\u00f8ren f\u00e5r opgaven \u2013 at tilf\u00f8je en replika. Hvad g\u00f8r operat\u00f8ren? Operat\u00f8ren beregner, at der skal oprettes en ny StatefulSet, i hvilken der skal beskrives visse skabeloner og volumenklausuler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 har forberedt det hele og sender det videre til K8s. Han siger, at han har brug for ConfigMap, StatefulSet og Volume. Kubernetes arbejder videre. Han materialiserer de grundl\u00e6ggende enheder, som han opererer med. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 ind i billedet igen. Han har allerede en fysisk pod, hvor man kan begynde at arbejde. Og ClickHouse-operat\u00f8ren opererer igen i termer af dom\u00e6net. Det vil sige, for specifikt at inkludere en replika i klyngen, skal der for det f\u00f8rste konfigureres et dataskema, som findes i denne klynge. Og for det andet skal denne replika inkluderes i overv\u00e5gningen, s\u00e5 den kan f\u00f8lges ordentligt. Det er allerede operat\u00f8ren, der s\u00e6tter dette op. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 derefter tr\u00e6der selve ClickHouse ind i billedet, det vil sige en endnu mere overordnet enhed. Det er allerede databasen. Den har sin egen instans, en ny konfigureret replika, der er klar til at komme ind i klyngen.<\/p>\n<p><\/p>\n<p>Det viser sig, at k\u00e6den af opgaver og ansvarsfordeling ved tilf\u00f8jelse af en replika er ret lang.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ec79cfa2b45fadbe25f4d9fe8d2ec5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os forts\u00e6tte med vores praktiske opgaver. Hvis klyngen allerede eksisterer, er det muligt at foretage en migrationskonfiguration. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 muligt at flytte gennem den eksisterende xml, som ClickHouse forst\u00e5r.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/91abb1d3b0a14f2118361403a74e14c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Man kan foretage finjusteringer af ClickHouse. Netop zoned deployment \u2013 det er, hvad jeg talte om i forbindelse med forklaringen af hostPath, lokal lagring. Det handler om, hvordan man korrekt laver zoned deployment.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fde502f30223e04a918f4fd598c3dd9f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Den n\u00e6ste praktiske opgave er overv\u00e5gning.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 vi \u00e6ndrer vores klynge, skal overv\u00e5gningen j\u00e6vnligt tilpasses. <\/p>\n<p><\/p>\n<p>Lad os se p\u00e5 skemaet. De gr\u00f8nne pile har vi allerede set p\u00e5. Nu lad os se p\u00e5 de r\u00f8de pile. Det er, hvordan vi \u00f8nsker at overv\u00e5ge vores klynge. Hvordan metrikker fra ClickHouse-klyngen g\u00e5r til Prometheus og derefter til Grafana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1210c1423f99d48a20e06e855bf48a72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvad er udfordringen med overv\u00e5gning? Hvorfor betragtes det som en pr\u00e6station? Udfordringen er netop i dynamikken. N\u00e5r vi har \u00e9n klynge, og den er statisk, kan man indstille overv\u00e5gningen \u00e9n gang og s\u00e5 lade den v\u00e6re.<\/p>\n<p><\/p>\n<p>Men hvis vi har mange klynger, eller hvis der konstant sker \u00e6ndringer, s\u00e5 er processen dynamisk. Og at skulle besk\u00e6ftige sig med at justere overv\u00e5gningen konstant er en spild af ressourcer og tid, det vil sige, det kan ogs\u00e5 v\u00e6re ligegyldigt. Det skal automatiseres. Udfordringen ligger netop i dynamikken i processen. Og operat\u00f8ren automatiserer det rigtig godt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 udviklede vores klynge sig? I begyndelsen var den s\u00e5dan her.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 blev den s\u00e5dan her.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1a3e915fbadf3aa5f3b33d337f36e76e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Som resultat blev den s\u00e5dan her. <\/p>\n<p><\/p>\n<p>Og overv\u00e5gningen udf\u00f8res automatisk af operat\u00f8ren. En enhedlig indgangspunkt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 blot p\u00e5 Grafana-dashboardet for at se, hvordan vores klynge fungerer. <\/p>\n<p><\/p>\n<p>For resten distribueres Grafana-dashboardet ogs\u00e5 med vores operator direkte i kildekoderne. Det kan tilsluttes og bruges. Dette screenshot fik jeg fra vores DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 at bev\u00e6ge os hen herfra? Det er:<\/p>\n<p><\/p>\n<ul>\n<li>At udvikle automatisering af test. Hovedopgaven er automatiseret test af nye versioner. <\/li>\n<li>Vi \u00f8nsker ogs\u00e5 meget at automatisere integrationen med ZooKeeper. Og vi planl\u00e6gger at integrere med ZooKeeper-operatoren. Alts\u00e5, der er skrevet en operator til ZooKeeper, og det er logisk, at de to operatorer begynder at integrere sig for at skabe en mere bekvem l\u00f8sning. <\/li>\n<li>Vi \u00f8nsker at lave mere avancerede sundhedstjek. <\/li>\n<li>Jeg har markeret det, vi har p\u00e5 vej, arver Templates \u2013 DONE, s\u00e5 med den n\u00e6ste release af operatoren vil vi allerede have skabelonarv. Dette er et st\u00e6rkt v\u00e6rkt\u00f8j, der g\u00f8r det muligt at bygge komplekse konfigurationer fra sm\u00e5 dele. <\/li>\n<li>Og vi \u00f8nsker automatisering af komplekse opgaver. Den vigtigste af disse er Re-sharding. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f232c0aab389be5069e5c7886e265c01.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os lave en midtvejsevaluering. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/62f7814994af0441ba5a82de4e9780d7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvad f\u00e5r vi ud af det? Og er det v\u00e6rd at g\u00f8re, eller ej? Skal vi overhovedet fors\u00f8ge at bringe databasen ind i Kubernetes og anvende operatoren generelt, og Alitnity-operatoren specifikt?<\/p>\n<p><\/p>\n<p>Udgangen er:<\/p>\n<p><\/p>\n<ul>\n<li>Betydelig forenkling og automatisering af konfiguration, udrulning samt vedligeholdelse. <\/li>\n<li>Indbygget overv\u00e5gning fra starten. <\/li>\n<li>Og kodede skabeloner klar til brug til komplekse situationer. Allerede handlinger som at tilf\u00f8je en replika skal ikke g\u00f8res manuelt. Det klarer operatoren. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/aebccd7a2dc55f14645f79f89f7b7458.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der er kun \u00e9t sidste sp\u00f8rgsm\u00e5l. Vi har allerede databasen i Kubernetes, virtualisering. Hvordan st\u00e5r det til med ydeevnen af den l\u00f8sning, is\u00e6r i lyset af, at ClickHouse er optimeret til ydeevne?<\/p>\n<p><\/p>\n<p>Svaret er \u2013 alt er fint! Jeg vil ikke g\u00e5 i detaljer, det er emnet for et separat foredrag. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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 der er et projekt kaldet TSBS. Hvad er dets hovedopgave? Det er at teste databaser for ydeevne. Det er et fors\u00f8g p\u00e5 at sammenligne varme med varme, bl\u00f8dt med bl\u00f8dt. <\/p>\n<p><\/p>\n<p>Hvordan fungerer det? Der genereres et datas\u00e6t. Derefter k\u00f8res dette datas\u00e6t p\u00e5 en ensartet r\u00e6kke tests p\u00e5 forskellige databaser. Og hver database l\u00f8ser en opgave p\u00e5 sin egen m\u00e5de. Derefter kan resultaterne sammenlignes. <\/p>\n<p><\/p>\n<p>Det underst\u00f8tter allerede en stor m\u00e6ngde databaser. Jeg har fremh\u00e6vet tre hovedtyper. De 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 til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5b4733534a4e6e36fb7788127adc6e86.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der er ogs\u00e5 blevet lavet en sammenligning med en anden lignende l\u00f8sning. Sammenligningen med RedShift. Sammenligningen blev udf\u00f8rt p\u00e5 Amazon. ClickHouse overg\u00e5r ogs\u00e5 alle i denne sammenh\u00e6ng. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/44cc8dedc07a02fe1ed5aad3e17a579c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvad kan vi konkludere ud fra det, jeg har fortalt?<\/p>\n<p><\/p>\n<ul>\n<li>DB i Kubernetes er muligt. Det er nok muligt med alle, men generelt ser det ud til at v\u00e6re muligt. ClickHouse i Kubernetes kan helt sikkert implementeres af vores operator. <\/li>\n<li>Operatoren hj\u00e6lper med at automatisere processerne og g\u00f8r virkelig livet lettere.<\/li>\n<li>Ydelsen er acceptabel.<\/li>\n<li>Og vi mener, at det kan og b\u00f8r bruges. <\/li>\n<\/ul>\n<p><\/p>\n<p>Open source \u2013 kom og v\u00e6r med!<\/p>\n<p><\/p>\n<p>Som jeg allerede har sagt, er operatoren et helt open source-produkt, s\u00e5 det ville v\u00e6re rigtig godt, hvis s\u00e5 mange som muligt ville bruge det. Kom og v\u00e6r med! Vi ser frem til at se jer alle!<\/p>\n<p><\/p>\n<p>Tak for alle!<\/p>\n<p><\/p>\n<p>Sp\u00f8rgsm\u00e5l<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operator i Kubernetes til styring af databaser. 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>Tak for pr\u00e6sentationen! Mit navn er Anton. Jeg er fra virksomheden SEMrush. Jeg er interesseret i, hvad ang\u00e5r logningen. Vi h\u00f8rer om overv\u00e5gning, men intet om logning, hvis vi taler om hele klyngen. For eksempel har vi sat en klynge op p\u00e5 hardware. Vi bruger centraliseret logning, hvor vi samler det med standardv\u00e6rkt\u00f8jer i en samlet m\u00e6ngde. Og s\u00e5 tr\u00e6kker vi de interessante data derfra.<\/em> <\/p>\n<p><\/p>\n<p>Et godt sp\u00f8rgsm\u00e5l, dvs. logning er p\u00e5 todo-listen. Vores operator automatiserer stadig ikke det. Den er stadig under udvikling, projektet er stadig relativt ungt. Vi forst\u00e5r n\u00f8dvendigheden af logning. Det er ogs\u00e5 et meget vigtigt emne, som m\u00e5ske er liges\u00e5 vigtigt som overv\u00e5gning. Men overv\u00e5gning var f\u00f8rst p\u00e5 listen til implementering. Logning vil komme. Vi str\u00e6ber naturligvis efter at automatisere alle aspekter af klyngens livscyklus. S\u00e5 svaret er \u2013 p\u00e5 nuv\u00e6rende tidspunkt kan operatoren desv\u00e6rre ikke dette, men det er p\u00e5 vores planer, og vi vil g\u00f8re det. Hvis der er lyst til at deltage, er pull request velkommen.<\/p>\n<p><\/p>\n<p><em>Hej! Tak for pr\u00e6sentationen! Jeg har et standardsp\u00f8rgsm\u00e5l relateret til Persistent Volumes. N\u00e5r vi opretter en konfiguration med denne operator, hvordan bestemmer operatoren, hvilken node vi har monteret en disk eller mappe p\u00e5? Skal vi p\u00e5 forh\u00e5nd forklare den, at den skal placere vores ClickHouse p\u00e5 de noder, der har disken?<\/em><\/p>\n<p><\/p>\n<p>S\u00e5 vidt jeg forst\u00e5r, er dette sp\u00f8rgsm\u00e5l en forts\u00e6ttelse af local storage, is\u00e6r den del, der omhandler hostPath. Det er som at forklare hele systemet, hvad der er n\u00f8dvendigt for, at pod'en skal k\u00f8re p\u00e5 en bestemt node, hvor vi har en fysisk tilsluttet disk, der er monteret p\u00e5 en bestemt sti. Det er en hel sektion, som jeg har ber\u00f8rt meget overfladisk, fordi svaret er ret omfattende. <\/p>\n<p><\/p>\n<p>Kort sagt ser det s\u00e5dan ud. Vi skal selvf\u00f8lgelig foretage provisioning af disse volumes. P\u00e5 nuv\u00e6rende tidspunkt mangler der dynamisk provisionering i local storage, s\u00e5 DevOps skal selv oprette diske, disse volumes. Og de skal informere Kubernetes provisioneringen om, at der vil v\u00e6re Persistent volumes af en bestemt klasse, som findes p\u00e5 bestemte noder. Derefter skal det forklares for Kubernetes, at pod'e, som kr\u00e6ver en bestemt klasse local storage, kun skal planl\u00e6gges p\u00e5 de noder, der har de n\u00f8dvendige labels. Til dette form\u00e5l er der i operatoren mulighed for at tildele en bestemt label og \u00e9n pr. host-forekomst. Og resultatet bliver, at pod'ene vil blive rutet af Kubernetes til at k\u00f8re kun p\u00e5 noder, som opfylder kravene til labels, sagt p\u00e5 en enkel m\u00e5de. Administratorer tildeler labels og foretager provisioning af diske manuelt. Og s\u00e5 kan det skaleres.<\/p>\n<p><\/p>\n<p>Og netop den tredje mulighed for local storage hj\u00e6lper med at lette dette lidt. Som jeg allerede har p\u00e5peget, er det et omhyggeligt stykke arbejde at konfigurere, som hj\u00e6lper med at opn\u00e5 maksimal ydelse i sidste ende.<\/p>\n<p><\/p>\n<p><em>Jeg har et sp\u00f8rgsm\u00e5l mere, der h\u00e6nger sammen med dette. Kubernetes er designet s\u00e5ledes, at det ikke er vigtigt for os, om vi mister en node eller ej. Hvad skal vi g\u00f8re, hvis vi har mistet den node, hvor vores shard er placeret?<\/em><\/p>\n<p><\/p>\n<p>Ja, Kubernetes er oprindeligt positioneret s\u00e5dan, at vores forhold til vores pod'e er som kv\u00e6g, men her bliver hver disk noget, der minder mere om et k\u00e6ledyr. Der er et problem, at vi ikke bare kan kaste dem v\u00e6k. Udviklingen af Kubernetes g\u00e5r i den retning, at man ikke helt kan forholde sig til dette filosofisk som til fuldst\u00e6ndig udskiftelige ressourcer.<\/p>\n<p><\/p>\n<p>Nu til et praktisk sp\u00f8rgsm\u00e5l. Hvad skal man g\u00f8re, hvis en node, hvor disken var, er blevet tabt? Det problem l\u00f8ses allerede p\u00e5 et h\u00f8jere niveau. I tilf\u00e6lde af ClickHouse har vi replikaer, der arbejder p\u00e5 et niveau over, dvs. p\u00e5 ClickHouse-niveau.<\/p>\n<p><\/p>\n<p>Hvad er fordelingen? DevOps er ansvarlig for, at ingen data g\u00e5r tabt. Han skal korrekt konfigurere replikationen og overv\u00e5ge, at replikationen udf\u00f8res. Dataene skal v\u00e6re duplikeret i replikatet p\u00e5 ClickHouse-niveau. Det er ikke en opgave, som operat\u00f8ren l\u00f8ser. Og det er ikke en opgave, som Kubernetes selv l\u00f8ser. Det er p\u00e5 ClickHouse-niveau.<\/p>\n<p><\/p>\n<p>Hvad skal man g\u00f8re, hvis jernnoden svigter? Og s\u00e5 skal man s\u00e6tte en anden op, korrekt provisionere en disk, p\u00e5f\u00f8re labels. Og derefter vil den opfylde kravene, s\u00e5 Kubernetes kan starte en instans af pod'en p\u00e5 den. Kubernetes vil starte den. I har jo ikke nok pods til det angivne antal. Den vil gennemg\u00e5 den cyklus, som jeg viste. Og p\u00e5 det \u00f8verste niveau vil ClickHouse forst\u00e5, at der er kommet en replik, den er stadig tom, og data skal begynde at flydes over til den. Alts\u00e5, denne proces er stadig d\u00e5rligt automatiseret. <\/p>\n<p><\/p>\n<p><em>Tak for opl\u00e6gget! N\u00e5r der sker forskellige problemer, og operat\u00f8ren falder og genstarter, mens begivenhederne forts\u00e6tter med at komme, hvordan h\u00e5ndterer I det?<\/em><\/p>\n<p><\/p>\n<p>Hvad sker der, hvis operat\u00f8ren falder og genstarter, ikke? <\/p>\n<p><\/p>\n<p><em>Ja. Og p\u00e5 det tidspunkt kom der begivenheder.<\/em> <\/p>\n<p><\/p>\n<p>Opgaven om, hvad der skal g\u00f8res i dette tilf\u00e6lde, er delvist opdelt mellem operat\u00f8ren og Kubernetes. Kubernetes har mulighed for at afspille de indtrufne begivenheder igen. Han afspiller dem. Og operat\u00f8rens opgave er at sikre, at n\u00e5r loggen med begivenhederne bliver afspillet til ham, s\u00e5 er disse begivenheder idempotente. Og at en gentagelse af den samme begivenhed ikke \u00f8del\u00e6gger vores system. Og vores operat\u00f8r klarer denne opgave. <\/p>\n<p><\/p>\n<p><em>Hej! Tak for opl\u00e6gget! Dmitry Zavyalov, selskab<\/em> <em>Smedova. Er der planer om at tilf\u00f8je mulighed for konfiguration med haproxy i operat\u00f8ren? Jeg er interesseret i en anden balancerer udover den standard, s\u00e5 den er smart og forst\u00e5r, at der faktisk er ClickHouse der.<\/em> <\/p>\n<p><\/p>\n<p>Taler du om Ingress?<\/p>\n<p><\/p>\n<p><em>Ja, erstat Ingress med haproxy. I haproxy kan man angive topologien for klyngen, hvor dens replikater befinder sig.<\/em><\/p>\n<p><\/p>\n<p>Vi har ikke t\u00e6nkt over det endnu. Hvis du har brug for det og kan forklare, hvorfor det er n\u00f8dvendigt, kan vi overveje at implementere det, is\u00e6r hvis du \u00f8nsker at deltage. Vi vil med gl\u00e6de se p\u00e5 muligheden. Kort sagt \u2013 nej, vi har ikke denne funktionalitet i \u00f8jeblikket. Tak for tippet, vi vil kigge p\u00e5 det. Hvis du ogs\u00e5 kan forklare use case og hvorfor det er n\u00f8dvendigt i praksis, for eksempel ved at oprette issues p\u00e5 GitHub, ville det v\u00e6re fremragende.<\/p>\n<p><\/p>\n<p><em>Der er allerede noget.<\/em><\/p>\n<p><\/p>\n<p>Godt. Vi er \u00e5bne for enhver forslag. Og haproxy er p\u00e5 todo-listen. Todo-listen vokser, men falder ikke endnu. Men det er godt, det betyder, at produktet er efterspurgt.<\/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.3 - 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\/da\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 i Kubernetes til at administrere databaser. Vladislav Klimenko (Altinity, 2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/da\/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":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/96965","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=96965"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/96965\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/96966"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=96965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=96965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=96965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}