{"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\/fr\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","title":{"rendered":"Southbridge \u00e0 Tcheliabinsk et Bitrix dans Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Des meetups pour les administrateurs syst\u00e8mes, Sysadminka, ont lieu \u00e0 Tcheliabinsk, et lors du dernier, j'ai pr\u00e9sent\u00e9 notre solution pour ex\u00e9cuter des applications sur 1C-Bitrix dans Kubernetes.<\/p>\n<p><\/p>\n<p>Bitrix, Kubernetes, Ceph \u2014 un excellent m\u00e9lange ?<\/p>\n<p><\/p>\n<p>Je vais expliquer comment nous avons assembl\u00e9 une solution fonctionnelle \u00e0 partir de tout cela.<\/p>\n<p><\/p>\n<p>Allons-y !<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge \u00e0 Tcheliabinsk et Bitrix dans 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>Le meetup a eu lieu le 18 avril \u00e0 Tcheliabinsk. Vous pouvez lire sur nos meetups dans <noindex><a rel=\"nofollow\" href=\"https:\/\/sysadminka.timepad.ru\">Timepad<\/a><\/noindex> et les voir sur <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/channel\/UCMblNgU0Gt-TXb9GdVeeinw\/\">YouTube<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Si vous souhaitez venir nous parler ou simplement \u00e9couter \u2014 bienvenue, \u00e9crivez \u00e0 vadim.isakanov@gmail.com et sur Telegram t.me\/vadimisakanov. <\/p>\n<p><\/p>\n<h2 id=\"moy-doklad\">Ma pr\u00e9sentation<\/h2>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=MZqPNMUjr_M\" title=\"Pr\u00e9sentation sur Bitrix dans Kubernetes\"><img decoding=\"async\" alt=\"Southbridge \u00e0 Tcheliabinsk et Bitrix dans 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\">Diapositives<\/a><\/noindex><\/p>\n<p><\/p>\n<h2 id=\"reshenie-bitriks-v-kubernetes-versiya-southbridge-10\">Solution \u00ab Bitrix dans Kubernetes, version Southbridge 1.0 \u00bb<\/h2>\n<p><\/p>\n<p>Je parlerai de notre solution dans un format \u00ab pour les d\u00e9butants en Kubernetes \u00bb, comme cela a \u00e9t\u00e9 fait lors du meetup. Mais je suppose que vous \u00eates au moins familier avec les mots Bitrix, Docker, Kubernetes, Ceph \u00e0 un niveau d'articles sur Wikip\u00e9dia.<\/p>\n<p><\/p>\n<h4 id=\"chto-voobsche-est-gotovogo-pro-bitriks-v-kubernetes\">Qu'est-ce qui existe d\u00e9j\u00e0 sur Bitrix dans Kubernetes ?<\/h4>\n<p><\/p>\n<p>Il y a tr\u00e8s peu d'informations sur le fonctionnement des applications Bitrix dans Kubernetes sur Internet.<br \/>\nJe n'ai trouv\u00e9 que les mat\u00e9riaux suivants :<\/p>\n<p><\/p>\n<p>Pr\u00e9sentation d'Alexandre Serbul, 1C-Bitrix, et 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=\"Lire la vid\u00e9o\" 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>Je recommande de l'\u00e9couter.<\/p>\n<p><\/p>\n<p>D\u00e9veloppement de notre propre solution par un utilisateur <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\/\">sur Habr\u00e9<\/a><\/noindex>.<br \/>\nJ'ai trouv\u00e9 encore <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ESSch\/kubernetes\">cette solution<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Et euh... c'est tout.<\/p>\n<p><\/p>\n<p>Je pr\u00e9viens, nous n'avons pas v\u00e9rifi\u00e9 la qualit\u00e9 des solutions aux liens ci-dessus \ud83d\ude42<br \/>\n\u00c0 propos, lors de la pr\u00e9paration de notre solution, j'ai parl\u00e9 avec Alexandre Serbul, \u00e0 l'\u00e9poque sa pr\u00e9sentation n'\u00e9tait pas encore disponible, donc mes diapositives contiennent le point \u00ab Bitrix n'utilise pas Kubernetes \u00bb.<\/p>\n<p><\/p>\n<p>Mais il y a d\u00e9j\u00e0 beaucoup d'images Docker pr\u00eates \u00e0 l'emploi pour faire fonctionner Bitrix dans 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>Cela suffit-il pour cr\u00e9er une solution compl\u00e8te pour Bitrix dans Kubernetes ?<br \/>\nNon. Il y a de nombreux probl\u00e8mes \u00e0 r\u00e9soudre.<\/p>\n<p><\/p>\n<h4 id=\"v-chem-problemy-s-bitriks-v-kubernetes\">Quels sont les probl\u00e8mes li\u00e9s \u00e0 Bitrix dans Kubernetes ?<\/h4>\n<p><\/p>\n<p><strong>Le premier \u2014 les images pr\u00eates sur Dockerhub ne conviennent pas \u00e0 Kubernetes.<\/strong><\/p>\n<p><\/p>\n<p>Si nous voulons construire une architecture de microservices (ce que nous souhaitons g\u00e9n\u00e9ralement dans Kubernetes), il est n\u00e9cessaire de diviser l'application dans Kubernetes en conteneurs et de s'assurer que chaque conteneur ex\u00e9cute une petite fonction (et le fait bien). Pourquoi seulement une ? En r\u00e9sum\u00e9 \u2014 plus c'est simple, plus c'est fiable.<br \/>\nPour plus de d\u00e9tails \u2014 veuillez consulter cet article et cette vid\u00e9o : <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>Les images Docker sur Dockerhub sont principalement construites selon le principe \u00ab tout-en-un \u00bb, donc nous avons d\u00fb cr\u00e9er notre propre solution et m\u00eame construire des images \u00e0 partir de z\u00e9ro.<\/p>\n<p><\/p>\n<p><strong>Deuxi\u00e8me \u2014 le code du site est modifi\u00e9 depuis le panneau d'administration.<\/strong><\/p>\n<p><\/p>\n<p>Nous avons cr\u00e9\u00e9 une nouvelle section sur le site - le code a \u00e9t\u00e9 mis \u00e0 jour (un r\u00e9pertoire avec le nom de la nouvelle section a \u00e9t\u00e9 ajout\u00e9).<\/p>\n<p><\/p>\n<p>Les propri\u00e9t\u00e9s du composant ont \u00e9t\u00e9 modifi\u00e9es depuis le panneau d'administration - le code a chang\u00e9.<\/p>\n<p><\/p>\n<p>Kubernetes ne sait pas travailler avec cela par d\u00e9faut, les conteneurs doivent \u00eatre immuables (Stateless).<\/p>\n<p><\/p>\n<p>La raison : chaque conteneur (pod) dans le cluster traite seulement une partie du trafic. Si vous modifiez le code dans un seul conteneur (pod), alors le code sera diff\u00e9rent dans les diff\u00e9rents pods, le site fonctionnera de mani\u00e8re vari\u00e9e, et diff\u00e9rents utilisateurs verront diff\u00e9rentes versions du site. Ce n'est pas viable.<\/p>\n<p><\/p>\n<p><strong>Troisi\u00e8me \u00e9tape : il faut r\u00e9soudre la question du d\u00e9ploiement.<\/strong><\/p>\n<p><\/p>\n<p>Si nous avons un monolithe et un serveur \u00ab classique \u00bb, tout est assez simple : nous d\u00e9ployons la nouvelle base de code, effectuons la migration de la base de donn\u00e9es, et redirigeons le trafic vers la nouvelle version du code. Le basculement se produit instantan\u00e9ment.<br \/>\nSi nous avons un site sur Kubernetes, d\u00e9coup\u00e9 en microservices, avec de nombreux conteneurs de code - cela devient complexe. Il faut construire des conteneurs avec la nouvelle version du code, les d\u00e9ployer \u00e0 la place des anciens, effectuer correctement la migration de la base de donn\u00e9es, et id\u00e9alement le faire de mani\u00e8re invisible pour les visiteurs. Heureusement, Kubernetes nous aide en supportant toute une vari\u00e9t\u00e9 de types de d\u00e9ploiement.<\/p>\n<p><\/p>\n<p><strong>Quatri\u00e8me \u00e9tape : il faut r\u00e9soudre la question du stockage des fichiers statiques.<\/strong><\/p>\n<p><\/p>\n<p>Si votre site p\u00e8se \u00ab seulement \u00bb 10 gigaoctets et que vous le d\u00e9ployez enti\u00e8rement dans des conteneurs, vous obtiendrez des conteneurs pesant 10 gigaoctets qui seront d\u00e9ploy\u00e9s ind\u00e9finiment.<br \/>\nIl est n\u00e9cessaire de stocker les parties les plus \u00ab lourdes \u00bb du site en dehors des conteneurs, et se pose la question de la mani\u00e8re de le faire correctement.<\/p>\n<p><\/p>\n<h4 id=\"chego-net-v-nashem-reshenii\">Ce qui manque dans notre solution.<\/h4>\n<p><\/p>\n<p>Tout le code de Bitrix n'est pas d\u00e9coup\u00e9 en micro-fonctions \/ microservices (par exemple, l'inscription s\u00e9par\u00e9ment, le module de boutique en ligne s\u00e9par\u00e9ment, etc.). Nous stockons l'int\u00e9gralit\u00e9 de la base de code dans chaque conteneur.<\/p>\n<p><\/p>\n<p>Nous ne stockons pas la base de donn\u00e9es dans Kubernetes (j'ai cependant r\u00e9alis\u00e9 des solutions avec une base de donn\u00e9es dans Kubernetes pour des environnements de d\u00e9veloppeurs, mais pas pour la production).<\/p>\n<p><\/p>\n<p>Les administrateurs du site verront tout de m\u00eame que le site fonctionne sur Kubernetes. La fonction \u00ab v\u00e9rification du syst\u00e8me \u00bb ne fonctionne pas correctement, pour modifier le code du site depuis le panneau d'administration, il faut d'abord cliquer sur le bouton \u00ab je veux modifier le code \u00bb.<\/p>\n<p><\/p>\n<p>Nous avons identifi\u00e9 les probl\u00e8mes, et clarifi\u00e9 la n\u00e9cessit\u00e9 de r\u00e9aliser une microservices architecture ; l'objectif est clair : obtenir un syst\u00e8me fonctionnel pour faire tourner des applications sur Bitrix dans Kubernetes, tout en conservant les capacit\u00e9s de Bitrix et les avantages de Kubernetes. Nous commen\u00e7ons la mise en \u0153uvre.<\/p>\n<p><\/p>\n<h4 id=\"arhitektura\">Architecture<\/h4>\n<p><\/p>\n<p>De nombreux \u00ab pods de travail \u00bb avec un serveur web (workers).<br \/>\nUn pod avec des t\u00e2ches cron (obligatoirement un seul).<br \/>\nUn pod de mise \u00e0 niveau pour modifier le code du site depuis le panneau d'administration (\u00e9galement obligatoirement un seul).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge \u00e0 Tcheliabinsk et Bitrix dans Kubernetes\" src=\"\/wp-content\/uploads\/e26a787c11f78811b15a89f597331ef1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous r\u00e9solvons les questions :<\/p>\n<p><\/p>\n<ul>\n<li>O\u00f9 stocker les sessions ?<\/li>\n<li>O\u00f9 stocker le cache ?<\/li>\n<li>O\u00f9 stocker les fichiers statiques, il n'est pas question de placer des gigaoctets de fichiers statiques dans une multitude de conteneurs ?<\/li>\n<li>Comment fonctionnera la base de donn\u00e9es ?<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"docker-obraz\">Image Docker<\/h4>\n<p><\/p>\n<p>Nous commen\u00e7ons par la construction de l'image Docker.<\/p>\n<p><\/p>\n<p>L'option id\u00e9ale est d'avoir une unique image universelle, \u00e0 partir de laquelle nous obtenons les pods workers, les pods avec t\u00e2ches cron, et les pods de mise \u00e0 niveau.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/centosadmin\/bitrixenv\">Nous avons cr\u00e9\u00e9 une telle image.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Elle inclut nginx, apache\/php-fpm (choisissable lors de la construction), msmtp pour l'envoi d'e-mails, et cron.<\/p>\n<p><\/p>\n<p>Lors de la construction de l'image, l'int\u00e9gralit\u00e9 de la base de code du site est copi\u00e9e dans le r\u00e9pertoire \/app (sauf les parties que nous d\u00e9placerons dans un stockage partag\u00e9 s\u00e9par\u00e9).<\/p>\n<p><\/p>\n<h4 id=\"mikroservisnost-servisy\">Microservices, services<\/h4>\n<p><\/p>\n<p><strong>Pods workers :<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Conteneur avec nginx + conteneur apache\/php-fpm + msmtp<\/li>\n<li>msmtp n'a pas pu \u00eatre s\u00e9par\u00e9 en un microservice distinct, Bitrix commence \u00e0 s'agiter car il ne peut pas envoyer des e-mails directement.<\/li>\n<li>Chaque conteneur contient l'int\u00e9gralit\u00e9 de la base de code.<\/li>\n<li>Interdiction de modifier le code dans les conteneurs.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Pod cron :<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Conteneur avec apache, php, cron<\/li>\n<li>Contient l'int\u00e9gralit\u00e9 de la base de code<\/li>\n<li>Interdiction de modifier le code dans les conteneurs<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Pod de mise \u00e0 niveau :<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Conteneur avec nginx + conteneur apache\/php-fpm + msmtp<\/li>\n<li>Pas d'interdiction de modifier le code dans les conteneurs<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Stockage des sessions<\/strong><\/p>\n<p><\/p>\n<p><strong>Stockage du cache Bitrix<\/strong><\/p>\n<p><\/p>\n<p>Encore important : les mots de passe pour se connecter \u00e0 tout, de la base de donn\u00e9es jusqu'\u00e0 l'email, sont stock\u00e9s dans les secrets Kubernetes. Nous b\u00e9n\u00e9ficions d'un avantage : seulement ceux \u00e0 qui nous donnons acc\u00e8s aux secrets peuvent voir les mots de passe, et non tous ceux qui ont acc\u00e8s \u00e0 la base de code du projet.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-dlya-statiki\">Stockage pour les fichiers statiques<\/h4>\n<p><\/p>\n<p>On peut utiliser n'importe quoi : ceph, nfs (mais nous ne recommandons pas nfs pour la production), stockage r\u00e9seau de fournisseurs \u2018cloud\u2019, etc.<\/p>\n<p><\/p>\n<p>Le stockage doit \u00eatre mont\u00e9 dans les conteneurs dans le r\u00e9pertoire \/upload\/ du site et d'autres r\u00e9pertoires contenant des fichiers statiques.<\/p>\n<p><\/p>\n<h4 id=\"baza-dannyh\">Base de donn\u00e9es<\/h4>\n<p><\/p>\n<p>Pour simplifier, nous recommandons de d\u00e9placer la base de donn\u00e9es en dehors de Kubernetes. Avoir une base de donn\u00e9es dans Kubernetes est une t\u00e2che complexe, elle rendra l'architecture beaucoup plus compliqu\u00e9e.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-sessiy\">Stockage des sessions<\/h4>\n<p><\/p>\n<p>Nous utilisons memcached \ud83d\ude42<\/p>\n<p><\/p>\n<p>Il g\u00e8re bien le stockage des sessions, se clusterise, et est pris en charge \u00abnativement\u00bb comme session.save_path dans php. Ce syst\u00e8me a \u00e9t\u00e9 \u00e9prouv\u00e9 \u00e0 plusieurs reprises dans l'architecture monolithique classique, lorsque nous construisions des clusters avec un grand nombre de serveurs web. Pour le d\u00e9ploiement, nous utilisons 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 ici, dans l'image, les param\u00e8tres pour le stockage des sessions dans memcached sont d\u00e9finis<\/p>\n<p><\/p>\n<p>Nous avons utilis\u00e9 des variables d'environnement pour transmettre les donn\u00e9es des h\u00f4tes avec 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 \/>\nCela permet d'utiliser le m\u00eame code dans les environnements dev, stage, test, prod (les noms des h\u00f4tes memcached y seront diff\u00e9rents, donc pour chaque environnement, nous devons transmettre un nom d'h\u00f4te unique pour les sessions).<br \/>\nStockage du cache Bitrix<\/p>\n<p><\/p>\n<p>Nous avons besoin d'un stockage r\u00e9silient, dans lequel tous les pods pourraient \u00e9crire et \u00e0 partir duquel ils pourraient lire.<\/p>\n<p><\/p>\n<p>Nous utilisons \u00e9galement memcached.<br \/>\nCette solution est recommand\u00e9e par Bitrix lui-m\u00eame.<\/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 ici, dans Bitrix, nous d\u00e9finissons o\u00f9 notre cache est stock\u00e9<\/p>\n<p><\/p>\n<p>Nous utilisons \u00e9galement des variables d'environnement.<\/p>\n<p><\/p>\n<h3 id=\"krontaski\">Les cronjobs<\/h3>\n<p><\/p>\n<p>Il existe plusieurs approches pour ex\u00e9cuter des cronjobs dans Kubernetes.<\/p>\n<p><\/p>\n<ul>\n<li>un d\u00e9ploiement s\u00e9par\u00e9 avec un pod pour l'ex\u00e9cution des cronjobs<\/li>\n<li>cronjob pour ex\u00e9cuter des cronjobs (si c'est une application web \u2014 avec wget <noindex>https:\/\/$host$cronjobname<\/noindex>, ou kubectl exec \u00e0 l'int\u00e9rieur d'un des pods de travail, etc.)<\/li>\n<li>etc.<\/li>\n<\/ul>\n<p><\/p>\n<p>On peut discuter du choix le plus appropri\u00e9, mais dans ce cas, nous avons opt\u00e9 pour l'option \u00ab d\u00e9ploiement s\u00e9par\u00e9 avec des pods pour les cronjobs \u00bb.<\/p>\n<p><\/p>\n<p>Comment cela est fait :<\/p>\n<p><\/p>\n<ul>\n<li>nous ajoutons les cron-t\u00e2ches via ConfigMap ou via le fichier config\/addcron<\/li>\n<li>nous ex\u00e9cutons un conteneur identique au pod de travail + autorisons l'ex\u00e9cution des cron-t\u00e2ches en son sein<\/li>\n<li>la m\u00eame base de code est utilis\u00e9e, gr\u00e2ce \u00e0 l'unification le processus de construction du conteneur est simple<\/li>\n<\/ul>\n<p><\/p>\n<p>Ce que nous obtenons de bon :<\/p>\n<p><\/p>\n<ul>\n<li>nous avons des cron-t\u00e2ches fonctionnant dans un environnement identique \u00e0 celui des d\u00e9veloppeurs (docker)<\/li>\n<li>Les cronjobs n'ont pas besoin d'\u00eatre \u00ab r\u00e9\u00e9crits \u00bb pour Kubernetes, ils fonctionnent de la m\u00eame mani\u00e8re et avec la m\u00eame base de code qu'auparavant.<\/li>\n<li>tous les membres de l'\u00e9quipe ayant des droits de commit dans la branche de production peuvent ajouter des cron-t\u00e2ches, pas seulement les administrateurs<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"modul-southbridge-k8sdeploy-i-redaktirovanie-koda-iz-admin-paneli\">Le module Southbridge K8SDeploy et l'\u00e9dition du code depuis le panneau d'administration<\/h3>\n<p><\/p>\n<p>Nous parions sur l'upgrade des pods ?<br \/>\nComment diriger le trafic l\u00e0-bas ?<br \/>\nYoupi, nous avons \u00e9crit un module pour cela en php \ud83d\ude42 C'est un petit module classique pour Bitrix. Il n'est pas encore disponible publiquement, mais nous pr\u00e9voyons de le rendre accessible.<br \/>\nLe module s'installe comme un module classique dans Bitrix :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge \u00e0 Tcheliabinsk et Bitrix dans Kubernetes\" src=\"\/wp-content\/uploads\/ba9f895ce645862c7ba003d523cd5656.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et il ressemble \u00e0 ceci :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge \u00e0 Tcheliabinsk et Bitrix dans Kubernetes\" src=\"\/wp-content\/uploads\/916ae9243fae9f6405cc68174ec5bb2b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il permet de d\u00e9finir un cookie qui identifie l'administrateur du site et permet \u00e0 Kubernetes d'envoyer le trafic vers le pod de mise \u00e0 niveau.<\/p>\n<p><\/p>\n<p>Une fois les modifications termin\u00e9es, il faut appuyer sur git push, les modifications du code seront envoy\u00e9es dans git, puis le syst\u00e8me g\u00e9n\u00e9rera une image avec la nouvelle version du code et la \u00ab d\u00e9ploiera \u00bb dans le cluster, rempla\u00e7ant les anciens pods.<\/p>\n<p><\/p>\n<p>Oui, c'est un peu bricol\u00e9, mais cela nous permet de conserver l'architecture microservices et de ne pas retirer aux utilisateurs de Bitrix leur fonctionnalit\u00e9 pr\u00e9f\u00e9r\u00e9e de modification du code depuis l'interface d'administration. Apr\u00e8s tout, c'est une option, la t\u00e2che de modification du code peut \u00eatre r\u00e9solue diff\u00e9remment.<\/p>\n<p><\/p>\n<h4 id=\"helm-chart\">Chart Helm<\/h4>\n<p><\/p>\n<p>Pour assembler des applications dans Kubernetes, nous utilisons g\u00e9n\u00e9ralement le gestionnaire de paquets Helm.<br \/>\nPour notre solution Bitrix dans Kubernetes, Sergey Bondarev, notre administrateur syst\u00e8me principal, a \u00e9crit un chart Helm sp\u00e9cial.<\/p>\n<p><\/p>\n<p>Il effectue la construction des workers, la mise \u00e0 niveau, les pods cron, configure les ingress, les services, et transmet les variables des secrets Kubernetes aux pods.<\/p>\n<p><\/p>\n<p>Nous stockons le code dans Gitlab, et nous lan\u00e7ons \u00e9galement l'assemblage Helm depuis Gitlab.<\/p>\n<p><\/p>\n<p>En bref, cela ressemble \u00e0 ceci<\/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 permet \u00e9galement de faire un retour \u00ab sans couture \u00bb, si quelque chose ne va pas lors du d\u00e9ploiement. C'est agr\u00e9able de voir que Kubernetes le fait automatiquement, sans temps d'arr\u00eat, plut\u00f4t que vous soyez en panique \u00e0 \u00ab r\u00e9parer le code par FTP parce que la production est tomb\u00e9e \u00bb.<\/p>\n<p><\/p>\n<h4 id=\"deploy\">D\u00e9ployer<\/h4>\n<p><\/p>\n<p>Oui, nous sommes fans de Gitlab &amp; Gitlab CI, nous l'utilisons \ud83d\ude42<br \/>\nLors d'un commit dans Gitlab dans le r\u00e9pertoire du projet, Gitlab lance un pipeline qui d\u00e9ploie la nouvelle version de l'environnement.<\/p>\n<p><\/p>\n<p>\u00c9tapes :<\/p>\n<p><\/p>\n<ul>\n<li>build (assemblons une nouvelle image Docker)<\/li>\n<li>test (testons)<\/li>\n<li>clean up (supprimons l'environnement de test)<\/li>\n<li>push (envoyons-le dans le registre Docker)<\/li>\n<li>deploy (d\u00e9ployons l'application dans Kubernetes via Helm).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge \u00e0 Tcheliabinsk et Bitrix dans Kubernetes\" src=\"\/wp-content\/uploads\/74e565a0793b90c3cc19b8c7dedaff34.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hourra, c'est pr\u00eat, nous d\u00e9ployons !<br \/>\nOu nous posons des questions, s'il y en a.<\/p>\n<p><\/p>\n<h2 id=\"itak-chto-my-sdelali\">Alors, qu'avons-nous fait<\/h2>\n<p><\/p>\n<p><strong>D'un point de vue technique :<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>nous avons dockeris\u00e9 Bitrix;<\/li>\n<li>nous avons \u00ab d\u00e9coup\u00e9 \u00bb Bitrix en conteneurs, chacun remplissant un minimum de fonctions;<\/li>\n<li>nous avons atteint un \u00e9tat sans \u00e9tat des conteneurs;<\/li>\n<li>nous avons r\u00e9solu le probl\u00e8me de mise \u00e0 jour de Bitrix dans Kubernetes;<\/li>\n<li>toutes les fonctionnalit\u00e9s de Bitrix ont continu\u00e9 \u00e0 fonctionner (presque toutes);<\/li>\n<li>nous avons bien g\u00e9r\u00e9 le d\u00e9ploiement dans Kubernetes et le retour entre les versions.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>D'un point de vue commercial :<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>haute disponibilit\u00e9;<\/li>\n<li>outils Kubernetes (int\u00e9gration simple avec Gitlab CI, d\u00e9ploiement sans couture, etc);<\/li>\n<li>mots de passe dans des secrets (visibles uniquement pour ceux \u00e0 qui l'acc\u00e8s aux mots de passe est directement accord\u00e9);<\/li>\n<li>Il est pratique de cr\u00e9er des environnements suppl\u00e9mentaires (pour le d\u00e9veloppement, les tests, etc.) au sein d'une seule infrastructure.<\/li>\n<\/ul>\n<p>Source : <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\/fr\/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=\"fr_FR\" \/>\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\/fr\/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 \u00e0 Tcheliabinsk et Bitrix dans Kubernetes | ProHoster","description":"Des meetups pour les administrateurs syst\u00e8me, Sysadminka, se tiennent \u00e0 Tcheliabinsk, et lors du dernier, j'ai pr\u00e9sent\u00e9 notre solution pour faire fonctionner des applications sur 1C-Bitrix dans Kubernetes. Bitrix, Kubernetes, Ceph \u2014.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/35581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=35581"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/35581\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=35581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=35581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=35581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}