{"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\/pt\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","title":{"rendered":"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/56e002c7408c4708e39ece867f84171e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A apresenta\u00e7\u00e3o aborda quest\u00f5es pr\u00e1ticas sobre o desenvolvimento de operadores no Kubernetes, o projeto de sua arquitetura e os principais princ\u00edpios de funcionamento.<\/p>\n<p><\/p>\n<p>Na primeira parte da apresenta\u00e7\u00e3o, abordaremos:<\/p>\n<p><\/p>\n<ul>\n<li>o que \u00e9 um operador no Kubernetes e para que serve;<\/li>\n<li>como um operador simplifica a gest\u00e3o de sistemas complexos;<\/li>\n<li>o que um operador pode e o que n\u00e3o pode fazer.<\/li>\n<\/ul>\n<p><\/p>\n<p>Em seguida, vamos discutir a estrutura interna do operador. Analisaremos a arquitetura e o funcionamento do operador passo a passo. Vamos detalhar:<\/p>\n<p><\/p>\n<ul>\n<li>a intera\u00e7\u00e3o entre o operador e o Kubernetes;<\/li>\n<li>quais fun\u00e7\u00f5es o operador assume e quais delega ao Kubernetes.<\/li>\n<\/ul>\n<p><\/p>\n<p>Vamos revisar a gest\u00e3o de shards e r\u00e9plicas de bancos de dados no Kubernetes.<br \/>\nEm seguida, vamos discutir quest\u00f5es de armazenamento de dados:<\/p>\n<p><\/p>\n<ul>\n<li>como trabalhar com Persistent Storage do ponto de vista do operador;<\/li>\n<li>os desafios de usar Local Storage.<\/li>\n<\/ul>\n<p><\/p>\n<p>Na parte final da apresenta\u00e7\u00e3o, examinaremos exemplos pr\u00e1ticos de aplica\u00e7\u00e3o <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">clickhouse-operator<\/a><\/noindex> na Amazon ou Google Cloud Service. A apresenta\u00e7\u00e3o \u00e9 baseada na experi\u00eancia de desenvolvimento e opera\u00e7\u00e3o de um operador para ClickHouse.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>V\u00eddeo:<\/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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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>Meu nome \u00e9 Vladislav Klimenko. Hoje, gostaria de compartilhar nossa experi\u00eancia no desenvolvimento e opera\u00e7\u00e3o de um operador, que \u00e9 um operador especializado para gerenciar clusters de bancos de dados. Usaremos como exemplo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">ClickHouse-operator<\/a><\/noindex> para gerenciar o cluster de ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cc297a3edb3b2a5e30d0dc2725de4011.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por que temos a oportunidade de falar sobre o operador e o ClickHouse?<\/p>\n<p><\/p>\n<ul>\n<li>Estamos envolvidos no suporte e desenvolvimento do ClickHouse. <\/li>\n<li>Atualmente, estamos tentando contribuir gradualmente para o desenvolvimento do ClickHouse. E somos os segundos ap\u00f3s o Yandex em termos de mudan\u00e7as feitas no ClickHouse. <\/li>\n<li>Temos buscado fazer projetos adicionais para o ecossistema ClickHouse. <\/li>\n<\/ul>\n<p><\/p>\n<p>Sobre um desses projetos, gostaria de falar. \u00c9 sobre o ClickHouse-operator para Kubernetes. <\/p>\n<p><\/p>\n<p>Na minha apresenta\u00e7\u00e3o, quero abordar dois temas: <\/p>\n<p><\/p>\n<ul>\n<li>O primeiro tema \u00e9 como nosso operador para gerenciar bancos de dados ClickHouse funciona no Kubernetes. <\/li>\n<li>O segundo tema \u00e9 como qualquer operador funciona, ou seja, como ele interage com o Kubernetes. <\/li>\n<\/ul>\n<p><\/p>\n<p>Essas duas quest\u00f5es se cruzar\u00e3o ao longo de toda a minha apresenta\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4cc9790e18e70ae1ccde2cf39ef4ef00.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quem estaria interessado em ouvir o que estou tentando compartilhar?<\/p>\n<p><\/p>\n<ul>\n<li>Ser\u00e1 mais interessante para aqueles que operam operadores. <\/li>\n<li>Ou para aqueles que desejam criar seu pr\u00f3prio operador para entender como ele funciona internamente, como o operador interage com o Kubernetes e quais desafios podem surgir. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/07545f7a0171b610697c519d4aa9cd43.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para entender melhor o que vamos discutir hoje, seria bom saber como funciona o Kubernetes e ter uma forma\u00e7\u00e3o b\u00e1sica em tecnologias de nuvem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/eff56cc3e83fde3d3e64d73d41b07417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O que \u00e9 o ClickHouse? \u00c9 um banco de dados orientado a colunas, especializado em processar consultas anal\u00edticas em tempo real. E \u00e9 completamente open source. <\/p>\n<p><\/p>\n<p>E precisamos saber apenas duas coisas. \u00c9 preciso entender que \u00e9 um banco de dados, ent\u00e3o o que vou explicar ser\u00e1 aplic\u00e1vel praticamente a qualquer banco de dados. E que o SGBD ClickHouse escala muito bem, oferecendo escalabilidade praticamente linear. Portanto, o estado do cluster \u00e9 um estado natural para o ClickHouse. E o que mais nos interessa discutir \u00e9 como gerenciar um cluster ClickHouse no Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5eb1ff5026c492117bf2467b10de7053.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por que ele \u00e9 necess\u00e1rio l\u00e1? Por que n\u00e3o podemos continuar a oper\u00e1-lo de forma independente? As respostas s\u00e3o parcialmente t\u00e9cnicas e parcialmente organizacionais. <\/p>\n<p><\/p>\n<ul>\n<li>Na pr\u00e1tica, encontramos cada vez mais situa\u00e7\u00f5es em que, em grandes empresas, praticamente todos os componentes j\u00e1 est\u00e3o no Kubernetes. As bases de dados permanecem fora. <\/li>\n<li>E frequentemente surge a quest\u00e3o: \u201c\u00c9 poss\u00edvel coloc\u00e1-las l\u00e1 dentro?\u201d. Portanto, grandes empresas se esfor\u00e7am para criar a m\u00e1xima unifica\u00e7\u00e3o de gerenciamento, a fim de ter rapidamente a capacidade de gerenciar seus reposit\u00f3rios de dados. <\/li>\n<li>E isso ajuda especialmente quando \u00e9 necess\u00e1ria a m\u00e1xima possibilidade de replicar a mesma coisa em um novo local, ou seja, m\u00e1xima portabilidade.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/99312e74bd7ed4031128c7ec872f6a68.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qu\u00e3o simples ou dif\u00edcil isso \u00e9? \u00c9 claro que pode ser feito manualmente. Mas n\u00e3o \u00e9 t\u00e3o simples, porque somamos a complexidade de gerenciar o pr\u00f3prio Kubernetes, e ainda h\u00e1 as especificidades do ClickHouse. E assim resulta em uma agrega\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>E tudo isso resulta em um conjunto consider\u00e1vel de tecnologias, cuja gest\u00e3o se torna bastante complicada, pois o Kubernetes traz suas quest\u00f5es cotidianas para a opera\u00e7\u00e3o, enquanto o ClickHouse traz suas quest\u00f5es para a opera\u00e7\u00e3o di\u00e1ria. Especialmente se tivermos v\u00e1rios ClickHouse e precisarmos constantemente trabalhar com eles. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ca10b805b2744d1a5283f96b0ac1cc11.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>No ClickHouse, ao ter uma configura\u00e7\u00e3o din\u00e2mica, existem v\u00e1rias quest\u00f5es que geram uma carga constante para o DevOps:<\/p>\n<p><\/p>\n<ul>\n<li>Quando queremos mudar algo no ClickHouse, como adicionar uma r\u00e9plica ou shard, precisamos gerenciar a configura\u00e7\u00e3o. <\/li>\n<li>Depois, \u00e9 necess\u00e1rio alterar o esquema de dados, pois o ClickHouse tem uma maneira espec\u00edfica de sharding. \u00c9 preciso organizar o esquema de dados e as configura\u00e7\u00f5es. <\/li>\n<li>\u00c9 necess\u00e1rio configurar a monitoriza\u00e7\u00e3o. <\/li>\n<li>Coleta de logs para novos shards e novas r\u00e9plicas. <\/li>\n<li>Preocupar-se com a recupera\u00e7\u00e3o.<\/li>\n<li>E com o rein\u00edcio. <\/li>\n<\/ul>\n<p><\/p>\n<p>Essas s\u00e3o tarefas rotineiras que gostar\u00edamos muito de facilitar na opera\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2461e861ca1d2f2344ead9decf85a97e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O Kubernetes ajuda bastante na opera\u00e7\u00e3o, mas nas quest\u00f5es b\u00e1sicas do sistema. <\/p>\n<p><\/p>\n<p>O Kubernetes facilita e automatiza tais tarefas como:<\/p>\n<p><\/p>\n<ul>\n<li>Recupera\u00e7\u00e3o.<\/li>\n<li>Rein\u00edcio. <\/li>\n<li>Gerenciamento do sistema de armazenamento.<\/li>\n<\/ul>\n<p><\/p>\n<p>Isso \u00e9 bom, \u00e9 a dire\u00e7\u00e3o certa, mas ele n\u00e3o tem uma compreens\u00e3o completa de como operar um cluster de banco de dados. <\/p>\n<p><\/p>\n<p>Queremos mais, gostar\u00edamos que todo o nosso banco de dados funcionasse no Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6564e9f29d5d518925c8593bca978345.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gostar\u00edamos de ter algo como um grande bot\u00e3o m\u00e1gico vermelho, que voc\u00ea pressiona e tem um cluster que se despliega e \u00e9 mantido durante todo o ciclo de vida, lidando com tarefas di\u00e1rias que precisam ser resolvidas. Um cluster ClickHouse no Kubernetes.<\/p>\n<p><\/p>\n<p>E n\u00f3s nos esfor\u00e7amos para criar uma solu\u00e7\u00e3o que ajude a facilitar o trabalho. Este \u00e9 o ClickHouse-operator para Kubernetes da empresa Altinity.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ff80c6fc59069ec900d545096ad978d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O operador \u00e9 um programa cuja principal fun\u00e7\u00e3o \u00e9 gerenciar outros programas, ou seja, \u00e9 um gestor. <\/p>\n<p><\/p>\n<p>E ele cont\u00e9m modelos de comportamento. Pode-se chamar isso de conhecimentos codificados sobre a \u00e1rea. <\/p>\n<p><\/p>\n<p>E sua principal tarefa \u00e9 facilitar a vida do DevOps e reduzir o micromanagement, para que ele (DevOps) pense em termos de alto n\u00edvel, ou seja, que ele (DevOps) n\u00e3o se preocupe com o micromanagement e n\u00e3o precise ajustar todos os detalhes manualmente. <\/p>\n<p><\/p>\n<p>E justamente o operador \u00e9 um assistente rob\u00f4 que lida com microtarefas e ajuda o DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0824a1fa710e8c4f45406aa7f596b977.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por que precisamos do operador? Ele se destaca especialmente em duas quest\u00f5es:<\/p>\n<p><\/p>\n<ul>\n<li>Quando o especialista que trabalha com ClickHouse n\u00e3o tem experi\u00eancia suficiente, mas j\u00e1 \u00e9 necess\u00e1rio operar o ClickHouse, o operador facilita a opera\u00e7\u00e3o e permite gerenciar um cluster ClickHouse com uma configura\u00e7\u00e3o bastante complexa, sem precisar entrar em detalhes sobre como tudo funciona por dentro. Basta dar-lhe tarefas de alto n\u00edvel e isso funciona. <\/li>\n<li>E a segunda tarefa, na qual ele se destaca, \u00e9 quando \u00e9 necess\u00e1rio automatizar uma grande quantidade de tarefas padr\u00e3o. Remove microtarefas dos administradores de sistema. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f1cb11156d57f560d0b6c82700ac6ff8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Isso \u00e9 mais \u00fatil para aqueles que est\u00e3o apenas come\u00e7ando sua jornada ou para aqueles que precisam se dedicar muito \u00e0 automa\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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 \u00e9 a diferen\u00e7a entre a abordagem baseada em operadores e outros sistemas? Existe o Helm. Ele tamb\u00e9m ajuda a instalar o ClickHouse, \u00e9 poss\u00edvel desenhar gr\u00e1ficos do helm que at\u00e9 montam um cluster completo de ClickHouse. Ent\u00e3o, qual \u00e9 a diferen\u00e7a entre um operador e, por exemplo, o Helm?<\/p>\n<p><\/p>\n<p>A principal diferen\u00e7a fundamental \u00e9 que o Helm \u00e9 um gerenciador de pacotes, enquanto o operador vai al\u00e9m. Ele abrange todo o ciclo de vida. N\u00e3o \u00e9 apenas instala\u00e7\u00e3o, mas tarefas di\u00e1rias que incluem escalonamento, sharding, ou seja, tudo o que precisa ser feito durante o ciclo de vida (se necess\u00e1rio, at\u00e9 desinstala\u00e7\u00e3o) \u2013 tudo isso \u00e9 resolvido pelo operador. Ele tenta automatizar e manter todo o ciclo de vida do software. Essa \u00e9 sua diferen\u00e7a fundamental em rela\u00e7\u00e3o a outras solu\u00e7\u00f5es dispon\u00edveis. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e26b57c8caf8437f683d7afbfa127ebd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Essa foi a parte introdut\u00f3ria, vamos seguir em frente. <\/p>\n<p><\/p>\n<p>Como constru\u00edmos nosso operador? Tentamos abordar a quest\u00e3o de gerenciar o cluster de ClickHouse como um \u00fanico recurso. <\/p>\n<p><\/p>\n<p>Aqui temos, na parte esquerda da imagem, os dados de entrada. \u00c9 um YAML com a especifica\u00e7\u00e3o do cluster, que \u00e9 passado de maneira cl\u00e1ssica atrav\u00e9s do kubectl para o Kubernetes. L\u00e1, nosso operador captura, faz sua m\u00e1gica. E no final, temos este esquema. Esta \u00e9 a implementa\u00e7\u00e3o do ClickHouse no Kubernetes.<\/p>\n<p><\/p>\n<p>E prosseguiremos vendo lentamente como o operador realmente funciona, quais tarefas padr\u00e3o podem ser resolvidas. Vamos nos concentrar apenas nas tarefas padr\u00e3o, pois temos tempo limitado. E n\u00e3o ser\u00e1 abordado tudo o que o operador pode resolver. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b40401931b58988058419d4495dbb1bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos nos basear na pr\u00e1tica. Nosso projeto \u00e9 totalmente open source, ent\u00e3o voc\u00ea pode ver no GitHub como ele funciona. E pode considerar que, se quiser apenas iniciar, com o Guia R\u00e1pido \u00e9 poss\u00edvel come\u00e7ar.<\/p>\n<p><\/p>\n<p>Se voc\u00ea quiser se aprofundar, tentamos manter a documenta\u00e7\u00e3o em um estado mais ou menos decente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9414d7c3aa94b6ad999e150f0ac25a97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos come\u00e7ar com uma tarefa pr\u00e1tica. A primeira tarefa, com a qual todos queremos come\u00e7ar, \u00e9 executar o primeiro exemplo de alguma forma. Como executar o ClickHouse usando um operador, mesmo sem saber muito bem como ele funciona? Escrevemos um manifesto, j\u00e1 que toda a comunica\u00e7\u00e3o com o k8s acontece atrav\u00e9s de manifestos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3e97cd235827460693ed95fb3598d31d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui est\u00e1 um manifesto complexo. O que est\u00e1 destacado em vermelho \u00e9 o que precisamos enfatizar. Estamos pedindo ao operador para criar um cluster chamado demo.<\/p>\n<p><\/p>\n<p>Por enquanto, esses s\u00e3o exemplos b\u00e1sicos. O armazenamento ainda n\u00e3o est\u00e1 descrito, mas voltaremos a ele um pouco mais tarde. Por enquanto, estaremos observando o desenvolvimento do cluster em tempo real.<\/p>\n<p><\/p>\n<p>Criamos este manifesto. Enviamos para o nosso operador. Ele trabalhou e fez sua m\u00e1gica.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/502e64fbe6ed7d04b2aecb7d51abc7f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Olhamos no console. Tr\u00eas componentes despertam nosso interesse \u2013 o Pod, dois Services e o StatefulSet.<\/p>\n<p><\/p>\n<p>O operador executou e podemos ver o que exatamente ele criou. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/67faf120e21e5113680ccff9c71b00f1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ele cria um esquema semelhante a este. Temos um StatefulSet, um Pod, um ConfigMap para cada r\u00e9plica e um ConfigMap para todo o cluster. \u00c9 imprescind\u00edvel ter servi\u00e7os como pontos de entrada para o cluster. <\/p>\n<p><\/p>\n<p>Os servi\u00e7os consistem em um Load Balancer Service central e mais um para cada r\u00e9plica, para cada shard. <\/p>\n<p><\/p>\n<p>Aqui est\u00e1 como nosso cluster b\u00e1sico se parece. Ele \u00e9 composto por um \u00fanico n\u00f3. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f235ada45ee58b517c0e041f795ae122.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos em frente, vamos complicar as coisas. Precisamos shardizar o cluster.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/992836a00434c64fb4616c1c4cc4df97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nossas demandas est\u00e3o crescendo, a din\u00e2mica come\u00e7a. Queremos adicionar um shard. Acompanhemos o desenvolvimento. Alteramos nossa especifica\u00e7\u00e3o. Estamos indicando que queremos dois shards. <\/p>\n<p><\/p>\n<p>Esse \u00e9 o mesmo arquivo que se desenvolve dinamicamente com o crescimento do sistema. O armazenamento ainda n\u00e3o est\u00e1 inclu\u00eddo, mas ser\u00e1 abordado mais adiante, \u00e9 um t\u00f3pico \u00e0 parte.<\/p>\n<p><\/p>\n<p>Enviamos o operador YAML e vemos o que acontece. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8ddb5845cae160098470208f51b5da7c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O operador pensou e criou as seguintes entidades. J\u00e1 temos dois Pods, tr\u00eas Services e, repentinamente, dois StatefulSets. Por que dois StatefulSets?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/26eb734ff1a195de2ceaab842b472ee4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na representa\u00e7\u00e3o estava assim \u2013 esse \u00e9 nosso estado inicial, quando t\u00ednhamos um pod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/657838b0d378121fdd66ad3ff8168600.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ficou assim. At\u00e9 agora tudo \u00e9 simples, foi duplicado. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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 por que o StatefulSet se tornou dois? Aqui precisamos desviar um pouco e discutir como a gest\u00e3o de Pods ocorre no Kubernetes.<\/p>\n<p><\/p>\n<p>H\u00e1 um objeto chamado StatefulSet, que permite criar um conjunto de Pods a partir de um modelo. O fator chave aqui \u00e9 o Template. E \u00e9 poss\u00edvel executar muitos Pods de um \u00fanico template em um StatefulSet. E a frase chave aqui \u00e9 'muitos Pods de um \u00fanico template'.<\/p>\n<p><\/p>\n<p>Houve uma grande tenta\u00e7\u00e3o de criar todo o cluster, encapsulando tudo em um \u00fanico StatefulSet. Isso funcionaria, n\u00e3o h\u00e1 problemas quanto a isso. Mas h\u00e1 um detalhe. Se quisermos montar um cluster heterog\u00eaneo, ou seja, com v\u00e1rias vers\u00f5es do ClickHouse, ent\u00e3o surgem quest\u00f5es. Sim, o StatefulSet pode realizar atualiza\u00e7\u00f5es cont\u00ednuas (rolling updates) e \u00e9 poss\u00edvel aplicar uma nova vers\u00e3o, ressaltando que n\u00e3o devemos tentar atualizar mais do que um certo n\u00famero de n\u00f3s ao mesmo tempo.<\/p>\n<p><\/p>\n<p>Mas se extrapolarmos a tarefa e dissermos que queremos fazer um cluster completamente heterog\u00eaneo e n\u00e3o queremos simplesmente mudar da vers\u00e3o antiga para a nova atrav\u00e9s de uma atualiza\u00e7\u00e3o cont\u00ednua, mas queremos criar um cluster heterog\u00eaneo tanto em termos de diferentes vers\u00f5es do ClickHouse quanto em termos de diferentes storages. Queremos, por exemplo, fazer algumas r\u00e9plicas em discos separados, em discos lentos, construindo, de maneira geral, um cluster completamente heterog\u00eaneo. E devido ao fato de que o StatefulSet cria uma solu\u00e7\u00e3o padronizada a partir de um \u00fanico modelo, n\u00e3o \u00e9 poss\u00edvel fazer isso. <\/p>\n<p><\/p>\n<p>Depois de alguma reflex\u00e3o, foi tomada a decis\u00e3o de fazer assim. Cada r\u00e9plica estar\u00e1 em seu pr\u00f3prio StatefulSet. Existem algumas desvantagens nessa solu\u00e7\u00e3o, mas na pr\u00e1tica isso encapsula completamente o operador. E h\u00e1 muitas vantagens. Podemos construir um cluster exatamente como desejamos, por exemplo, absolutamente heterog\u00eaneo. Portanto, em um cluster onde temos dois shards com uma r\u00e9plica cada, teremos 2 StatefulSets e 2 Pods justamente porque escolhemos essa abordagem devido \u00e0s raz\u00f5es mencionadas acima para possibilitar a constru\u00e7\u00e3o de um cluster heterog\u00eaneo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b7ae92a545f9bb6cc5f0136df87207f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos voltar \u00e0s tarefas pr\u00e1ticas. Precisamos configurar usu\u00e1rios em nosso cluster, ou seja, precisamos realizar alguma configura\u00e7\u00e3o do ClickHouse no Kubernetes. O operador oferece todas as possibilidades para isso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6a65aa78293c0b40230cf24efc58e55a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Podemos escrever diretamente no YAML o que queremos. Todas as op\u00e7\u00f5es de configura\u00e7\u00e3o mapeiam diretamente desse YAML para as configura\u00e7\u00f5es do ClickHouse, que depois s\u00e3o distribu\u00eddas por todo o cluster.<\/p>\n<p><\/p>\n<p>Tamb\u00e9m podemos escrever assim. Isso \u00e9 apenas um exemplo. A senha pode ser criptografada. Todas as op\u00e7\u00f5es de configura\u00e7\u00e3o do ClickHouse s\u00e3o absolutamente suportadas. Aqui \u00e9 apenas um exemplo. <\/p>\n<p><\/p>\n<p>A configura\u00e7\u00e3o do cluster \u00e9 disseminada como ConfigMap. Na pr\u00e1tica, a atualiza\u00e7\u00e3o do ConfigMap n\u00e3o acontece instantaneamente, portanto, se for um cluster grande, o processo de propaga\u00e7\u00e3o da configura\u00e7\u00e3o leva algum tempo. Mas tudo isso \u00e9 muito conveniente na pr\u00e1tica.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2e42d19d7a558e3b8d4bbb51fe5bd08b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Estamos complicando a tarefa. O cluster est\u00e1 se desenvolvendo. Queremos replicar dados. Ou seja, j\u00e1 temos dois shards, cada um com uma r\u00e9plica, os usu\u00e1rios est\u00e3o configurados. Estamos crescendo e queremos trabalhar com replica\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c97e5e6ca9cb66d3a94fb8cfe610186.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O que precisamos para replica\u00e7\u00e3o? <\/p>\n<p><\/p>\n<p>Precisamos do ZooKeeper. No ClickHouse, a replica\u00e7\u00e3o \u00e9 constru\u00edda utilizando o ZooKeeper. O ZooKeeper \u00e9 necess\u00e1rio para que v\u00e1rias r\u00e9plicas do ClickHouse cheguem a um consenso sobre quais blocos de dados est\u00e3o em qual ClickHouse. <\/p>\n<p><\/p>\n<p>Qualquer ZooKeeper pode ser utilizado. Se a empresa tiver um ZooKeeper externo, ele pode ser utilizado. Caso contr\u00e1rio, \u00e9 poss\u00edvel instalar a partir do nosso reposit\u00f3rio. Existe um instalador que facilita tudo isso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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 o esquema de intera\u00e7\u00e3o de todo o sistema fica assim. Temos o Kubernetes como plataforma. Nela, \u00e9 executado o operador do ClickHouse. O ZooKeeper est\u00e1 representado aqui. E o operador interage tanto com o ClickHouse quanto com o ZooKeeper. Ou seja, temos uma intera\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>E tudo isso \u00e9 necess\u00e1rio para que o ClickHouse consiga replicar dados com sucesso no k8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4fc37aee850acd20517fa3d7562f0165.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Agora vamos analisar a tarefa em si, como ser\u00e1 o manifesto para a replica\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Adicionamos duas se\u00e7\u00f5es ao nosso manifesto. A primeira indica de onde obter o ZooKeeper, que pode ser tanto interno ao Kubernetes quanto externo. Isso \u00e9 apenas uma descri\u00e7\u00e3o. E solicitamos as r\u00e9plicas. Ou seja, queremos duas r\u00e9plicas. No total, devemos ter 4 pods. Sobre o armazenamento, devemos lembrar, ele voltar\u00e1 um pouco mais adiante. Armazenamento \u00e9 uma hist\u00f3ria \u00e0 parte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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 assim.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/909ffd258dbce718ddf529a1a753de6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fica assim. As r\u00e9plicas s\u00e3o adicionadas. A quarta n\u00e3o coube, acreditamos que pode haver muitas. E ao lado \u00e9 adicionado o ZooKeeper. Os esquemas est\u00e3o se tornando mais complexos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c33b37fc7fc72f51276e5e98b9ec2134.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E chegou a hora de adicionar a pr\u00f3xima tarefa. Vamos adicionar Armazenamento Persistente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f28d14901a713eca413a52ec6ea21ac5.jpeg\" style=\"display:block;margin: 0 auto;\" \/>Temos v\u00e1rias op\u00e7\u00f5es para Armazenamento Persistente.<\/p>\n<p><\/p>\n<p>Caso estejamos operando em um provedor de nuvem, como Amazon ou Google, h\u00e1 uma grande tenta\u00e7\u00e3o de utilizar armazenamento em nuvem. \u00c9 muito conveniente, \u00e9 uma boa op\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>E h\u00e1 uma segunda op\u00e7\u00e3o. \u00c9 para armazenamento local, quando temos discos locais em cada n\u00f3. Esta op\u00e7\u00e3o \u00e9 muito mais complexa de implementar, mas, ao mesmo tempo, \u00e9 mais eficiente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/483ee5c08b62e987620bf54fd32a44b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos analisar o que temos em rela\u00e7\u00e3o ao armazenamento em nuvem.<\/p>\n<p><\/p>\n<p>Existem vantagens. \u00c9 muito simples de configurar. Basta solicitar ao provedor de nuvem que forne\u00e7a um armazenamento de determinada capacidade e classe. As classes s\u00e3o detalhadas pelos pr\u00f3prios provedores. <\/p>\n<p><\/p>\n<p>E h\u00e1 uma desvantagem. Para algumas pessoas, isso n\u00e3o \u00e9 uma desvantagem cr\u00edtica. Claro, haver\u00e1 algumas limita\u00e7\u00f5es de desempenho. \u00c9 muito conveniente para o trabalho, confi\u00e1vel, mas existem algumas potenciais quedas de desempenho.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8e82430b64477f91640078ff4eacb47e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E como o ClickHouse se concentra exatamente no desempenho, pode-se at\u00e9 dizer que extrai tudo o que \u00e9 poss\u00edvel, portanto muitos clientes tentam maximizar o desempenho.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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 para extrair o m\u00e1ximo, precisamos de armazenamento local.<\/p>\n<p><\/p>\n<p>O Kubernetes fornece tr\u00eas abstra\u00e7\u00f5es para o uso de armazenamento local no Kubernetes. S\u00e3o: <\/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>Vamos considerar como eles diferem e em que s\u00e3o semelhantes. <\/p>\n<p><\/p>\n<p>Primeiro, em todas as tr\u00eas abordagens, nosso armazenamento \u00e9 composto por discos locais, que est\u00e3o na mesma n\u00f3 f\u00edsica do k8s. Mas eles t\u00eam algumas diferen\u00e7as.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79afb620a0c9a1552b47240b405fedc9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come\u00e7aremos com o mais simples, ou seja, com o emptyDir. O que \u00e9 isso na pr\u00e1tica? \u00c9 quando pedimos ao nosso sistema de especifica\u00e7\u00e3o que o sistema de cont\u00eainer (na maioria das vezes, isso \u00e9 o Docker) nos forne\u00e7a acesso a uma pasta no disco local.<\/p>\n<p><\/p>\n<p>Na pr\u00e1tica, o Docker cria temporariamente uma pasta em seus pr\u00f3prios caminhos, chamando-a de um longo hash. E fornece uma interface de acesso a ela. <\/p>\n<p><\/p>\n<p>Como isso funcionar\u00e1 em termos de desempenho? Funcionar\u00e1 na velocidade do disco local, ou seja, \u00e9 acesso total ao seu disco. <\/p>\n<p><\/p>\n<p>Mas esse m\u00e9todo tem sua desvantagem. O Persistent \u00e9 um tanto duvidoso nesse caso. Na primeira movimenta\u00e7\u00e3o dos cont\u00eaineres pelo Docker, o Persistent se perde. Se o Kubernetes quiser, por algum motivo, mover esse Pod para outro disco, os dados ser\u00e3o perdidos. <\/p>\n<p><\/p>\n<p>Essa abordagem \u00e9 boa para testes, pois j\u00e1 apresenta uma velocidade normal, mas para algo s\u00e9rio, essa op\u00e7\u00e3o n\u00e3o \u00e9 adequada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0b60f80fc9ea0e2c1820021bcd9e1382.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Portanto, h\u00e1 uma segunda abordagem. \u00c9 o hostPath. Se olharmos o slide anterior e este, podemos ver uma \u00fanica diferen\u00e7a. Temos a pasta saindo do Docker diretamente para o n\u00f3 do Kubernetes. Aqui \u00e9 um pouco mais simples. Definimos diretamente o caminho no sistema de arquivos local onde gostar\u00edamos de armazenar nossos dados. <\/p>\n<p><\/p>\n<p>Os benef\u00edcios desse m\u00e9todo existem. Agora temos um verdadeiro Persistent, e \u00e9 cl\u00e1ssico. Os dados ser\u00e3o gravados em um endere\u00e7o espec\u00edfico no disco. <\/p>\n<p><\/p>\n<p>H\u00e1 tamb\u00e9m desvantagens. A complexidade de gerenciamento. Nosso Kubernetes pode querer mover um Pod para outro n\u00f3 f\u00edsico. E \u00e9 aqui que o DevOps entra em a\u00e7\u00e3o. Ele deve explicar corretamente a todo o sistema que esses pods s\u00f3 podem ser movidos para n\u00f3s nos quais voc\u00ea tem algo montado nesses caminhos, e n\u00e3o mais de um n\u00f3 por vez. Isso \u00e9 bastante complicado. <\/p>\n<p><\/p>\n<p>Para esses fins, n\u00f3s, como operadores, criamos modelos para ocultar toda essa complexidade. E poder\u00edamos simplesmente dizer: 'Eu quero que haja uma inst\u00e2ncia do ClickHouse em cada n\u00f3 f\u00edsico e neste caminho espec\u00edfico.' <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f64c19bccc8b187d6af112eda896b25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas essa necessidade n\u00e3o \u00e9 s\u00f3 nossa, portanto, os senhores do pr\u00f3prio Kubernetes tamb\u00e9m entendem que as pessoas gostariam de ter acesso a discos f\u00edsicos, por isso eles fornecem um terceiro n\u00edvel.<\/p>\n<p><\/p>\n<p>Ele \u00e9 chamado de local. N\u00e3o h\u00e1 praticamente nenhuma diferen\u00e7a em rela\u00e7\u00e3o ao slide anterior. Antes, era necess\u00e1rio fazer manualmente, que n\u00e3o podemos mover esses pods de um n\u00f3 para outro, porque eles devem estar ligados a um disco f\u00edsico local em tal caminho, e agora todo esse conhecimento \u00e9 encapsulado no pr\u00f3prio Kubernetes. E fica muito mais f\u00e1cil configurar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/140c43be34dd7015c0bf4cfd0a0bb384.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voltemos \u00e0 nossa tarefa pr\u00e1tica. Vamos voltar ao modelo YAML. Aqui temos um verdadeiro storage. N\u00f3s retornamos a isso. Definimos um cl\u00e1ssico modelo de VolumeClaim como no k8s. E descrevemos qual storage queremos.<\/p>\n<p><\/p>\n<p>Ap\u00f3s isso, o k8s solicitar\u00e1 o storage. Ele nos alocar\u00e1 dentro do StatefulSet. E, no final, isso ficar\u00e1 \u00e0 disposi\u00e7\u00e3o do ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/960e666486ed09cebd83235d43f83970.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>T\u00ednhamos esse esquema. Nosso Persistent Storage estava em vermelho, o que sugeria que deveria ser feito. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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 ele fica verde. Agora o esquema do cluster ClickHouse no k8s est\u00e1 completamente finalizado. Temos shards, r\u00e9plicas, ZooKeeper, h\u00e1 um verdadeiro Persistent, que \u00e9 implementado de uma forma ou de outra. O esquema j\u00e1 est\u00e1 totalmente funcional. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c409ee5da6309a67904394d968ed4906.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Continuamos vivendo. Nosso cluster est\u00e1 se desenvolvendo. E Alexey se esfor\u00e7a e lan\u00e7a uma nova vers\u00e3o do ClickHouse.<\/p>\n<p><\/p>\n<p>Surge uma tarefa pr\u00e1tica \u2013 testar a nova vers\u00e3o do ClickHouse em nosso cluster. E, naturalmente, n\u00e3o queremos atualizar tudo, queremos talvez colocar uma nova vers\u00e3o em uma r\u00e9plica em um canto distante, ou talvez n\u00e3o uma nova vers\u00e3o, mas duas de uma vez, pois elas saem com frequ\u00eancia. <\/p>\n<p><\/p>\n<p>O que podemos dizer sobre isso?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48ed52d393d977d0cfaa9320bd02ed1e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui temos exatamente essa oportunidade. S\u00e3o os templates de pods. Podemos detalhar, nosso operador permite construir um cluster heterog\u00eaneo. Ou seja, podemos configurar desde todas as r\u00e9plicas em conjunto at\u00e9 cada r\u00e9plica individual, definindo qual vers\u00e3o do ClickHouse desejamos e qual vers\u00e3o de armazenamento. Podemos configurar completamente o cluster da maneira que precisamos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4949ecd8119cb4ec0f4bad9bf27fa74e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos nos aprofundar um pouco mais. Antes, falamos sobre como o ClickHouse-operator funciona em rela\u00e7\u00e3o \u00e0s especificidades do ClickHouse.<\/p>\n<p><\/p>\n<p>Agora, gostaria de dizer algumas palavras sobre como qualquer operador funciona e como interage com o K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ca9c2a23c54b2a81ac0a8bba88d5e65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos considerar a intera\u00e7\u00e3o com o K8s primeiramente. O que acontece quando fazemos kubectl apply? Nossos objetos aparecem em etcd atrav\u00e9s da API. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b9eaedeb0f34d10398ba0187f09fef9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por exemplo, os objetos b\u00e1sicos do Kubernetes: pod, StatefulSet, service e assim por diante. <\/p>\n<p><\/p>\n<p>Neste momento, nada f\u00edsico acontece ainda. Esses objetos precisam ser materializados no cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3c49dc1b0067347d5fc415ef9b87642d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para isso, aparece o controlador. O controlador \u00e9 um componente especial do k8s que consegue materializar essas descri\u00e7\u00f5es. Ele sabe como e o que deve ser feito fisicamente. Ele sabe como iniciar cont\u00eaineres e o que deve ser configurado para que o servidor funcione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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 ele materializa nossos objetos no K8s.<\/p>\n<p><\/p>\n<p>Mas queremos operar n\u00e3o apenas com pods e StatefulSets, queremos criar ClickHouseInstallation, ou seja, um objeto do tipo ClickHouse, para oper\u00e1-lo como um todo. At\u00e9 agora, essa possibilidade n\u00e3o existe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1594921ac5dd9384ce81ceae92f5cda9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas o K8s tem uma outra coisa agrad\u00e1vel. Queremos que exista uma entidade complexa, que seja composta de pods e StatefulSets do nosso cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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 o que \u00e9 necess\u00e1rio para isso? Primeiro, surge a Custom Resource Definition. O que \u00e9 isso? \u00c9 uma descri\u00e7\u00e3o para o K8s que informa que voc\u00ea ter\u00e1 mais um tipo de dado, que queremos adicionar um recurso personalizado ao pod, StatefulSet, que ser\u00e1 complexo internamente. \u00c9 uma descri\u00e7\u00e3o da estrutura de dados. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f02ae12ef3ab5db974234b14e38792ac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tamb\u00e9m o enviamos para l\u00e1 atrav\u00e9s do kubectl apply. O Kubernetes o aceitou com prazer. <\/p>\n<p><\/p>\n<p>E agora temos, no armazenamento, a possibilidade de registrar um recurso personalizado chamado ClickHouseInstallation no objeto em etcd.<\/p>\n<p><\/p>\n<p>Mas at\u00e9 agora, nada mais acontecer\u00e1. Ou seja, se criarmos agora um arquivo YAML, que discutimos contendo a descri\u00e7\u00e3o de shards, r\u00e9plicas e dissermos 'kubectl apply', o Kubernetes o aceitar\u00e1, colocar\u00e1 no etcd e dir\u00e1: '\u00d3timo, mas n\u00e3o sei o que fazer com isso. N\u00e3o sei como gerenciar ClickHouseInstallation.' <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7c2f9f3f81b83c987a3bd72a881d0d91.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Portanto, precisamos de algu\u00e9m que ajude o Kubernetes a gerenciar um novo tipo de dados. \u00c0 esquerda, temos o controlador padr\u00e3o do Kubernetes, que trabalha com tipos de dados padr\u00e3o. E \u00e0 direita, devemos ter um controlador personalizado, que pode lidar com tipos de dados personalizados. <\/p>\n<p><\/p>\n<p>E de outra forma, ele \u00e9 chamado de operador. Eu o destaquei aqui fora do Kubernetes, porque ele pode ser executado fora do K8s. Na maioria das vezes, claro, todos os operadores s\u00e3o executados no Kubernetes, mas nada impede que ele funcione fora, por isso foi especificamente destacado aqui. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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, por sua vez, o controlador personalizado, tamb\u00e9m conhecido como operador, interage com o Kubernetes atrav\u00e9s da API. Ele j\u00e1 sabe como interagir com a API. E ele j\u00e1 sabe como materializar um esquema complexo a partir do recurso personalizado que queremos criar. \u00c9 exatamente isso que o operador faz. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a5f773ddc3663f24d5379955da9c3037.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como funciona o operador? Vamos dar uma olhada na parte direita, para entender como ele faz isso. Descobriremos como o operador materializa tudo isso e como a intera\u00e7\u00e3o com o K8s acontece a seguir.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/08a8d8dbcb35117a0eb3320589c6ff8d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O operador \u00e9 um programa. Ele \u00e9 orientado a eventos. O operador, atrav\u00e9s da API do Kubernetes, se inscreve em eventos. Na API do Kubernetes, existem pontos de entrada onde voc\u00ea pode se inscrever em eventos. E se algo mudar no K8s, o Kubernetes enviar\u00e1 eventos a todos que quiserem, ou seja, quem se inscreveu naquele ponto da API receber\u00e1 notifica\u00e7\u00f5es.<\/p>\n<p><\/p>\n<p>O operador se inscreve em eventos e deve fazer alguma rea\u00e7\u00e3o. Sua tarefa \u00e9 reagir a eventos que surgem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f0664a4151e6e7f6f8575a3e54372e9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Os eventos s\u00e3o gerados por algumas atualiza\u00e7\u00f5es. Chega nosso arquivo YAML com a descri\u00e7\u00e3o do ClickHouseInstallation. Ele foi para o etcd atrav\u00e9s do kubectl apply. L\u00e1, um evento foi acionado, e esse evento chegou ao ClickHouse-operator. O operador recebeu essa descri\u00e7\u00e3o. E ele deve fazer algo. Se uma atualiza\u00e7\u00e3o para o objeto ClickHouseInstallation chegou, ent\u00e3o \u00e9 necess\u00e1rio atualizar o cluster. E a tarefa do operador \u00e9 atualizar o cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0952bdd391a72aa15bf66af4ce69f4af.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O que ele faz? Primeiro, \u00e9 necess\u00e1rio elaborar um plano de a\u00e7\u00e3o sobre o que faremos com essa atualiza\u00e7\u00e3o. As atualiza\u00e7\u00f5es podem ser muito pequenas, ou seja, pequenas na execu\u00e7\u00e3o do YAML, mas podem resultar em mudan\u00e7as muito grandes no cluster. Portanto, o operador cria um plano e o segue.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79caaa43b6fd9f3e2eb1afe44ecb2df9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ele come\u00e7a a trabalhar de acordo com esse plano, para construir essa estrutura internamente, a fim de materializar pods, servi\u00e7os, ou seja, fazer o que \u00e9 sua tarefa principal. Isso \u00e9 como construir um cluster ClickHouse no Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e91576a26d6b758a68ae0b35cbe01897.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Agora, vamos abordar algo interessante. Esta \u00e9 a divis\u00e3o de responsabilidades entre o Kubernetes e o operador, ou seja, o que o Kubernetes faz, o que o operador faz e como eles interagem entre si. <\/p>\n<p><\/p>\n<p>O Kubernetes \u00e9 respons\u00e1vel pelas coisas do sistema, ou seja, pelo conjunto b\u00e1sico de objetos que pode ser interpretado como de escopo sist\u00eamico. O Kubernetes sabe como iniciar pods, reiniciar cont\u00eaineres, fazer o mount de volumes, trabalhar com ConfigMap, ou seja, tudo que pode ser chamado de sistema. <\/p>\n<p><\/p>\n<p>Os operadores operam em \u00e1reas tem\u00e1ticas. Cada operador \u00e9 feito para sua \u00e1rea tem\u00e1tica. N\u00f3s fizemos um para o ClickHouse.<\/p>\n<p><\/p>\n<p>E o operador interage precisamente em termos da \u00e1rea tem\u00e1tica, como adicionar uma r\u00e9plica, criar um esquema, configurar monitora\u00e7\u00e3o. H\u00e1, portanto, essa divis\u00e3o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9dc07d9c29d5dfd538343aadb751e4c0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos considerar um exemplo pr\u00e1tico de como essa divis\u00e3o de responsabilidades ocorre quando realizamos a a\u00e7\u00e3o de adicionar uma r\u00e9plica. <\/p>\n<p><\/p>\n<p>O operador recebe a tarefa de adicionar uma r\u00e9plica. O que o operador faz? O operador calcular\u00e1 que \u00e9 necess\u00e1rio criar um novo StatefulSet, no qual \u00e9 preciso descrever determinados modelos, volume claim. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7a31f2f76a3bdda87e4bccf0e04fe4a8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ele preparou tudo isso e passa adiante para o K8s. Diz que precisa de ConfigMap, StatefulSet, Volume. O Kubernetes processa. Ele materializa as unidades b\u00e1sicas com as quais opera. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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 em seguida, entra em a\u00e7\u00e3o novamente o ClickHouse-operator. Ele j\u00e1 tem um pod f\u00edsico, no qual j\u00e1 \u00e9 poss\u00edvel fazer algo. E o ClickHouse-operator novamente trabalha em termos da \u00e1rea tem\u00e1tica. Ou seja, para incluir uma r\u00e9plica no cluster, \u00e9 necess\u00e1rio, primeiro, configurar o esquema de dados que existe nesse cluster. E, em segundo lugar, essa r\u00e9plica deve ser inclu\u00edda na monitora\u00e7\u00e3o, para que seja bem rastreada. J\u00e1 \u00e9 o operador que configura isso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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 somente depois disso \u00e9 que o pr\u00f3prio ClickHouse entra em cena, ou seja, mais uma entidade de n\u00edvel superior. Isso j\u00e1 \u00e9 um banco de dados. Ele possui sua pr\u00f3pria inst\u00e2ncia, uma r\u00e9plica configurada, pronta para entrar no cluster.<\/p>\n<p><\/p>\n<p>Consequentemente, a cadeia de execu\u00e7\u00e3o e divis\u00e3o de responsabilidades ao adicionar uma r\u00e9plica \u00e9 bastante longa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ec79cfa2b45fadbe25f4d9fe8d2ec5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos continuar com nossas tarefas pr\u00e1ticas. Se o cluster j\u00e1 existe, \u00e9 poss\u00edvel realizar a migra\u00e7\u00e3o da configura\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a52aee0d4350b8da00cdb4b525df80ad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fizemos de modo que no XML existente, que o ClickHouse entende, se possa passar adiante.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/91abb1d3b0a14f2118361403a74e14c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9 poss\u00edvel fazer um ajuste fino do ClickHouse. O deployment zonado \u00e9 exatamente o que eu mencionei ao explicar o hostPath e o armazenamento local. \u00c9 como fazer corretamente um deployment zonado.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fde502f30223e04a918f4fd598c3dd9f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A pr\u00f3xima tarefa pr\u00e1tica \u00e9 o monitoramento.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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 temos altera\u00e7\u00e3o no cluster, precisamos configurar o monitoramento periodicamente. <\/p>\n<p><\/p>\n<p>Vamos analisar o diagrama. J\u00e1 revisamos as setas verdes. Agora vamos considerar as setas vermelhas. Isso mostra como queremos monitorar nosso cluster. Como as m\u00e9tricas do cluster ClickHouse v\u00e3o para o Prometheus e depois para o Grafana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1210c1423f99d48a20e06e855bf48a72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E qual \u00e9 a dificuldade com o monitoramento? Por que isso \u00e9 considerado uma conquista? A dificuldade est\u00e1 na din\u00e2mica. Quando temos um \u00fanico cluster e ele \u00e9 est\u00e1tico, \u00e9 poss\u00edvel configurar o monitoramento uma vez e depois n\u00e3o se preocupar mais com isso.<\/p>\n<p><\/p>\n<p>Mas se temos muitos clusters ou se algo est\u00e1 constantemente mudando, o processo \u00e9 din\u00e2mico. E estar sempre configurando o monitoramento novamente consome recursos e tempo, ou seja, \u00e9 um trabalho que pode ser tedioso. Isso precisa ser automatizado. A dificuldade realmente est\u00e1 na din\u00e2mica do processo. E o operador consegue automatizar isso muito bem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48a7264f1228671e0c483c8211a71eb3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como o nosso cluster se desenvolveu? No in\u00edcio ele era assim.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8a8c7b6cd5562deb315368e1e8e1c976.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Depois ele ficou assim.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1a3e915fbadf3aa5f3b33d337f36e76e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E, por fim, tornou-se assim. <\/p>\n<p><\/p>\n<p>O monitoramento \u00e9 feito automaticamente pelo operador. Um \u00fanico ponto de entrada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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 n\u00f3s apenas olhamos no painel do Grafana, observando como a vida do nosso cluster flui internamente. <\/p>\n<p><\/p>\n<p>Ali\u00e1s, o painel do Grafana tamb\u00e9m \u00e9 distribu\u00eddo com nosso operador diretamente nos fontes. \u00c9 poss\u00edvel conectar e utilizar. Este screenshot foi fornecido pelos nossos DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ad1c2899dd845d0ba4185bdf758468c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para onde gostar\u00edamos de avan\u00e7ar a partir daqui? Isso \u00e9:<\/p>\n<p><\/p>\n<ul>\n<li>Desenvolver a automa\u00e7\u00e3o dos testes. A principal tarefa \u00e9 o teste automatizado de novas vers\u00f5es. <\/li>\n<li>Al\u00e9m disso, queremos muito automatizar a integra\u00e7\u00e3o com o ZooKeeper. E estamos planejando nos integrar com o ZooKeeper-operator. Ou seja, foi escrito um operador para o ZooKeeper, e \u00e9 l\u00f3gico que dois operadores comecem a se integrar para construir uma solu\u00e7\u00e3o mais conveniente. <\/li>\n<li>Queremos realizar verifica\u00e7\u00f5es de sa\u00fade mais complexas. <\/li>\n<li>Eu destaquei em verde que estamos prestes a implementar a heran\u00e7a de Templates \u2013 CONCLU\u00cdDO, ou seja, com o pr\u00f3ximo lan\u00e7amento do operador, j\u00e1 teremos a heran\u00e7a de templates. \u00c9 uma ferramenta poderosa, que permite construir configura\u00e7\u00f5es complexas a partir de partes. <\/li>\n<li>E queremos a automa\u00e7\u00e3o de tarefas complexas. A principal delas \u00e9 o Re-sharding. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f232c0aab389be5069e5c7886e265c01.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos fazer um resumo intermedi\u00e1rio. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/62f7814994af0441ba5a82de4e9780d7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O que estamos obtendo no final? E vale a pena ou n\u00e3o? Dever\u00edamos mesmo tentar trazer o banco de dados para o Kubernetes e aplicar o operador em geral e o operador Alitnity em particular.<\/p>\n<p><\/p>\n<p>No final, obtemos:<\/p>\n<p><\/p>\n<ul>\n<li>Uma simplifica\u00e7\u00e3o e automa\u00e7\u00e3o significativas da configura\u00e7\u00e3o, deployment e tamb\u00e9m da manuten\u00e7\u00e3o. <\/li>\n<li>Monitoramento integrado desde o in\u00edcio. <\/li>\n<li>E templates codificados prontos para uso em situa\u00e7\u00f5es complexas. N\u00e3o precisamos mais fazer manualmente a\u00e7\u00f5es como adicionar uma r\u00e9plica. Isso \u00e9 feito pelo operador. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/aebccd7a2dc55f14645f79f89f7b7458.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ainda resta apenas uma \u00faltima pergunta. J\u00e1 temos um banco de dados no Kubernetes, virtualiza\u00e7\u00e3o. Como fica o desempenho dessa solu\u00e7\u00e3o, principalmente considerando que o ClickHouse \u00e9 otimizado para desempenho?<\/p>\n<p><\/p>\n<p>A resposta \u00e9 \u2013 tudo certo! N\u00e3o vou me aprofundar, isso \u00e9 um assunto para uma palestra separada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ffc230941f0ae24926186db4d8d68ade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas existe um projeto chamado TSBS. Qual \u00e9 o seu principal objetivo? \u00c9 um teste de bancos de dados para desempenho. \u00c9 uma tentativa de comparar coisas semelhantes. <\/p>\n<p><\/p>\n<p>Como funciona? Um conjunto de dados \u00e9 gerado. Depois, esse conjunto de dados \u00e9 testado em diferentes bancos de dados com um conjunto id\u00eantico de testes. E cada banco de dados resolve uma tarefa da forma que consegue. Assim, os resultados podem ser comparados. <\/p>\n<p><\/p>\n<p>Ele j\u00e1 suporta uma grande variedade de bancos de dados. Eu destaquei tr\u00eas principais. S\u00e3o eles:<\/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=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5b4733534a4e6e36fb7788127adc6e86.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tamb\u00e9m foi feita uma compara\u00e7\u00e3o com outra solu\u00e7\u00e3o semelhante. A compara\u00e7\u00e3o com o RedShift foi realizada na Amazon. O ClickHouse tamb\u00e9m superou todos nesse aspecto. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/44cc8dedc07a02fe1ed5aad3e17a579c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Que conclus\u00f5es podemos tirar do que eu apresentei?<\/p>\n<p><\/p>\n<ul>\n<li>DB no Kubernetes \u00e9 poss\u00edvel. Provavelmente, \u00e9 poss\u00edvel qualquer um, mas, em geral, parece que \u00e9 vi\u00e1vel. ClickHouse no Kubernetes com certeza \u00e9 poss\u00edvel com o suporte do nosso operador. <\/li>\n<li>O operador ajuda a automatizar processos e realmente facilita a vida.<\/li>\n<li>O desempenho \u00e9 normal.<\/li>\n<li>E, nos parece, que isso pode e deve ser utilizado. <\/li>\n<\/ul>\n<p><\/p>\n<p>C\u00f3digo aberto \u2013 junte-se a n\u00f3s!<\/p>\n<p><\/p>\n<p>Como j\u00e1 mencionei, o operador \u00e9 um produto totalmente de c\u00f3digo aberto, ent\u00e3o seria \u00f3timo se o maior n\u00famero poss\u00edvel de pessoas o utilizasse. Junte-se a n\u00f3s! Estamos esperando por todos voc\u00eas!<\/p>\n<p><\/p>\n<p>Muito obrigado a todos!<\/p>\n<p><\/p>\n<p>Perguntas<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador no Kubernetes para gerenciar clusters de banco de dados. 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>Obrigado pela apresenta\u00e7\u00e3o! Meu nome \u00e9 Anton. Eu sou da empresa SEMrush. Estou curioso sobre a parte de logging. Sobre monitoramento estamos cientes, mas sobre logging n\u00e3o sei nada, se falamos sobre o cluster como um todo. Por exemplo, n\u00f3s levantamos um cluster em hardware. E usamos logging centralizado, coletando dados com ferramentas padr\u00e3o em um \u00fanico local. E depois extra\u00edmos os dados interessantes.<\/em> <\/p>\n<p><\/p>\n<p>Boa pergunta, ou seja, logging est\u00e1 na lista de tarefas. Nosso operador ainda n\u00e3o automatiza isso. Ele ainda est\u00e1 em desenvolvimento, o projeto \u00e9 bastante jovem. N\u00f3s entendemos a necessidade de logging. Este \u00e9 tamb\u00e9m um tema muito importante. E provavelmente n\u00e3o \u00e9 menos importante que o monitoramento. Mas o monitoramento foi o primeiro na lista de implementa\u00e7\u00f5es. O logging vir\u00e1. Estamos, naturalmente, tentando automatizar todos os aspectos da vida do cluster. Portanto, a resposta \u00e9: no momento, o operador, infelizmente, n\u00e3o faz isso, mas est\u00e1 nos planos, faremos isso. Se houver interesse em se juntar, por favor, enviem pull requests.<\/p>\n<p><\/p>\n<p><em>Ol\u00e1! Obrigado pela apresenta\u00e7\u00e3o! Tenho uma pergunta padr\u00e3o relacionada a Persistent Volumes. Quando criamos uma configura\u00e7\u00e3o com esse operador, como o operador determina em qual n\u00f3 um disco ou pasta est\u00e1 montado? Precisamos explicar a ele que, por favor, coloque nosso ClickHouse exatamente nesses n\u00f3s onde o disco est\u00e1 dispon\u00edvel?<\/em><\/p>\n<p><\/p>\n<p>Pelo que eu entendo, essa pergunta \u00e9 uma extens\u00e3o do armazenamento local, especialmente na parte sobre hostPath. \u00c9 como explicar ao sistema que \u00e9 necess\u00e1rio que o pod seja executado exatamente naquele n\u00f3, onde temos um disco fisicamente conectado, que est\u00e1 montado em tal caminho. \u00c9 uma se\u00e7\u00e3o inteira, que eu abordei de forma muito superficial, pois a resposta \u00e9 bastante extensa. <\/p>\n<p><\/p>\n<p>De forma resumida, isso funciona assim. Naturalmente, precisamos provisionar esses volumes. No momento, n\u00e3o h\u00e1 provisionamento din\u00e2mico em armazenamento local, ent\u00e3o os DevOps devem criar os discos manualmente, esses volumes. E devem explicar ao Kubernetes o seguinte: que voc\u00ea ter\u00e1 Persistent volumes de um certo tipo, localizados em determinados n\u00f3s. Em seguida, precisamos explicar ao Kubernetes que os pods que requerem esse tipo de armazenamento local devem ser agendados apenas em certos n\u00f3s, com base em labels. Para isso, o operador tem a possibilidade de atribuir algum label e um por inst\u00e2ncia do host. Assim, os pods ser\u00e3o roteados pelo Kubernetes para serem executados apenas em n\u00f3s que atendem aos requisitos dos labels, falando de forma simples. Os administradores atribuem labels, criam os discos manualmente. E assim, se torna escal\u00e1vel.<\/p>\n<p><\/p>\n<p>E \u00e9 exatamente essa terceira op\u00e7\u00e3o de armazenamento local que ajuda a facilitar um pouco isso. Como j\u00e1 destaquei, \u00e9 um trabalho meticuloso de configura\u00e7\u00e3o que, ao final, ajuda a obter o m\u00e1ximo desempenho.<\/p>\n<p><\/p>\n<p><em>Tenho uma segunda pergunta relacionada a isso. O Kubernetes foi concebido para que n\u00e3o importasse se perd\u00eassemos um n\u00f3 ou n\u00e3o. O que devemos fazer, nesse caso, se perdermos um n\u00f3 onde est\u00e1 o nosso shard?<\/em><\/p>\n<p><\/p>\n<p>Sim, o Kubernetes foi inicialmente posicionado de forma que nossa rela\u00e7\u00e3o com os pods \u00e9 como a de gado, mas aqui cada disco se torna algo como um animal de estima\u00e7\u00e3o. H\u00e1 um problema em que n\u00e3o podemos simplesmente descart\u00e1-los. E o desenvolvimento do Kubernetes est\u00e1 indo na dire\u00e7\u00e3o de que n\u00e3o \u00e9 poss\u00edvel trat\u00e1-los completamente de forma filos\u00f3fica, como recursos totalmente descart\u00e1veis.<\/p>\n<p><\/p>\n<p>Agora, uma pergunta pr\u00e1tica. O que fazer se voc\u00ea perder um n\u00f3 onde o disco estava? Aqui, a tarefa \u00e9 resolvida em um n\u00edvel mais alto. No caso do ClickHouse, temos r\u00e9plicas que funcionam em um n\u00edvel superior, ou seja, no n\u00edvel do ClickHouse.<\/p>\n<p><\/p>\n<p>Qual \u00e9 a disposi\u00e7\u00e3o? A responsabilidade por n\u00e3o perder dados cabe ao DevOps. Ele deve configurar corretamente a replica\u00e7\u00e3o e deve monitorar se a replica\u00e7\u00e3o est\u00e1 sendo executada. Na r\u00e9plica, no n\u00edvel do ClickHouse, os dados devem ser duplicados. Essa n\u00e3o \u00e9 uma tarefa que o operador resolve. E n\u00e3o \u00e9 uma tarefa que o pr\u00f3prio Kubernetes resolve. Isso est\u00e1 no n\u00edvel do ClickHouse.<\/p>\n<p><\/p>\n<p>O que fazer se voc\u00ea tiver um n\u00f3 f\u00edsico falhando? E parece que teremos que instalar um segundo, corretamente provisionar o disco nele, aplicar labels. E, ap\u00f3s isso, ele atender\u00e1 aos requisitos para que o Kubernetes possa iniciar uma inst\u00e2ncia do pod. O Kubernetes o iniciar\u00e1. Voc\u00ea n\u00e3o tem o n\u00famero suficiente de pods at\u00e9 o especificado. Ele passar\u00e1 pelo ciclo que eu mostrei. E no n\u00edvel mais alto, o ClickHouse entender\u00e1 que uma r\u00e9plica entrou, ela ainda est\u00e1 vazia e precisamos come\u00e7ar a transferir dados para ela. Ou seja, esse processo ainda est\u00e1 pouco automatizado. <\/p>\n<p><\/p>\n<p><em>Obrigado pela apresenta\u00e7\u00e3o! Quando acontecem v\u00e1rias coisas ruins, o operador falha e reinicia, e nesse momento eventos chegam, voc\u00ea de alguma forma os processa?<\/em><\/p>\n<p><\/p>\n<p>O que acontece se o operador falhar e reiniciar, certo? <\/p>\n<p><\/p>\n<p><em>Sim. E nesse momento eventos chegaram.<\/em> <\/p>\n<p><\/p>\n<p>A tarefa do que fazer nesse caso \u00e9 parcialmente dividida entre o operador e o Kubernetes. O Kubernetes tem a capacidade de reproduzir o evento que ocorreu. Ele o reproduz. E a tarefa do operador \u00e9 garantir que, quando um replay do log de eventos for feito, esses eventos sejam idempotentes. E que a reinser\u00e7\u00e3o do mesmo evento n\u00e3o quebre nosso sistema. E nosso operador lida bem com essa tarefa. <\/p>\n<p><\/p>\n<p><em>Ol\u00e1! Obrigado pela apresenta\u00e7\u00e3o! Dmitry Zavyalov, empresa<\/em> <em>Smidova. Est\u00e1 planejada a adi\u00e7\u00e3o de configura\u00e7\u00e3o no operador com haproxy? Estou interessado em algum outro balanceador al\u00e9m do padr\u00e3o, que seja inteligente e entenda que realmente existe ClickHouse.<\/em> <\/p>\n<p><\/p>\n<p>Voc\u00ea est\u00e1 falando sobre Ingress?<\/p>\n<p><\/p>\n<p><em>Sim, substituir Ingress por haproxy. No haproxy, \u00e9 poss\u00edvel especificar a topologia do cluster, onde est\u00e3o suas r\u00e9plicas.<\/em><\/p>\n<p><\/p>\n<p>Por enquanto, n\u00e3o pensamos sobre isso. Se voc\u00ea precisar e puder explicar por que isso \u00e9 necess\u00e1rio, podemos implementar, especialmente se voc\u00ea quiser participar. Teremos prazer em considerar essa op\u00e7\u00e3o. Resumindo, n\u00e3o, n\u00e3o temos essa funcionalidade no momento. Obrigado pela sugest\u00e3o, vamos analisar isso. E se voc\u00ea ainda explicar o caso de uso e por que isso \u00e9 necess\u00e1rio na pr\u00e1tica, por exemplo, criando issues no GitHub, ser\u00e1 \u00f3timo.<\/p>\n<p><\/p>\n<p><em>J\u00e1 existe.<\/em><\/p>\n<p><\/p>\n<p>Certo. Estamos abertos a quaisquer propostas. E haproxy est\u00e1 na lista de tarefas. A lista de tarefas est\u00e1 crescendo e n\u00e3o diminuindo por enquanto. Mas isso \u00e9 bom, significa que o produto \u00e9 solicitado.<\/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.3 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Operador no Kubernetes para gerenciar clusters de banco de dados. Vladislav Klimenko (Altinity, 2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pt\/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":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/96965","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=96965"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/96965\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/96966"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=96965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=96965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=96965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}