
Foredraget handler om praktiske spÞrsmÄl knyttet til utviklingen av en operator i Kubernetes, design av dens arkitektur og grunnleggende prinsipper for funksjon.
I den fÞrste delen av foredraget vil vi se pÄ:
- hva en operator i Kubernetes er og hvorfor den er nĂždvendig;
- hvordan operatoren forenkler administrasjonen av komplekse systemer;
- hva en operator kan gjĂžre og hva den ikke kan gjĂžre.
Deretter gÄr vi videre til diskusjonen om den indre strukturen til operatoren. Vi vil se pÄ arkitekturen og funksjonen til operatoren steg for steg. Vi vil gÄ nÞye gjennom:
- interaksjon mellom operatoren og Kubernetes;
- hvilke funksjoner operatoren tar pÄ seg, og hva den delegerer til Kubernetes.
Vi vil se pÄ forvaltning av shards og replikater av databaser i Kubernetes.
Videre vil vi diskutere dataoppbevaringsspÞrsmÄl:
- hvordan jobbe med Persistent Storage fra operatorens perspektiv;
- feller ved bruk av Local Storage.
I den avsluttende delen av foredraget vil vi se pÄ praktiske eksempler pÄ anvendelse av med Amazon eller Google Cloud Service. Foredraget er bygget pÄ utviklingen og erfaringen med Ä drive en operator for ClickHouse.
Video:

Mitt navn er ĐлаЎОŃлаĐČ ĐĐ»ĐžĐŒĐ”ĐœĐșĐŸ. I dag skulle jeg gjerne fortelle om vĂ„r erfaring med utvikling og drift av operatĂžren, som er en spesialisert operator for administrasjon av databaseklynger. Vi tar utgangspunkt i for Ă„ administrere en ClickHouse-klynge.

Hvorfor har vi muligheten til Ă„ snakke om operatoren og ClickHouse?
- Vi jobber med stĂžtte og utvikling av ClickHouse.
- For tiden prÞver vi gradvis Ä bidra sÄ mye vi kan til utviklingen av ClickHouse. Vi er nummer to etter Yandex i volumet av endringer vi har gjort i ClickHouse.
- Vi prĂžver Ă„ lage ekstra prosjekter for ClickHouse-Ăžkosystemet.
Om et slikt prosjekt vil jeg gjerne fortelle. Det handler om ClickHouse-operatoren for Kubernetes.
I mitt foredrag vil jeg berĂžre to temaer:
- Det fÞrste temaet er hvordan vÄr operator fungerer for Ä administrere ClickHouse databaser i Kubernetes.
- Det andre temaet er hvordan enhver operator fungerer, det vil si hvordan den interagerer med Kubernetes.
Disse to spÞrsmÄlene vil krysse hverandre gjennom hele mitt foredrag.

Hvem vil vĂŠre interessert i Ă„ hĂžre det jeg prĂžver Ă„ fortelle?
- Det vil vĂŠre mest interessant for de som drifter operatĂžrer.
- Eller de som Þnsker Ä lage sin egen for Ä forstÄ hvordan det fungerer internt, hvordan operatoren interagerer med Kubernetes og hvilke feller som kan oppstÄ.

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.

What is ClickHouse? It is a column-oriented database designed for online analytical processing of queries. And it is completely open source.
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.

Why is it needed there? Why can't we continue to operate it independently? The answers are partly technical and partly organizational.
- In practice, we increasingly encounter situations where, in large companies, almost all components are already in Kubernetes. Databases remain outside.
- 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.
- This is especially helpful if we need maximum repeatability in a new location, i.e., maximum portability.

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.
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.

ClickHouse, with dynamic configuration, presents quite a number of issues that create a constant workload for DevOps:
- When we want to change something in ClickHouse, for example, adding a replica or shard, we need to conduct configuration management.
- SÄ mÄ du endre dataskjemaet, fordi ClickHouse har en spesifikk mÄte Ä sharde data pÄ. Det er nÞdvendig Ä organisere dataskjemaet og konfigurasjonene.
- Monitoring mÄ settes opp.
- Loggsamling for nye shard-er, for nye replikaer.
- Ta seg av gjenoppretting.
- Og omstart.
Dette er rutinearbeid som man veldig gjerne vil forenkle i driften.

Kubernetes hjelper godt med driften, men pÄ grunnleggende systemnivÄ.
Kubernetes letter og automatiserer blant annet slike ting som:
- Gjenoppretting.
- Omstart.
- HÄndtering av lagringssystemet.
Det er bra, det er riktig retning, men det har overhodet ikke noen forstÄelse for hvordan man skal drifte en databasklynge.
Man Ăžnsker mer, man vil at hele databasen skal fungere i Kubernetes.

Man Þnsker Ä ha noe som ligner en stor, magisk rÞd knapp, som man kan trykke pÄ, og sÄ rulles det ut og opprettholdes en klynge gjennom hele livssyklusen med daglige oppgaver som mÄ lÞses. ClickHouse-klynge i Kubernetes.
Og vi har forsĂžkt Ă„ lage en lĂžsning som ville gjĂžre arbeidet enklere. Dette er ClickHouse-operatoren for Kubernetes fra Altinity.

