{"id":35581,"date":"2019-10-31T22:05:09","date_gmt":"2019-10-31T19:05:09","guid":{"rendered":"https:\/\/prohoster.info\/blog\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes\/"},"modified":"2019-10-31T22:05:09","modified_gmt":"2019-10-31T19:05:09","slug":"southbridge-v-chelyabinske-i-bitriks-v-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","title":{"rendered":"Southbridge em Chelyabinsk e Bitrix no Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Em Chelyabinsk, ocorrem meetups para administradores de sistemas Sysadminka, e na \u00faltima reuni\u00e3o, fiz uma apresenta\u00e7\u00e3o sobre nossa solu\u00e7\u00e3o para rodar aplicativos no 1C-Bitrix no Kubernetes.<\/p>\n<p><\/p>\n<p>Bitrix, Kubernetes, Ceph - uma combina\u00e7\u00e3o excelente?<\/p>\n<p><\/p>\n<p>Vou explicar como montamos uma solu\u00e7\u00e3o funcional a partir de tudo isso.<\/p>\n<p><\/p>\n<p>Vamos l\u00e1!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge em Chelyabinsk e Bitrix no Kubernetes\" src=\"\/wp-content\/uploads\/3f1b760eeab9dc07124a6353ccd2f004.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>O meetup aconteceu em 18 de abril em Chelyabinsk. Voc\u00ea pode ler sobre nossos meetups em <noindex><a rel=\"nofollow\" href=\"https:\/\/sysadminka.timepad.ru\">Timepad<\/a><\/noindex> e assistir no <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/channel\/UCMblNgU0Gt-TXb9GdVeeinw\/\">YouTube<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Se voc\u00ea quiser se juntar a n\u00f3s com uma apresenta\u00e7\u00e3o ou como ouvinte - fique \u00e0 vontade, escreva para vadim.isakanov@gmail.com e no Telegram t.me\/vadimisakanov. <\/p>\n<p><\/p>\n<h2 id=\"moy-doklad\">Minha apresenta\u00e7\u00e3o<\/h2>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=MZqPNMUjr_M\" title=\"Apresenta\u00e7\u00e3o sobre Bitrix no Kubernetes\"><img decoding=\"async\" alt=\"Southbridge em Chelyabinsk e Bitrix no Kubernetes\" src=\"\/wp-content\/uploads\/eb02d3ceb8248faad927c2bcae0074de.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/yadi.sk\/i\/1q0YpFHBGBdtcg\">Slides<\/a><\/noindex><\/p>\n<p><\/p>\n<h2 id=\"reshenie-bitriks-v-kubernetes-versiya-southbridge-10\">Solu\u00e7\u00e3o \u00abBitrix no Kubernetes, vers\u00e3o Southbridge 1.0\u00bb<\/h2>\n<p><\/p>\n<p>Vou falar sobre nossa solu\u00e7\u00e3o no formato \u00abpara iniciantes no Kubernetes\u00bb, como foi feita no meetup. Mas presumo que voc\u00ea j\u00e1 conhece os termos Bitrix, Docker, Kubernetes, Ceph, pelo menos no n\u00edvel de artigos da Wikipedia.<\/p>\n<p><\/p>\n<h4 id=\"chto-voobsche-est-gotovogo-pro-bitriks-v-kubernetes\">O que j\u00e1 existe sobre Bitrix no Kubernetes?<\/h4>\n<p><\/p>\n<p>Na internet, h\u00e1 muito pouca informa\u00e7\u00e3o sobre como os aplicativos funcionam no Bitrix no Kubernetes.<br \/>\nEncontrei apenas esses materiais:<\/p>\n<p><\/p>\n<p>Apresenta\u00e7\u00e3o de Alexander Serbul, 1C-Bitrix, e Anton Tuzlukov da Qsoft: <\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"lHK4eOvLbRM\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/lHK4eOvLbRM\/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>Recomendo ouvi-lo.<\/p>\n<p><\/p>\n<p>Desenvolvimento de uma solu\u00e7\u00e3o pr\u00f3pria pelo usu\u00e1rio <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/serkyron\/\" class=\"user_link\">serkyron<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/351286\/\">no Habr<\/a><\/noindex>.<br \/>\nEncontrei ainda <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ESSch\/kubernetes\">essa solu\u00e7\u00e3o<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>E isso \u00e9 tudo.<\/p>\n<p><\/p>\n<p>Aten\u00e7\u00e3o, n\u00e3o verificamos a qualidade das solu\u00e7\u00f5es nos links acima \ud83d\ude42<br \/>\nAli\u00e1s, ao preparar nossa solu\u00e7\u00e3o, conversei com Alexander Serbul, e na \u00e9poca, sua apresenta\u00e7\u00e3o ainda n\u00e3o existia, portanto, em meus slides, h\u00e1 um item que diz 'Bitrix n\u00e3o usa Kubernetes'.<\/p>\n<p><\/p>\n<p>Mas j\u00e1 existem muitas imagens Docker prontas para uso do Bitrix no Docker: <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/search?q=bitrix&amp;type=image\">https:\/\/hub.docker.com\/search?q=bitrix&amp;type=image<\/a><\/noindex> <\/p>\n<p><\/p>\n<p>Isso \u00e9 suficiente para criar uma solu\u00e7\u00e3o completa para Bitrix no Kubernetes?<br \/>\nN\u00e3o. H\u00e1 uma s\u00e9rie de problemas que precisam ser resolvidos.<\/p>\n<p><\/p>\n<h4 id=\"v-chem-problemy-s-bitriks-v-kubernetes\">Quais s\u00e3o os problemas com Bitrix no Kubernetes?<\/h4>\n<p><\/p>\n<p><strong>O primeiro - as imagens prontas do Dockerhub n\u00e3o s\u00e3o adequadas para Kubernetes<\/strong><\/p>\n<p><\/p>\n<p>Se quisermos construir uma arquitetura de microsservi\u00e7os (e no Kubernetes geralmente queremos), precisamos dividir o aplicativo em cont\u00eaineres e garantir que cada cont\u00eainer execute uma \u00fanica fun\u00e7\u00e3o pequena (e fa\u00e7a isso bem). Por que apenas uma? Em resumo - quanto mais simples, mais confi\u00e1vel.<br \/>\nSe quiser mais detalhes - por favor, assista a este artigo e v\u00eddeo: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/426637\/\">https:\/\/habr.com\/ru\/company\/southbridge\/blog\/426637\/<\/a><\/noindex> <\/p>\n<p><\/p>\n<p>As imagens Docker do Dockerhub s\u00e3o principalmente constru\u00eddas sob o princ\u00edpio 'tudo em um', por isso tivemos que realmente criar nossa pr\u00f3pria solu\u00e7\u00e3o e at\u00e9 fazer as imagens do zero.<\/p>\n<p><\/p>\n<p><strong>O segundo - o c\u00f3digo do site \u00e9 ajustado do painel administrativo<\/strong><\/p>\n<p><\/p>\n<p>Criamos uma nova se\u00e7\u00e3o no site - o c\u00f3digo foi atualizado (uma diret\u00f3rio com o nome da nova se\u00e7\u00e3o foi adicionado).<\/p>\n<p><\/p>\n<p>Alteramos as propriedades do componente pelo painel de administra\u00e7\u00e3o - o c\u00f3digo foi alterado.<\/p>\n<p><\/p>\n<p>Kubernetes n\u00e3o consegue trabalhar com isso 'por padr\u00e3o', os containers devem ser imut\u00e1veis (Stateless).<\/p>\n<p><\/p>\n<p>Motivo: cada container (pod) no cluster processa apenas uma parte do tr\u00e1fego. Se o c\u00f3digo for alterado apenas em um container (pod), o c\u00f3digo ser\u00e1 diferente em diferentes pods, o site funcionar\u00e1 de forma diferente, e diferentes vers\u00f5es do site ser\u00e3o mostradas para os diferentes usu\u00e1rios. Isso n\u00e3o \u00e9 vi\u00e1vel.<\/p>\n<p><\/p>\n<p><strong>Terceiro - precisamos resolver a quest\u00e3o do deploy.<\/strong><\/p>\n<p><\/p>\n<p>Se tivermos um monolito e um \u00fanico servidor 'cl\u00e1ssico', tudo \u00e9 bem simples: implementamos uma nova base de c\u00f3digo, realizamos a migra\u00e7\u00e3o do banco de dados, e redirecionamos o tr\u00e1fego para a nova vers\u00e3o do c\u00f3digo. A troca ocorre instantaneamente.<br \/>\nSe nosso site estiver no Kubernetes, dividido em microsservi\u00e7os, com muitos containers de c\u00f3digo - ai ai. Precisamos compilar containers com a nova vers\u00e3o do c\u00f3digo, substitu\u00ed-los pelos antigos, realizar a migra\u00e7\u00e3o do banco de dados corretamente e, idealmente, fazer isso sem que os visitantes percebam. Felizmente, o Kubernetes nos ajuda, suportando uma s\u00e9rie de diferentes tipos de deploy.<\/p>\n<p><\/p>\n<p><strong>Quarto - precisamos resolver a quest\u00e3o do armazenamento de arquivos est\u00e1ticos.<\/strong><\/p>\n<p><\/p>\n<p>Se o seu site pesa 'apenas' 10 gigabytes e voc\u00ea o implementar completamente em containers, voc\u00ea ter\u00e1 containers pesando 10 gigabytes que levar\u00e3o uma eternidade para serem implantados.<br \/>\nPrecisamos armazenar as partes 'mais pesadas' do site fora dos containers, e surge a quest\u00e3o de como fazer isso corretamente.<\/p>\n<p><\/p>\n<h4 id=\"chego-net-v-nashem-reshenii\">O que n\u00e3o est\u00e1 em nossa solu\u00e7\u00e3o.<\/h4>\n<p><\/p>\n<p>Todo o c\u00f3digo do Bitrix n\u00e3o foi dividido em microfun\u00e7\u00f5es\/microsservi\u00e7os (como registro separado, m\u00f3dulo de e-commerce separado, etc.). Mantemos toda a base de c\u00f3digo em cada container na \u00edntegra.<\/p>\n<p><\/p>\n<p>A base no Kubernetes tamb\u00e9m n\u00e3o \u00e9 armazenada (eu j\u00e1 implementei solu\u00e7\u00f5es com base no Kubernetes para ambientes de desenvolvimento, mas n\u00e3o para produ\u00e7\u00e3o).<\/p>\n<p><\/p>\n<p>Os administradores do site ainda perceber\u00e3o que o site est\u00e1 rodando no Kubernetes. A fun\u00e7\u00e3o 'verifica\u00e7\u00e3o do sistema' n\u00e3o funciona corretamente, para editar o c\u00f3digo do site a partir do painel de administra\u00e7\u00e3o, \u00e9 necess\u00e1rio primeiro pressionar o bot\u00e3o 'quero editar o c\u00f3digo'.<\/p>\n<p><\/p>\n<p>Resolvemos os problemas, entendemos a necessidade de implementar microservi\u00e7os, e o objetivo est\u00e1 claro \u2014 obter um sistema funcional para operar aplicativos no Bitrix em Kubernetes, preservando tanto as funcionalidades do Bitrix quanto as vantagens do Kubernetes. Vamos iniciar a implementa\u00e7\u00e3o.<\/p>\n<p><\/p>\n<h4 id=\"arhitektura\">Arquitetura<\/h4>\n<p><\/p>\n<p>Muitos pods 'worker' com servidor web.<br \/>\nUm pod com tarefas cron (obrigatoriamente apenas um).<br \/>\nUm pod de upgrade para edi\u00e7\u00e3o do c\u00f3digo do site a partir do painel de administra\u00e7\u00e3o (tamb\u00e9m obrigatoriamente apenas um).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge em Chelyabinsk e Bitrix no Kubernetes\" src=\"\/wp-content\/uploads\/e26a787c11f78811b15a89f597331ef1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Estamos resolvendo quest\u00f5es:<\/p>\n<p><\/p>\n<ul>\n<li>Onde armazenar as sess\u00f5es?<\/li>\n<li>Onde armazenar o cache?<\/li>\n<li>Onde armazenar a est\u00e1tica? N\u00e3o podemos colocar gigabytes de est\u00e1tica em um monte de cont\u00eaineres.<\/li>\n<li>Como o banco de dados vai funcionar?<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"docker-obraz\">Imagem Docker<\/h4>\n<p><\/p>\n<p>Come\u00e7amos pela constru\u00e7\u00e3o da imagem Docker.<\/p>\n<p><\/p>\n<p>A op\u00e7\u00e3o ideal \u2014 temos uma \u00fanica imagem universal, a partir da qual obtemos tanto os pods worker quanto os pods com tarefas cron e os pods de upgrade.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/centosadmin\/bitrixenv\">Fizemos exatamente essa imagem.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Ela inclui nginx, apache\/php-fpm (que pode ser escolhido durante a constru\u00e7\u00e3o), msmtp para envio de emails, e cron.<\/p>\n<p><\/p>\n<p>Durante a constru\u00e7\u00e3o da imagem, toda a base de c\u00f3digo do site \u00e9 copiada para o diret\u00f3rio \/app (exceto as partes que vamos mover para um armazenamento compartilhado separado).<\/p>\n<p><\/p>\n<h4 id=\"mikroservisnost-servisy\">Microservi\u00e7os, servi\u00e7os<\/h4>\n<p><\/p>\n<p><strong>Pods worker:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Cont\u00eainer com nginx + cont\u00eainer apache\/php-fpm + msmtp.<\/li>\n<li>N\u00e3o foi poss\u00edvel mover msmtp para um microservi\u00e7o separado, o Bitrix come\u00e7a a reclamar que n\u00e3o consegue enviar emails diretamente.<\/li>\n<li>Dentro de cada cont\u00eainer, h\u00e1 uma base de c\u00f3digo completa.<\/li>\n<li>\u00c9 proibido modificar o c\u00f3digo nos cont\u00eaineres.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Pod cron:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Cont\u00eainer com apache, php, cron.<\/li>\n<li>Inclui a base de c\u00f3digo completa.<\/li>\n<li>\u00c9 proibido modificar o c\u00f3digo nos cont\u00eaineres.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Pod de upgrade:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Cont\u00eainer com nginx + cont\u00eainer apache\/php-fpm + msmtp.<\/li>\n<li>N\u00e3o h\u00e1 proibi\u00e7\u00e3o de modificar o c\u00f3digo nos cont\u00eaineres.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Armazenamento de sess\u00f5es.<\/strong><\/p>\n<p><\/p>\n<p><strong>Armazenamento de cache do Bitrix.<\/strong><\/p>\n<p><\/p>\n<p>Outra coisa importante: as senhas para conex\u00e3o a tudo, desde o banco de dados at\u00e9 o email, s\u00e3o armazenadas em segredos do Kubernetes. Temos a vantagem de que as senhas s\u00e3o vis\u00edveis apenas para aqueles a quem concedemos acesso aos segredos, e n\u00e3o para todos que t\u00eam acesso \u00e0 base de c\u00f3digo do projeto.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-dlya-statiki\">Armazenamento para est\u00e1tica.<\/h4>\n<p><\/p>\n<p>Pode-se usar qualquer coisa: ceph, nfs (mas n\u00e3o recomendamos nfs para produ\u00e7\u00e3o), armazenamento em rede de provedores 'nublados', etc.<\/p>\n<p><\/p>\n<p>O armazenamento precisar\u00e1 ser conectado dentro dos cont\u00eaineres ao diret\u00f3rio \/upload\/ do site e a outros diret\u00f3rios com est\u00e1tica.<\/p>\n<p><\/p>\n<h4 id=\"baza-dannyh\">Banco de dados<\/h4>\n<p><\/p>\n<p>Para simplificar, recomendamos manter o banco de dados fora do Kubernetes. Um banco de dados no Kubernetes \u00e9 uma tarefa separada e complexa, que tornar\u00e1 o esquema significativamente mais complicado.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-sessiy\">Armazenamento de sess\u00f5es.<\/h4>\n<p><\/p>\n<p>Usamos memcached \ud83d\ude42<\/p>\n<p><\/p>\n<p>Ele lida bem com o armazenamento de sess\u00f5es, \u00e9 clusteriz\u00e1vel e \u00e9 suportado \"nativamente\" como session.save_path no php. Esse sistema j\u00e1 foi testado in\u00fameras vezes na arquitetura monol\u00edtica cl\u00e1ssica, quando constru\u00edmos clusters com um grande n\u00famero de servidores web. Para o deploy, usamos helm.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ helm install stable\/memcached --name session<\/code><\/pre>\n<p><\/p>\n<p>php.ini - aqui na imagem est\u00e3o definidas as configura\u00e7\u00f5es para armazenamento de sess\u00f5es no memcached<\/p>\n<p><\/p>\n<p>Usamos Vari\u00e1veis de Ambiente para transmitir dados sobre os hosts com memcached <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/inject-data-application\/define-environment-variable-container\/\">https:\/\/kubernetes.io\/docs\/tasks\/inject-data-application\/define-environment-variable-container\/<\/a><\/noindex>.<br \/>\nIsso permite usar o mesmo c\u00f3digo em ambientes dev, stage, test, prod (os nomes dos hosts memcached ser\u00e3o diferentes entre eles, por isso precisamos passar um nome \u00fanico de host para as sess\u00f5es em cada ambiente).<br \/>\nArmazenamento de cache Bitrix<\/p>\n<p><\/p>\n<p>Precisamos de um armazenamento tolerante a falhas, onde todos os pods possam escrever e ler.<\/p>\n<p><\/p>\n<p>Tamb\u00e9m usamos memcached.<br \/>\nEssa solu\u00e7\u00e3o \u00e9 recomendada pelo pr\u00f3prio Bitrix.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ helm install stable\/memcached --name cache<\/code><\/pre>\n<p><\/p>\n<p>bitrix\/.settings_extra.php - aqui no Bitrix \u00e9 definido onde armazenamos o cache<\/p>\n<p><\/p>\n<p>Da mesma forma, usamos Vari\u00e1veis de Ambiente.<\/p>\n<p><\/p>\n<h3 id=\"krontaski\">Tarefas cron<\/h3>\n<p><\/p>\n<p>Existem diferentes abordagens para executar tarefas cron no Kubernetes.<\/p>\n<p><\/p>\n<ul>\n<li>deployment separado com pod para a execu\u00e7\u00e3o de tarefas cron<\/li>\n<li>cronjob para executar tarefas cron (se for um aplicativo web - com wget <noindex>https:\/\/$host$cronjobname<\/noindex>, ou kubectl exec dentro de um dos pods worker, etc.)<\/li>\n<li>etc.<\/li>\n<\/ul>\n<p><\/p>\n<p>Pode-se discutir qual \u00e9 o mais correto, mas neste caso optamos pela op\u00e7\u00e3o 'deployment separado com pods para cron jobs'.<\/p>\n<p><\/p>\n<p>Como isso \u00e9 feito:<\/p>\n<p><\/p>\n<ul>\n<li>adicionamos tarefas cron atrav\u00e9s do ConfigMap ou atrav\u00e9s do arquivo config\/addcron<\/li>\n<li>executamos uma inst\u00e2ncia do cont\u00eainer, id\u00eantica ao pod worker + permitimos a execu\u00e7\u00e3o de tarefas cron nele<\/li>\n<li>\u00e9 utilizada a mesma base de c\u00f3digo, gra\u00e7as \u00e0 unifica\u00e7\u00e3o, a constru\u00e7\u00e3o do cont\u00eainer \u00e9 simples<\/li>\n<\/ul>\n<p><\/p>\n<p>O que conseguimos de bom:<\/p>\n<p><\/p>\n<ul>\n<li>temos tarefas cron funcionais em um ambiente id\u00eantico ao do ambiente dos desenvolvedores (docker)<\/li>\n<li>Os cron jobs n\u00e3o precisam ser 'reescritos' para Kubernetes, eles funcionam no mesmo formato e na mesma base de c\u00f3digo que antes.<\/li>\n<li>as tarefas cron podem ser adicionadas por todos os membros da equipe com direitos de commit na branch de produ\u00e7\u00e3o, e n\u00e3o apenas pelos administradores<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"modul-southbridge-k8sdeploy-i-redaktirovanie-koda-iz-admin-paneli\">M\u00f3dulo Southbridge K8SDeploy e edi\u00e7\u00e3o de c\u00f3digo a partir do painel de administra\u00e7\u00e3o<\/h3>\n<p><\/p>\n<p>Falamos sobre o upgrade do pod?<br \/>\nE como direcionar o tr\u00e1fego para l\u00e1?<br \/>\nUhul, escrevemos um m\u00f3dulo para isso em php \ud83d\ude42 \u00c9 um pequeno m\u00f3dulo cl\u00e1ssico para o Bitrix. Ele ainda n\u00e3o est\u00e1 dispon\u00edvel publicamente, mas planejamos disponibiliz\u00e1-lo.<br \/>\nO m\u00f3dulo \u00e9 instalado como um m\u00f3dulo comum no Bitrix:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge em Chelyabinsk e Bitrix no Kubernetes\" src=\"\/wp-content\/uploads\/ba9f895ce645862c7ba003d523cd5656.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se parece assim:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge em Chelyabinsk e Bitrix no Kubernetes\" src=\"\/wp-content\/uploads\/916ae9243fae9f6405cc68174ec5bb2b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ele permite definir um cookie que identifica o administrador do site e permite que o Kubernetes envie tr\u00e1fego para o pod de upgrade.<\/p>\n<p><\/p>\n<p>Quando as altera\u00e7\u00f5es s\u00e3o conclu\u00eddas, voc\u00ea deve clicar em git push para que as altera\u00e7\u00f5es no c\u00f3digo sejam enviadas para o git. Em seguida, o sistema construir\u00e1 uma imagem com a nova vers\u00e3o do c\u00f3digo e a \"distribuir\u00e1\" pelo cluster, substituindo os pods antigos.<\/p>\n<p><\/p>\n<p>Sim, um pouco improvisado, mas assim mantemos a arquitetura de microservi\u00e7os e n\u00e3o retiramos dos usu\u00e1rios do Bitrix a valiosa possibilidade de corrigir o c\u00f3digo a partir do painel de administra\u00e7\u00e3o. Afinal, isso \u00e9 uma op\u00e7\u00e3o; o problema da corre\u00e7\u00e3o de c\u00f3digo pode ser resolvido de outra forma.<\/p>\n<p><\/p>\n<h4 id=\"helm-chart\">Helm chart<\/h4>\n<p><\/p>\n<p>Para construir aplica\u00e7\u00f5es no Kubernetes, geralmente usamos o gerenciador de pacotes Helm.<br \/>\nPara nossa solu\u00e7\u00e3o Bitrix no Kubernetes, Sergey Bondarev, nosso administrador de sistemas principal, escreveu um Helm chart especial.<\/p>\n<p><\/p>\n<p>Ele executa a montagem de workers, atualiza\u00e7\u00e3o, pods cron, configura ingressos, servi\u00e7os, e passa vari\u00e1veis dos segredos do Kubernetes para os pods.<\/p>\n<p><\/p>\n<p>N\u00f3s armazenamos o c\u00f3digo no Gitlab e tamb\u00e9m iniciamos a constru\u00e7\u00e3o do Helm a partir do Gitlab.<\/p>\n<p><\/p>\n<p>De forma resumida, isso se parece com:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ helm upgrade --install project .helm --set image=registrygitlab.local\/k8s\/bitrix -f .helm\/values.yaml --wait --timeout 300 --debug --tiller-namespace=production<\/code><\/pre>\n<p><\/p>\n<p>O Helm tamb\u00e9m permite fazer um rollback \"sem emendas\", caso algo d\u00ea errado durante o deploy. \u00c9 bom saber que voc\u00ea n\u00e3o est\u00e1 em p\u00e2nico \"corrigindo o c\u00f3digo via ftp porque o ambiente de produ\u00e7\u00e3o caiu\", mas sim que o Kubernetes faz isso automaticamente, sem downtime.<\/p>\n<p><\/p>\n<h4 id=\"deploy\">Deploy<\/h4>\n<p><\/p>\n<p>Sim, somos f\u00e3s do Gitlab &amp; Gitlab CI, usamos isso \ud83d\ude42<br \/>\nAo fazer um commit no Gitlab no reposit\u00f3rio do projeto, o Gitlab inicia um pipeline que realiza a implanta\u00e7\u00e3o de uma nova vers\u00e3o do ambiente.<\/p>\n<p><\/p>\n<p>Etapas:<\/p>\n<p><\/p>\n<ul>\n<li>build (constru\u00edmos uma nova imagem Docker)<\/li>\n<li>test (testamos)<\/li>\n<li>clean up (removemos o ambiente de teste)<\/li>\n<li>push (enviamos para o Docker registry)<\/li>\n<li>deploy (implementamos a aplica\u00e7\u00e3o no Kubernetes via Helm).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge em Chelyabinsk e Bitrix no Kubernetes\" src=\"\/wp-content\/uploads\/74e565a0793b90c3cc19b8c7dedaff34.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uhul, pronto, vamos implementar!<br \/>\nBem, ou fazemos perguntas, se houver.<\/p>\n<p><\/p>\n<h2 id=\"itak-chto-my-sdelali\">Ent\u00e3o, o que fizemos<\/h2>\n<p><\/p>\n<p><strong>Do ponto de vista t\u00e9cnico:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>dockerizamos o Bitrix;<\/li>\n<li>\u201cdividimos\u201d o Bitrix em cont\u00eaineres, cada um dos quais executa fun\u00e7\u00f5es m\u00ednimas;<\/li>\n<li>alcan\u00e7amos um estado stateless para os cont\u00eaineres;<\/li>\n<li>resolvemos o problema de atualiza\u00e7\u00e3o do Bitrix no Kubernetes;<\/li>\n<li>todas as fun\u00e7\u00f5es do Bitrix continuaram funcionando (quase todas);<\/li>\n<li>executamos o deploy no Kubernetes e o rollback entre vers\u00f5es.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Do ponto de vista empresarial:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>alta disponibilidade;<\/li>\n<li>ferramentas do Kubernetes (integra\u00e7\u00e3o simples com Gitlab CI, deploy sem emendas, etc);<\/li>\n<li>senhas em segredos (vis\u00edveis apenas para aqueles a quem o acesso \u00e0s senhas foi diretamente concedido);<\/li>\n<li>\u00e9 conveniente criar ambientes adicionais (para desenvolvimento, testes e outros) dentro de uma \u00fanica infraestrutura.<\/li>\n<\/ul>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/456608\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u0442\u0430\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 Sysadminka, \u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0438\u0437 \u043d\u0438\u0445 \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043e \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 1\u0421-\u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes. \u0411\u0438\u0442\u0440\u0438\u043a\u0441, Kubernetes, \u0421eph \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u043c\u0435\u0441\u044c? \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u0438\u0437 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041f\u043e\u0435\u0445\u0430\u043b\u0438! \u041c\u0438\u0442\u0430\u043f \u043f\u0440\u043e\u0448\u0435\u043b 18 \u0430\u043f\u0440\u0435\u043b\u044f \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435. \u041f\u0440\u043e \u043d\u0430\u0448\u0438 \u043c\u0438\u0442\u0430\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 Timepad \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35581","post","type-post","status-publish","format-standard","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=\"\u0412 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u0442\u0430\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 Sysadminka, \u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0438\u0437 \u043d\u0438\u0445 \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043e \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 1\u0421-\u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes. \u0411\u0438\u0442\u0440\u0438\u043a\u0441, Kubernetes, \u0421eph \u2014.\" \/>\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\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes\" \/>\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\udd47Southbridge \u0432 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u0438 \u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u0442\u0430\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 Sysadminka, \u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0438\u0437 \u043d\u0438\u0445 \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043e \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 1\u0421-\u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes. \u0411\u0438\u0442\u0440\u0438\u043a\u0441, Kubernetes, \u0421eph \u2014.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes\" \/>\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=\"2019-10-31T19:05:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:05:09+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\udd47Southbridge em Chelyabinsk e Bitrix no Kubernetes | ProHoster","description":"Em Chelyabinsk, est\u00e3o ocorrendo meetups de administradores de sistemas Sysadminka, e na \u00faltima delas fiz uma apresenta\u00e7\u00e3o sobre nossa solu\u00e7\u00e3o para execu\u00e7\u00e3o de aplicativos no 1C-Bitrix no Kubernetes. Bitrix, Kubernetes, Ceph.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","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\udd47Southbridge \u0432 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u0438 \u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes | ProHoster","og:description":"\u0412 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u0442\u0430\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 Sysadminka, \u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0438\u0437 \u043d\u0438\u0445 \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043e \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 1\u0421-\u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes. \u0411\u0438\u0442\u0440\u0438\u043a\u0441, Kubernetes, \u0421eph \u2014.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","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":"2019-10-31T19:05:09+00:00","article:modified_time":"2019-10-31T19:05:09+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35581","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":"2026-01-21 23:52:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:59:36","updated":"2026-01-21 23:52:19","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\/35581","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=35581"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/35581\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=35581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=35581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=35581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}