{"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\/it\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","title":{"rendered":"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/56e002c7408c4708e39ece867f84171e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La relazione si concentra su questioni pratiche nello sviluppo di un operatore in Kubernetes, progettando la sua architettura e i principi fondamentali del suo funzionamento.<\/p>\n<p><\/p>\n<p>Nella prima parte della relazione esamineremo:<\/p>\n<p><\/p>\n<ul>\n<li>cosa sia un operatore in Kubernetes e a cosa serva;<\/li>\n<li>come un operatore semplifica la gestione di sistemi complessi;<\/li>\n<li>cosa pu\u00f2 e cosa non pu\u00f2 fare un operatore.<\/li>\n<\/ul>\n<p><\/p>\n<p>Successivamente, passeremo alla discussione della struttura interna dell'operatore. Esamineremo l'architettura e il funzionamento dell'operatore passo dopo passo. Approfondiremo:<\/p>\n<p><\/p>\n<ul>\n<li>l'interazione tra l'operatore e Kubernetes;<\/li>\n<li>quali funzioni l'operatore assume e quali delega a Kubernetes.<\/li>\n<\/ul>\n<p><\/p>\n<p>Analizzeremo la gestione di shard e repliche del database in Kubernetes.<br \/>\nPoi, discuteremo questioni relative allo storage dei dati:<\/p>\n<p><\/p>\n<ul>\n<li>come lavorare con Persistent Storage dal punto di vista dell'operatore;<\/li>\n<li>insidie nell'uso di Local Storage.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nella parte conclusiva della relazione esamineremo esempi pratici di applicazione <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">clickhouse-operator<\/a><\/noindex> con Amazon o Google Cloud Service. La relazione si basa sull'esempio dello sviluppo e dell'esperienza di utilizzo dell'operatore per 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=\"Riproduci 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>Mi chiamo Vladislav Klimenko. Oggi vorrei condividere la nostra esperienza nello sviluppo e nell'operazione di un operatore, specificamente un operatore per la gestione dei cluster di database. User\u00f2 come esempio <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">ClickHouse-operator<\/a><\/noindex> per gestire un cluster ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cc297a3edb3b2a5e30d0dc2725de4011.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Perch\u00e9 abbiamo la possibilit\u00e0 di parlare dell'operatore e di ClickHouse?<\/p>\n<p><\/p>\n<ul>\n<li>Ci occupiamo del supporto e dello sviluppo di ClickHouse. <\/li>\n<li>Attualmente cerchiamo di dare il nostro contributo allo sviluppo di ClickHouse. Siamo i secondi dopo Yandex per volume di modifiche apportate a ClickHouse. <\/li>\n<li>Cerchiamo di realizzare progetti aggiuntivi per l'ecosistema di ClickHouse. <\/li>\n<\/ul>\n<p><\/p>\n<p>Di uno di questi progetti vorrei parlarvi. Riguarda il ClickHouse-operator per Kubernetes. <\/p>\n<p><\/p>\n<p>Nel mio intervento vorrei affrontare due argomenti: <\/p>\n<p><\/p>\n<ul>\n<li>Il primo argomento \u00e8 come funziona il nostro operatore per la gestione dei database ClickHouse in Kubernetes. <\/li>\n<li>Il secondo argomento \u00e8 come funziona un operatore in generale, cio\u00e8 come interagisce con Kubernetes. <\/li>\n<\/ul>\n<p><\/p>\n<p>Questi due aspetti saranno collegati per tutto il mio intervento. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4cc9790e18e70ae1ccde2cf39ef4ef00.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A chi potrebbe interessare ascoltare ci\u00f2 che sto cercando di condividere?<\/p>\n<p><\/p>\n<ul>\n<li>Sar\u00e0 particolarmente interessante per chi gestisce operatori. <\/li>\n<li>Oppure per chi desidera costruirne uno proprio, per comprendere come funziona internamente, come l'operatore interagisce con Kubernetes e quali insidie potrebbero emergere. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/07545f7a0171b610697c519d4aa9cd43.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per comprendere al meglio ci\u00f2 di cui parleremo oggi, sarebbe utile avere una conoscenza di base su come funziona Kubernetes e una preparazione di base sulle tecnologie cloud. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/eff56cc3e83fde3d3e64d73d41b07417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Che cos'\u00e8 ClickHouse? \u00c8 un database colonnare specializzato nell'elaborazione online di query analitiche. Ed \u00e8 completamente open source. <\/p>\n<p><\/p>\n<p>E dobbiamo sapere solo due cose. Dobbiamo sapere che si tratta di un database, quindi ci\u00f2 di cui parler\u00f2 sar\u00e0 applicabile praticamente a qualsiasi database. E che il DBMS ClickHouse si scala molto bene, offrendo quasi linearit\u00e0 nella scalabilit\u00e0. Pertanto, lo stato del cluster \u00e8 una condizione naturale per ClickHouse. Ci interessa discutere principalmente come gestire un cluster ClickHouse in Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5eb1ff5026c492117bf2467b10de7053.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Perch\u00e9 \u00e8 necessario? Perch\u00e9 non possiamo continuare a gestirlo da soli? Le risposte sono parzialmente tecniche e parzialmente organizzative. <\/p>\n<p><\/p>\n<ul>\n<li>Nella pratica, ci troviamo sempre pi\u00f9 spesso di fronte a situazioni in cui nelle grandi aziende praticamente tutti i componenti sono gi\u00e0 in Kubernetes. Rimangono escluse solo le basi di dati. <\/li>\n<li>E la domanda che si pone sempre pi\u00f9 spesso \u00e8: \u00ab\u00c8 possibile inserirlo all'interno?\u00bb. Pertanto, le grandi aziende cercano di massimizzare l'unificazione della gestione per poter gestire rapidamente i propri archivi di dati. <\/li>\n<li>Questo \u00e8 particolarmente utile quando \u00e8 necessaria la massima ripetibilit\u00e0 in una nuova posizione, cio\u00e8 la massima portabilit\u00e0.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/99312e74bd7ed4031128c7ec872f6a68.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quanto \u00e8 semplice o complesso? Certo, \u00e8 possibile farlo manualmente. Ma non \u00e8 cos\u00ec semplice, poich\u00e9 ci sono gi\u00e0 le complessit\u00e0 nella gestione di Kubernetes, mentre si sovrappongono le specificit\u00e0 di ClickHouse. Questo porta a una sorta di aggregazione. <\/p>\n<p><\/p>\n<p>E tutto ci\u00f2 crea un insieme piuttosto ampio di tecnologie, la cui gestione diventa gi\u00e0 piuttosto complessa, poich\u00e9 Kubernetes porta le sue questioni quotidiane di sfruttamento, e ClickHouse porta le sue questioni quotidiane di gestione. Specialmente se abbiamo pi\u00f9 istanze di ClickHouse e dobbiamo costantemente occuparci di loro. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ca10b805b2744d1a5283f96b0ac1cc11.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In ClickHouse, when configuring dynamically, there are numerous questions that create a constant burden on DevOps.<\/p>\n<p><\/p>\n<ul>\n<li>When we want to change something in ClickHouse, for instance, adding a replica or a shard, we need to manage the configuration. <\/li>\n<li>Then we must adjust the data schema because ClickHouse has a specific way of sharding. We need to lay out the data schema and the configurations. <\/li>\n<li>Monitoring must be set up. <\/li>\n<li>Logging collection for new shards and new replicas. <\/li>\n<li>Ensuring recovery.<\/li>\n<li>And restarting. <\/li>\n<\/ul>\n<p><\/p>\n<p>These are routine tasks that we wish to simplify in operations.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2461e861ca1d2f2344ead9decf85a97e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kubernetes assists well in operations, but only for basic system tasks. <\/p>\n<p><\/p>\n<p>Kubernetes effectively alleviates and automates tasks such as:<\/p>\n<p><\/p>\n<ul>\n<li>Recovery.<\/li>\n<li>Restarting. <\/li>\n<li>Storage management.<\/li>\n<\/ul>\n<p><\/p>\n<p>This is good; it's the right direction, but it has no comprehensive understanding of how to operate a database cluster. <\/p>\n<p><\/p>\n<p>We desire more; we want our entire database to function within Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6564e9f29d5d518925c8593bca978345.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vorresti qualcosa come un grande pulsante rosso magico su cui premi e ottieni un cluster che si sviluppa e si gestisce per tutto il suo ciclo di vita, affrontando compiti quotidiani da risolvere. Cluster ClickHouse in Kubernetes.<\/p>\n<p><\/p>\n<p>Abbiamo cercato di realizzare una soluzione che rendesse il lavoro pi\u00f9 facile. Questo \u00e8 ClickHouse-operator per Kubernetes di Altinity.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ff80c6fc59069ec900d545096ad978d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un operatore \u00e8 un programma la cui principale responsabilit\u00e0 \u00e8 gestire altri programmi, ovvero \u00e8 un gestore. <\/p>\n<p><\/p>\n<p>Contiene modelli di comportamento. Questo pu\u00f2 essere definito come conoscenze codificate sulla materia. <\/p>\n<p><\/p>\n<p>Il suo compito principale \u00e8 semplificare la vita ai DevOps e ridurre il micromanagement, affinch\u00e9 possano gi\u00e0 pensare in termini di alto livello, evitando di doversi occupare del micromanagement e di configurare manualmente tutti i dettagli. <\/p>\n<p><\/p>\n<p>E l'operatore funge da assistente robotico che si occupa delle micro-attivit\u00e0 e supporta i DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0824a1fa710e8c4f45406aa7f596b977.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A cosa serve un operatore? Si dimostra particolarmente efficace in due aspetti:<\/p>\n<p><\/p>\n<ul>\n<li>Quando un esperto di ClickHouse non ha abbastanza esperienza, ma \u00e8 necessario utilizzare ClickHouse, l'operatore semplifica la gestione e consente l'esecuzione di un cluster ClickHouse con una configurazione piuttosto complessa, senza addentrarsi troppo nei dettagli su come funziona internamente. Basta dargli incarichi di alto livello e tutto funziona. <\/li>\n<li>E il secondo compito in cui si distingue di pi\u00f9 \u00e8 quando \u00e8 necessario automatizzare un gran numero di compiti standard. Rimuove le microattivit\u00e0 dagli amministratori di sistema. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f1cb11156d57f560d0b6c82700ac6ff8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo \u00e8 particolarmente utile sia per chi sta appena iniziando il proprio percorso, sia per chi deve dedicarsi molto all'automazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/128e7d9ff1ce0c535f98be66aedb1060.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qual \u00e8 quindi la differenza tra un approccio basato sugli operatori e altri sistemi? C'\u00e8 anche Helm. Anche questo aiuta a installare ClickHouse e si possono creare helm charts che installano persino un intero cluster di ClickHouse. Qual \u00e8 quindi la differenza tra l'operatore e, ad esempio, Helm?<\/p>\n<p><\/p>\n<p>La fondamentale differenza \u00e8 che Helm \u00e8 un gestore di pacchetti, mentre l'operatore va oltre. Si occupa dell'intero ciclo di vita. Non si tratta solo di installazione, ma di attivit\u00e0 quotidiane che comprendono scalabilit\u00e0, sharding e tutto ci\u00f2 che deve essere eseguito nel processo di vita (inclusa eventualmente anche la rimozione) \u2013 tutto questo lo gestisce l'operatore. Cerca di automatizzare e mantenere l'intero ciclo di vita del software. Questo \u00e8 il suo fondamentale distinto rispetto ad altre soluzioni disponibili. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e26b57c8caf8437f683d7afbfa127ebd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questa \u00e8 stata la parte introduttiva, ora andiamo avanti. <\/p>\n<p><\/p>\n<p>Come costruiamo il nostro operatore? Cerchiamo di gestire il cluster ClickHouse come una risorsa unica. <\/p>\n<p><\/p>\n<p>Qui sulla sinistra abbiamo i dati in ingresso. \u00c8 un YAML con la specifica del cluster, che viene tradizionalmente inviato a Kubernetes tramite kubectl. Qui l'operatore coglie il tutto e fa la sua magia. E in uscita abbiamo uno schema come questo. \u00c8 l'implementazione di ClickHouse in Kubernetes.<\/p>\n<p><\/p>\n<p>E successivamente cominceremo a esaminare lentamente come funziona l'operatore e quali compiti tipici possono essere risolti. Esamineremo solo i compiti tipici, poich\u00e9 abbiamo tempo limitato. E non parleremo di tutto ci\u00f2 che l'operatore pu\u00f2 gestire. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b40401931b58988058419d4495dbb1bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Partiamo dalla pratica. Il nostro progetto \u00e8 completamente open source, quindi puoi vedere su GitHub come funziona. E puoi considerare che, se vuoi semplicemente avviare, puoi iniziare con la Quick Start Guide.<\/p>\n<p><\/p>\n<p>Se vuoi approfondire, ci impegniamo a mantenere la documentazione in uno stato pi\u00f9 o meno decente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9414d7c3aa94b6ad999e150f0ac25a97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iniziamo con un compito pratico. La prima cosa da cui tutti vogliamo partire \u00e8 lanciare il primo esempio in qualche modo. Come avviare ClickHouse utilizzando l'operatore, anche senza sapere molto su come funziona? Scriviamo un manifesto, poich\u00e9 tutta la comunicazione con k8s avviene tramite manifesti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3e97cd235827460693ed95fb3598d31d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco un manifesto complesso. Ci\u00f2 che abbiamo evidenziato in rosso \u00e8 su cui dobbiamo concentrarci. Chiediamo all'operatore di creare un cluster di nome demo.<\/p>\n<p><\/p>\n<p>Questi sono solo esempi di base. Lo Storage non \u00e8 ancora descritto, ma torneremo a parlarne pi\u00f9 tardi. Nel frattempo, osserviamo come evolve il cluster.<\/p>\n<p><\/p>\n<p>Abbiamo creato questo manifesto. Lo stiamo dando in pasto al nostro operatore. Ha lavorato e ha fatto la sua magia.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/502e64fbe6ed7d04b2aecb7d51abc7f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Guardiamo la console. Tre componenti catturano l'attenzione: il Pod, i due Service e lo StatefulSet.<\/p>\n<p><\/p>\n<p>L'operatore ha fatto il suo lavoro, e possiamo vedere cosa ha esattamente creato. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/67faf120e21e5113680ccff9c71b00f1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Crea una struttura simile a questa. Abbiamo uno StatefulSet, un Pod, un ConfigMap per ogni replica e un ConfigMap per l'intero cluster. Servizi obbligatori come punti di ingresso nel cluster. <\/p>\n<p><\/p>\n<p>I servizi comprendono il Load Balancer Service centrale e si possono avere anche per ogni replica, per ogni shardo. <\/p>\n<p><\/p>\n<p>Ecco come appare il nostro cluster di base. \u00c8 composto da un'unica nod. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f235ada45ee58b517c0e041f795ae122.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Andiamo avanti, lo complicheremo. Dobbiamo shardizzare il cluster.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/992836a00434c64fb4616c1c4cc4df97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le nostre esigenze stanno crescendo, c'\u00e8 dinamica. Vogliamo aggiungere uno shardo. Seguiamo lo sviluppo. Cambiamo la nostra specifica. Indichiamo che desideriamo due shard. <\/p>\n<p><\/p>\n<p>Questo \u00e8 lo stesso file, che si evolve dinamicamente con la crescita del sistema. Lo Storage non \u00e8 trattato, ma ne discuteremo pi\u00f9 avanti, \u00e8 un argomento a parte.<\/p>\n<p><\/p>\n<p>Diamo in pasto l'operatore YAML e vediamo cosa succede. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8ddb5845cae160098470208f51b5da7c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'operatore ha riflettuto e ha creato le seguenti entit\u00e0. Abbiamo gi\u00e0 due Pod, tre Service e, improvvisamente, due StatefulSet. Perch\u00e9 due StatefulSet?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/26eb734ff1a195de2ceaab842b472ee4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nello schema era cos\u00ec: questa \u00e8 la nostra condizione iniziale, quando avevamo un solo pod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/657838b0d378121fdd66ad3ff8168600.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Adesso \u00e8 diventato cos\u00ec. Finora \u00e8 tutto semplice, si \u00e8 duplicato. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f039a7046f1c56fbdad6b5a26a519b10.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E perch\u00e9 ci sono due StatefulSet? Qui bisogna divagare e discutere come in Kubernetes avviene la gestione dei Pod.<\/p>\n<p><\/p>\n<p>Esiste un oggetto chiamato StatefulSet, che consente di creare un insieme di Pod da un modello. Qui il fattore chiave \u00e8 il Template. E in un unico StatefulSet si possono avviare molti Pod da un solo modello. E la frase chiave qui \u00e8 \u00abmolti Pod da un solo modello\u00bb.<\/p>\n<p><\/p>\n<p>C'era una grande tentazione di creare l'intero cluster, impacchettandolo in un unico StatefulSet. Questo funzionerebbe, non ci sono problemi. Ma c'\u00e8 un piccolo dettaglio. Se vogliamo assemblare un cluster eterogeneo, cio\u00e8 composto da pi\u00f9 versioni di ClickHouse, qui iniziano i problemi. S\u00ec, StatefulSet pu\u00f2 fare un aggiornamento rolling, s\u00ec, si pu\u00f2 applicare una nuova versione, specificando che non \u00e8 consigliabile provare pi\u00f9 di un certo numero di nodi contemporaneamente.<\/p>\n<p><\/p>\n<p>Ma se extrapoliamo il compito e diciamo che vogliamo creare un cluster completamente eterogeneo, e non vogliamo semplicemente eseguire un rolling update dalla vecchia versione alla nuova, ma vogliamo creare un cluster eterogeneo sia in termini di diverse versioni di ClickHouse che di storage. Vogliamo, ad esempio, creare alcune repliche su dischi separati, su dischi pi\u00f9 lenti, insomma, costruire completamente un cluster eterogeneo. Poich\u00e9 lo StatefulSet realizza una soluzione standardizzata da un singolo modello, non \u00e8 possibile fare tutto ci\u00f2. <\/p>\n<p><\/p>\n<p>Dopo alcune riflessioni, \u00e8 stata presa la decisione di procedere in questo modo. Ogni replica avr\u00e0 il proprio StatefulSet. Ci sono alcuni svantaggi in questa soluzione, ma in pratica tutto \u00e8 completamente racchiuso nell'operatore. E ci sono molti vantaggi. Possiamo costruire un cluster esattamente come lo desideriamo, ad esempio, assolutamente eterogeneo. Pertanto, nel cluster in cui abbiamo due shard con una replica ciascuno, avremo 2 StatefulSet e 2 Pod, proprio perch\u00e9 abbiamo scelto questo approccio per le ragioni sopra menzionate che ci consentono di costruire un cluster eterogeneo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b7ae92a545f9bb6cc5f0136df87207f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Torniamo alle applicazioni pratiche. Nel nostro cluster dobbiamo configurare gli utenti, cio\u00e8 dobbiamo effettuare alcune configurazioni di ClickHouse in Kubernetes. L'operatore offre tutte le possibilit\u00e0 per farlo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6a65aa78293c0b40230cf24efc58e55a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Possiamo scrivere direttamente in YAML quello che vogliamo. Tutte le opzioni di configurazione si mappano direttamente da questo YAML ai file di configurazione di ClickHouse, che poi vengono distribuiti su tutto il cluster.<\/p>\n<p><\/p>\n<p>Possiamo scrivere anche in questo modo. Questo \u00e8 solo un esempio. \u00c8 possibile fare una password criptata. Tutte le opzioni di configurazione di ClickHouse sono supportate. Qui c'\u00e8 solo un esempio. <\/p>\n<p><\/p>\n<p>La configurazione del cluster viene distribuita come ConfigMap. Nella pratica, l'aggiornamento di ConfigMap non avviene istantaneamente, quindi se il cluster \u00e8 grande, il processo di immissione della configurazione richiede del tempo. Ma tutto ci\u00f2 \u00e8 molto comodo da gestire.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2e42d19d7a558e3b8d4bbb51fe5bd08b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Complichiamo il compito. Il cluster si sta sviluppando. Vogliamo replicare i dati. Cio\u00e8, abbiamo gi\u00e0 due shard, con una replica, e gli utenti sono configurati. Stiamo crescendo e vogliamo occupentrarci della replicazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c97e5e6ca9cb66d3a94fb8cfe610186.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cosa ci serve per la replicazione? <\/p>\n<p><\/p>\n<p>Abbiamo bisogno di ZooKeeper. In ClickHouse, la replicazione \u00e8 costruita utilizzando ZooKeeper. ZooKeeper \u00e8 necessario affinch\u00e9 diverse repliche di ClickHouse raggiungano un consenso su quali blocchi di dati siano presenti in ciascun ClickHouse. <\/p>\n<p><\/p>\n<p>Si pu\u00f2 utilizzare qualsiasi versione di ZooKeeper. Se l'azienda ha un ZooKeeper esterno, pu\u00f2 essere utilizzato. In caso contrario, possiamo installarlo dal nostro repository. Esiste un installatore che semplifica tutto questo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6cc40951a19b982abf578836edf569d3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La schema di interazione dell'intero sistema \u00e8 la seguente. Abbiamo Kubernetes come piattaforma. Su di essa eseguiamo l'operatore ClickHouse. Ho rappresentato ZooKeeper qui. L'operatore interagisce sia con ClickHouse che con ZooKeeper. Quindi, si ottiene un'interazione. <\/p>\n<p><\/p>\n<p>Tutto ci\u00f2 \u00e8 necessario affinch\u00e9 ClickHouse replichi con successo i dati in k8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4fc37aee850acd20517fa3d7562f0165.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora diamo un'occhiata al compito stesso, a come apparir\u00e0 il manifesto per la replicazione.<\/p>\n<p><\/p>\n<p>Aggiungiamo due sezioni al nostro manifesto. La prima riguarda da dove ottenere ZooKeeper, che pu\u00f2 essere sia interno a Kubernetes che esterno. \u00c8 semplicemente una descrizione. E richiediamo repliche. Vale a dire, vogliamo due repliche. In totale, quindi, avremo 4 pod. Ricordiamo lo storage, che verr\u00e0 menzionato pi\u00f9 avanti. Lo storage \u00e8 un argomento a parte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb8c974d0587a4ad87d6ba36bbe5e3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Era cos\u00ec.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/909ffd258dbce718ddf529a1a753de6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Diventa cos\u00ec. Vengono aggiunte delle repliche. La quarta non ci stava, crediamo che ce ne possano essere molte. E viene aggiunto ZooKeeper di lato. Gli schemi diventano pi\u00f9 complessi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c33b37fc7fc72f51276e5e98b9ec2134.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c8 arrivato il momento di aggiungere il prossimo compito. Aggiungeremo Storage Persistente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f28d14901a713eca413a52ec6ea21ac5.jpeg\" style=\"display:block;margin: 0 auto;\" \/>Per quanto riguarda lo Storage Persistente, abbiamo diverse opzioni di implementazione.<\/p>\n<p><\/p>\n<p>Nel caso in cui ci troviamo su un provider cloud, ad esempio, utilizzando Amazon o Google, c'\u00e8 una grande tentazione di utilizzare lo storage cloud. \u00c8 molto comodo, \u00e8 vantaggioso. <\/p>\n<p><\/p>\n<p>E c'\u00e8 una seconda opzione. Questa \u00e8 per lo storage locale, quando abbiamo dischi locali su ciascun nodo. Questa opzione \u00e8 molto pi\u00f9 complessa da implementare, ma \u00e8 pi\u00f9 performante. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/483ee5c08b62e987620bf54fd32a44b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Diamo un'occhiata a cosa abbiamo riguardo allo storage cloud.<\/p>\n<p><\/p>\n<p>Ci sono vantaggi. \u00c8 molto semplice da configurare. Ordiniamo semplicemente al provider cloud di fornirci uno storage di una certa capacit\u00e0, di una certa classe. Le classi sono definite dai provider stessi. <\/p>\n<p><\/p>\n<p>E c'\u00e8 uno svantaggio. Per qualcuno questo svantaggio non \u00e8 critico. Certamente, ci saranno alcune problematiche di prestazioni. \u00c8 molto comodo in uso, affidabile, ma ci sono potenziali cali di prestazioni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8e82430b64477f91640078ff4eacb47e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poich\u00e9 ClickHouse si concentra principalmente sulle prestazioni, si pu\u00f2 dire che sfrutti al massimo ogni risorsa; per questo molte aziende cercano di ottenere il massimo delle prestazioni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8638fe37b848a98ce8326218d368baa3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per ottenere il massimo, abbiamo bisogno di storage locale.<\/p>\n<p><\/p>\n<p>Kubernetes fornisce tre astrazioni per l'uso dello storage locale in Kubernetes. Queste sono: <\/p>\n<p><\/p>\n<ul>\n<li>EmptyDir<\/li>\n<li>HostPath.<\/li>\n<li>Locale<\/li>\n<\/ul>\n<p><\/p>\n<p>Esaminiamo in che modo si differenziano e in cosa sono simili. <\/p>\n<p><\/p>\n<p>Innanzitutto, in tutti e tre gli approcci, lo storage si basa su dischi locali che si trovano sulla stessa nodo fisica di k8s. Tuttavia, ci sono alcune differenze.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79afb620a0c9a1552b47240b405fedc9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iniziamo con il pi\u00f9 semplice, ovvero emptyDir. Di cosa si tratta nella pratica? In sostanza, chiediamo al nostro specifica al sistema di containerizzazione (che pi\u00f9 spesso \u00e8 Docker) di fornirci accesso a una cartella sul disco locale.<\/p>\n<p><\/p>\n<p>In pratica, Docker crea una cartella temporanea da qualche parte, assegnandole un lungo hash come nome. E fornisce un'interfaccia per accedervi. <\/p>\n<p><\/p>\n<p>Come funzioner\u00e0 in termini di prestazioni? Funzioner\u00e0 alla velocit\u00e0 del disco locale, quindi si tratta di un accesso completo al proprio hardware. <\/p>\n<p><\/p>\n<p>Tuttavia, questa modalit\u00e0 presenta uno svantaggio. Persistent \u00e8 piuttosto discutibile in questo caso. Alla prima azione del docker con i container, Persistent si perde. Se a Kubernetes venisse in mente di spostare questo Pod su un altro disco per qualche motivo, i dati andrebbero perduti. <\/p>\n<p><\/p>\n<p>Questo approccio \u00e8 buono per i test, perch\u00e9 mostra gi\u00e0 una velocit\u00e0 normale, ma per qualcosa di serio questa soluzione non \u00e8 adatta. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0b60f80fc9ea0e2c1820021bcd9e1382.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco quindi un secondo approccio. Si tratta di hostPath. Se guardiamo il diapositiva precedente e questa, possiamo notare una sola differenza. La nostra cartella \u00e8 uscita dal docker direttamente sulla nodi Kubernetes. \u00c8 un po' pi\u00f9 semplice. Scriviamo direttamente il percorso nel file system locale, dove vorremmo memorizzare i nostri dati. <\/p>\n<p><\/p>\n<p>Questo metodo ha i suoi vantaggi. \u00c8 gi\u00e0 un vero Persistent, e per di pi\u00f9 classico. I dati saranno registrati su disco in un certo indirizzo. <\/p>\n<p><\/p>\n<p>Ci sono anche degli svantaggi. La complessit\u00e0 nella gestione \u00e8 uno di essi. Il nostro Kubernetes potrebbe decidere di spostare un Pod su un'altra nodo fisica. Qui entra in gioco il DevOps. Deve spiegare correttamente all'intero sistema che questi pod possono essere spostati solo su nodi in cui hai qualcosa montato lungo quei percorsi, e non pi\u00f9 di un nodo alla volta. \u00c8 piuttosto complesso. <\/p>\n<p><\/p>\n<p>Proprio per questi scopi, noi come operatori abbiamo creato dei modelli per nascondere tutta questa complessit\u00e0. Cos\u00ec si potrebbe semplicemente dire: \u00abVoglio avere un'istanza di ClickHouse su ogni nodo fisico e su un determinato percorso\u00bb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f64c19bccc8b187d6af112eda896b25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma questa necessit\u00e0 non \u00e8 solo nostra, quindi i gentiluomini di Kubernetes capiscono anche che gli utenti vogliono avere accesso ai dischi fisici, e per questo forniscono un terzo livello.<\/p>\n<p><\/p>\n<p>Si chiama local. Le differenze rispetto alla diapositiva precedente sono praticamente nulle. Prima era necessario gestire manualmente il trasferimento dei pod da un nodo all'altro, poich\u00e9 dovevano essere collegati in un percorso specifico a un disco fisico locale, mentre ora tutte queste conoscenze sono incorporate in Kubernetes stesso. Risulta quindi molto pi\u00f9 semplice configurare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/140c43be34dd7015c0bf4cfd0a0bb384.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Torniamo al nostro compito pratico. Torniamo al template YAML. Qui abbiamo un vero storage. Siamo tornati su questo. Stiamo impostando un template di VolumeClaim classico come in k8s. E descriviamo quale storage vogliamo.<\/p>\n<p><\/p>\n<p>Dopo di ci\u00f2, k8s richieder\u00e0 storage. Ce ne fornir\u00e0 uno in StatefulSet. E alla fine questo sar\u00e0 a disposizione di ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/960e666486ed09cebd83235d43f83970.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Avevamo questo schema. Il nostro Persistent Storage era rosso, il che lasciava intendere che dovesse essere reso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a989df489e3a9fef6a4fbf7b93c489a6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E diventa verde. Ora lo schema del cluster ClickHouse su k8s \u00e8 completamente finalizzato. Abbiamo shard, repliche, ZooKeeper e un vero Persistent, realizzato in un modo o nell'altro. Lo schema \u00e8 gi\u00e0 completamente funzionante. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c409ee5da6309a67904394d968ed4906.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Continuiamo a progredire. Il nostro cluster si evolve. E Alexey si impegna e rilascia una nuova versione di ClickHouse.<\/p>\n<p><\/p>\n<p>Si presenta un compito pratico: testare la nuova versione di ClickHouse sul nostro cluster. Naturalmente, non vogliamo aggiornare tutto, ma preferiremmo installare la nuova versione in un angolo remoto, e magari anche non solo una nuova versione, ma ben due, visto che escono frequentemente. <\/p>\n<p><\/p>\n<p>Cosa possiamo dire al riguardo?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48ed52d393d977d0cfaa9320bd02ed1e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo proprio questa opportunit\u00e0. Ci sono dei modelli di pod. Possiamo elaborare la configurazione poich\u00e9 il nostro operatore consente di costruire un cluster eterogeneo. Cio\u00e8, possiamo configurarlo a partire da tutte le repliche insieme, fino a ogni singola replica specificando quale versione di ClickHouse vogliamo e quale versione di storage desideriamo. Possiamo configurare completamente il cluster secondo le nostre necessit\u00e0. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4949ecd8119cb4ec0f4bad9bf27fa74e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Adesso ci addentriamo un po' di pi\u00f9. Prima abbiamo parlato di come funziona ClickHouse-Operator in relazione alle specifiche di ClickHouse.<\/p>\n<p><\/p>\n<p>Ora vorrei dire alcune parole su come funziona generalmente qualsiasi operatore, e su come interagisce con K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ca9c2a23c54b2a81ac0a8bba88d5e65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iniziamo esaminando l'interazione con K8s. Cosa succede quando eseguiamo kubectl apply? I nostri oggetti appaiono in etcd tramite l'API. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b9eaedeb0f34d10398ba0187f09fef9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ad esempio, i componenti di base di Kubernetes: pod, StatefulSet, servizio e cos\u00ec via. <\/p>\n<p><\/p>\n<p>Tuttavia, non sta ancora accadendo nulla di fisico. Questi oggetti devono essere materializzati nel cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3c49dc1b0067347d5fc415ef9b87642d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A questo serve il controller. Il controller \u00e8 un componente speciale di k8s che sa come materializzare queste descrizioni. Sa come fare fisicamente e come avviare i container, cosa deve essere configurato affinch\u00e9 il server funzioni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d951eb0f7bacf519566b0ef6cf9bc100.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E materializza i nostri oggetti in K8s.<\/p>\n<p><\/p>\n<p>Ma non vogliamo operare solo con pod e StatefulSet, vogliamo creare un ClickHouseInstallation, cio\u00e8 un oggetto di tipo ClickHouse, per operarlo come un'unica entit\u00e0. Al momento, questa possibilit\u00e0 non esiste. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1594921ac5dd9384ce81ceae92f5cda9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma K8s ha una cosa piacevole. Vogliamo che emerga un'entit\u00e0 complessa da qualche parte, che integri pod e StatefulSet nel nostro cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/04f86706f506fa91e365d45537dd9def.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E cosa bisogna fare per questo? Innanzitutto, entra in scena la Custom Resource Definition. Cos'\u00e8? \u00c8 una descrizione per K8s, che stabilisce che avremo un ulteriore tipo di dati, e che vogliamo aggiungere una risorsa personalizzata che sar\u00e0 complessa all'interno di pod e StatefulSet. Questa \u00e8 la descrizione della struttura dei dati. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f02ae12ef3ab5db974234b14e38792ac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lo inviamo anche noi tramite kubectl apply. Kubernetes lo ha accolto con gioia. <\/p>\n<p><\/p>\n<p>E ora nella nostra archiviazione, l'oggetto in etcd ha la possibilit\u00e0 di registrare una risorsa personalizzata chiamata ClickHouseInstallation.<\/p>\n<p><\/p>\n<p>Ma fino ad ora non succeder\u00e0 niente di pi\u00f9. Cio\u00e8, se adesso creiamo un file YAML, come abbiamo visto, descrivendo shard, repliche e diciamo 'kubectl apply', Kubernetes lo accetter\u00e0, lo metter\u00e0 in etcd e dir\u00e0: 'Ottimo, ma non so cosa farne. Non so come gestire ClickHouseInstallation'. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7c2f9f3f81b83c987a3bd72a881d0d91.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pertanto, abbiamo bisogno di qualcuno che aiuti Kubernetes a gestire un nuovo tipo di dati. A sinistra abbiamo un controller Kubernetes predefinito che lavora con i tipi di dati standard. E a destra deve comparire un controller personalizzato che sa lavorare con i tipi di dati personalizzati. <\/p>\n<p><\/p>\n<p>E in un altro modo si chiama operatore. L'ho messo qui appositamente al di fuori di Kubernetes perch\u00e9 pu\u00f2 essere eseguito anche esternamente a K8s. Spesso, naturalmente, tutti gli operatori vengono eseguiti in Kubernetes, ma niente impedisce di posizionarlo all'esterno, quindi qui \u00e8 stato appositamente spostato all'esterno. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7aa3a1b67d0def5ba752dff56baeebbf.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E nel suo turno, il controller personalizzato, noto anche come operatore, interagisce con Kubernetes attraverso l'API. Sa gi\u00e0 come interagire con l'API e conosce gi\u00e0 come materializzare uno schema complesso a partire da una risorsa personalizzata, ci\u00f2 che vogliamo realizzare. \u00c8 proprio di questo che si occupa l'operatore. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a5f773ddc3663f24d5379955da9c3037.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come funziona l'operatore? Diamo un'occhiata alla parte destra per scoprire come fa. Scopriamo come l'operatore materializza tutto questo e come avviene ulteriormente l'interazione con K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/08a8d8dbcb35117a0eb3320589c6ff8d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'operatore \u00e8 un programma. \u00c8 orientato agli eventi. Utilizzando l'API di Kubernetes, l'operatore si iscrive agli eventi. Nell'API di Kubernetes ci sono punti di entrata dove ci si pu\u00f2 iscrivere agli eventi. E se qualcosa cambia in K8s, Kubernetes invia eventi a tutti gli interessati, ovvero chi si \u00e8 iscritto a quel punto dell'API ricever\u00e0 notifiche.<\/p>\n<p><\/p>\n<p>L'operatore si iscrive agli eventi e deve reagire in qualche modo. Il suo compito \u00e8 reagire agli eventi che si presentano. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f0664a4151e6e7f6f8575a3e54372e9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gli eventi vengono generati da alcuni aggiornamenti. Arriva il nostro file YAML con la descrizione di ClickHouseInstallation. Questo \u00e8 passato a etcd tramite kubectl apply. Qui si \u00e8 attivato un evento, che \u00e8 arrivato al ClickHouse-operator. L'operatore ha ricevuto questa descrizione. E ora ha qualcosa da fare. Se \u00e8 arrivato un aggiornamento per l'oggetto ClickHouseInstallation, bisogna aggiornare il cluster. Il compito dell'operatore \u00e8 quello di aggiornare il cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0952bdd391a72aa15bf66af4ce69f4af.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cosa fa? In primo luogo, deve elaborare un piano d'azione per gestire questo aggiornamento. Gli aggiornamenti possono essere molto piccoli, cio\u00e8 ridotti nell'esecuzione YAML, ma possono comportare cambiamenti molto grandi nel cluster. Perci\u00f2, l'operatore crea un piano e poi lo segue.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79caaa43b6fd9f3e2eb1afe44ecb2df9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Inizia a lavorare su questa struttura secondo il piano, per materializzare i pod, i servizi, cio\u00e8 per fare ci\u00f2 che \u00e8 il suo compito principale. \u00c8 come costruire un cluster ClickHouse in Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e91576a26d6b758a68ae0b35cbe01897.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora parliamo di un aspetto interessante. Questa \u00e8 la suddivisione delle responsabilit\u00e0 tra Kubernetes e l'operatore, cio\u00e8 cosa fa Kubernetes, cosa fa l'operatore e come interagiscono tra loro. <\/p>\n<p><\/p>\n<p>Kubernetes si occupa delle operazioni di sistema, ovvero del set base di oggetti che pu\u00f2 essere interpretato come ambito di sistema. Kubernetes sa come avviare pod, riavviare container, montare volumi e gestire ConfigMap, cio\u00e8 tutto ci\u00f2 che pu\u00f2 essere definito come sistema. <\/p>\n<p><\/p>\n<p>Gli operatori operano in settori specifici. Ogni operatore \u00e8 creato per il proprio settore. Ne abbiamo realizzato uno per ClickHouse.<\/p>\n<p><\/p>\n<p>E l'operatore interagisce precisamente in termini del settore, come aggiungere una replica, creare uno schema, configurare il monitoraggio. Questo porta a una chiara distinzione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9dc07d9c29d5dfd538343aadb751e4c0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vediamo un esempio pratico di come avviene questa suddivisione delle responsabilit\u00e0 quando eseguiamo l'azione di aggiungere una replica. <\/p>\n<p><\/p>\n<p>L'operatore riceve la richiesta di aggiungere una replica. Cosa fa l'operatore? Calcola che deve creare un nuovo StatefulSet, in cui deve descrivere determinati modelli e richieste di volume. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7a31f2f76a3bdda87e4bccf0e04fe4a8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ha preparato tutto questo e lo passa a K8s. Dice che ha bisogno di ConfigMap, StatefulSet e Volume. Kubernetes elabora la richiesta. Materializza le unit\u00e0 fondamentali con cui opera. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2be6892234cc12b056962265c13dba07.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E cos\u00ec entra in gioco di nuovo il ClickHouse-operator. Ha gi\u00e0 un pod fisico su cui pu\u00f2 iniziare a lavorare. E il ClickHouse-operator opera di nuovo in termini della specifica del dominio. Cio\u00e8, specificamente per ClickHouse, per includere una replica nel cluster \u00e8 necessario, prima di tutto, configurare lo schema dei dati presente in quel cluster. In secondo luogo, questa replica deve essere inclusa nel monitoraggio per garantirne un buon tracciamento. L'operatore si occupa di questa configurazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/790616342b98b347fa67e0100754c8b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E solo dopo questo entra in gioco il ClickHouse stesso, cio\u00e8 un'entit\u00e0 di livello superiore. Questa \u00e8 gi\u00e0 un database. Ha il proprio instance, un'altra replica configurata, pronta per entrare nel cluster.<\/p>\n<p><\/p>\n<p>Si ha cos\u00ec una catena di esecuzione e divisione delle responsabilit\u00e0 piuttosto lunga quando si aggiunge una replica.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ec79cfa2b45fadbe25f4d9fe8d2ec5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Continuiamo con i nostri esercizi pratici. Se il cluster \u00e8 gi\u00e0 esistente, si pu\u00f2 procedere con la migrazione della configurazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a52aee0d4350b8da00cdb4b525df80ad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo fatto in modo che nel file xml esistente, che ClickHouse comprende, si possa passare attraverso.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/91abb1d3b0a14f2118361403a74e14c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c8 possibile effettuare un fine-tuning di ClickHouse. Proprio il zoned deployment \u00e8 ci\u00f2 di cui parlavo spiegando il hostPath e lo storage locale. \u00c8 come configurare correttamente il zoned deployment.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fde502f30223e04a918f4fd598c3dd9f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il prossimo compito pratico \u00e8 il monitoraggio.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4e685fba7883075105c0164a778c51e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se il nostro cluster cambia, \u00e8 necessario configurare periodicamente il monitoraggio. <\/p>\n<p><\/p>\n<p>Esaminiamo lo schema. Abbiamo gi\u00e0 analizzato le frecce verdi. Ora consideriamo le frecce rosse. Questo \u00e8 come vogliamo monitorare il nostro cluster. Come le metriche dal cluster ClickHouse arrivano a Prometheus e poi a Grafana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1210c1423f99d48a20e06e855bf48a72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qual \u00e8 la difficolt\u00e0 nel monitoraggio? Perch\u00e9 \u00e8 considerato un risultato? La difficolt\u00e0 risiede nella dinamica. Quando abbiamo un cluster singolo e statico, possiamo configurare il monitoraggio una volta e non pensarci pi\u00f9.<\/p>\n<p><\/p>\n<p>Ma se abbiamo molti cluster, o se qualcosa cambia continuamente, il processo diventa dinamico. E occuparsi costantemente della riconfigurazione del monitoraggio \u00e8 uno spreco di risorse e tempo, ovvero anche solo una fonte di pigrizia. Questo deve essere automatizzato. La difficolt\u00e0 sta nella dinamicit\u00e0 del processo. E l'operatore lo automatizza molto bene. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48a7264f1228671e0c483c8211a71eb3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come si \u00e8 evoluto il nostro cluster? All'inizio era cos\u00ec.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8a8c7b6cd5562deb315368e1e8e1c976.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poi \u00e8 diventato cos\u00ec.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1a3e915fbadf3aa5f3b33d337f36e76e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alla fine \u00e8 diventato in questo modo. <\/p>\n<p><\/p>\n<p>Il monitoraggio \u00e8 fatto automaticamente dall'operatore. Unico punto di accesso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e079e65bf8deff43a81d8ffde938a709.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E noi guardiamo solo il dashboard Grafana, osservando la vita pulsante del nostro cluster. <\/p>\n<p><\/p>\n<p>A proposito, anche il dashboard Grafana viene fornito con il nostro operatore direttamente nel codice sorgente. \u00c8 possibile collegarlo e utilizzarlo. Questo screenshot \u00e8 stato fornito dai nostri DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ad1c2899dd845d0ba4185bdf758468c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qual \u00e8 la nostra prossima direzione? Questo \u00e8:<\/p>\n<p><\/p>\n<ul>\n<li>Sviluppare l'automazione dei test. L'obiettivo principale \u00e8 il test automatizzato delle nuove versioni. <\/li>\n<li>Vogliamo anche automatizzare l'integrazione con ZooKeeper. Abbiamo in programma di integrarci con lo ZooKeeper-operator. Cio\u00e8, per ZooKeeper \u00e8 stato scritto un operatore, ed \u00e8 logico che i due operatori inizino a integrarsi per costruire una soluzione pi\u00f9 comoda. <\/li>\n<li>Vogliamo implementare controlli pi\u00f9 complessi per la vitalit\u00e0. <\/li>\n<li>In verde ho evidenziato ci\u00f2 che ha gi\u00e0 raggiunto l'eredit\u00e0 dei Templates \u2013 FATTO, cio\u00e8 con il prossimo rilascio dell'operatore avremo gi\u00e0 l'eredit\u00e0 dei template. Questo \u00e8 uno strumento potente che consente di costruire configurazioni complesse da pezzi. <\/li>\n<li>E vogliamo l'automazione di compiti complessi. Il principale di cui stiamo parlando \u00e8 la Re-sharding. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f232c0aab389be5069e5c7886e265c01.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Facciamo un riepilogo intermedio. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/62f7814994af0441ba5a82de4e9780d7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cosa otteniamo alla fine? \u00c8 conveniente farlo o no? \u00c8 necessario tentare di portare un database in Kubernetes e applicare l'operatore in generale e l'operatore Alitnity in particolare?<\/p>\n<p><\/p>\n<p>Alla fine otteniamo:<\/p>\n<p><\/p>\n<ul>\n<li>Una significativa semplificazione e automazione della configurazione, del deployment e della manutenzione. <\/li>\n<li>Monitoraggio integrato fin da subito. <\/li>\n<li>E modelli codificati pronti all'uso per situazioni complesse. Non \u00e8 pi\u00f9 necessario aggiungere manualmente una replica. Questo \u00e8 compito dell'operatore. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/aebccd7a2dc55f14645f79f89f7b7458.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rimane solo un'ultima domanda. Abbiamo gi\u00e0 un database in Kubernetes, virtualizzazione. Qual \u00e8 la performance di tale soluzione, specialmente considerando che ClickHouse \u00e8 ottimizzato per le performance?<\/p>\n<p><\/p>\n<p>La risposta \u00e8: tutto funziona bene! Non entrer\u00f2 nei dettagli, \u00e8 un argomento di un intervento separato. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ffc230941f0ae24926186db4d8d68ade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma esiste un progetto chiamato TSBS. Qual \u00e8 il suo obiettivo principale? \u00c8 un test per valutare le performance dei database. \u00c8 un tentativo di confrontare il caldo con il caldo, il morbido con il morbido. <\/p>\n<p><\/p>\n<p>Come funziona? Viene generato un insieme di dati. Successivamente, questo set di dati viene eseguito su un insieme di test identico su diverse basi di dati. E ogni database risolve un compito secondo le proprie capacit\u00e0. Poi \u00e8 possibile confrontare i risultati. <\/p>\n<p><\/p>\n<p>Supporta gi\u00e0 un ampio numero di database. Ne ho evidenziati tre principali. Questi sono:<\/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=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5b4733534a4e6e36fb7788127adc6e86.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c8 stato inoltre effettuato un confronto con un'altra soluzione simile. Il confronto con RedShift. L'analisi \u00e8 stata condotta su Amazon. Anche ClickHouse supera tutti in questo ambito. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/44cc8dedc07a02fe1ed5aad3e17a579c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quali conclusioni possiamo trarre da quanto ho detto?<\/p>\n<p><\/p>\n<ul>\n<li>DB pu\u00f2 essere utilizzato in Kubernetes. Probabilmente, si possono utilizzare tutti, ma in generale sembra che sia possibile. ClickHouse in Kubernetes \u00e8 certamente utilizzabile tramite il nostro operatore. <\/li>\n<li>L'operatore aiuta ad automatizzare i processi e semplifica davvero la vita.<\/li>\n<li>Le performance sono buone.<\/li>\n<li>E, riteniamo, che sia possibile e necessario utilizzarlo. <\/li>\n<\/ul>\n<p><\/p>\n<p>Open source \u2013 unitevi a noi!<\/p>\n<p><\/p>\n<p>Come ho gi\u00e0 detto, l'operatore \u00e8 un prodotto completamente open source, quindi sarebbe davvero fantastico se il maggior numero possibile di persone lo utilizzasse. Unitevi a noi! Vi aspettiamo tutti!<\/p>\n<p><\/p>\n<p>Grazie a tutti!<\/p>\n<p><\/p>\n<p>Domande<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operatore in Kubernetes per la gestione di cluster di database. 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>Grazie per la presentazione! Mi chiamo Anton e vengo dall'azienda SEMrush. Sono curioso riguardo al logging. Sento parlare di monitoraggio, ma riguardo al logging non si dice nulla, parlando del cluster nel suo insieme. Noi, ad esempio, abbiamo sollevato un cluster sull'hardware. E utilizziamo il logging centralizzato, raccogliendo standardmente in un unico luogo. E poi da l\u00ec estraiamo i dati che ci interessano.<\/em> <\/p>\n<p><\/p>\n<p>Ottima domanda, cio\u00e8 il logging \u00e8 nella lista delle cose da fare. Il nostro operatore per ora non lo automatizza. \u00c8 ancora in fase di sviluppo, il progetto \u00e8 abbastanza giovane. Comprendiamo l'importanza del logging. \u00c8 un tema molto rilevante. E probabilmente \u00e8 almeno importante quanto il monitoraggio. Ma il monitoraggio \u00e8 stato il primo in lista per l'implementazione. Il logging ci sar\u00e0. Naturalmente, ci sforziamo di automatizzare tutti gli aspetti della vita del cluster. Quindi la risposta \u00e8: al momento l'operatore purtroppo non \u00e8 in grado di farlo, ma \u00e8 nei nostri piani, lo faremo. Se c'\u00e8 interesse a partecipare, per favore fai un pull request.<\/p>\n<p><\/p>\n<p><em>Ciao! Grazie per la presentazione! Ho una domanda standard riguardante i Persistent Volumes. Quando creiamo una configurazione con quest'operatore, come fa l'operatore a determinare su quale nodo abbiamo montato un disco o una cartella? Dobbiamo spiegarli in anticipo che, per favore, posizioni il nostro ClickHouse precisamente su quei nodi dove c'\u00e8 un disco?<\/em><\/p>\n<p><\/p>\n<p>Se non erro, questa domanda \u00e8 un proseguimento dello storage locale, in particolare della parte relativa a hostPath. \u00c8 come spiegare all'intero sistema che vogliamo che un pod venga eseguito su un determinato nodo, sul quale abbiamo un disco fisicamente collegato, montato in un determinato percorso. \u00c8 un'intera sezione che ho toccato in modo molto superficiale, perch\u00e9 la risposta \u00e8 piuttosto complessa. <\/p>\n<p><\/p>\n<p>In breve, funziona in questo modo. Naturalmente, dobbiamo fare il provisioning di questi volumi. Attualmente, non c'\u00e8 provisioning dinamico nello storage locale, quindi i DevOps devono creare manualmente i dischi, ossia questi volumi. Devono anche spiegare a Kubernetes il provisioning, indicando che ci saranno Persistent volumes di un certo tipo, localizzati su specifici nodi. Dopodich\u00e9, sar\u00e0 necessario spiegare a Kubernetes che i pod che richiedono un certo tipo di storage locale devono essere schedulati solo su determinati nodi mediante labels. A tal fine, l'operatore ha la possibilit\u00e0 di assegnare etichette specifiche e una per istanza host. Di conseguenza, i pod verranno instradati da Kubernetes per avviarsi solo su nodi che soddisfano i requisiti delle etichette, per dirla in termini semplici. Gli amministratori assegnano le labels e fanno il provisioning dei dischi manualmente. In questo modo, si riesce a scalare.<\/p>\n<p><\/p>\n<p>E infatti, la terza opzione locale aiuta un po' a semplificare questo lavoro. Come ho gi\u00e0 sottolineato, si tratta di un lavoro meticoloso di configurazione che, alla fine, contribuisce a ottenere la massima performance.<\/p>\n<p><\/p>\n<p><em>Ho una seconda domanda relativa a questo. Kubernetes \u00e8 stato progettato in modo che non ci importi se perdiamo un nodo o meno. Cosa dobbiamo fare in questo caso, se perdiamo il nodo in cui \u00e8 ospitato uno shard?<\/em><\/p>\n<p><\/p>\n<p>S\u00ec, Kubernetes \u00e8 stato inizialmente concepito con l'idea che il nostro rapporto con i nostri pod sia simile a quello con il bestiame, mentre ogni disco diventa qualcosa di simile a un animale domestico. C'\u00e8 un problema: non possiamo semplicemente buttarli via. Lo sviluppo di Kubernetes sta andando verso la direzione in cui non \u00e8 possibile considerare tutto questo in modo puramente filosofico, come risorse completamente usa e getta.<\/p>\n<p><\/p>\n<p>Ora, una domanda pratica. Cosa fare se hai perso un nodo su cui si trovava un disco? Qui la questione viene risolta a un livello pi\u00f9 alto. Nel caso di ClickHouse, abbiamo delle repliche che operano a un livello superiore, cio\u00e8 a livello di ClickHouse.<\/p>\n<p><\/p>\n<p>Qual \u00e8 la disposizione finale? \u00c8 responsabilit\u00e0 del DevOps assicurarsi che i dati non vengano persi. Deve configurare correttamente la replica e deve monitorare che essa funzioni. I dati devono essere duplicati nella replica a livello di ClickHouse. Non \u00e8 un compito che risolve l'operatore e nemmeno Kubernetes. \u00c8 una questione a livello di ClickHouse.<\/p>\n<p><\/p>\n<p>Cosa fare se il tuo nodo fisico \u00e8 andato gi\u00f9? Dobbiamo quindi installare un secondo nodo, configurare correttamente il disco e applicare le etichette. Solo cos\u00ec potr\u00e0 soddisfare i requisiti affinch\u00e9 Kubernetes possa avviare un'istanza del pod. Kubernetes lo avvier\u00e0. Hai un numero insufficiente di pod rispetto a quello richiesto. Passer\u00e0 attraverso il ciclo che ti ho mostrato. A un livello superiore, ClickHouse capir\u00e0 che \u00e8 stata aggiunta una replica, che \u00e8 ancora vuota e da cui iniziare a trasferire i dati. Questo processo, per\u00f2, \u00e8 ancora poco automatizzato. <\/p>\n<p><\/p>\n<p><em>Grazie per la presentazione! Quando accadono inconvenienti e l'operatore si blocca e si riavvia, nel frattempo arrivano eventi. Come gestisci questa situazione?<\/em><\/p>\n<p><\/p>\n<p>Cosa succede se l'operatore si blocca e si riavvia, giusto? <\/p>\n<p><\/p>\n<p><em>Esatto. E in quel momento sono arrivati eventi.<\/em> <\/p>\n<p><\/p>\n<p>Il compito di gestire questa situazione \u00e8 parzialmente suddiviso tra l'operatore e Kubernetes. Kubernetes ha la capacit\u00e0 di riprodurre l'evento che si \u00e8 verificato. Lo riproduce. Compito dell'operatore \u00e8 garantire che, quando viene eseguito un replay del log degli eventi, questi eventi siano idempotenti. Questo significa che la ripetizione dello stesso evento non deve danneggiare il nostro sistema. E il nostro operatore gestisce bene questo compito. <\/p>\n<p><\/p>\n<p><em>Buongiorno! Grazie per la presentazione! Dmitrij Zavjalov, azienda<\/em> <em>Smedova. \u00c8 prevista l'aggiunta di funzionalit\u00e0 di configurazione dell'operatore con haproxy? Sarei interessato a un altro bilanciatore oltre a quello standard, che sia intelligente e comprenda che si tratta di ClickHouse.<\/em> <\/p>\n<p><\/p>\n<p>Stai parlando di Ingress?<\/p>\n<p><\/p>\n<p><em>S\u00ec, sostituisci Ingress con haproxy. In haproxy puoi specificare la topologia del cluster, dove ha le repliche.<\/em><\/p>\n<p><\/p>\n<p>Per ora non ci abbiamo pensato. Se hai bisogno di questa funzione e puoi spiegare perch\u00e9 ti serve, possiamo implementarla, soprattutto se desideri partecipare. Saremmo felici di considerare questa opzione. In breve, no, al momento non abbiamo questa funzionalit\u00e0. Grazie per il suggerimento, ci daremo un'occhiata. Se puoi anche spiegare il caso d'uso e perch\u00e9 \u00e8 necessario nella pratica, ad esempio creando dei problemi su GitHub, sarebbe ottimo.<\/p>\n<p><\/p>\n<p><em>Esiste gi\u00e0.<\/em><\/p>\n<p><\/p>\n<p>Va bene. Siamo aperti a qualsiasi proposta. E haproxy \u00e8 inserito nella lista todo. La lista todo cresce, e non diminuisce per ora. Ma va bene, significa che il prodotto \u00e8 richiesto.<\/p>\n<p>Fonte: <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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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\/it\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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:description\" content=\"\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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/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\udd47Operatore in Kubernetes per la gestione dei cluster DB. Vladislav Klimenko (Altinity, 2019) | ProHoster","description":"La relazione riguarda questioni pratiche nello sviluppo di un operatore in Kubernetes, progettazione della sua architettura e principi fondamentali di funzionamento. Nella prima parte della relazione vedremo: cos'\u00e8 un operatore in Kubernetes e a cosa serve; come l'operatore semplifica la gestione di sistemi complessi; cosa pu\u00f2 fare e cosa non pu\u00f2 fare l'operatore. Successivamente, passeremo a discutere la struttura interna dell'operatore. Esamineremo l'architettura e il funzionamento.","canonical_url":"https:\/\/prohoster.info\/it\/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":"it_IT","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:description":"\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","og:url":"https:\/\/prohoster.info\/it\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/96965","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=96965"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/96965\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/96966"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=96965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=96965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=96965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}