En operator er et program hvis hovedoppgave er Ä administrere andre programmer, altsÄ en forvalter.
Og det inneholder atferdsmĂžnstre. Man kan kalle dette kodifiserte kunnskaper om fagfeltet.
Og dens hovedoppgave er Ä gjÞre livet lettere for DevOps og redusere mikrostyring, slik at han (DevOps) kan tenke i hÞynivÄtermer, det vil si at han (DevOps) ikke trenger Ä gjÞre mikrostyring og manuelt konfigurere alle detaljer.
Og nettopp operatoren er en robotassistent som tar tak i mikrouppgaver og hjelper DevOps.

Hvorfor trenger man en operator? Den viser seg spesielt godt i to spÞrsmÄl:
- NÄr en spesialist som jobber med ClickHouse har utilstrekkelig erfaring, men man allerede mÄ drifte ClickHouse, letter operatoren driften og gjÞr det mulig Ä administrere en ClickHouse-klynge med en relativt kompleks konfigurasjon, uten Ä gÄ for mye i detalj om hvordan alt fungerer innad. Man gir bare hÞynivÄoppgaver, og sÄ fungerer det.
- Og den andre oppgaven hvor han utmerker seg best, er nÄr det er nÞdvendig Ä automatisere mange standardoppgaver. Han fjerner mikroadministrative oppgaver fra systemadministratorene.

Dette er mest nyttig for de som nettopp begynner sin vei, eller for de som trenger Ă„ jobbe mye med automatisering.

Hva er forskjellen mellom tilnÊrmingen basert pÄ operatÞrer og andre systemer? Det finnes jo Helm. Det hjelper ogsÄ med Ä 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Þren og for eksempel Helm?
Hovedforskjellen er at Helm er en pakkebehandling, mens operatĂžren gĂ„r videre. Det handler om Ă„ fĂžlge hele livssyklusen. Det er ikke bare installasjon, men daglige oppgaver som inkluderer skalering, sharding, det vil si alt som mĂ„ gjĂžres i lĂžpet av livssyklusen (hvis nĂždvendig, ogsĂ„ sletting) â alt dette hĂ„ndterer operatĂžren. Han prĂžver Ă„ automatisere og vedlikeholde hele livssyklusen til programvaren. Dette er hans fundamentale skille fra andre lĂžsninger som er tilgjengelige.

Det var innledningen, la oss gÄ videre.
Hvordan bygger vi vÄr operatÞr? Vi prÞver Ä tilnÊrme oss spÞrsmÄlet om hvordan vi kan administrere et ClickHouse-kluster som en enkelt ressurs.
Her har vi i venstre del av bildet inngangsdataene. Dette er YAML med spesifikasjonen for klusteret, som pÄ klassisk mÄte blir overfÞrt til Kubernetes via kubectl. Der tar operatÞren tak i dette, gjÞr sin magi. Og ut ved de fÄr vi et slikt skjema. Dette er implementeringen av ClickHouse i Kubernetes.
Og videre skal vi sakte se pÄ hvordan operatÞren fungerer, hvilke standardoppgaver man kan lÞse. Vi vil bare se pÄ standardoppgaver, fordi vi har begrenset tid. Og ikke alt hva operatÞren kan lÞse vil bli diskutert.

La oss ta utgangspunkt i praksis. Prosjektet vÄrt er helt open source, sÄ man kan se pÄ GitHub hvordan det fungerer. Og man kan ta utgangspunkt i at, hvis man bare Þnsker Ä starte, kan man begynne med Quick Start Guide.
Hvis man Þnsker Ä forstÄ det i detalj, prÞver vi Ä opprettholde dokumentasjonen i en mer eller mindre anstendig tilstand.

La oss begynne med en praktisk oppgave. Den fÞrste oppgaven, som vi alle Þnsker Ä starte med, er Ä kjÞre det fÞrste eksemplet pÄ en eller annen mÄte. Hvordan kan vi starte ClickHouse ved hjelp av operatÞren, selv uten Ä vite hvordan det fungerer? Vi skriver et manifest, ettersom all kommunikasjon med k8s skjer gjennom manifestene.

Her er et slikt komplisert manifest. Det som er uthevet i rÞdt, er det vi mÄ fokusere pÄ. Vi ber operatÞren om Ä lage en klynge med navnet demo.
SÄ langt er dette grunnleggende eksempler. Storage er ennÄ ikke beskrevet, men vi kommer tilbake til storage senere. For nÄ vil vi observere utviklingen av klyngen i dynamikk.
Vi har laget dette manifestet. Vi mater det inn til operatÞren vÄr. Han jobbet, gjorde sin magi.

Vi ser pĂ„ konsollen. Tre komponenter vekker interesse â det er Pod, to tjenester, StatefulSet.
OperatĂžren har jobbet og vi kan se hva han har opprettet.

Han lager omtrent et slikt skjema. Vi har StatefulSet, Pod, ConfigMap for hver replikk, ConfigMap for hele klyngen. Tjenestene er nĂždvendigvis som inngangspunkter til klyngen.
Tjenester â det er den sentrale Load Balancer-tjenesten, og det kan ogsĂ„ vĂŠre en for hver replikk, for hver shard.
Slik ser vÄr grunnleggende klynge ut. Den bestÄr av én enkelt node.

La oss gÄ videre, vi skal komplisere det. Klyngen mÄ sharding.

VÄre oppgaver vokser, dynamikken begynner. Vi Þnsker Ä legge til en shard. Vi fÞlger med pÄ utviklingen. Vi endrer spesifikasjonen vÄr. Vi angir at vi Þnsker to shards.
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.
Vi mater YAML-operatĂžren og ser hva som skjer.

OperatĂžren tenkte og lagde fĂžlgende enheter. Vi har allerede to Pods, tre tjenester og, plutselig, to StatefulSets. Hvorfor to StatefulSets?

