{"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 presentazione \u00e8 dedicata a questioni pratiche nello sviluppo dell'operatore in Kubernetes, progettazione della sua architettura e dei principi di funzionamento di base.<\/p>\n<p><\/p>\n<p>Nella prima parte della presentazione esamineremo:<\/p>\n<p><\/p>\n<ul>\n<li>cos'\u00e8 un operatore in Kubernetes e a cosa serve;<\/li>\n<li>come l'operatore semplifica la gestione di sistemi complessi;<\/li>\n<li>cosa pu\u00f2 fare l'operatore e cosa non pu\u00f2 fare.<\/li>\n<\/ul>\n<p><\/p>\n<p>Successivamente, passeremo a discutere della struttura interna dell'operatore. Esamineremo l'architettura e il funzionamento dell'operatore passo dopo passo. Analizzeremo in dettaglio:<\/p>\n<p><\/p>\n<ul>\n<li>l'interazione tra l'operatore e Kubernetes;<\/li>\n<li>quali funzioni l'operatore si assume e quali delega a Kubernetes.<\/li>\n<\/ul>\n<p><\/p>\n<p>Esamineremo la gestione degli shard e delle repliche di database in Kubernetes.<br \/>\nSuccessivamente, discuteremo delle questioni relative alla memorizzazione dei dati:<\/p>\n<p><\/p>\n<ul>\n<li>come lavorare con il Persistent Storage dal punto di vista dell'operatore;<\/li>\n<li>i problemi nell'utilizzo del Local Storage.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nella parte finale della presentazione analizzeremo 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 presentazione si basa sull'esperienza di sviluppo e 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=\"Guarda il 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 volevo parlare della nostra esperienza nello sviluppo e nell'uso dell'operatore, che \u00e8 un operatore specializzato per la gestione dei cluster di database. Prendendo a esempio <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">ClickHouse-operator<\/a><\/noindex> per la gestione del 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 contribuire gradualmente allo sviluppo di ClickHouse. E siamo secondi solo a Yandex per il volume di modifiche apportate a ClickHouse. <\/li>\n<li>Cerchiamo di sviluppare progetti aggiuntivi per l'ecosistema di ClickHouse. <\/li>\n<\/ul>\n<p><\/p>\n<p>Vorrei parlare di uno di questi progetti. Si tratta del ClickHouse-operator per Kubernetes. <\/p>\n<p><\/p>\n<p>Nella mia presentazione vorrei toccare due argomenti: <\/p>\n<p><\/p>\n<ul>\n<li>Il primo argomento riguarda come funziona il nostro operatore per la gestione dei database ClickHouse in Kubernetes. <\/li>\n<li>Il secondo argomento \u00e8 come funziona qualsiasi operatore, cio\u00e8 come interagisce con Kubernetes. <\/li>\n<\/ul>\n<p><\/p>\n<p>Questi due temi si intersecheranno durante tutta la mia presentazione. <\/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 quello che cerco di presentare?<\/p>\n<p><\/p>\n<ul>\n<li>Sar\u00e0 particolarmente interessante per chi utilizza operatori. <\/li>\n<li>O a quelli che vogliono creare il proprio, per capire come funziona internamente, come interagisce l'operatore con Kubernetes e quali insidie possono sorgere. <\/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 discuteremo oggi, sarebbe utile sapere come funziona Kubernetes e avere 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 con specificit\u00e0 nel trattamento online delle query analitiche. Ed \u00e8 completamente open source. <\/p>\n<p><\/p>\n<p>E ci sono due cose di cui \u00e8 importante essere a conoscenza. \u00c8 necessario sapere che \u00e8 un database, quindi ci\u00f2 di cui parler\u00f2 sar\u00e0 applicabile praticamente a qualsiasi database. E che il DBMS ClickHouse scala molto bene, offre praticamente scalabilit\u00e0 lineare. Inoltre, lo stato del cluster \u00e8 uno stato naturale per ClickHouse. Ci interessa soprattutto discutere di 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 sfruttarlo autonomamente? Le risposte sono parzialmente tecniche e parzialmente organizzative. <\/p>\n<p><\/p>\n<ul>\n<li>Nella pratica, ci troviamo sempre pi\u00f9 spesso in situazioni in cui nelle grandi aziende praticamente tutti i componenti sono gi\u00e0 in Kubernetes. I database rimangono al di fuori. <\/li>\n<li>E sempre pi\u00f9 si pone la domanda: '\u00c8 possibile inserirli qui dentro?'. Pertanto, le grandi aziende cercano di massimizzare l'unificazione della gestione per poter gestire rapidamente i propri repository di dati. <\/li>\n<li>E questo \u00e8 particolarmente utile se \u00e8 necessaria la massima possibilit\u00e0 di ripetere la stessa cosa in un nuovo luogo, 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 complicato? Certamente si pu\u00f2 fare manualmente. Ma non \u00e8 cos\u00ec semplice, perch\u00e9 abbiamo la complessit\u00e0 della gestione di Kubernetes stessa, ma si sovrappone anche la specificit\u00e0 di ClickHouse. Si ottiene quindi una tale aggregazione. <\/p>\n<p><\/p>\n<p>E tutto questo porta a un insieme piuttosto ampio di tecnologie, la cui gestione diventa gi\u00e0 piuttosto complessa, perch\u00e9 Kubernetes porta con s\u00e9 domande quotidiane sull'esercizio, mentre ClickHouse porta le sue questioni quotidiane di gestione. Soprattutto, se abbiamo pi\u00f9 istanze di ClickHouse e dobbiamo costantemente interagire con esse. <\/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, with dynamic configuration, there are a considerable number of issues that create a constant load on DevOps:<\/p>\n<p><\/p>\n<ul>\n<li>When we want to change something in ClickHouse, for example, to add a replica or a shard, we need to manage the configuration. <\/li>\n<li>Then we need to change the data schema because ClickHouse has a specific way of sharding. The data schema needs to be deployed, and the configurations need to be arranged. <\/li>\n<li>Monitoring needs to be configured. <\/li>\n<li>Log collection for new shards, for new replicas. <\/li>\n<li>Worry about recovery.<\/li>\n<li>And restarting. <\/li>\n<\/ul>\n<p><\/p>\n<p>These are routine tasks that we would like to ease in operation.<\/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 itself helps well in operation but on basic system tasks. <\/p>\n<p><\/p>\n<p>Kubernetes simplifies and automates tasks such as:<\/p>\n<p><\/p>\n<ul>\n<li>Recovery.<\/li>\n<li>Restarting. <\/li>\n<li>Managing the storage system.<\/li>\n<\/ul>\n<p><\/p>\n<p>This is good; it's the right direction, but it has no complete understanding of how to operate a database cluster. <\/p>\n<p><\/p>\n<p>We want more; we want our entire database to run on 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>We want something like a big magical red button that you press, and it deploys and maintains a cluster with daily tasks that need to be solved. A ClickHouse cluster on Kubernetes.<\/p>\n<p><\/p>\n<p>And we tried to create a solution that would help ease operations. This is the ClickHouse operator for Kubernetes from 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>The operator is a program whose main task is to manage other programs, i.e., it is a manager. <\/p>\n<p><\/p>\n<p>It contains behavior templates. This can be called codified knowledge about the subject area. <\/p>\n<p><\/p>\n<p>Its primary task is to make the life of DevOps easier and reduce micromanagement, so that he (DevOps) thinks in high-level terms, i.e., not engaging in micromanagement and not configuring all the details manually. <\/p>\n<p><\/p>\n<p>The operator is a helper robot that tackles micro-tasks and assists 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>Why is an operator needed? It shows its strength especially in two areas:<\/p>\n<p><\/p>\n<ul>\n<li>Quando uno specialista che si occupa di ClickHouse non ha abbastanza esperienza, ma \u00e8 gi\u00e0 necessario utilizzare ClickHouse, l'operatore semplifica l'uso e consente di gestire un cluster ClickHouse con una configurazione piuttosto complessa, senza approfondire troppo nei dettagli su come funziona internamente. Basta dargli compiti ad alto livello e funziona. <\/li>\n<li>La seconda attivit\u00e0 in cui si distingue meglio \u00e8 quando \u00e8 necessario automatizzare un gran numero di compiti standard. Si occupa delle microattivit\u00e0 degli 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 coloro che stanno appena iniziando il loro 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 su operatori e altri sistemi? Esiste Helm. Anche lui aiuta a installare ClickHouse, si possono disegnare helm charts che possono anche installare un intero cluster ClickHouse. Qual \u00e8 quindi la differenza tra un operatore e, ad esempio, Helm?<\/p>\n<p><\/p>\n<p>La principale differenza fondamentale \u00e8 che Helm \u00e8 una gestione dei pacchetti, mentre l'operatore va oltre. Si occupa dell'intero ciclo di vita. Non \u00e8 solo installazione, ma anche attivit\u00e0 quotidiane che includono scalabilit\u00e0, sharding, cio\u00e8 tutto ci\u00f2 che deve essere eseguito nel corso del ciclo di vita (in caso di necessit\u00e0, anche la rimozione) \u2013 questo \u00e8 tutto compito dell'operatore. Si propone di automatizzare e gestire l'intero ciclo di vita del software. Questa \u00e8 la sua fondamentale differenza 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 era la parte introduttiva, andiamo avanti. <\/p>\n<p><\/p>\n<p>Come costruiamo il nostro operatore? Cerchiamo di gestire il cluster ClickHouse come una singola risorsa. <\/p>\n<p><\/p>\n<p>Qui sulla sinistra abbiamo i dati di input. Questo \u00e8 un YAML con la specifica del cluster, che viene tradizionalmente passato a Kubernetes attraverso kubectl. L\u00ec, il nostro operatore lo raccoglie e fa la sua magia. E all'uscita otteniamo uno schema come questo. Questa \u00e8 l'implementazione di ClickHouse in Kubernetes.<\/p>\n<p><\/p>\n<p>E poi, vedremo gradualmente come funziona l'operatore e quali compiti standard possono essere risolti. Considereremo solo compiti standard, perch\u00e9 abbiamo tempo limitato. E non sar\u00e0 trattato tutto ci\u00f2 che l'operatore pu\u00f2 risolvere. <\/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 \u00e8 possibile dare un'occhiata a GitHub per vedere come funziona. E si pu\u00f2 partire da considerazioni, se si vuole semplicemente avviarlo, si pu\u00f2 cominciare con la Guida all'Inizio Veloce.<\/p>\n<p><\/p>\n<p>Se si desidera approfondire, cerchiamo di 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. Il primo compito, da cui tutti vogliamo partire, \u00e8 avviare il primo esempio in un modo o nell'altro. Come avviare ClickHouse tramite l'operatore, anche senza sapere esattamente come funziona? Scriviamo il 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 piuttosto complesso. Ci\u00f2 che abbiamo evidenziato in rosso \u00e8 ci\u00f2 su cui dobbiamo concentrarci. Chiediamo all'operatore di creare un cluster di nome demo.<\/p>\n<p><\/p>\n<p>Attualmente sono solo esempi di base. Lo storage non \u00e8 ancora descritto, ma ci torneremo pi\u00f9 avanti. Per ora, osserveremo lo sviluppo del cluster in dinamica.<\/p>\n<p><\/p>\n<p>Abbiamo creato questo manifesto. Lo forniamo al nostro operatore. Ha lavorato e 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 nella console. Tre componenti ci attirano l'attenzione: Pod, due Service e StatefulSet.<\/p>\n<p><\/p>\n<p>L'operatore ha lavorato e possiamo vedere cosa ha 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 schematizzazione simile a questa. Abbiamo StatefulSet, Pod, ConfigMap per ogni replica e un ConfigMap per l'intero cluster. I servizi sono indispensabili come punti di accesso al cluster. <\/p>\n<p><\/p>\n<p>I servizi comprendono il Load Balancer Service centrale e, per ogni replica, per ogni shard \u00e8 possibile avere anche altri servizi. <\/p>\n<p><\/p>\n<p>Ecco come appare un cluster di base. \u00c8 composto da una singola nodo. <\/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>Procediamo e rendiamo le cose pi\u00f9 complesse. \u00c8 necessario shardare 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 aumentando, inizia la dinamica. Vogliamo aggiungere uno shard. Seguiamo lo sviluppo. Modifichiamo la nostra specifica. Indichiamo che vogliamo due shard. <\/p>\n<p><\/p>\n<p>Questo \u00e8 lo stesso file che si sviluppa dinamicamente con la crescita del sistema. Non c'\u00e8 storage, ma questo sar\u00e0 trattato pi\u00f9 avanti, \u00e8 un argomento a parte.<\/p>\n<p><\/p>\n<p>Forniamo l'operatore YAML e vediamo cosa ne risulta. <\/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 pensato e ha creato le seguenti entit\u00e0. Abbiamo gi\u00e0 due Pod, tre Service e, inaspettatamente, 2 StatefulSet. Perch\u00e9 2 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 - questo \u00e8 il nostro stato 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>\u00c8 diventato cos\u00ec. Per ora, \u00e8 tutto semplice, \u00e8 stato 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 sono diventati due StatefulSet? Qui dobbiamo distoglierci e discutere come avviene la gestione dei Pod in Kubernetes.<\/p>\n<p><\/p>\n<p>C'\u00e8 un oggetto chiamato StatefulSet, che consente di creare un insieme di Pod da un modello. Qui il fattore chiave \u00e8 il Template. \u00c8 possibile eseguire molti Pod da un unico StatefulSet utilizzando lo stesso modello. La frase chiave qui \u00e8 \u00abda un solo modello molti Pod\u00bb.<\/p>\n<p><\/p>\n<p>C'era una forte tentazione di creare l'intero cluster, racchiudendo tutto in un unico StatefulSet. Questo funzionerebbe, non ci sono problemi in tal senso. Ma c'\u00e8 un aspetto da considerare. Se vogliamo costruire un cluster eterogeneo, ovvero composto da diverse versioni di ClickHouse, qui iniziano i problemi. S\u00ec, StatefulSet pu\u00f2 eseguire un aggiornamento rolling, s\u00ec, \u00e8 possibile aggiornare alla nuova versione, specificando che non si dovrebbero avere pi\u00f9 di un certo numero di nodi contemporaneamente.<\/p>\n<p><\/p>\n<p>Ma se esponiamo il problema e diciamo che vogliamo creare un cluster completamente eterogeneo e non vogliamo passare da una vecchia versione a una nuova tramite un aggiornamento rolling, ma vogliamo semplicemente costruire un cluster eterogeneo sia in termini di diverse versioni di ClickHouse che di diversi tipi di storage. Vogliamo, ad esempio, che alcune repliche siano su dischi separati, su dischi lenti; in sostanza, costruire un cluster completamente eterogeneo. E poich\u00e9 StatefulSet crea una soluzione standardizzata da un modello unico, non \u00e8 possibile farlo. <\/p>\n<p><\/p>\n<p>Dopo qualche riflessione, \u00e8 stata presa la decisione di procedere in questo modo. Ogni replica avr\u00e0 il proprio StatefulSet. Ci sono alcuni svantaggi a questa soluzione, ma nella pratica tutto viene completamente incapsulato dall'operatore. E ci sono molti vantaggi. Possiamo costruire un cluster esattamente come vogliamo, ad esempio completamente 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, al fine 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 questioni pratiche. Nel nostro cluster dobbiamo configurare gli utenti, cio\u00e8 dobbiamo eseguire alcune configurazioni di ClickHouse in Kubernetes. L'operatore fornisce tutte le opzioni necessarie per 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\/6a65aa78293c0b40230cf24efc58e55a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Possiamo scrivere direttamente in YAML ci\u00f2 che desideriamo. Tutte le opzioni di configurazione si mappano direttamente da questo YAML nei file di configurazione di ClickHouse, che poi vengono distribuiti in tutto il cluster.<\/p>\n<p><\/p>\n<p>Si pu\u00f2 scrivere anche in questo modo. Questo \u00e8 solo un esempio. \u00c8 possibile impostare una password criptata. Tutte le opzioni di configurazione di ClickHouse sono assolutamente 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 del ConfigMap non avviene immediatamente, quindi, se il cluster \u00e8 grande, il processo di aggiornamento della configurazione richiede un certo tempo. Ma tutto ci\u00f2 \u00e8 molto conveniente nella gestione.<\/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, ciascuno con una replica, e gli utenti sono configurati. Cresciamo e vogliamo occuparci 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>Di cosa abbiamo bisogno 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 abbiano consenso su quali blocchi di dati ci sono su ciascun ClickHouse. <\/p>\n<p><\/p>\n<p>Puoi usare qualsiasi ZooKeeper. Se l'impresa ha un ZooKeeper esterno, pu\u00f2 essere utilizzato. Se non c'\u00e8, si pu\u00f2 installare uno dal nostro repository. C'\u00e8 un installer 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>E lo schema di interazione dell'intero sistema risulta essere cos\u00ec. Abbiamo Kubernetes come piattaforma. Su di esso viene eseguito l'operatore ClickHouse. Ho rappresentato ZooKeeper qui. E l'operatore interagisce sia con ClickHouse che con ZooKeeper. Cio\u00e8, risulta un'interazione. <\/p>\n<p><\/p>\n<p>E 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 \u00e8 dove prendere ZooKeeper, che pu\u00f2 essere sia all'interno di Kubernetes sia esterno. Questo \u00e8 solo una descrizione. E richiediamo repliche. Cio\u00e8, vogliamo due repliche. In totale, quindi, dovremmo avere 4 pod. Ricordiamo lo storage, torner\u00e0 pi\u00f9 avanti. Lo storage \u00e8 una questione 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 le repliche. La quarta non ci stava, ma crediamo che possano essercene molte. E a lato viene aggiunto ZooKeeper. Gli schemi si complicano. <\/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 giunto il momento di aggiungere il compito successivo. Aggiungeremo lo 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 lo Storage Persistente abbiamo diverse opzioni di implementazione.<\/p>\n<p><\/p>\n<p>Nel caso in cui ci troviamo in un cloud provider, ad esempio, utilizzando Amazon o Google, c'\u00e8 una grande tentazione di utilizzare lo storage cloud. \u00c8 molto conveniente, \u00e8 ottimo. <\/p>\n<p><\/p>\n<p>E c'\u00e8 una seconda opzione. Questa \u00e8 per il local storage, quando abbiamo dischi locali su ogni nodo. Questa opzione \u00e8 molto pi\u00f9 complessa da implementare, ma \u00e8 anche 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 al cloud storage.<\/p>\n<p><\/p>\n<p>Ci sono vantaggi. \u00c8 molto semplice da configurare. Ordiniamo semplicemente al fornitore di cloud, che ci dia, per favore, uno storage di tale capacit\u00e0, di tale classe. Le classi sono definite dai fornitori stessi. <\/p>\n<p><\/p>\n<p>E c'\u00e8 uno svantaggio. Per qualcuno potrebbe non essere un problema critico. Ovviamente ci saranno alcune ripercussioni sulle prestazioni. \u00c8 molto comodo lavorare, affidabile, ma ci sono alcune potenziali cadute 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 proprio sulle prestazioni, si potrebbe dire che estrae tutto ci\u00f2 che \u00e8 possibile, quindi molti clienti 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>E per ottenere il massimo, abbiamo bisogno del local storage.<\/p>\n<p><\/p>\n<p>Kubernetes fornisce tre astrazioni per utilizzare il local storage in Kubernetes. Esse sono: <\/p>\n<p><\/p>\n<ul>\n<li>EmptyDir<\/li>\n<li>HostPath.<\/li>\n<li>Local<\/li>\n<\/ul>\n<p><\/p>\n<p>Esaminiamo come si differenziano e come sono simili. <\/p>\n<p><\/p>\n<p>In primo luogo, in tutti e tre gli approcci abbiamo storage \u2013 dischi locali che si trovano sullo stesso nodo fisico di k8s. Ma 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 la cosa pi\u00f9 semplice, ovvero con emptyDir. Cosa significa questo in pratica? Chiediamo al nostro specifica di richiedere al sistema di containerizzazione (solitamente \u2013 Docker) di fornirci accesso a una cartella sul disco locale.<\/p>\n<p><\/p>\n<p>In pratica, Docker crea da qualche parte i suoi percorsi propri una cartella temporanea, chiamandola con un lungo hash. E fornisce l'interfaccia di accesso ad essa. <\/p>\n<p><\/p>\n<p>Come funzioner\u00e0 in termini di prestazioni? Funzioner\u00e0 alla velocit\u00e0 del disco locale, quindi c'\u00e8 accesso completo al proprio disco. <\/p>\n<p><\/p>\n<p>Ma questa operazione ha il suo svantaggio. La persistenza in questo caso \u00e8 piuttosto dubbia. Alla prima movimentazione dei container da parte di Docker, la persistenza si perde. Se Kubernetes decidesse per qualche motivo di spostare questo Pod su un altro disco, i dati andranno persi. <\/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 opzione 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 perch\u00e9 c'\u00e8 un secondo approccio. Si tratta di hostPath. Se si guarda alla diapositiva precedente e a questa, si pu\u00f2 vedere solo una differenza. La nostra cartella \u00e8 uscita dal Docker direttamente sul nodo Kubernetes. Qui \u00e8 un po' pi\u00f9 semplice. Scriviamo direttamente il percorso nel file system locale, dove vogliamo conservare i nostri dati. <\/p>\n<p><\/p>\n<p>Ci sono vantaggi in questo metodo. Questo \u00e8 un vero Persistent, e anche classico. I dati saranno salvati su disco a un certo indirizzo. <\/p>\n<p><\/p>\n<p>Ci sono anche degli svantaggi. C'\u00e8 la complessit\u00e0 della gestione. Il nostro Kubernetes potrebbe voler spostare un Pod su un altro nodo fisico. E qui entra in gioco il DevOps. Deve spiegare correttamente all'intero sistema che questi pod possono essere spostati solo su nodi specifici, dove hai montato qualcosa lungo quei percorsi, e non pi\u00f9 di un nodo alla volta. \u00c8 abbastanza complicato. <\/p>\n<p><\/p>\n<p>Appositamente per questi scopi, abbiamo creato dei modelli nel nostro operatore per nascondere tutta questa complessit\u00e0. E sarebbe possibile semplicemente dire: \u00abVoglio un'istanza di ClickHouse su ogni nodo fisico e su un certo 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 le persone vogliono avere accesso ai dischi fisici, quindi offrono un terzo livello.<\/p>\n<p><\/p>\n<p>Si chiama local. Non c'\u00e8 praticamente alcuna differenza rispetto alla diapositiva precedente. Solo in passato dovevamo gestire manualmente che non potevamo trasferire questi pod da un nodo all'altro, perch\u00e9 dovevano essere collegati a un certo percorso sul disco fisico locale, mentre ora tutta questa conoscenza \u00e8 incapsulata all'interno di Kubernetes stesso. Risulta 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 modello YAML. Qui abbiamo un vero storage. Siamo tornati a questo. Definiamo il modello VolumeClaim classico come in k8s. E descriviamo quale storage vogliamo.<\/p>\n<p><\/p>\n<p>Dopo di che k8s richieder\u00e0 lo storage. Ce lo assegner\u00e0 nel StatefulSet. E alla fine diventer\u00e0 di pertinenza 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 uno schema del genere. Il nostro Persistent Storage era rosso, il che suggeriva che doveva essere realizzato. <\/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 c'\u00e8 un vero Persistent, che \u00e8 implementato 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 vivere. Il nostro cluster si sta sviluppando. E Alexey sta cercando di fare del suo meglio, rilasciando 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. E naturalmente, non vogliamo installarla su tutto il cluster, vorremmo metterla in un angolo remoto, magari su una replica, oppure, forse, non solo su una nuova versione, ma addirittura su due, poich\u00e9 escono piuttosto spesso. <\/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 precisamente questa opportunit\u00e0. Sono i template dei pod. Possiamo scrivere, il nostro operatore consente completamente di costruire un cluster eterogeneo. Cio\u00e8, configurare, partendo da tutte le repliche accumulate, fino ad ogni singola replica, indicando quale versione di ClickHouse vogliamo, quale versione di storage desideriamo. Possiamo configurare completamente il cluster nella configurazione di cui abbiamo bisogno. <\/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>Ci addentriamo un po' di pi\u00f9. Prima abbiamo parlato di come funziona ClickHouse-operator in relazione alle specificit\u00e0 di ClickHouse.<\/p>\n<p><\/p>\n<p>Ora vorrei dire qualche parola su come funziona in generale 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 con l'interazione con K8s. Cosa succede quando facciamo 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>Per esempio, gli oggetti di base di Kubernetes: pod, StatefulSet, servizio e cos\u00ec via. <\/p>\n<p><\/p>\n<p>In questo momento, nulla di fisico accade ancora. 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>Per farlo, appare un controller. Il controller \u00e8 un componente speciale di k8s, che sa come materializzare queste descrizioni. Sa come e cosa fare fisicamente. Sa 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 vogliamo operare non solo con i pod e con gli StatefulSet, vogliamo creare ClickHouseInstallation, cio\u00e8 un oggetto di tipo ClickHouse, per operarlo come un'unit\u00e0 unica. Al momento, non c'\u00e8 tale possibilit\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\/1594921ac5dd9384ce81ceae92f5cda9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma K8s ha una cosa piacevole. Vogliamo che appaia da qualche parte un'entit\u00e0 complessa come questa, in cui il nostro cluster sia raccolto da pod e 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\/04f86706f506fa91e365d45537dd9def.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E cosa bisogna fare per questo? Innanzitutto, entra in gioco la Custom Resource Definition. Che cos'\u00e8? \u00c8 una descrizione per K8s, che indica che avrai un altro tipo di dato, che vogliamo aggiungere come risorsa personalizzata all'interno di pod, StatefulSet. \u00c8 una 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 l\u00ec tramite kubectl apply. Kubernetes lo ha accolto con gioia. <\/p>\n<p><\/p>\n<p>E ora nel nostro storage, l'oggetto in etcd ha la possibilit\u00e0 di registrare una risorsa personalizzata chiamata ClickHouseInstallation.<\/p>\n<p><\/p>\n<p>Ma finora non succeder\u00e0 altro. Cio\u00e8, se ora creiamo un file YAML, che abbiamo esaminato, con la descrizione di shard, repliche e diciamo \"kubectl apply\", Kubernetes lo accetter\u00e0, lo metter\u00e0 in etcd e dir\u00e0: \"Ottimo, ma non so cosa farci. Come gestire ClickHouseInstallation non lo so.\" <\/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>Di conseguenza, abbiamo bisogno di qualcuno che aiuti Kubernetes a gestire il nuovo tipo di dato. A sinistra abbiamo il controller standard di Kubernetes, che lavora con i tipi di dato standard. A destra deve apparire un controller personalizzato, che sa lavorare con i tipi di dato personalizzati. <\/p>\n<p><\/p>\n<p>E con un nome diverso \u00e8 chiamato operatore. L'ho portato qui appositamente fuori da Kubernetes, perch\u00e9 pu\u00f2 essere eseguito anche esternamente a K8s. Di solito, tutti gli operatori vengono eseguiti in Kubernetes, ma nulla impedisce loro di operare esternamente; perci\u00f2 qui \u00e8 stato scelto di posizionarlo 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 il controller personalizzato, cio\u00e8 l'operatore, interagisce con Kubernetes tramite l'API. Sa gi\u00e0 come interagire con l'API. E sa gi\u00e0 come materializzare una complessa architettura a partire dalla risorsa personalizzata che vogliamo creare. Questo \u00e8 precisamente ci\u00f2 di cui 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 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. L'operatore si iscrive agli eventi tramite l'API di Kubernetes. L'API di Kubernetes ha dei punti di accesso dove ci si pu\u00f2 iscrivere agli eventi. E se qualcosa cambia in K8s, Kubernetes invia eventi a tutti coloro che lo desiderano, cio\u00e8 chi si \u00e8 iscritto a questo punto API ricever\u00e0 notifiche.<\/p>\n<p><\/p>\n<p>L'operatore si iscrive agli eventi e deve fare qualche reazione. 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. \u00c8 passato attraverso kubectl apply in etcd. L\u00ec si \u00e8 attivato un evento, e alla fine questo evento \u00e8 arrivato al ClickHouse-operator. L'operatore ha ricevuto questa descrizione. E deve fare qualcosa. Se \u00e8 arrivato un aggiornamento per l'oggetto ClickHouseInstallation, allora bisogna aggiornare il cluster. E il compito dell'operatore \u00e8 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? Innanzitutto, deve pianificare le azioni, cio\u00e8 cosa faremo con questo aggiornamento. Gli aggiornamenti possono essere molto piccoli, quindi piccoli 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 elaborare questa struttura secondo il piano, per materializzare i pod, i servizi, cio\u00e8 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 una cosa interessante. Questa \u00e8 la divisione 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 di questioni sistemiche, cio\u00e8 dell'insieme di base di oggetti che possono essere interpretati come system-scope. Kubernetes sa come avviare i pod, come riavviare i container, come montare i volumi, come lavorare con ConfigMap, cio\u00e8 tutto ci\u00f2 che si pu\u00f2 definire sistema. <\/p>\n<p><\/p>\n<p>Gli operatori operano in aree tematiche. Ogni operatore \u00e8 creato per la propria area di competenza. Noi abbiamo creato quello per ClickHouse.<\/p>\n<p><\/p>\n<p>E l'operatore interagisce esattamente in termini di aree tematiche come aggiungere una replica, creare uno schema, configurare il monitoraggio. Si ottiene quindi questa divisione.<\/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>Esaminiamo un esempio pratico di come avviene questa divisione di responsabilit\u00e0 quando compiamo l'azione di aggiungere una replica. <\/p>\n<p><\/p>\n<p>All'operatore arriva un compito: aggiungere una replica. Cosa fa l'operatore? L'operatore calcola che deve creare un nuovo StatefulSet, in cui bisogna descrivere certi modelli e il reclamo del 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 successivamente a K8s. Dice che ha bisogno di ConfigMap, StatefulSet, Volume. Kubernetes elabora. Materializza le unit\u00e0 di base 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 poi interviene di nuovo ClickHouse-operator. Ha gi\u00e0 a disposizione un pod fisico, su cui \u00e8 possibile lavorare. E ClickHouse-operator opera nuovamente in termini di dominio. Cio\u00e8, specificamente ClickHouse, per includere una replica nel cluster, bisogna, prima di tutto, configurare lo schema dei dati presente in quel cluster. E, in secondo luogo, questa replica deve essere inclusa nel monitoraggio, affinch\u00e9 possa essere seguita correttamente. Gi\u00e0 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 ClickHouse stesso, cio\u00e8 un'entit\u00e0 di livello superiore. Questo \u00e8 gi\u00e0 un database. Ha il suo instance, una replica configurata, pronta per unirsi al cluster.<\/p>\n<p><\/p>\n<p>Si ottiene cos\u00ec una catena di esecuzione e divisione delle responsabilit\u00e0 per l'aggiunta di una replica piuttosto lunga.<\/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>Procediamo con le nostre attivit\u00e0 pratiche. Se il cluster esiste gi\u00e0, si pu\u00f2 effettuare 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 trasmettere senza problemi.<\/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'assistenza fine di ClickHouse. Infatti, il zoned deployment \u00e8 ci\u00f2 di cui ho parlato durante la spiegazione di hostPath e local storage. \u00c8 il modo corretto per effettuare un 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 riguarda 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 considerato le frecce verdi. Ora esaminiamo le frecce rosse. Questo riguarda il modo in cui desideriamo monitorare il nostro cluster. Come le metriche dal cluster ClickHouse vengono trasferite 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 complessit\u00e0 del monitoraggio? Perch\u00e9 \u00e8 considerato un risultato? La complessit\u00e0 riguarda proprio la dinamica. Quando abbiamo un cluster statico, \u00e8 possibile configurare il monitoraggio una volta e non pensarci pi\u00f9.<\/p>\n<p><\/p>\n<p>Ma se abbiamo molti cluster, o se c'\u00e8 un costante cambiamento, il processo \u00e8 dinamico. E occuparsi continuamente di ripristinare il monitoraggio \u00e8 una perdita di risorse e tempo, cio\u00e8 anche semplicemente pigrizia. \u00c8 necessario automatizzare tutto questo. La complessit\u00e0 sta proprio nella dinamica del processo. E l'operatore automatizza tutto questo 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 \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 cos\u00ec. <\/p>\n<p><\/p>\n<p>E il monitoraggio viene eseguito automaticamente dall'operatore. Punto di ingresso unico. <\/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 semplicemente, in uscita, nel dashboard di Grafana, come vive il nostro cluster. <\/p>\n<p><\/p>\n<p>A proposito, il dashboard di Grafana \u00e8 distribuito insieme al nostro operatore direttamente nel codice sorgente. Puoi collegarlo e utilizzarlo. Questa \u00e8 uno screenshot 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>Dove vorremmo andare avanti? 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>Inoltre, desideriamo molto automatizzare l'integrazione con ZooKeeper. E nei piani c'\u00e8 l'integrazione con ZooKeeper-operator. Cio\u00e8, per ZooKeeper \u00e8 stato scritto un operatore e ha senso che due operatori comincino a integrarsi per costruire una soluzione pi\u00f9 comoda. <\/li>\n<li>Vogliamo fare controlli di vitalit\u00e0 pi\u00f9 complessi. <\/li>\n<li>In verde ho evidenziato ci\u00f2 che abbiamo in arrivo, l'ereditariet\u00e0 dei Templates \u2013 FATTO, cio\u00e8 con il prossimo rilascio dell'operatore avremo gi\u00e0 l'ereditariet\u00e0 dei modelli. Questo \u00e8 uno strumento potente che permette di costruire configurazioni complesse a pezzi. <\/li>\n<li>E vogliamo automatizzare compiti complessi. Il principale di questi \u00e8 il 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 bilancio 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 in uscita? Vale la pena dedicarcisi o no? \u00c8 necessario provare a portare il database in Kubernetes e applicare l'operatore in generale e l'operatore Alitnity in particolare.<\/p>\n<p><\/p>\n<p>In uscita otteniamo:<\/p>\n<p><\/p>\n<ul>\n<li>Un notevole semplificazione e automazione della configurazione, del dispiego e anche della manutenzione. <\/li>\n<li>Monitoraggio integrato immediato. <\/li>\n<li>E modelli codificati gi\u00e0 pronti per situazioni complesse. Non \u00e8 pi\u00f9 necessario aggiungere una replica manualmente. Questo lo fa l'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 l'ultima domanda. Abbiamo gi\u00e0 un database in Kubernetes, virtualizzazione. Qual \u00e8 la prestazione di questa soluzione, specialmente considerando che ClickHouse \u00e8 ottimizzato per le prestazioni?<\/p>\n<p><\/p>\n<p>La risposta \u00e8 \u2013 tutto bene! Non entrer\u00f2 nei dettagli, \u00e8 un tema di una presentazione separata. <\/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 c'\u00e8 un progetto chiamato TSBS. Qual \u00e8 il suo obiettivo principale? \u00c8 un test di database per le prestazioni. \u00c8 un tentativo di confrontare il simile con il simile, il morbido con il morbido. <\/p>\n<p><\/p>\n<p>Come funziona? Viene generato un set di dati. Poi, questo set di dati viene testato su diversi database con gli stessi test. E ogni database risolve un compito come meglio pu\u00f2. E poi i risultati possono essere confrontati. <\/p>\n<p><\/p>\n<p>Supporta gi\u00e0 un gran numero di database. Ne ho evidenziati tre principali. 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 stata inoltre effettuata un'analisi rispetto a un'altra soluzione simile. \u00c8 stato un confronto con RedShift. Il confronto \u00e8 stato effettuato su Amazon. ClickHouse supera anche in questo caso tutti gli altri. <\/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 raccontato?<\/p>\n<p><\/p>\n<ul>\n<li>DB su Kubernetes \u00e8 possibile. Probabilmente qualsiasi DB \u00e8 utilizzabile, ma in generale sembra fattibile. ClickHouse su Kubernetes \u00e8 sicuramente utilizzabile con il nostro operatore. <\/li>\n<li>L'operatore aiuta ad automatizzare i processi e semplifica realmente la vita.<\/li>\n<li>Le prestazioni sono normali.<\/li>\n<li>E ci sembra che questo possa e debba essere utilizzato. <\/li>\n<\/ul>\n<p><\/p>\n<p>Open source \u2013 unitevi!<\/p>\n<p><\/p>\n<p>Come ho gi\u00e0 detto, l'operatore \u00e8 un prodotto completamente open source, quindi sarebbe davvero bello 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. Vengo dall'azienda SEMrush. Sono curioso riguardo il logging. Si sente parlare di monitoraggio, ma non di logging, se parliamo dell'intero cluster. Noi, ad esempio, abbiamo un cluster montato su hardware. Utilizziamo logging centralizzato, raccogliendo standardamente in un'unica soluzione. Poi estraiamo i dati interessanti da l\u00ec.<\/em> <\/p>\n<p><\/p>\n<p>Buona domanda, ossia il logging \u00e8 nella lista delle cose da fare. Il nostro operatore attualmente non lo automatizza. \u00c8 ancora in fase di sviluppo, il progetto \u00e8 ancora abbastanza giovane. Comprendiamo l'importanza del logging. \u00c8 un tema molto rilevante e probabilmente altrettanto importante quanto il monitoraggio. Ma il primo della lista per l'implementazione \u00e8 stato il monitoraggio. 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, sfortunatamente, non lo sa fare, ma \u00e8 nei nostri piani, lo faremo. Se desiderate unirvi, un pull request, per favore.<\/p>\n<p><\/p>\n<p><em>Buongiorno! Grazie per la presentazione! Ho una domanda standard riguardo i Persistent Volumes. Quando creiamo una configurazione con questo operatore, come fa l'operatore a determinare su quale nodo abbiamo montato un disco o una cartella? Dobbiamo spiegargli in anticipo che, per favore, posiziona il nostro ClickHouse esattamente su questi nodi, quelli dove c'\u00e8 un disco?<\/em><\/p>\n<p><\/p>\n<p>Per quanto ne so, questa domanda \u00e8 un'estensione dello storage locale, in particolare della sua parte riguardante il hostPath. \u00c8 come spiegare all'intero sistema che \u00e8 necessario far partire un pod su un nodo specifico, su cui abbiamo un disco fisicamente connesso, montato in un determinato percorso. \u00c8 un'intera sezione che ho toccato in modo molto superficiale, perch\u00e9 la risposta \u00e8 piuttosto ampia. <\/p>\n<p><\/p>\n<p>In breve, si presenta cos\u00ec. Dobbiamo ovviamente fare il provisioning di questi volumi. Al momento, nel local storage non c'\u00e8 provisioning dinamico, quindi i DevOps devono creare i dischi, ovvero questi volumi, manualmente. Devono anche spiegare a Kubernetes il provisioning, specificando che avremo Persistent volumes di un certo tipo, situati su determinati nodi. Poi sar\u00e0 necessario spiegare a Kubernetes che i pod che richiedono quella classe di storage locale devono essere schedulati solo su quei nodi, tramite le etichette. A questo scopo, l'operatore ha la possibilit\u00e0 di assegnare alcune etichette e una per ogni istanza host. Cos\u00ec i pod saranno instradati da Kubernetes per essere avviati solo su nodi che soddisfano i requisiti delle etichette, parlando in termini semplici. Gli amministratori assegnano le etichette e fanno il provisioning dei dischi manualmente. In questo modo, il tutto si scalda.<\/p>\n<p><\/p>\n<p>E proprio la terza opzione locale aiuta un po' a semplificare la situazione. Come ho gi\u00e0 sottolineato, si tratta di un lavoro meticoloso di configurazione, che alla fine aiuta a ottenere massime prestazioni.<\/p>\n<p><\/p>\n<p><em>Ho una seconda domanda correlata a questo. Kubernetes \u00e8 stato pensato in modo tale da non preoccuparsi se perdiamo un nodo o meno. Cosa dobbiamo fare in questo caso se perdiamo il nodo su cui si trova un shard?<\/em><\/p>\n<p><\/p>\n<p>S\u00ec, Kubernetes \u00e8 stato inizialmente posizionato in modo che il nostro rapporto con i pod fosse simile a quello degli animali da allevamento, mentre ora ogni disco diventa qualcosa di simile a un animale domestico. Esiste un problema: non possiamo semplicemente scartarli. Lo sviluppo di Kubernetes sta andando verso una direzione in cui non \u00e8 possibile considerare tutto filosoficamente come risorse completamente eliminabili.<\/p>\n<p><\/p>\n<p>Ora una domanda pratica. Cosa fare se hai perso un nodo su cui si trovava un disco? Qui il problema deve essere affrontato a un livello superiore. Nel caso di ClickHouse, abbiamo repliche che funzionano a un livello superiore, cio\u00e8 a livello di ClickHouse.<\/p>\n<p><\/p>\n<p>Qual \u00e8 la disposizione risultante? DevOps \u00e8 responsabile della conservazione dei dati. Deve configurare correttamente la replica e deve monitorare il suo svolgimento. I dati devono essere duplicati nella replica a livello di ClickHouse. Questa non \u00e8 un'operazione che svolge l'operatore, n\u00e9 \u00e8 un compito che deve gestire Kubernetes. \u00c8 a livello di ClickHouse.<\/p>\n<p><\/p>\n<p>Cosa fare se il nodo hardware si guasta? In questo caso, sar\u00e0 necessario installarne un secondo, configurare correttamente il disco e applicare le etichette. Dopo di che, dovr\u00e0 soddisfare i requisiti affinch\u00e9 Kubernetes possa avviare un'istanza del pod. Kubernetes lo avvier\u00e0. Non hai abbastanza pod rispetto a quanto richiesto. Essa passer\u00e0 attraverso un ciclo, come ho mostrato. E al livello pi\u00f9 alto, ClickHouse capir\u00e0 che \u00e8 stata aggiunta una replica, \u00e8 ancora vuota e bisogna iniziare a trasferirvi i dati. Cio\u00e8, questo processo \u00e8 ancora poco automatizzato. <\/p>\n<p><\/p>\n<p><em>Grazie per la presentazione! Quando si verificano problemi e l'operatore si arresta e si riavvia, nel frattempo arrivano eventi, come gestisci la situazione?<\/em><\/p>\n<p><\/p>\n<p>Cosa succede se l'operatore si arresta e si riavvia? <\/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 cosa fare in questo caso \u00e8 parzialmente suddiviso tra l'operatore e Kubernetes. Kubernetes ha la possibilit\u00e0 di riprodurre l'evento che \u00e8 accaduto. Lo riproduce. Il compito dell'operatore \u00e8 assicurarsi che, quando viene fatto il replay del log degli eventi, questi siano idempotenti. E che l'ingresso ripetuto dello stesso evento non rompa il nostro sistema. E il nostro operatore gestisce questo compito. <\/p>\n<p><\/p>\n<p><em>Buongiorno! Grazie per la presentazione! Dmitry Zavyalov, azienda<\/em> <em>Smedova. \u00c8 prevista l'aggiunta all'operatore della possibilit\u00e0 di configurazione con haproxy? Sarei interessato a un altro bilanciatore oltre a quello standard, che sia intelligente e capisca 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, sostituire Ingress con haproxy. In haproxy \u00e8 possibile specificare la topologia del cluster, dove ha le repliche.<\/em><\/p>\n<p><\/p>\n<p>Per ora non ci abbiamo pensato. Se avete bisogno di questo e potete spiegare perch\u00e9 sia necessario, possiamo implementarlo, soprattutto se volete partecipare. Siamo felici di considerare questa opzione. La risposta breve \u00e8: no, al momento non abbiamo questa funzionalit\u00e0. Grazie per il suggerimento, ci daremo un'occhiata. E se poteste anche spiegare il caso d'uso e perch\u00e9 sia utile nella pratica, per esempio creando issue su GitHub, sarebbe fantastico.<\/p>\n<p><\/p>\n<p><em>C'\u00e8 gi\u00e0.<\/em><\/p>\n<p><\/p>\n<p>Va bene. Siamo aperti a qualsiasi proposta. E haproxy \u00e8 nella lista delle cose da fare. La lista delle cose da fare sta crescendo e non diminuendo 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 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/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) 5.0.1.1\" \/>\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: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 di cluster di database. Vladislav Klimenko (Altinity, 2019) | ProHoster","description":"","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: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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}