{"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\/es\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","title":{"rendered":"Southbridge en Chelyabinsk y Bitrix en Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>En Cheli\u00e1binsk se llevan a cabo meetups para administradores de sistemas Sysadminka, y en el \u00faltimo de ellos hice una presentaci\u00f3n sobre nuestra soluci\u00f3n para ejecutar aplicaciones en 1C-Bitrix en Kubernetes.<\/p>\n<p><\/p>\n<p>\u00bfBitrix, Kubernetes, Ceph: una combinaci\u00f3n excelente?<\/p>\n<p><\/p>\n<p>Les contar\u00e9 c\u00f3mo reunimos todo esto en una soluci\u00f3n funcional.<\/p>\n<p><\/p>\n<p>\u00a1Vamos!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge en Chelyabinsk y Bitrix en 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>El meetup tuvo lugar el 18 de abril en Cheli\u00e1binsk. Sobre nuestros meetups se puede leer en <noindex><a rel=\"nofollow\" href=\"https:\/\/sysadminka.timepad.ru\">Timepad<\/a><\/noindex> y ver en <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/channel\/UCMblNgU0Gt-TXb9GdVeeinw\/\">YouTube<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Si quieren venir a nosotros como ponentes o como oyentes, \u00a1bienvenidos! Escriban a vadim.isakanov@gmail.com y en Telegram t.me\/vadimisakanov. <\/p>\n<p><\/p>\n<h2 id=\"moy-doklad\">Mi presentaci\u00f3n<\/h2>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=MZqPNMUjr_M\" title=\"Informe sobre Bitrix en Kubernetes\"><img decoding=\"async\" alt=\"Southbridge en Chelyabinsk y Bitrix en 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\">Diapositivas<\/a><\/noindex><\/p>\n<p><\/p>\n<h2 id=\"reshenie-bitriks-v-kubernetes-versiya-southbridge-10\">La soluci\u00f3n \u00abBitrix en Kubernetes, versi\u00f3n Southbridge 1.0\u00bb<\/h2>\n<p><\/p>\n<p>Hablar\u00e9 de nuestra soluci\u00f3n en un formato \u00abpara principiantes en Kubernetes\u00bb, como se hizo en el meetup. Pero supongo que las palabras Bitrix, Docker, Kubernetes, Ceph les son familiares, al menos a nivel de art\u00edculos en Wikipedia.<\/p>\n<p><\/p>\n<h4 id=\"chto-voobsche-est-gotovogo-pro-bitriks-v-kubernetes\">\u00bfQu\u00e9 hay disponible sobre Bitrix en Kubernetes?<\/h4>\n<p><\/p>\n<p>En toda la Internet hay muy poca informaci\u00f3n sobre c\u00f3mo funcionan las aplicaciones en Bitrix en Kubernetes.<br \/>\nSolo encontr\u00e9 estos materiales:<\/p>\n<p><\/p>\n<p>La presentaci\u00f3n de Alexander Serbul y Anton Tuzlukov de 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=\"Reproducir video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Recomiendo escucharlo.<\/p>\n<p><\/p>\n<p>Desarrollo de una soluci\u00f3n propia por el usuario <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\/\">en Habr\u00e9<\/a><\/noindex>.<br \/>\nTambi\u00e9n encontr\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ESSch\/kubernetes\">tal soluci\u00f3n<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Yyyy\u2026 en realidad, eso es todo.<\/p>\n<p><\/p>\n<p>Aviso que no hemos comprobado la calidad de las soluciones en los enlaces anteriores \ud83d\ude42<br \/>\nPor cierto, al preparar nuestra soluci\u00f3n habl\u00e9 con Alexander Serbul, su presentaci\u00f3n a\u00fan no hab\u00eda sido publicada, por lo que en mis diapositivas hay un punto que dice \u00abBitrix no utiliza Kubernetes\u00bb.<\/p>\n<p><\/p>\n<p>Pero ya hay muchas im\u00e1genes Docker listas para trabajar con Bitrix en 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>\u00bfEs suficiente esto para crear una soluci\u00f3n completa para Bitrix en Kubernetes?<br \/>\nNo. Hay una gran cantidad de problemas que necesitan ser resueltos.<\/p>\n<p><\/p>\n<h4 id=\"v-chem-problemy-s-bitriks-v-kubernetes\">\u00bfCu\u00e1les son los problemas con Bitrix en Kubernetes?<\/h4>\n<p><\/p>\n<p><strong>El primero: las im\u00e1genes listas de Dockerhub no son adecuadas para Kubernetes.<\/strong><\/p>\n<p><\/p>\n<p>Si queremos construir una arquitectura de microservicios (y generalmente queremos en Kubernetes), la aplicaci\u00f3n en Kubernetes debe dividirse en contenedores y lograr que cada contenedor realice una peque\u00f1a funci\u00f3n (y lo haga bien). \u00bfPor qu\u00e9 solo una? En pocas palabras: cuanto m\u00e1s simple, m\u00e1s confiable.<br \/>\nSi quieren m\u00e1s informaci\u00f3n, por favor vean este art\u00edculo y video: <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>Las im\u00e1genes Docker en Dockerhub est\u00e1n construidas principalmente bajo el principio de \u00abtodo en uno\u00bb, por eso tuvimos que crear nuestra propia soluci\u00f3n, incluso creando las im\u00e1genes desde cero.<\/p>\n<p><\/p>\n<p><strong>El segundo: el c\u00f3digo del sitio se corrige desde el panel de administraci\u00f3n.<\/strong><\/p>\n<p><\/p>\n<p>Se cre\u00f3 una nueva secci\u00f3n en el sitio web: se actualiz\u00f3 el c\u00f3digo (se a\u00f1adi\u00f3 un directorio con el nombre de la nueva secci\u00f3n).<\/p>\n<p><\/p>\n<p>Se cambiaron las propiedades del componente desde el panel de administraci\u00f3n: el c\u00f3digo cambi\u00f3.<\/p>\n<p><\/p>\n<p>Kubernetes no puede trabajar con esto 'por defecto'; los contenedores deben ser inmutables (Stateless).<\/p>\n<p><\/p>\n<p>Raz\u00f3n: cada contenedor (pod) en el cl\u00faster solo procesa una parte del tr\u00e1fico. Si se cambia el c\u00f3digo solo en un contenedor (pod), entonces en diferentes pods el c\u00f3digo ser\u00e1 diferente, el sitio funcionar\u00e1 de manera distinta y a diferentes usuarios se les mostrar\u00e1n diferentes versiones del sitio. As\u00ed no se puede vivir.<\/p>\n<p><\/p>\n<p><strong>Tercero: se debe resolver el problema del despliegue.<\/strong><\/p>\n<p><\/p>\n<p>Si tenemos un monolito y un servidor 'cl\u00e1sico', todo es bastante simple: desplegamos una nueva base de c\u00f3digo, realizamos la migraci\u00f3n de la base de datos y cambiamos el tr\u00e1fico a la nueva versi\u00f3n del c\u00f3digo. El cambio ocurre de manera instant\u00e1nea.<br \/>\nSi nuestro sitio est\u00e1 en Kubernetes, descompuesto en microservicios y hay muchos contenedores con c\u00f3digo, oh. Necesitamos construir contenedores con la nueva versi\u00f3n del c\u00f3digo, desplegarlos en lugar de los antiguos, realizar correctamente la migraci\u00f3n de la base de datos, y en ideal hacerlo de manera invisible para los visitantes. Afortunadamente, Kubernetes nos ayuda en esto, apoyando una variedad de tipos de despliegue.<\/p>\n<p><\/p>\n<p><strong>Cuarto: se debe resolver el problema del almacenamiento de est\u00e1tica.<\/strong><\/p>\n<p><\/p>\n<p>Si su sitio pesa 'solo' 10 gigabytes y lo despliega completamente en contenedores, obtendr\u00e1 contenedores de 10 gigabytes, que se desplegar\u00e1n eternamente.<br \/>\nEs necesario almacenar las partes 'm\u00e1s pesadas' del sitio fuera de los contenedores, y surge la pregunta de c\u00f3mo hacerlo correctamente.<\/p>\n<p><\/p>\n<h4 id=\"chego-net-v-nashem-reshenii\">Lo que no est\u00e1 en nuestra soluci\u00f3n.<\/h4>\n<p><\/p>\n<p>Todo el c\u00f3digo de Bitrix no est\u00e1 dividido en microfunciones\/microservicios (de tal manera que el registro sea separado, el m\u00f3dulo de la tienda en l\u00ednea sea separado, etc.). Almacenamos toda la base de c\u00f3digo en cada contenedor en su totalidad.<\/p>\n<p><\/p>\n<p>La base no se almacena en Kubernetes (aunque he implementado soluciones con la base en Kubernetes para entornos de desarrolladores, pero no para producci\u00f3n).<\/p>\n<p><\/p>\n<p>Los administradores del sitio notar\u00e1n que el sitio est\u00e1 funcionando en Kubernetes. La funci\u00f3n 'verificaci\u00f3n del sistema' no funciona correctamente; para editar el c\u00f3digo del sitio desde el panel de administraci\u00f3n, primero se debe presionar el bot\u00f3n 'quiero editar el c\u00f3digo'.<\/p>\n<p><\/p>\n<p>Hemos resuelto los problemas, tenemos claridad sobre la necesidad de implementar microservicios, el objetivo est\u00e1 claro: crear un sistema funcional para ejecutar aplicaciones en Bitrix en Kubernetes, preservando tanto las capacidades de Bitrix como las ventajas de Kubernetes. Comenzamos la implementaci\u00f3n.<\/p>\n<p><\/p>\n<h4 id=\"arhitektura\">Arquitectura<\/h4>\n<p><\/p>\n<p>Muchos pods 'trabajadores' con servidor web.<br \/>\nUn pod para tareas programadas (debe haber solo uno).<br \/>\nUn pod de actualizaci\u00f3n para editar el c\u00f3digo del sitio desde el panel de administraci\u00f3n (tambi\u00e9n debe haber solo uno).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge en Chelyabinsk y Bitrix en Kubernetes\" src=\"\/wp-content\/uploads\/e26a787c11f78811b15a89f597331ef1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Estamos resolviendo cuestiones:<\/p>\n<p><\/p>\n<ul>\n<li>\u00bfD\u00f3nde almacenar las sesiones?<\/li>\n<li>\u00bfD\u00f3nde almacenar la cach\u00e9?<\/li>\n<li>\u00bfD\u00f3nde almacenar los archivos est\u00e1ticos? No podemos colocar gigabytes de archivos est\u00e1ticos en un mont\u00f3n de contenedores.<\/li>\n<li>\u00bfC\u00f3mo funcionar\u00e1 la base de datos?<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"docker-obraz\">Imagen de Docker<\/h4>\n<p><\/p>\n<p>Comenzamos con la construcci\u00f3n de la imagen de Docker.<\/p>\n<p><\/p>\n<p>La opci\u00f3n ideal es tener una imagen universal, a partir de la cual obtenemos tanto pods de workers como pods con tareas programadas, y pods de actualizaci\u00f3n.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/centosadmin\/bitrixenv\">Hemos creado precisamente esa imagen.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Incluye nginx, apache\/php-fpm (se puede elegir al construir), msmtp para el env\u00edo de correos y cron.<\/p>\n<p><\/p>\n<p>Al construir la imagen, se copia la base de c\u00f3digo completa del sitio en el directorio \/app (excepto aquellas partes que trasladaremos a un almacenamiento compartido separado).<\/p>\n<p><\/p>\n<h4 id=\"mikroservisnost-servisy\">Microservicios, servicios<\/h4>\n<p><\/p>\n<p><strong>Pods de worker:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Contenedor con nginx + contenedor apache\/php-fpm + msmtp<\/li>\n<li>No se pudo trasladar msmtp a un microservicio separado, Bitrix comienza a quejarse de que no puede enviar correos directamente.<\/li>\n<li>En cada contenedor est\u00e1 la base de c\u00f3digo completa.<\/li>\n<li>Prohibici\u00f3n de modificar el c\u00f3digo en los contenedores.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Pod de cron:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Contenedor con apache, php, cron<\/li>\n<li>incluye la base de c\u00f3digo completa<\/li>\n<li>prohibici\u00f3n de modificar el c\u00f3digo en los contenedores<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Pod de actualizaci\u00f3n:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Contenedor con nginx + contenedor apache\/php-fpm + msmtp<\/li>\n<li>no hay prohibici\u00f3n de modificar el c\u00f3digo en los contenedores<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>almacenamiento de sesiones<\/strong><\/p>\n<p><\/p>\n<p><strong>almacenamiento de cach\u00e9 Bitrix<\/strong><\/p>\n<p><\/p>\n<p>Tambi\u00e9n es importante: almacenamos las contrase\u00f1as para la conexi\u00f3n a todo, desde la base de datos hasta el correo, en secretos de kubernetes. Obtenemos un beneficio, las contrase\u00f1as solo son visibles para aquellos a quienes damos acceso a los secretos, no para todos, quienes tienen acceso a la base de c\u00f3digo del proyecto.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-dlya-statiki\">Almacenamiento para archivos est\u00e1ticos<\/h4>\n<p><\/p>\n<p>Se puede usar cualquier cosa: ceph, nfs (pero no recomendamos nfs para producci\u00f3n), almacenamiento en red de proveedores \u00aben la nube\u00bb, etc.<\/p>\n<p><\/p>\n<p>El almacenamiento deber\u00e1 conectarse en los contenedores al directorio \/upload\/ del sitio y otros directorios con archivos est\u00e1ticos.<\/p>\n<p><\/p>\n<h4 id=\"baza-dannyh\">Base de datos<\/h4>\n<p><\/p>\n<p>Para simplificar, recomendamos colocar la base fuera de Kubernetes. Tener la base dentro de Kubernetes es una tarea compleja, complicar\u00e1 el esquema significativamente.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-sessiy\">Almacenamiento de sesiones<\/h4>\n<p><\/p>\n<p>Usamos memcached \ud83d\ude42<\/p>\n<p><\/p>\n<p>Se encarga bien del almacenamiento de sesiones, se puede agrupar y se soporta \"nativamente\" como session.save_path en PHP. Este sistema ha sido implementado muchas veces en la cl\u00e1sica arquitectura monol\u00edtica, cuando constru\u00edamos cl\u00fasteres con un gran n\u00famero de servidores web. Para el despliegue 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 \u2014 aqu\u00ed se definen las configuraciones para el almacenamiento de sesiones en memcached dentro de la imagen<\/p>\n<p><\/p>\n<p>Usamos variables de entorno para pasar datos sobre los hosts de 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 \/>\nEsto permite utilizar el mismo c\u00f3digo en entornos dev, stage, test, prod (los nombres de los hosts de memcached ser\u00e1n diferentes en ellos, por lo que necesitamos pasar un nombre \u00fanico de host para las sesiones en cada entorno).<br \/>\nAlmacenamiento en cach\u00e9 de Bitrix<\/p>\n<p><\/p>\n<p>Necesitamos un almacenamiento tolerante a fallos, al que todos los pods puedan escribir y desde el que puedan leer.<\/p>\n<p><\/p>\n<p>Tambi\u00e9n usamos memcached.<br \/>\nEsta soluci\u00f3n es recomendada por 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 \u2014 aqu\u00ed en Bitrix se establece d\u00f3nde se almacena la cach\u00e9<\/p>\n<p><\/p>\n<p>Tambi\u00e9n usamos variables de entorno.<\/p>\n<p><\/p>\n<h3 id=\"krontaski\">Tareas programadas<\/h3>\n<p><\/p>\n<p>Hay diferentes enfoques para ejecutar tareas programadas en Kubernetes.<\/p>\n<p><\/p>\n<ul>\n<li>despliegue separado con un pod para ejecutar tareas programadas<\/li>\n<li>cronjob para ejecutar tareas programadas (si es una aplicaci\u00f3n web \u2014 con wget <noindex>https:\/\/$host$cronjobname<\/noindex>, o kubectl exec dentro de uno de los pods worker, etc.)<\/li>\n<li>etc.<\/li>\n<\/ul>\n<p><\/p>\n<p>Se puede debatir sobre cu\u00e1l es la opci\u00f3n m\u00e1s correcta, pero en este caso elegimos la opci\u00f3n 'despliegue separado con pods para tareas cron'.<\/p>\n<p><\/p>\n<p>C\u00f3mo se hace:<\/p>\n<p><\/p>\n<ul>\n<li>agregamos las tareas programadas a trav\u00e9s de ConfigMap o mediante el archivo config\/addcron<\/li>\n<li>ejecutamos un contenedor id\u00e9ntico al pod worker en una sola instancia + permitimos la ejecuci\u00f3n de tareas programadas en \u00e9l<\/li>\n<li>se utiliza la misma base de c\u00f3digo, gracias a la unificaci\u00f3n, la compilaci\u00f3n del contenedor es simple<\/li>\n<\/ul>\n<p><\/p>\n<p>Qu\u00e9 beneficios obtenemos:<\/p>\n<p><\/p>\n<ul>\n<li>tenemos tareas programadas funcionando en un entorno id\u00e9ntico al entorno de los desarrolladores (docker)<\/li>\n<li>No es necesario 'reescribir' las tareas cron para Kubernetes, funcionan en la misma forma y en la misma base de c\u00f3digo que antes.<\/li>\n<li>las tareas programadas pueden ser agregadas por todos los miembros del equipo con derechos de commit en la rama de producci\u00f3n, no solo por los administradores<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"modul-southbridge-k8sdeploy-i-redaktirovanie-koda-iz-admin-paneli\">M\u00f3dulo Southbridge K8SDeploy y edici\u00f3n de c\u00f3digo desde el panel de administraci\u00f3n<\/h3>\n<p><\/p>\n<p>\u00bfAcaso no hablamos sobre la actualizaci\u00f3n del pod?<br \/>\n\u00bfY c\u00f3mo dirigir el tr\u00e1fico hacia all\u00ed?<br \/>\n\u00a1Hurra, hemos escrito un m\u00f3dulo para esto en PHP \ud83d\ude42! Es un peque\u00f1o m\u00f3dulo cl\u00e1sico para Bitrix. A\u00fan no est\u00e1 disponible p\u00fablicamente, pero planeamos hacerlo accesible.<br \/>\nEl m\u00f3dulo se instala como un m\u00f3dulo normal en Bitrix:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge en Chelyabinsk y Bitrix en Kubernetes\" src=\"\/wp-content\/uploads\/ba9f895ce645862c7ba003d523cd5656.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y se ve as\u00ed:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge en Chelyabinsk y Bitrix en Kubernetes\" src=\"\/wp-content\/uploads\/916ae9243fae9f6405cc68174ec5bb2b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Permite establecer una cookie que identifica al administrador del sitio y permite que Kubernetes env\u00ede tr\u00e1fico al pod de actualizaci\u00f3n.<\/p>\n<p><\/p>\n<p>Cuando los cambios est\u00e1n completos, hay que presionar git push. Los cambios en el c\u00f3digo se enviar\u00e1n a git, luego el sistema construir\u00e1 la imagen con la nueva versi\u00f3n del c\u00f3digo y la desplegar\u00e1 en el cl\u00faster, reemplazando los pods antiguos.<\/p>\n<p><\/p>\n<p>S\u00ed, un poco torpe, pero al mismo tiempo mantenemos la arquitectura de microservicios y no le quitamos a los usuarios de Bitrix su opci\u00f3n favorita de modificar el c\u00f3digo desde el panel de administraci\u00f3n. Al final, esta es una opci\u00f3n, se puede resolver la tarea de modificaci\u00f3n de c\u00f3digo de otra manera.<\/p>\n<p><\/p>\n<h4 id=\"helm-chart\">Chart de Helm<\/h4>\n<p><\/p>\n<p>Para construir aplicaciones en Kubernetes, generalmente utilizamos el gestor de paquetes Helm.<br \/>\nPara nuestra soluci\u00f3n de Bitrix en Kubernetes, Sergey Bondarev, nuestro administrador de sistemas principal, escribi\u00f3 un chart de Helm espec\u00edfico.<\/p>\n<p><\/p>\n<p>Ejecuta la construcci\u00f3n de pods trabajadores, actualizaciones, pods cron, configura ingresses, servicios y pasa variables de secretos de Kubernetes a los pods.<\/p>\n<p><\/p>\n<p>Almacenamos el c\u00f3digo en Gitlab, y tambi\u00e9n iniciamos la construcci\u00f3n de Helm desde Gitlab.<\/p>\n<p><\/p>\n<p>En resumen, se ve as\u00ed:<\/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>Helm tambi\u00e9n permite realizar un \"rollback\" sin fisuras si algo sale mal durante el despliegue. Es agradable no estar en p\u00e1nico \"arreglando el c\u00f3digo por ftp porque el entorno de producci\u00f3n se cay\u00f3\", sino que Kubernetes lo hace autom\u00e1ticamente, y adem\u00e1s sin tiempo de inactividad.<\/p>\n<p><\/p>\n<h4 id=\"deploy\">Despliegue<\/h4>\n<p><\/p>\n<p>S\u00ed, somos fan\u00e1ticos de Gitlab &amp; Gitlab CI, lo usamos \ud83d\ude42<br \/>\nAl hacer un commit en Gitlab en el repositorio del proyecto, Gitlab inicia un pipeline que despliega una nueva versi\u00f3n del entorno.<\/p>\n<p><\/p>\n<p>Etapas:<\/p>\n<p><\/p>\n<ul>\n<li>build (construimos una nueva imagen de Docker)<\/li>\n<li>test (probamos)<\/li>\n<li>clean up (eliminamos el entorno de prueba)<\/li>\n<li>push (lo enviamos al registro de Docker)<\/li>\n<li>deploy (desplegamos la aplicaci\u00f3n en Kubernetes a trav\u00e9s de Helm).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge en Chelyabinsk y Bitrix en Kubernetes\" src=\"\/wp-content\/uploads\/74e565a0793b90c3cc19b8c7dedaff34.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00a1Hurra, listo, \u00a1implementamos!<br \/>\nO planteamos preguntas, si las hay.<\/p>\n<p><\/p>\n<h2 id=\"itak-chto-my-sdelali\">As\u00ed que, \u00bfqu\u00e9 hicimos?<\/h2>\n<p><\/p>\n<p><strong>Desde un punto de vista t\u00e9cnico:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>dockerizamos Bitrix;<\/li>\n<li>\"cortamos\" Bitrix en contenedores, cada uno realizando funciones m\u00ednimas;<\/li>\n<li>logramos que los contenedores sean stateless;<\/li>\n<li>resolvimos el problema de actualizar Bitrix en Kubernetes;<\/li>\n<li>todas las funciones de Bitrix continuaron funcionando (casi todas);<\/li>\n<li>trabajamos el despliegue en Kubernetes y el rollback entre versiones.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Desde un punto de vista empresarial:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>tolerancia a fallos;<\/li>\n<li>herramientas de Kubernetes (integraci\u00f3n sencilla con Gitlab CI, despliegue sin fisuras, etc);<\/li>\n<li>contrase\u00f1as en secretos (solo visible para aquellos a quienes se les otorg\u00f3 acceso directo a las contrase\u00f1as);<\/li>\n<li>es conveniente crear entornos adicionales (para desarrollo, pruebas, etc.) dentro de una infraestructura \u00fanica.<\/li>\n<\/ul>\n<p>Fuente: <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.2 - 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\/es\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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 en Chelyabinsk y Bitrix en Kubernetes | ProHoster","description":"En Chelyabinsk, se llevan a cabo meetups de administradores de sistemas Sysadminka, y en el \u00faltimo de ellos di una charla sobre nuestra soluci\u00f3n para operar aplicaciones en 1C-Bitrix en Kubernetes. Bitrix, Kubernetes, Ceph \u2014.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/35581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=35581"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/35581\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=35581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=35581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=35581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}