PĂ„ skjemaet var det slik â dette er vĂ„r opprinnelige tilstand, nĂ„r vi hadde Ă©n pod.

Det har blitt slik. SĂ„ langt er alt enkelt, det er duplisert.

Og hvorfor har StatefulSet blitt to? Her mÄ vi avbryte og diskutere hvordan pod-er styres i Kubernetes.
Det finnes et objekt kalt StatefulSet, som lar deg lage en gruppe Pod-er fra en mal. Her er den nĂžkkelfaktoren â det er malen. Og i ett StatefulSet kan du kjĂžre mange Pod-er med Ă©n mal. Og den nĂžkkelfrasen her er 'mange Pod-er fra Ă©n mal'.
Det var en stor fristelse Ä lage hele klyngen i én StatefulSet. Dette vil fungere, det er det ingen problemer med. Men det er ett problem. Hvis vi Þnsker Ä sette sammen en heterogen klynge, altsÄ fra flere versjoner av ClickHouse, sÄ begynner vi Ä fÄ spÞrsmÄl. Ja, StatefulSet kan gjÞre rolling update, ja, der kan man rulle ut en ny versjon og forklare at man mÄ prÞve ikke mer enn sÄ mange noder samtidig.
Men hvis vi ekstrapolerer oppgaven og sier at vi vil lage en helt heterogen klynge, og at vi ikke vil gjÞre en oppgradering fra gammel til ny versjon ved hjelp av rolling update, men rett og slett vil skape en heterogen klynge bÄde nÄr det gjelder forskjellige versjoner av ClickHouse og nÄr det gjelder ulik lagring. For eksempel Þnsker vi Ä lage noen replikater pÄ separate disker, pÄ langsomme, generelt sett, bygg helt en heterogen klynge. Og fordi StatefulSet lager en standardisert lÞsning fra én mal, er det derfor ikke mulig Ä gjÞre det.
Etter litt ettertanke ble det besluttet at vi gjÞr det slik. Hver replika har sin egen StatefulSet. Det er noen ulemper med denne lÞsningen, men i praksis inkapsler dette alt operatÞren. Og det er mange fordeler. Vi kan bygge helt den klyngen vi Þnsker, for eksempel helt heterogen. Derfor, i en klynge der vi har to shards med én replika hver, vil vi ha 2 StatefulSet-er og 2 Pods nettopp fordi vi har valgt en sÄdan tilnÊrming av de nevnte grunnene for muligheten til Ä bygge en heterogen klynge.

La oss gÄ tilbake til praktiske oppgaver. I vÄr klynge mÄ vi konfigurere brukere, altsÄ mÄ vi gjÞre noe konfigurasjon av ClickHouse i Kubernetes. OperatÞren gir alle muligheter for dette.

Vi kan skrive direkte i YAML hva vi Ăžnsker. Alle konfigurasjonsalternativer mappes direkte fra denne YAML til ClickHouse-konfigurasjoner, som deretter distribueres over hele klyngen.
Vi kan ogsÄ skrive slik. Dette er et eksempel. Passordet kan gjÞres kryptert. Absolutt alle konfigurasjonsalternativer for ClickHouse stÞttes. Her er det bare et eksempel.
Konfigurasjonen for klyngen distribueres som ConfigMap. I praksis skjer oppdatering av ConfigMap ikke umiddelbart, sÄ hvis det er en stor klynge, tar det litt tid Ä pushe konfigurasjonen. Men alt dette er veldig praktisk i drift.

Vi kompliserer oppgaven. Klyngen utvikler seg. Vi Ăžnsker Ă„ replikere data. Det vil si at vi allerede har to shards, med en replika hver, og brukerne er satt opp. Vi vokser og Ăžnsker Ă„ jobbe med replikering.

Hva trenger vi for replikering?
Vi trenger ZooKeeper. I ClickHouse er replikering bygget med bruk av ZooKeeper. ZooKeeper er nÞdvendig for at de ulike replikaene av ClickHouse skal ha en konsensus om hvilke datablokker som finnes pÄ hvilken ClickHouse.
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Ärt repository. Det finnes en installer som gjÞr dette enklere.

Og interaksjonsskjemaet for hele systemet ser slik ut. Vi har Kubernetes som plattform. PÄ den kjÞrer ClickHouse-operatÞren. ZooKeeper er her representert. OperatÞren samhandler med bÄde ClickHouse og ZooKeeper. Det vil si at det blir en interaksjon.
Og alt dette er nĂždvendig for at ClickHouse skal replikere data vellykket i k8s.

La oss nÄ se pÄ selve oppgaven, hvordan manifestet for replikering vil se ut.
Vi legger til to seksjoner i manifestet vÄrt. Den fÞrste er hvor vi skal hente ZooKeeper, som kan vÊre bÄde internt i Kubernetes og ekstern. Dette er bare en beskrivelse. Og vi ber om replikene. Det vil si at vi Þnsker to replikas. Totalt skal vi ha 4 pod'er. NÄr det gjelder lagring, husker vi, det kommer litt senere. Lagring er en egen sang.

Det var slik.

Det blir slik. Replikaene legges til. Den fjerde fikk ikke plass, men vi tror at det kan vÊre mange der. Og ZooKeeper legges til pÄ siden. Skjematikkene blir mer kompliserte.

