{"id":91199,"date":"2020-08-10T01:42:03","date_gmt":"2020-08-09T23:42:03","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov"},"modified":"2020-08-10T01:42:03","modified_gmt":"2020-08-09T23:42:03","slug":"kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov","title":{"rendered":"Kubernetes no DomClick: como dormir tranquilo gerenciando um cluster de 1000 microsservi\u00e7os","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Meu nome \u00e9 Victor Yagofarov e eu sou respons\u00e1vel pelo desenvolvimento da plataforma Kubernetes na empresa DomClick como l\u00edder t\u00e9cnico da equipe de Ops. Gostaria de falar sobre como nossos processos de Dev  Ops est\u00e3o organizados, as particularidades da opera\u00e7\u00e3o de um dos maiores clusters de k8s na R\u00fassia, assim como as pr\u00e1ticas de DevOps\/SRE que nossa equipe aplica.<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes no DomClick: como dormir tranquilo gerenciando um cluster de 1000 microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2020\/08\/6c908104c734b36cc7a960fbe4d65e3f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>Equipe de Ops<\/h4>\n<p>\nAtualmente, a equipe de Ops conta com 15 pessoas. Tr\u00eas delas s\u00e3o respons\u00e1veis pelo escrit\u00f3rio, duas trabalham em outro fuso hor\u00e1rio e est\u00e3o dispon\u00edveis, inclusive, \u00e0 noite. Assim, sempre h\u00e1 algu\u00e9m da Ops diante do monitor, pronto para reagir a incidentes de qualquer complexidade. N\u00e3o temos plant\u00f5es noturnos, o que ajuda a preservar nossa sa\u00fade mental e permite que todos descansem e aproveitem o tempo livre n\u00e3o apenas diante do computador.<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes no DomClick: como dormir tranquilo gerenciando um cluster de 1000 microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2020\/08\/47051db273f116df376e64bad67c6f37.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAs compet\u00eancias s\u00e3o variadas: especialistas em redes, DBA, profissionais de stack ELK, administradores\/desenvolvedores de Kubernetes, especialistas em monitoramento, virtualiza\u00e7\u00e3o, hardware, etc. O que une a todos \u00e9 que cada um pode substituir, em certa medida, qualquer um de n\u00f3s: por exemplo, adicionar novos n\u00f3s ao cluster k8s, atualizar o PostgreSQL, escrever pipelines CI\/CD + Ansible, automatizar algo em Python\/Bash\/Go, conectar hardware no data center. Ter compet\u00eancias fortes em uma \u00e1rea n\u00e3o impede mudar de dire\u00e7\u00e3o e come\u00e7ar a se desenvolver em outra. Por exemplo, entrei na empresa como especialista em PostgreSQL, e agora minha principal responsabilidade s\u00e3o os clusters Kubernetes. Na equipe, qualquer crescimento \u00e9 bem-vindo e existe um forte senso de camaradagem.<\/p>\n<p>Ali\u00e1s, estamos contratando. Os requisitos para os candidatos s\u00e3o bastante padr\u00e3o. Pessoalmente, acho importante que a pessoa se encaixe na equipe, seja pac\u00edfica, mas tamb\u00e9m saiba defender seu ponto de vista, deseje se desenvolver e n\u00e3o tenha medo de fazer algo novo, propondo suas pr\u00f3prias ideias. Al\u00e9m disso, habilidades de programa\u00e7\u00e3o em linguagens de script s\u00e3o obrigat\u00f3rias, assim como o conhecimento b\u00e1sico de Linux e ingl\u00eas. O ingl\u00eas \u00e9 necess\u00e1rio apenas para que, em caso de problemas, a pessoa possa buscar uma solu\u00e7\u00e3o em 10 segundos, e n\u00e3o em 10 minutos. Especialistas com profundo conhecimento de Linux s\u00e3o muito dif\u00edceis de encontrar hoje em dia: \u00e9 engra\u00e7ado, mas dois candidatos em tr\u00eas n\u00e3o conseguem responder \u00e0 pergunta 'O que \u00e9 Load Average? De onde ele vem?'. E consideram que a pergunta 'Como coletar um core dump de um programa em C' \u00e9 algo de um mundo de superhumanos... ou dinossauros. Temos que conviver com isso, j\u00e1 que normalmente as pessoas t\u00eam outras compet\u00eancias muito desenvolvidas, e n\u00f3s ensinaremos sobre 'Linux'. A resposta para a pergunta 'por que tudo isso \u00e9 importante para um engenheiro DevOps no mundo moderno das nuvens' ter\u00e1 que ficar de fora deste artigo, mas, em tr\u00eas palavras: tudo isso \u00e9 necess\u00e1rio.<\/p>\n<h4>Equipe de Ferramentas<\/h4>\n<p>\nA equipe de Ferramentas desempenha um papel significativo na automa\u00e7\u00e3o. Sua principal tarefa \u00e9 criar ferramentas gr\u00e1ficas e CLI convenientes para desenvolvedores. Por exemplo, nosso desenvolvimento interno Confer permite, literalmente, com alguns cliques do mouse, implantar um aplicativo no Kubernetes, configurar recursos, chaves do vault, etc. Antes, us\u00e1vamos Jenkins + Helm 2, mas tivemos que desenvolver nossa pr\u00f3pria ferramenta para eliminar a necessidade de copiar e colar e trazer uniformidade ao ciclo de vida do software.<\/p>\n<p>A equipe Ops n\u00e3o escreve pipelines para os desenvolvedores, mas pode oferecer consultoria sobre qualquer d\u00favida em sua elabora\u00e7\u00e3o (alguns ainda t\u00eam Helm 3).<\/p>\n<h4>DevOps<\/h4>\n<p>\nNo que diz respeito ao DevOps, vemos dessa forma:<\/p>\n<p>As equipes de Dev escrevem c\u00f3digo e o implantam atrav\u00e9s do Confer em dev -&gt; qa\/stage -&gt; prod. A responsabilidade por garantir que o c\u00f3digo n\u00e3o trave e n\u00e3o gere erros recai sobre as equipes de Dev e Ops. Durante o dia, a primeira pessoa a reagir a um incidente com seu aplicativo deve ser, em primeiro lugar, o respons\u00e1vel da equipe Ops, e durante a noite e no per\u00edodo da madrugada, o administrador de plant\u00e3o (Ops) deve acordar o desenvolvedor de plant\u00e3o, se souber com certeza que o problema n\u00e3o est\u00e1 na infraestrutura. Todas as m\u00e9tricas e alertas na monitoramento aparecem automaticamente ou semi-automaticamente.<\/p>\n<p>A \u00e1rea de responsabilidade das Ops come\u00e7a a partir do momento em que a aplica\u00e7\u00e3o \u00e9 implantada em produ\u00e7\u00e3o, mas a responsabilidade dos Devs n\u00e3o termina aqui \u2014 estamos todos juntos na mesma jornada.<\/p>\n<p>Os desenvolvedores consultam os administradores se precisarem de ajuda na cria\u00e7\u00e3o de um microservi\u00e7o administrativo (por exemplo, backend em Go + HTML5), e os administradores consultam os desenvolvedores sobre quaisquer quest\u00f5es relacionadas \u00e0 infraestrutura ou ao k8s.<\/p>\n<p>A prop\u00f3sito, n\u00e3o temos um mon\u00f3lito, apenas microservi\u00e7os. O n\u00famero oscila entre 900 e 1000 no cluster k8s em produ\u00e7\u00e3o, se medido pela quantidade. <i>implanta\u00e7\u00f5es<\/i>O n\u00famero de pods varia entre 1700 e 2000. Atualmente, h\u00e1 cerca de 2000 pods no cluster de produ\u00e7\u00e3o.<\/p>\n<p>N\u00e3o posso fornecer n\u00fameros exatos, pois monitoramos microservi\u00e7os desnecess\u00e1rios e os eliminamos de forma semi-autom\u00e1tica. O monitoramento de entidades desnecess\u00e1rias em k8s \u00e9 facilitado pelo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Nastradamus\/useless-operator\">useless-operator<\/a><\/noindex>, o que economiza recursos e dinheiro.<\/p>\n<h2> Gerenciamento de recursos <\/h2>\n<p><\/p>\n<h4> Monitoramento <\/h4>\n<p>\nUm pilar fundamental na opera\u00e7\u00e3o de um grande cluster \u00e9 um monitoramento bem estruturado e informativo. At\u00e9 o momento, n\u00e3o encontramos uma solu\u00e7\u00e3o universal que atenda 100% das necessidades de monitoramento, por isso, ocasionalmente criamos diferentes solu\u00e7\u00f5es personalizadas nesse ambiente.<\/p>\n<ul>\n<li><b>Zabbix<\/b>. O monitoramento tradicional, que serve principalmente para rastrear o estado geral da infraestrutura. Ele nos informa quando um n\u00f3 falha devido \u00e0 CPU, mem\u00f3ria, discos, rede, e assim por diante. Nada de extraordin\u00e1rio, mas tamb\u00e9m temos um DaemonSet separado de agentes que, por exemplo, monitoram o estado do DNS no cluster: procuramos pods coredns com problemas e verificamos a acessibilidade de hosts externos. \u00c0 primeira vista, pode parecer desnecess\u00e1rio, mas em grandes volumes de tr\u00e1fego, esse componente \u00e9 um ponto cr\u00edtico de falha. J\u00e1 mencionei anteriormente <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/495450\/\">descrevi<\/a><\/noindex>, como lidei com a performance do DNS no cluster.<\/li>\n<li><b>Prometheus Operator<\/b>. Um conjunto de diferentes exportadores oferece uma vis\u00e3o abrangente de todos os componentes do cluster. Em seguida, visualizamos tudo isso em grandes pain\u00e9is no Grafana, e para notifica\u00e7\u00f5es, usamos o alertmanager.\n<\/li>\n<\/ul>\n<p>\nOutro instrumento \u00fatil para n\u00f3s foi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Nastradamus\/list-ingress\">list-ingress<\/a><\/noindex>. N\u00f3s o escrevemos depois de v\u00e1rias situa\u00e7\u00f5es em que uma equipe sobrepunha suas rotas Ingress com as de outra equipe, resultando em erros 50x. Agora, antes do deploy em produ\u00e7\u00e3o, os desenvolvedores verificam se v\u00e3o afetar algu\u00e9m, e para a minha equipe, \u00e9 uma boa ferramenta para um diagn\u00f3stico inicial de problemas com Ingress. Curiosamente, inicialmente ele foi escrito para administradores e tinha uma apar\u00eancia bem 'r\u00fastica', mas ap\u00f3s ser adotado pelas equipes de desenvolvimento, passou por uma grande transforma\u00e7\u00e3o e agora n\u00e3o parece mais uma 'interface web feita por administradores para administradores'. Em breve, abandonaremos essa ferramenta e situa\u00e7\u00f5es semelhantes ser\u00e3o validadas antes mesmo do lan\u00e7amento do pipeline.<\/p>\n<h4>Recursos de equipes no \u2018Kube\u2019<\/h4>\n<p>\nAntes de iniciarmos os exemplos, \u00e9 importante explicar como funcionamos na aloca\u00e7\u00e3o de recursos para <i>microsservi\u00e7os<\/i>.<\/p>\n<p>Para entender quais equipes e em que quantidades utilizam seus <i>recursos<\/i> (CPU, mem\u00f3ria, SSD local), alocamos para cada equipe seu pr\u00f3prio <i>namespace<\/i> no \u2018Kubernetes\u2019 e limitamos suas m\u00e1ximas capacidades de CPU, mem\u00f3ria e disco, previamente discutindo as necessidades das equipes. Assim, uma equipe, em geral, n\u00e3o bloquear\u00e1 o cluster inteiro para deploy, alocando milhares de n\u00facleos e terabytes de mem\u00f3ria. Os acessos no namespace s\u00e3o concedidos atrav\u00e9s do AD (usamos RBAC). Os namespaces e seus limites s\u00e3o adicionados atrav\u00e9s de um pull request no reposit\u00f3rio GIT, e em seguida, tudo \u00e9 automaticamente implantado atrav\u00e9s do pipeline Ansible.<\/p>\n<p>Exemplo de aloca\u00e7\u00e3o de recursos para uma equipe:<\/p>\n<pre><code class=\"go\">namespaces:\n\n  chat-team:\n    pods: 23\n    limits:\n      cpu: 11\n      memory: 20Gi\n    requests:\n      cpu: 11\n      memory: 20Gi\n<\/code><\/pre>\n<p><\/p>\n<h4>Requisi\u00e7\u00f5es e limites<\/h4>\n<p>\nNo \u2018Kube\u2019 <i>Request<\/i> \u00e9 a quantidade de recursos garantidamente reservados para <i>pod<\/i> (um ou mais cont\u00eaineres Docker) no cluster. O Limit \u00e9 um m\u00e1ximo n\u00e3o garantido. Muitas vezes, podemos observar nos gr\u00e1ficos que alguma equipe definiu muitos requests para todos os seus aplicativos e n\u00e3o consegue fazer o deploy de um aplicativo no \u2018Kubernetes\u2019, pois todos os requests j\u00e1 foram 'consumidos' no seu namespace.<\/p>\n<p>A sa\u00edda correta de tal situa\u00e7\u00e3o: observar o consumo real de recursos e comparar com a quantidade solicitada (Request).<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes no DomClick: como dormir tranquilo gerenciando um cluster de 1000 microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2020\/08\/417373d4421064f28d57a03b6bb5bf94.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Kubernetes no DomClick: como dormir tranquilo gerenciando um cluster de 1000 microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2020\/08\/3168ad6dc8b159059b21e1177e145376.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNas capturas de tela acima, \u00e9 poss\u00edvel ver que os 'solicitados' (Requested) de CPU est\u00e3o se aproximando da quantidade real de threads, enquanto os Limits podem exceder a quantidade real de threads dos processadores centrais.<\/p>\n<p>Agora vamos analisar detalhadamente um namespace (escolhi o namespace kube-system \u2014 o namespace do sistema para os componentes do pr\u00f3prio \u2018Kubernetes\u2019) e observar a rela\u00e7\u00e3o entre o tempo de CPU e mem\u00f3ria realmente utilizados e o que foi solicitado:<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes no DomClick: como dormir tranquilo gerenciando um cluster de 1000 microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2020\/08\/ed6160de5397b8cd39cbae172d4bb872.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c9 evidente que a mem\u00f3ria e o CPU reservados para os servi\u00e7os do sistema s\u00e3o muito maiores do que os realmente utilizados. No caso do kube-system, isso \u00e9 justificado: houve momentos em que o nginx ingress controller ou o nodelocaldns estavam no limite do CPU e consumiam muita RAM, ent\u00e3o essa reserva \u00e9 justific\u00e1vel. Al\u00e9m disso, n\u00e3o podemos confiar em gr\u00e1ficos das \u00faltimas 3 horas: \u00e9 desej\u00e1vel ver m\u00e9tricas hist\u00f3ricas de um per\u00edodo longo.<\/p>\n<p>Foi desenvolvida um sistema de \u2018recomenda\u00e7\u00f5es\u2019. Por exemplo, aqui podemos ver quais recursos seria melhor aumentar os \u2018limites\u2019 (o teto permitido), para evitar \u2018throttling\u2019 (estrangulamento): o momento em que j\u00e1 se gastou CPU ou mem\u00f3ria dentro do seu tempo alocado e est\u00e1 aguardando ser \u2018descongelado\u2019:<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes no DomClick: como dormir tranquilo gerenciando um cluster de 1000 microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2020\/08\/f23aece10a585e6847bcacfe947031d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nE aqui est\u00e3o os pods que deveriam moderar seus apetites:<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes no DomClick: como dormir tranquilo gerenciando um cluster de 1000 microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2020\/08\/1ec9996ce6355aeba603008d51aac209.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSobre <i>throttling<\/i> + monitoramento de recursos pode render v\u00e1rias mat\u00e9rias, ent\u00e3o perguntem nos coment\u00e1rios. Em poucas palavras, posso dizer que a tarefa de automatizar essas m\u00e9tricas \u00e9 bastante complexa e exige muito tempo e malabarismos com fun\u00e7\u00f5es \u2018window\u2019 e \u2018CTE\u2019 no Prometheus \/ VictoriaMetrics (esses termos est\u00e3o entre aspas, pois no PromQL praticamente n\u00e3o h\u00e1 algo assim, e precisamos criar consultas complexas em v\u00e1rios pain\u00e9is de texto e otimiz\u00e1-las).<\/p>\n<p>Em resumo, os desenvolvedores t\u00eam ferramentas para monitorar seus namespaces no \u2018Kubernetes\u2019, e eles podem escolher onde e em que momento recursos podem ser \u2018cortados\u2019 e quais pods podem receber todo o CPU a noite inteira.<\/p>\n<h4>Metodologias<\/h4>\n<p>\nNa empresa, como agora <i>est\u00e1 na moda<\/i>, seguimos pr\u00e1ticas de DevOps e <i>SRE<\/i>- pr\u00e1ticas. Quando h\u00e1 1000 microsservi\u00e7os na empresa, cerca de 350 desenvolvedores e 15 administradores para toda a infraestrutura, \u00e9 preciso \u2018estar na moda\u2019: por tr\u00e1s de todos esses \u2018buzzwords\u2019 h\u00e1 uma necessidade urgente de automatiza\u00e7\u00e3o de tudo, e os administradores n\u00e3o devem ser o gargalo nos processos.<\/p>\n<p>Como Ops, fornecemos v\u00e1rias m\u00e9tricas e dashboards para os desenvolvedores, relacionados \u00e0 velocidade de resposta dos servi\u00e7os e seus erros.<\/p>\n<p>Utilizamos metodologias como: <noindex><a rel=\"nofollow\" href=\"https:\/\/thenewstack.io\/monitoring-microservices-red-method\/\">RED<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brendangregg.com\/usemethod.html\">USE<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/forepaas\/distributed-monitoring-101-the-four-golden-signals-305bbbc33d35\">Sinais Dourados<\/a><\/noindex>, combinando-os. Tentamos minimizar o n\u00famero de dashboards para que, \u00e0 primeira vista, seja claro qual servi\u00e7o est\u00e1 em degrada\u00e7\u00e3o (por exemplo, c\u00f3digos de resposta por segundo, tempo de resposta no percentil 99), e assim por diante. Assim que novas m\u00e9tricas s\u00e3o necess\u00e1rias para nossos dashboards gerais, as desenhamos e adicionamos imediatamente.<\/p>\n<p><i>N\u00e3o desenhei gr\u00e1ficos h\u00e1 um m\u00eas. Provavelmente, isso \u00e9 um bom sinal: significa que a maioria dos desejos j\u00e1 foi realizada. Houve momentos em que, em uma semana, eu desenhava pelo menos um novo gr\u00e1fico por dia.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes no DomClick: como dormir tranquilo gerenciando um cluster de 1000 microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2020\/08\/574f1b4d2be78fb779f1771bffac51dd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Kubernetes no DomClick: como dormir tranquilo gerenciando um cluster de 1000 microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2020\/08\/6ab2aa05f912839b14bdbcf84faaeb3a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO resultado obtido \u00e9 valioso porque agora os desenvolvedores raramente v\u00e3o aos administradores com perguntas sobre 'onde verificar uma m\u00e9trica'.<\/p>\n<p>Implementa\u00e7\u00e3o <i>Service Mesh<\/i> n\u00e3o est\u00e1 longe e deve facilitar muito a vida de todos; os colegas da equipe de Ferramentas est\u00e3o perto de implementar uma vers\u00e3o abstrata do 'Istio de um usu\u00e1rio saud\u00e1vel': o ciclo de vida de cada solicita\u00e7\u00e3o HTTP(s) ser\u00e1 vis\u00edvel no monitoramento, e ser\u00e1 poss\u00edvel entender 'em qual etapa tudo falhou' durante a intera\u00e7\u00e3o entre servi\u00e7os (e n\u00e3o s\u00f3). Inscreva-se para as novidades do hub da empresa DomClick. =)<\/p>\n<h2>Apoio \u00e0 infraestrutura do Kubernetes<\/h2>\n<p>\nHistoricamente, usamos uma vers\u00e3o patchada <i>Kubespray<\/i> \u2014 Fun\u00e7\u00e3o Ansible para implanta\u00e7\u00e3o, expans\u00e3o e atualiza\u00e7\u00e3o do Kubernetes. Em algum momento, o suporte a instala\u00e7\u00f5es n\u00e3o kubeadm foi removido da branch principal, e o processo de transi\u00e7\u00e3o para kubeadm n\u00e3o foi proposto. Como resultado, a empresa Southbridge fez seu fork (com suporte a kubeadm e r\u00e1pida corre\u00e7\u00e3o de problemas cr\u00edticos). <\/p>\n<p>O processo de atualiza\u00e7\u00e3o de todos os clusters k8s \u00e9 o seguinte:<\/p>\n<ul>\n<li>Pegamos <i>Kubespray<\/i> da Southbridge, comparamos com nossa branch e mesclamos.<\/li>\n<li>Vamos liberar a atualiza\u00e7\u00e3o em <i>Stress<\/i>- 'Kube'.<\/li>\n<li>Fazemos a atualiza\u00e7\u00e3o n\u00f3 por n\u00f3 (em Ansible isso \u00e9 'serial: 1') em <i>Dev<\/i>- 'Kube'.<\/li>\n<li>Atualizamos <i>Prod<\/i> no s\u00e1bado \u00e0 noite n\u00f3 por n\u00f3.<\/li>\n<\/ul>\n<p>\nNo futuro, temos planos de substituir <i>Kubespray<\/i> por algo mais r\u00e1pido e migrar para <i>kubeadm<\/i>.<\/p>\n<p>Temos tr\u00eas 'Kubes': Stress, Dev e Prod. Planejamos lan\u00e7ar mais um (<i>hot standby<\/i>) Kube Prod no segundo Data Center. <i>Stress<\/i> e <i>Dev<\/i> vivem em 'm\u00e1quinas virtuais' (oVirt para Stress e VMWare cloud para Dev). <i>Prod<\/i>- 'Kube' vive em 'bare metal': s\u00e3o n\u00f3s iguais com 32 threads de CPU, 64-128 Gb de RAM e 300 Gb de SSD RAID 10 \u2014 ao todo s\u00e3o 50. Tr\u00eas n\u00f3s 'finos' s\u00e3o dedicados ao 'mestre' do <i>Prod<\/i>- 'Kube': 16 Gb de RAM, 12 threads de CPU.<\/p>\n<p>Para produ\u00e7\u00e3o, preferimos usar 'bare metal' e evitar camadas desnecess\u00e1rias como <i>OpenStack<\/i>: n\u00e3o precisamos de 'vizinhos barulhentos' e CPU <i>steal time<\/i>. E a complexidade da administra\u00e7\u00e3o aumenta aproximadamente em duas vezes no caso do OpenStack in-house.<\/p>\n<p>Para CI\/CD de \"Kubernetes\" e outros componentes de infraestrutura, usamos um servidor GIT separado, Helm 3 (passamos por uma transi\u00e7\u00e3o bastante dif\u00edcil do Helm 2, mas estamos muito satisfeitos com a op\u00e7\u00e3o <i>atomic<\/i>), Jenkins, Ansible e Docker. Gostamos de branches de feature e de implementar em diferentes ambientes a partir de um \u00fanico reposit\u00f3rio.<\/p>\n<h3>Conclus\u00e3o<\/h3>\n<p><img decoding=\"async\" alt=\"Kubernetes no DomClick: como dormir tranquilo gerenciando um cluster de 1000 microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2020\/08\/34ddcd1f275c63c1ad821218d16b5abb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAssim, de maneira geral, o processo DevOps na empresa DomClick parece do ponto de vista de um engenheiro de opera\u00e7\u00f5es. O artigo ficou menos t\u00e9cnico do que eu esperava: portanto, fique atento \u00e0s novidades da DomClick no Habr\u00e9: haver\u00e1 artigos mais \"hardcore\" sobre Kubernetes e muito mais.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/501122\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0438\u043a\u0442\u043e\u0440 \u042f\u0433\u043e\u0444\u0430\u0440\u043e\u0432, \u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c Kubernetes-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0432 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Ops (\u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f). \u042f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 Dev &lt;-&gt; Ops, \u043e\u0431 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 k8s-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u0432 \u0420\u043e\u0441\u0441\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e DevOps\/SRE-\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 Ops \u0412 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Ops [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91200,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91199","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=\"description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0438\u043a\u0442\u043e\u0440 \u042f\u0433\u043e\u0444\u0430\u0440\u043e\u0432, \u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c Kubernetes-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0432 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Ops (\u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f).\" \/>\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\/kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov\" \/>\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\udd47Kubernetes \u0432 \u0414\u043e\u043c\u041a\u043b\u0438\u043a: \u043a\u0430\u043a \u0441\u043f\u0430\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u043d\u0430 1000 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0438\u043a\u0442\u043e\u0440 \u042f\u0433\u043e\u0444\u0430\u0440\u043e\u0432, \u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c Kubernetes-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0432 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Ops (\u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f).\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov\" \/>\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-08-09T23:42:03+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-09T23:42:03+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\udd47Kubernetes na DomClick: como dormir tranquilo gerenciando um cluster de 1000 microsservi\u00e7os | ProHoster","description":"Meu nome \u00e9 Victor Yagofarov, e eu estou desenvolvendo a plataforma Kubernetes na DomClick como l\u00edder t\u00e9cnico de desenvolvimento na equipe de Ops (opera\u00e7\u00f5es).","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov","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\udd47Kubernetes \u0432 \u0414\u043e\u043c\u041a\u043b\u0438\u043a: \u043a\u0430\u043a \u0441\u043f\u0430\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u043d\u0430 1000 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 | ProHoster","og:description":"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0438\u043a\u0442\u043e\u0440 \u042f\u0433\u043e\u0444\u0430\u0440\u043e\u0432, \u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c Kubernetes-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0432 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Ops (\u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f).","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov","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-08-09T23:42:03+00:00","article:modified_time":"2020-08-09T23:42:03+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91199","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 12:32:23","updated":"2022-09-28 06:43:59","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\/91199","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=91199"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/91199\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/91200"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=91199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=91199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=91199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}