Og tiden har kommet for Ă„ legge til neste oppgave. Vi skal legge til Persistent Storage.
NÄr det gjelder Persistent Storage, har vi ulike implementasjonsalternativer.
I tilfelle vi kjĂžrer i en cloud-leverandĂžr, for eksempel Amazon eller Google, er det fristende Ă„ bruke skytjenester for lagring. Det er veldig praktisk, det er bra.
Og det finnes et annet alternativ. Dette er for lokal lagring, nÄr vi har lokale disker pÄ hver node. Dette alternativet er mye mer komplekst Ä implementere, men samtidig mer effektivt.

La oss se pÄ hva vi har med hensyn til cloud-lagring.
Det er fordeler. Det er veldig enkelt Ă„ konfigurere. Vi ber bare sky-leverandĂžren om Ă„ gi oss lagring av en bestemt kapasitet, av en bestemt klasse. Klassene er beskrevet av leverandĂžrene selv.
Og det er en ulempe. For noen er dette en uvesentlig ulempe. SelvfÞlgelig vil det vÊre noen performance-overbelastninger. Det er veldig praktisk Ä jobbe med, pÄlitelig, men det finnes noen potensielle ytelsesproblemer.

Og siden ClickHouse fokuserer nettopp pÄ ytelse, kan man til og med si at det trekker ut alt som er mulig, derfor prÞver mange kunder Ä fÄ maksimalt ut av ytelsen.

Og for Ä fÄ maksimalt ut av det, trenger vi local storage.
Kubernetes tilbyr tre abstraksjoner for bruk av local storage i Kubernetes. Disse er:
- EmptyDir
- HostPath.
- Local
La oss se pÄ hvordan de skiller seg fra hverandre, og hva de har til felles.
For det fĂžrste, i alle tre tilnĂŠrmingene har vi storage â lokale disker som ligger pĂ„ den samme fysiske k8s noden. Men de har noen forskjeller.

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 Ä gi oss tilgang til en mappe pÄ den lokale disken.
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.
Hvordan vil dette fungere med ytelsen? Dette vil fungere med hastigheten til den lokale disken, dvs. det er full tilgang til sin egen harddisk.
Men dette har en ulempe. Persistensen er ganske tvilsom. Ved den fÞrste bevegelsen av Docker med containerne gÄr persistensen tapt. Hvis Kubernetes av en eller annen grunn Þnsker Ä flytte denne Pod-en til en annen disk, vil dataene gÄ tapt.
Denne tilnĂŠrmingen er bra for tester, fordi den viser grei hastighet, men for noe seriĂžst er ikke dette alternativet passende.

Derfor er det en annen tilnÊrming. Dette er hostPath. Hvis vi ser pÄ det forrige lyset og dette, kan vi se én eneste forskjell. Mappen vÄr har gÄtt fra Docker direkte til Kubernetes-noden. Her er det litt enklere. Vi skriver rett ut hvilken sti vi Þnsker Ä bruke pÄ det lokale filsystemet for Ä lagre vÄre data.
Fordelene med denne metoden er reelle. Dette er allerede ekte persistering, og dessuten klassisk. Vi vil ha data lagret pÄ disken et bestemt sted.
Det finnes ogsÄ ulemper. Dette er kompleksiteten ved administrasjon. VÄr Kubernetes kan Þnske Ä flytte en Pod til en annen fysisk node. Og da kommer DevOps inn i bildet. Han mÄ forklare systemet korrekt at disse pod'ene bare kan flyttes til noder der du har noe montert pÄ disse stiene, og ikke mer enn en node av gangen. Dette er ganske komplisert.
Spesielt for disse formÄlene har vi laget maler for Ä skjule all denne kompleksiteten. Man kunne enkelt si: «Jeg Þnsker at det skal vÊre én instans av ClickHouse pÄ hver fysisk node og pÄ denne stien».

Men dette behovet gjelder ikke bare oss, derfor forstÄr gutta i Kubernetes ogsÄ at folk Þnsker tilgang til fysiske disker, sÄ de tilbyr et tredje nivÄ.
Det kalles lokal. Forskjellen fra forrige lysbilde er praktisk talt ingen. Tidligere mÄtte man gjÞre det manuelt, at pod'ene ikke kan flyttes fra node til node fordi de mÄ vÊre festet til en bestemt sti til en lokal fysisk disk, men nÄ er all denne kunnskapen innkapslet i Kubernetes selv. Og det blir mye enklere Ä konfigurere.

La oss gÄ tilbake til vÄr praktiske oppgave. La oss gÄ tilbake til YAML-malen. Her har vi fÄtt en ekte lagring. Vi har kommet tilbake til dette. Vi definerer en klassisk VolumeClaim-mal som i k8s. Og beskriver hvilken lagring vi Þnsker.
Etter dette vil k8s be om lagring. Den vil tildele oss det i StatefulSet. Og til slutt vil det bli tilgjengelig for ClickHouse.

Vi hadde et slikt skjema. VÄr Persistent Storage var rÞd, noe som antydet at det burde gjÞres noe med det.

Og det blir grÞnt. NÄ er skjemaet for ClickHouse-klyngen pÄ k8s helt ferdigstilt. Vi har shard, replikaer, ZooKeeper, og det er ekte Persistent, som er implementert pÄ en eller annen mÄte. Skjemaet er allerede helt operativt.

Vi fortsetter Ä leve videre. Klyngen vÄr utvikler seg. Og Alexey jobber hardt og slipper en ny versjon av ClickHouse.
Det oppstĂ„r en praktisk oppgave â Ă„ teste den nye versjonen av ClickHouse pĂ„ vĂ„r klynge. Og selvfĂžlgelig Ăžnsker vi ikke Ă„ rulle den ut helt, vi Ăžnsker Ă„ sette en ny versjon i et hjĂžrne, og kanskje ikke bare Ă©n ny versjon, men to samtidig, fordi de lanseres ganske ofte.
Hva kan vi si om dette?

Her har vi nettopp en slik mulighet. Dette er maler for podâer. Man kan spesifisere, vĂ„r 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 Ăžnsker, hvilken versjon av lagring vi Ăžnsker. Vi kan fullstendig konfigurere klusteret i den konfigurasjonen vi trenger.

Vi skal dykke litt dypere. FĂžr dette snakket vi om hvordan ClickHouse-operatoren fungerer spesifikt for ClickHouse.
NĂ„ vil jeg gjerne si noen ord om hvordan hvilken som helst operator fungerer, samt hvordan den interagerer med K8s.

La oss fÞrst se pÄ interaksjonen med K8s. Hva skjer nÄr vi kjÞrer kubectl apply? VÄre objekter dukker opp i etcd via API.

For eksempel de grunnleggende Kubernetes-objektene: pod, StatefulSet, service og sÄ videre.
Samtidig skjer det ingen fysiske endringer ennÄ. Disse objektene mÄ materialiseres i klusteret.

For dette dukker det opp en kontroller. Kontrolleren er en spesialkomponent i k8s, som kan materialisere disse beskrivelsene. Den vet hva som mÄ gjÞres fysisk. Den vet hvordan man starter containere, hva som mÄ settes opp for at serveren skal fungere.

Og den materialiserer vÄre objekter i K8s.
Men vi Ăžnsker Ă„ operere ikke bare med podâer, StatefulSetâer, vi Ăžnsker Ă„ opprette ClickHouseInstallation, altsĂ„ et objekt av typen ClickHouse, sĂ„ vi kan operere med det som en helhet. ForelĂžpig finnes det ikke en slik mulighet.

Men K8s har en annen nyttig funksjon. Vi Ăžnsker at det skal oppstĂ„ en slik kompleks enhet, der vĂ„rt kluster er samlet fra podâer og StatefulSetâer.

Hva mÄ vi gjÞre for dette? FÞrst og fremst kommer Custom Resource Definition inn pÄ scenen. Hva er dette? Dette er en beskrivelse for K8s, som sier at du vil ha en annen datatyper, at vi Þnsker Ä legge til en tilpasset ressurs til pod, StatefulSet, som vil vÊre kompleks innvendig. Dette er beskrivelsen av dataskrukturen.

Vi sender det ogsÄ dit via kubectl apply. Kubernetes tok det med glede.
Og nÄ har vi i lagringen, for objektet i etcd, muligheten til Ä registrere den tilpassede ressursen med navnet ClickHouseInstallation.
Men inntil videre skjer det ikke noe mer. Det vil si, hvis vi nÄ lager en YAML-fil som vi har diskutert med beskrivelse av shards, replikaer, og sier «kubectl apply», sÄ vil Kubernetes godta den, lagre den i etcd og si: «Flott, men hva skal jeg gjÞre med den? Jeg vet ikke hvordan jeg skal hÄndtere ClickHouseInstallation».

Derfor trenger vi noen som kan hjelpe Kubernetes med Ä hÄndtere en ny type data. Til venstre har vi den innebygde Kubernetes-kontrolleren som arbeider med innebygde datatyper. Og til hÞyre mÄ vi ha en egendefinert kontroller som kan arbeide med egendefinerte datatyper.
Og den kalles ogsÄ en operator. Jeg har spesifikt plassert den utenfor Kubernetes her, fordi den kan kjÞre ogsÄ utenfor K8s. Ofte kjÞrer selvfÞlgelig alle operatorene i Kubernetes, men ingenting hindrer den fra Ä stÄ utenfor, sÄ derfor er den spesifikt plassert utenfor.

Den egendefinerte kontrolleren, som er operatĂžren, 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 Ăžnsker. Det er nettopp dette operatĂžren gjĂžr.

Hvordan fungerer operatĂžren? La oss se til hĂžyre for Ă„ finne ut hvordan den gjĂžr dette. Vi vil finne ut hvordan operatĂžren materialiserer alt dette, og hvordan interaksjonen med K8s fortsetter.

En operatÞr er et program. Den er hendelsesdrevet. OperatÞren abonnerer pÄ hendelser ved hjelp av Kubernetes API. I Kubernetes API finnes det tilgangspunkter hvor man kan abonnere pÄ hendelser. Og hvis noe endres i K8s, sÄ sender Kubernetes hendelser til alle som Þnsker det, det vil si, de som abonnerte pÄ dette API-punktet vil motta varsler.
OperatÞren abonnerer pÄ hendelser og mÄ reagere pÄ dem. Dens oppgave er Ä reagere pÄ de nye hendelsene som dukker opp.

Hendelsene genereres av oppdateringer. VÄr YAML-fil med beskrivelsen av ClickHouseInstallation kommer inn. Den gÄr gjennom kubectl apply til etcd. Der trer det inn en hendelse, og denne hendelsen kommer til ClickHouse-operatÞren. OperatÞren mottar denne beskrivelsen. Og den mÄ gjÞre noe. Hvis det kommer en oppdatering pÄ ClickHouseInstallation-objektet, sÄ mÄ klusteret oppdateres. Og operatÞrens oppgave er Ä oppdatere klusteret.

Hva gjÞr han? For det fÞrste mÄ vi lage en handlingsplan for hva vi skal gjÞre med denne oppdateringen. Oppdateringer kan vÊre veldig smÄ, dvs. smÄ i YAML-implementeringen, men kan fÞre til store endringer i klusteret. Derfor lager operatÞren en plan, og sÄ fÞlger han den.

Han begynner i henhold til denne planen Ă„ lage strukturen internt for Ă„ materialisere podder, tjenester, dvs. gjĂžre det som er hans hovedoppgave. Det er som Ă„ bygge et ClickHouse-kluster i Kubernetes.

La oss nÄ se pÄ noe interessant. Dette er ansvarsdelingen mellom Kubernetes og operatÞren, dvs. hva Kubernetes gjÞr, hva operatÞren gjÞr og hvordan de samhandler.
Kubernetes hÄndterer systemrelaterte ting, dvs. den grunnleggende sett med objekter som kan tolkes som systemomfang. Kubernetes vet hvordan man kjÞrer podder, hvordan man restart containerne, hvordan man monterer volumer, hvordan man arbeider med ConfigMap, dvs. alt som kan kalles systemet.
OperatĂžrer opererer innenfor spesifikke domener. Hver operatĂžr er laget for sitt spesifikke domene. Vi har laget for ClickHouse.
Og operatÞren samhandler nettopp i termer av det spesifikke domenet, som Ä legge til en replika, lage et skjema, sette opp overvÄkning. Det blir en slik inndeling.

La oss se pÄ et praktisk eksempel pÄ hvordan denne ansvarsdelingen skjer nÄr vi utfÞrer oppgaven med Ä legge til en replika.
OperatĂžren fĂ„r i oppgave â Ă„ legge til en replika. Hva gjĂžr operatĂžren? OperatĂžren beregner at det mĂ„ lages en ny StatefulSet, hvor vi mĂ„ beskrive bestemte maler, volumkrav.

Han forbereder alt dette og sender det videre til K8s. Han sier at han trenger ConfigMap, StatefulSet, Volum. Kubernetes utfĂžrer oppgaven. Han materialiserer de grunnleggende enhetene som han opererer med.

Og sÄ kommer ClickHouse-operatÞren inn i bildet igjen. Han har allerede en fysisk pod, hvor det kan gjÞres noe. Og ClickHouse-operatÞren jobber igjen i termer av det spesifikke domenet. For Ä aktivere en replika i klusteret mÄ ClickHouse, for det fÞrste, konfigurere datamodellen som finnes i dette klusteret. Og for det andre, mÄ denne replikas overvÄking settes opp slik at den kan spores godt. Det er operatÞren som konfigurerer dette.

Og fĂžrst 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 Ă„ bli med i klyngen.
Dermed blir kjeden av utfĂžrelse og ansvarsfordeling ved tillegging av replikas ganske lang.

La oss fortsette med vÄre praktiske oppgaver. Hvis klyngen allerede eksisterer, kan vi utfÞre migrering av konfigurasjonen.

Vi har gjort det slik at vi kan legge inn data i den eksisterende XML-filen som ClickHouse forstÄr.

Det er mulig Ă„ gjĂžre en finjustering av ClickHouse. Nettopp zoned deployment â det er hva jeg snakket om da jeg forklarte hostPath, lokal lagring. Det handler om hvordan man gjĂžr zoned deployment riktig.

Neste praktiske oppgave er overvÄking.

Hvis klyngen vÄr endres, mÄ overvÄkingen justeres regelmessig.
La oss se pÄ diagrammet. Vi har allerede vurdert de grÞnne pilene. NÄ la oss se pÄ de rÞde pilene. Dette viser hvordan vi Þnsker Ä overvÄke klyngen vÄr. Hvordan metrikker fra ClickHouse-klyngen kommer inn i Prometheus og deretter til Grafana.

Hva er utfordringen med overvÄking? Hvorfor betraktes det som en prestasjon? Utfordringen ligger nettopp i dynamikken. NÄr vi har én klynge som er statisk, kan vi sette opp overvÄkingen én gang og sÄ glemme den.
Men hvis vi har mange klynger, eller hvis noe stadig endres, er prosessen dynamisk. Og Ä stadig mÄtte justere overvÄkingen er en ressurs- og tidskrevende oppgave, det vil si selv det krever litt latskap. Dette mÄ automatiseres. Utfordringen ligger nettopp i prosessens dynamikk. Og operatÞren automatiserer dette veldig godt.

Hvordan har klyngen vÄr utviklet seg? I begynnelsen var den slik.

SĂ„ var den slik.

Til slutt ble den slik.
Og overvÄkingen gjÞres automatisk av operatÞren. En inngangspunkt.

Og vi ser bare pÄ utgangen i Grafana-dashbordet, hvordan livet i klyngen vÄr pulserer.
For Þvrig blir Grafana-dashbordet ogsÄ distribuert med operatÞren vÄr rett fra kildekoden. Det er mulig Ä koble til og bruke. Dette skjermbildet fikk jeg fra vÄr DevOps.

Hvor Þnsker vi Ä gÄ videre? Det er:
- Ă utvikle automatisering av testing. Hovedoppgaven er automatisk testing av nye versjoner.
- Vi Þnsker ogsÄ Ä 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Þrene bÞr begynne Ä integreres for Ä bygge en mer brukervennlig lÞsning.
- Vi Ăžnsker Ă„ gjĂžre mer avanserte livssykluskontroller.
- Jeg har markert grĂžnt det som er i anmarsj: arven fra Templates â FERTIG, det vil si at med neste utgivelse av operatĂžren vil vi allerede ha arving av maler. Dette er et kraftig verktĂžy som lar oss bygge komplekse konfigurasjoner fra biter.
- Og vi Ăžnsker automatisering av komplekse oppgaver. Den viktigste av disse er Re-sharding.

La oss oppsummere sÄ langt.

Hva fÄr vi ut av dette? Og er det verdt innsatsen eller ikke? Skulle vi i det hele tatt prÞve Ä integrere databasen i Kubernetes og bruke operatÞren generelt og Alitnity-operatÞren spesielt?
Utgangen blir:
- Betydelig forenkling og automatisering av konfigurasjon, distribusjon og vedlikehold.
- Umiddelbart innebygd overvÄking.
- Og klare, kodifiserte maler for komplekse situasjoner. Det er ikke lenger nĂždvendig Ă„ legge til en replika manuelt. Dette gjĂžres av operatĂžren.

Det er bare ett spÞrsmÄl igjen. Vi har allerede databasen i Kubernetes, virtualisering. Hvordan stÄr det til med ytelsen til en slik lÞsning, spesielt med tanke pÄ at ClickHouse er optimalisert for ytelse?
Svaret er â alt er i orden! Jeg vil ikke gĂ„ inn pĂ„ detaljene, dette er et eget tema for en presentasjon.

Men det finnes et prosjekt som heter TSBS. Hva er hovedoppgaven? Det er en ytelsestesting av databaser. Det er et forsÞk pÄ Ä sammenligne varme med varme, myk med myk.
Hvordan fungerer det? Det genereres et datasett. Deretter kjÞres dette datasettet gjennom et identisk sett med tester pÄ forskjellige databaser. Hver database lÞser en oppgave pÄ sitt eget mÄte. Deretter kan man sammenligne resultatene.
Det stĂžtter allerede mange databaser. Jeg har markert tre hovedtyper. Disse er:
- TimescaleDB.
- InfluxDB.
- ClickHouse.

Det ble ogsÄ gjort en sammenligning med en annen lignende lÞsning. Sammenligningen med RedShift. Sammenligningen ble gjort pÄ Amazon. ClickHouse overgÄr ogsÄ alle i denne sammenhengen.

Hvilke konklusjoner kan vi trekke fra det jeg har fortalt?
- DB i Kubernetes er mulig. Kanskje alle kan vÊre det, men generelt ser det ut til at det er mulig. ClickHouse i Kubernetes er absolutt mulig med hjelp fra vÄr operator.
- Operatoren hjelper med Ă„ automatisere prosesser og gjĂžr livet enklere.
- Ytelsen er normal.
- Og vi mener at dette kan og bĂžr brukes.
Open source â bli med!
Som jeg allerede har sagt, er operatoren et helt open source produkt, sÄ det ville vÊrt veldig bra om sÄ mange som mulig bruker det. Bli med! Vi venter pÄ dere alle!
Takk til alle!
SpÞrsmÄl

Takk for presentasjonen! Jeg heter Anton. Jeg er fra SEMrush. Jeg er interessert i logging. Vi hÞrer om overvÄking, men ingenting om logging nÄr vi snakker om hele klyngen. Vi har for eksempel satt opp en klynge pÄ eget utstyr. Og vi bruker sentralisert logging, samler med standardverktÞy i en felles logg, og deretter henter vi ut interessante data.
Godt spĂžrsmĂ„l, altsĂ„ logging stĂ„r pĂ„ todo-listen. VĂ„r operator automatiserer ikke dette for Ăžyeblikket. Den er fortsatt under utvikling, prosjektet er fortsatt relativt ungt. Vi forstĂ„r nĂždvendigheten av logging. Dette er ogsĂ„ et veldig viktig tema. Og det er kanskje ikke mindre viktig enn overvĂ„king. Men det fĂžrste pĂ„ listen for implementering var overvĂ„king. Logging vil komme. Vi gjĂžr selvfĂžlgelig vĂ„rt beste for Ă„ automatisere alle aspekter av klyngens livssyklus. SĂ„ svaret er â i Ăžyeblikket kan ikke operatoren dette, men det er pĂ„ planen, og vi vil gjĂžre det. Hvis noen har lyst til Ă„ bidra, sĂ„ send inn en pull request, vĂŠr sĂ„ snill.
Hei! Takk for presentasjonen! Jeg har et standardspÞrsmÄl knyttet til Persistent Volumes. NÄr vi oppretter en konfigurasjon med denne operatoren, hvordan bestemmer operatoren hvilken node vi har montert en disk eller mappe pÄ? MÄ vi pÄ forhÄnd forklare at vi Þnsker Ä plassere vÄr ClickHouse nettopp pÄ de nodene der det finnes disk?
SÄ vidt jeg forstÄr, er dette spÞrsmÄlet en fortsettelse av lokal lagring, spesielt delen som gjelder hostPath. Det er som Ä forklare hele systemet at pod'en mÄ kjÞre pÄ en spesifikk node hvor vi har en fysisk tilkoblet disk som er montert pÄ en spesifikk sti. Dette er en hel seksjon som jeg berÞrte veldig overfladisk fordi svaret er ganske omfattende.
Kort sagt ser det slik ut. Vi mÄ selvfÞlgelig gjÞre provisioning av disse volumene. Per nÄ finnes det ingen dynamisk provisioning i local storage, sÄ DevOps mÄ selv opprette diskene, disse volumene. De mÄ forklare Kubernetes provisioning at du vil ha Persistent volumes av en bestemt klasse, som ligger pÄ bestemte noder. Deretter mÄ de forklare Kubernetes at pod'er som krever en bestemt klasse local storage, kun skal planlegges pÄ de bestemte nodene basert pÄ labels. For dette formÄlet har operatÞren muligheten til Ä tildele en bestemt label og en per host-instans. Dermed vil pod'ene bli rutet av Kubernetes for Ä kjÞre kun pÄ noder som oppfyller kravene, labels, for Ä si det enkelt. Administratorene tildeler labels og gjÞr provisioning av diskene manuelt. Og sÄ kan det skaleres.
Og nettopp det tredje alternativet for local storage hjelper litt med dette. Som jeg allerede har pÄpekt, er det et tidkrevende arbeid med konfigurasjon som ved sluttresultatet hjelper Ä oppnÄ maksimal ytelse.
Jeg har et annet spÞrsmÄl relatert til dette. Kubernetes var tenkt slik at vi ikke bryr oss om vi mister en node eller ikke. Hva gjÞr vi i dette tilfellet hvis vi mister noden der shard'en vÄr ligger?
Ja, Kubernetes ble opprinnelig posisjonert pÄ den mÄten at vi behandler vÄre pod'er som storfe, mens her blir hver disk noe som ligner pÄ et kjÊledyr. Det er et problem at vi ikke bare kan kaste dem bort. Utviklingen av Kubernetes gÄr i retning av at vi ikke kan forholde oss helt filosofisk til dette, som til helt avhendte ressurser.
NÄ et praktisk spÞrsmÄl. Hva gjÞr du hvis du har mistet en node der disken var? Dette problemet lÞses allerede pÄ et hÞyere nivÄ. I tilfellet med ClickHouse har vi replikater som fungerer pÄ et hÞyere nivÄ, dvs. pÄ ClickHouse-nivÄ.
Hva blir sÄ disposisjonen? Det er DevOps som har ansvaret for at dataene ikke gÄr tapt. Han mÄ korrekt konfigurere replikasjonen og sÞrge for at replikasjonen utfÞres. Dataene mÄ vÊre duplisert i replikene pÄ ClickHouse-nivÄ. Dette er ikke en oppgave som operatÞren lÞser. Og det er ikke en oppgave som Kubernetes selv lÞser. Det er pÄ ClickHouse-nivÄ.
Hva skal man gjÞre hvis den fysiske noden din faller av? Det viser seg at du mÄ sette opp en ny, riktig provisjonere en disk, og pÄfÞre etiketter. Etter dette vil den oppfylle kravene om at Kubernetes kan starte en instans av en pod pÄ den. Kubernetes vil starte den. Antall pod-er dine er jo ikke tilstrekkelig i henhold til spesifikasjonene. Den vil gÄ gjennom syklusen som jeg viste. Og pÄ det Þverste nivÄet for ClickHouse vil det forstÄ at vÄr replika er kommet inn, den er fortsatt tom, og vi mÄ begynne Ä overfÞre data til den. Det vil si at denne prosessen fortsatt er lite automatisert.
Takk for foredraget! NÄr det skjer uventede hendelser, faller operatÞren og starter pÄ nytt, mens hendelser inntreffer, hvordan hÄndterer dere dette?
Hva skjer hvis operatÞren faller og starter pÄ nytt, ikke sant?
Ja. Og i dette Ăžyeblikket kom det hendelser.
Oppgaven om hva man skal gjÞre i dette tilfellet deles delvis mellom operatÞren og Kubernetes. Kubernetes har muligheten til Ä spille av den skjede hendelsen. Den spiller av. Og det er oppgaven til operatÞren Ä sÞrge for at nÄr hendelsene blir spilt pÄ nytt, sÄ er disse hendelsene idempotente. Og at en gjentatt inntreden av den samme hendelsen ikke bryter systemet vÄrt. Og vÄr operatÞr hÄndterer denne oppgaven.
Hei! Takk for foredraget! Dmitrij Zavyalov, selskapet Smedova. Er det planlagt Ä legge til muligheten for Ä konfigurere med haproxy i operatÞren? Det ville vÊrt interessant med en annen balansehÄndterer enn standarden, slik at den er smart og forstÄr hva ClickHouse faktisk er.
Snakker du om Ingress?
Ja, Ă„ erstatte Ingress med haproxy. I haproxy kan man spesifisere topologien til klyngen, hvor replikene befinner seg.
ForelĂžpig har vi ikke tenkt pĂ„ dette. Hvis dette er nĂždvendig for deg og du kan forklare hvorfor det er nĂždvendig, kan det realiseres, spesielt hvis du Ăžnsker Ă„ delta. Vi vurderer det gjerne. Kort svar â nei, vi har ikke denne funksjonaliteten for Ăžyeblikket. Takk for innspill, vi vil se pĂ„ det. Og hvis du ogsĂ„ forklarer bruksomrĂ„det og hvorfor det er nĂždvendig i praksis, for eksempel ved Ă„ opprette issues pĂ„ GitHub, vil det vĂŠre flott.
Det er allerede gjort.
Bra. Vi er Äpne for alle forslag. Og haproxy legges til todo-listen. Todo-listen vokser, ikke minker ennÄ. Men det er bra, det betyr at produktet er etterspurt.
Kilde: habr.com
