{"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\/it\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","title":{"rendered":"Southbridge a Chelyabinsk e Bitrix in Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>A Chelyabinsk si tengono i meet-up degli amministratori di sistema Sysadminka, e nell'ultimo di essi ho tenuto una relazione sulla nostra soluzione per far funzionare le applicazioni su 1C-Bitrix in Kubernetes.<\/p>\n<p><\/p>\n<p>Bitrix, Kubernetes, Ceph: una miscela eccellente?<\/p>\n<p><\/p>\n<p>Vi racconter\u00f2 come abbiamo raccolto tutto questo in una soluzione funzionante.<\/p>\n<p><\/p>\n<p>Andiamo!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge a Chelyabinsk e Bitrix in 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>Il meet-up si \u00e8 svolto il 18 aprile a Chelyabinsk. Potete leggere dei nostri meet-up su <noindex><a rel=\"nofollow\" href=\"https:\/\/sysadminka.timepad.ru\">Timepad<\/a><\/noindex> e guardarli su <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/channel\/UCMblNgU0Gt-TXb9GdVeeinw\/\">YouTube<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Se volete venire da noi con una presentazione o come ascoltatore \u2014 siete i benvenuti, scrivete a vadim.isakanov@gmail.com e su Telegram t.me\/vadimisakanov. <\/p>\n<p><\/p>\n<h2 id=\"moy-doklad\">La mia relazione<\/h2>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=MZqPNMUjr_M\" title=\"Relazione su Bitrix in Kubernetes\"><img decoding=\"async\" alt=\"Southbridge a Chelyabinsk e Bitrix in 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\">Diapositive<\/a><\/noindex><\/p>\n<p><\/p>\n<h2 id=\"reshenie-bitriks-v-kubernetes-versiya-southbridge-10\">Soluzione 'Bitrix in Kubernetes, versione Southbridge 1.0'<\/h2>\n<p><\/p>\n<p>Parler\u00f2 della nostra soluzione in un formato 'per principianti in Kubernetes', come \u00e8 stato presentato nel meet-up. Ma presumo che conoscete gi\u00e0 i termini Bitrix, Docker, Kubernetes e Ceph, almeno a livello di articoli su Wikipedia.<\/p>\n<p><\/p>\n<h4 id=\"chto-voobsche-est-gotovogo-pro-bitriks-v-kubernetes\">Cosa c'\u00e8 di gi\u00e0 pronto per Bitrix in Kubernetes?<\/h4>\n<p><\/p>\n<p>Su tutta Internet ci sono pochissime informazioni sul funzionamento delle applicazioni su Bitrix in Kubernetes.<br \/>\nHo trovato solo questi materiali:<\/p>\n<p><\/p>\n<p>Relazione di Aleksandr Serbul, 1C-Bitrix, e Anton Tuzlukov di 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=\"Guarda il 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>Ve lo consiglio.<\/p>\n<p><\/p>\n<p>Sviluppo di una propria soluzione dal punto di vista dell'utente <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\/\">In questo settore sono giunti anche i sistemi di intelligenza artificiale. Algoritmi intelligenti prevedono i guasti dei server analizzando il loro 'comportamento'. Ad esempio, l'azienda Litbit<\/a><\/noindex>.<br \/>\nHo trovato anche <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ESSch\/kubernetes\">questa soluzione<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>E insomma, tutto qui.<\/p>\n<p><\/p>\n<p>Avviso che non abbiamo verificato la qualit\u00e0 delle soluzioni nei link sopra \ud83d\ude42<br \/>\nA proposito, durante la preparazione della nostra soluzione ho parlato con Aleksandr Serbul, e all'epoca la sua relazione non era ancora disponibile, quindi nelle mie slide c'\u00e8 un punto 'Bitrix non utilizza Kubernetes'.<\/p>\n<p><\/p>\n<p>Tuttavia, esistono gi\u00e0 molti immagini Docker pronte per utilizzare Bitrix in 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>\u00c8 sufficiente questo per creare una soluzione completa per Bitrix in Kubernetes?<br \/>\nNo. Ci sono molti problemi da risolvere.<\/p>\n<p><\/p>\n<h4 id=\"v-chem-problemy-s-bitriks-v-kubernetes\">Quali sono i problemi con Bitrix in Kubernetes?<\/h4>\n<p><\/p>\n<p><strong>Il primo: le immagini pronte da Dockerhub non sono adatte per Kubernetes.<\/strong><\/p>\n<p><\/p>\n<p>Se vogliamo costruire un'architettura a microservizi (e in Kubernetes di solito vogliamo farlo), l'applicazione in Kubernetes deve essere divisa in contenitori, e bisogna garantirsi che ogni contenitore svolga una piccola funzione (e la faccia bene). Perch\u00e9 solo una? In breve, pi\u00f9 \u00e8 semplice, pi\u00f9 \u00e8 affidabile.<br \/>\nSe volete approfondire, per favore guardate questo articolo e 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>Le immagini Docker su Dockerhub sono principalmente costruite secondo il principio 'tutto in uno', quindi abbiamo dovuto comunque inventare la nostra bicicletta e persino creare le immagini da zero.<\/p>\n<p><\/p>\n<p><strong>Il secondo: il codice del sito viene modificato dalla dashboard di amministrazione.<\/strong><\/p>\n<p><\/p>\n<p>Abbiamo creato una nuova sezione sul sito: il codice \u00e8 stato aggiornato (\u00e8 stata aggiunta una directory con il nome della nuova sezione).<\/p>\n<p><\/p>\n<p>Abbiamo modificato le propriet\u00e0 del componente dal pannello di amministrazione: il codice \u00e8 cambiato.<\/p>\n<p><\/p>\n<p>Kubernetes \u00abdi default\u00bb non sa lavorare cos\u00ec, i contenitori devono essere immutabili (Stateless).<\/p>\n<p><\/p>\n<p>Motivo: ogni contenitore (pod) nel cluster gestisce solo una parte del traffico. Se si modifica il codice solo in un contenitore (pod), il codice sar\u00e0 diverso in diversi pod, il sito funzioner\u00e0 in modo diverso, diversi utenti vedranno diverse versioni del sito. Non si pu\u00f2 vivere cos\u00ec.<\/p>\n<p><\/p>\n<p><strong>Terzo: bisogna risolvere la questione del deployment.<\/strong><\/p>\n<p><\/p>\n<p>Se abbiamo un monolite e un server \u00abclassico\u00bb, \u00e8 tutto molto semplice: implementiamo una nuova base di codice, eseguiamo la migrazione del DB, dirottiamo il traffico sulla nuova versione del codice. Il passaggio avviene istantaneamente.<br \/>\nSe il nostro sito \u00e8 in Kubernetes, suddiviso in microservizi, i contenitori con il codice sono molti: oh. Bisogna assemblare i contenitori con la nuova versione del codice, deployarli al posto dei precedenti, eseguire correttamente la migrazione del DB, e idealmente farlo in modo invisibile per i visitatori. Per fortuna, in questo Kubernetes ci aiuta, supportando una moltitudine di diversi tipi di deployment.<\/p>\n<p><\/p>\n<p><strong>Quarto: bisogna risolvere la questione dell'archiviazione della staticit\u00e0.<\/strong><\/p>\n<p><\/p>\n<p>Se il tuo sito pesa \u00absolo\u00bb 10 gigabyte e decidi di deployarlo completamente in contenitori, otterrai contenitori dal peso di 10 gigabyte, che verranno deployati per un'eternit\u00e0.<br \/>\n\u00c8 necessario conservare le parti \u00abpi\u00f9 pesanti\u00bb del sito al di fuori dei contenitori, e sorge la questione di come farlo correttamente.<\/p>\n<p><\/p>\n<h4 id=\"chego-net-v-nashem-reshenii\">Cosa non \u00e8 presente nella nostra soluzione.<\/h4>\n<p><\/p>\n<p>Tutto il codice di Bitrix non \u00e8 suddiviso in microfunzioni\/microservizi (in modo tale che la registrazione sia separata, il modulo del negozio online separato, ecc.). Conserviamo l'intera base di codice in ciascun contenitore.<\/p>\n<p><\/p>\n<p>Non archiviamo il database in Kubernetes (anche se ho implementato soluzioni con il database in Kubernetes per gli ambienti di sviluppo, ma non per la produzione).<\/p>\n<p><\/p>\n<p>Gli amministratori del sito noteranno che il sito funziona in Kubernetes. La funzione \u00abverifica sistema\u00bb non funziona correttamente, per modificare il codice del sito dal pannello di amministrazione \u00e8 necessario prima cliccare sul pulsante \u00abvoglio modificare il codice\u00bb.<\/p>\n<p><\/p>\n<p>Abbiamo identificato i problemi e la necessit\u00e0 di implementare la microservizi. L'obiettivo \u00e8 chiaro: creare un sistema operativo per le applicazioni su Bitrix in Kubernetes, mantenendo sia le funzionalit\u00e0 di Bitrix che i vantaggi di Kubernetes. Iniziamo l'implementazione.<\/p>\n<p><\/p>\n<h4 id=\"arhitektura\">Architettura<\/h4>\n<p><\/p>\n<p>Molti \"worker\" pod con server web.<br \/>\nUn pod con attivit\u00e0 cron (obbligatorio solo uno).<br \/>\nUn pod di aggiornamento per modificare il codice del sito dalla dashboard (anche questo soltanto uno \u00e8 obbligatorio).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge a Chelyabinsk e Bitrix in Kubernetes\" src=\"\/wp-content\/uploads\/e26a787c11f78811b15a89f597331ef1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Affrontiamo le seguenti questioni:<\/p>\n<p><\/p>\n<ul>\n<li>Dove memorizzare le sessioni?<\/li>\n<li>Dove memorizzare la cache?<\/li>\n<li>Dove memorizzare la statica, non possiamo mettere gigabyte di statica in una moltitudine di contenitori?<\/li>\n<li>Come funzioner\u00e0 il database?<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"docker-obraz\">Immagine Docker<\/h4>\n<p><\/p>\n<p>Iniziamo costruendo l'immagine Docker.<\/p>\n<p><\/p>\n<p>L'opzione ideale \u00e8 avere un'unica immagine universale, sulla quale otteniamo sia i pod worker, sia i pod con cron job, sia i pod di aggiornamento.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/centosadmin\/bitrixenv\">Abbiamo realizzato proprio un'immagine del genere.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Include nginx, apache\/php-fpm (puoi scegliere durante la costruzione), msmtp per l'invio di email e cron.<\/p>\n<p><\/p>\n<p>Durante la costruzione dell'immagine, l'intera base di codice del sito viene copiata nella directory \/app (eccezion fatta per le parti che sposteremo in uno storage condiviso separato).<\/p>\n<p><\/p>\n<h4 id=\"mikroservisnost-servisy\">Microservizi, servizi<\/h4>\n<p><\/p>\n<p><strong>Pod worker:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Contenitore con nginx + contenitore apache\/php-fpm + msmtp<\/li>\n<li>Non siamo riusciti a separare msmtp in un microservizio differente, Bitrix inizia a lamentarsi perch\u00e9 non riesce a inviare email direttamente.<\/li>\n<li>In ogni contenitore c'\u00e8 l'intera base di codice.<\/li>\n<li>Divieto di modificare il codice nei contenitori.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Pod cron:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Contenitore con apache, php, cron<\/li>\n<li>Include l'intera base di codice<\/li>\n<li>Divieto di modificare il codice nei contenitori<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Pod di aggiornamento:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Contenitore con nginx + contenitore apache\/php-fpm + msmtp<\/li>\n<li>Non ci sono divieti di modifica del codice nei contenitori<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Storage delle sessioni<\/strong><\/p>\n<p><\/p>\n<p><strong>Storage della cache di Bitrix<\/strong><\/p>\n<p><\/p>\n<p>\u00c8 importante: le password per l'accesso a tutto, dal database alla posta, vengono memorizzate nei segreti di Kubernetes. Otteniamo un vantaggio: le password sono visibili solo a coloro ai quali diamo accesso ai segreti, e non a tutti quelli che hanno accesso alla base di codice del progetto.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-dlya-statiki\">Storage per la statica<\/h4>\n<p><\/p>\n<p>\u00c8 possibile utilizzare qualsiasi cosa: ceph, nfs (ma non raccomandiamo nfs per la produzione), storage di rete da fornitori 'cloud', ecc.<\/p>\n<p><\/p>\n<p>Lo storage dovr\u00e0 essere connesso nei contenitori nella directory \/upload\/ del sito e in altre directory con la statica.<\/p>\n<p><\/p>\n<h4 id=\"baza-dannyh\">Qui la scelta \u00e8 stata molto pi\u00f9 semplice, Simple SCADA offre due prodotti da utilizzare: MS SQL Server e MySQL. Il secondo mi \u00e8 sembrato pi\u00f9 vicino, poich\u00e9 avevo gi\u00e0 lavorato con esso, quindi mi sono fermato l\u00ec.<\/h4>\n<p><\/p>\n<p>Per semplificare, raccomandiamo di estrarre il database al di fuori di Kubernetes. Un database in Kubernetes \u00e8 un compito complesso e rende lo schema molto pi\u00f9 difficile.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-sessiy\">Storage delle sessioni<\/h4>\n<p><\/p>\n<p>Utilizziamo memcached \ud83d\ude42<\/p>\n<p><\/p>\n<p>Gestisce bene la memorizzazione delle sessioni, si clusterizza e viene supportato \"nativamente\" come session.save_path in php. Questo sistema \u00e8 stato ben collaudato nella classica architettura monolitica, quando costruivamo cluster con un gran numero di server web. Per il deploy utilizziamo 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 qui nell'immagine sono impostate le configurazioni per la memorizzazione delle sessioni in memcached<\/p>\n<p><\/p>\n<p>Abbiamo utilizzato le Environment Variables per trasmettere i dati sugli host di 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 \/>\nQuesto consente di utilizzare lo stesso codice negli ambienti dev, stage, test, prod (i nomi degli host di memcached in essi saranno diversi, quindi per ogni ambiente dobbiamo fornire un nome host unico per le sessioni).<br \/>\nCache store di Bitrix<\/p>\n<p><\/p>\n<p>Abbiamo bisogno di uno storage resiliente in cui tutti i pod possano scrivere e da cui possano leggere.<\/p>\n<p><\/p>\n<p>Utilizziamo anche memcached.<br \/>\nQuesta soluzione \u00e8 raccomandata da Bitrix stesso.<\/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 qui in Bitrix viene specificato dove abbiamo la cache<\/p>\n<p><\/p>\n<p>Utilizziamo anche le Environment Variables.<\/p>\n<p><\/p>\n<h3 id=\"krontaski\">Cron jobs<\/h3>\n<p><\/p>\n<p>Ci sono vari approcci all'esecuzione di cron jobs in Kubernetes.<\/p>\n<p><\/p>\n<ul>\n<li>un deployment separato con un pod per l'esecuzione dei cron jobs<\/li>\n<li>cronjob per eseguire i cron jobs (se \u00e8 un'app web \u2014 con wget <noindex>https:\/\/$host$cronjobname<\/noindex>, o kubectl exec all'interno di uno dei pod worker, ecc.)<\/li>\n<li>ecc.<\/li>\n<\/ul>\n<p><\/p>\n<p>Si pu\u00f2 discutere su quale sia la scelta migliore, ma in questo caso abbiamo scelto l'opzione \"deploy separato con pod per i cronjob\".<\/p>\n<p><\/p>\n<p>Come \u00e8 stato fatto:<\/p>\n<p><\/p>\n<ul>\n<li>aggiungiamo i cron jobs tramite ConfigMap oppure attraverso il file config\/addcron<\/li>\n<li>in un'istanza eseguiamo il container, identico al pod worker + consentiamo l'esecuzione dei cron jobs in esso<\/li>\n<li>viene utilizzato lo stesso codice sorgente, grazie all'unificazione la costruzione del container \u00e8 semplice<\/li>\n<\/ul>\n<p><\/p>\n<p>Cosa otteniamo di buono:<\/p>\n<p><\/p>\n<ul>\n<li>abbiamo cron jobs funzionanti in un ambiente identico a quello degli sviluppatori (docker)<\/li>\n<li>I cronjob non devono essere \"riscritti\" per Kubernetes, funzionano nella stessa forma e nella stessa base di codice di prima.<\/li>\n<li>i cron jobs possono essere aggiunti da tutti i membri del team con diritti di commit nel branch di produzione, non solo dagli admin<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"modul-southbridge-k8sdeploy-i-redaktirovanie-koda-iz-admin-paneli\">Modulo Southbridge K8SDeploy e modifica del codice dalla dashboard di amministrazione<\/h3>\n<p><\/p>\n<p>Ne abbiamo parlato dell'upgrade del pod?<br \/>\nE come indirizzare il traffico l\u00ec?<br \/>\nEvviva, abbiamo scritto un modulo per questo in php \ud83d\ude42 \u00c8 un piccolo modulo classico per Bitrix. Non \u00e8 ancora disponibile pubblicamente, ma intendiamo renderlo accessibile.<br \/>\nIl modulo \u00e8 installato come un normale modulo in Bitrix:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge a Chelyabinsk e Bitrix in Kubernetes\" src=\"\/wp-content\/uploads\/ba9f895ce645862c7ba003d523cd5656.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E appare in questo modo:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge a Chelyabinsk e Bitrix in Kubernetes\" src=\"\/wp-content\/uploads\/916ae9243fae9f6405cc68174ec5bb2b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Permette di impostare un cookie che identifica l'amministratore del sito e consente a Kubernetes di inviare traffico al pod di upgrade.<\/p>\n<p><\/p>\n<p>Quando le modifiche sono complete, \u00e8 necessario premere git push; le modifiche al codice verranno inviate a git, e successivamente il sistema compiler\u00e0 un'immagine con la nuova versione del codice e la distribuir\u00e0 nel cluster, sostituendo i vecchi pod.<\/p>\n<p><\/p>\n<p>S\u00ec, un po' macchinoso, ma in questo modo manteniamo l'architettura microservizi e non togliamo agli utenti di Bitrix la possibilit\u00e0 di modificare il codice dall'amministratore. Dopotutto, questa \u00e8 un'opzione; possiamo risolvere la modifica del codice in un altro modo.<\/p>\n<p><\/p>\n<h4 id=\"helm-chart\">Chart Helm<\/h4>\n<p><\/p>\n<p>Per compilare applicazioni in Kubernetes, di solito utilizziamo il gestore di pacchetti Helm.<br \/>\nPer la nostra soluzione Bitrix in Kubernetes, Sergey Bondarev, il nostro principale amministratore di sistema, ha scritto un chart Helm speciale.<\/p>\n<p><\/p>\n<p>Esegue la costruzione di worker, l'aggiornamento, i pod cron, configura ingress, servizi e trasferisce le variabili dai segreti di Kubernetes ai pod.<\/p>\n<p><\/p>\n<p>Conserviamo il codice in Gitlab, e anche la costruzione di Helm viene avviata da Gitlab.<\/p>\n<p><\/p>\n<p>In breve, appare cos\u00ec<\/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 consente anche di effettuare un rollback \"senza soluzione di continuit\u00e0\" nel caso in cui qualcosa vada storto durante il deployment. \u00c8 piacevole sapere che non ti trovi in panico a \"sistemare il codice via ftp perch\u00e9 il prod \u00e8 andato gi\u00f9\", mentre Kubernetes lo fa automaticamente e senza downtime.<\/p>\n<p><\/p>\n<h4 id=\"deploy\">Deploy<\/h4>\n<p><\/p>\n<p>S\u00ec, siamo fan di Gitlab &amp; Gitlab CI, lo utilizziamo \ud83d\ude42<br \/>\nQuando si effettua un commit in Gitlab nel repository del progetto, Gitlab avvia una pipeline che implementa il rilascio della nuova versione dell'ambiente.<\/p>\n<p><\/p>\n<p>Fasi:<\/p>\n<p><\/p>\n<ul>\n<li>build (creiamo una nuova immagine Docker)<\/li>\n<li>test (testiamo)<\/li>\n<li>clean up (rimuoviamo l'ambiente di test)<\/li>\n<li>push (inviamo l'immagine al Docker registry)<\/li>\n<li>deploy (distribuiamo l'applicazione in Kubernetes tramite Helm).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge a Chelyabinsk e Bitrix in Kubernetes\" src=\"\/wp-content\/uploads\/74e565a0793b90c3cc19b8c7dedaff34.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Evvi, fatto, implementiamo!<br \/>\nOppure poniamo domande, se ci sono.<\/p>\n<p><\/p>\n<h2 id=\"itak-chto-my-sdelali\">Quindi, cosa abbiamo fatto<\/h2>\n<p><\/p>\n<p><strong>Dal punto di vista tecnico:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>abbiamo dockerizzato Bitrix;<\/li>\n<li>\"abbiamo suddiviso\" Bitrix in contenitori, ciascuno con funzioni minime;<\/li>\n<li>abbiamo raggiunto uno stato stateless per i contenitori;<\/li>\n<li>abbiamo risolto il problema con l'aggiornamento di Bitrix in Kubernetes;<\/li>\n<li>tutte le funzionalit\u00e0 di Bitrix hanno continuato a funzionare (quasi tutte);<\/li>\n<li>abbiamo completato il deployment in Kubernetes e il rollback tra le versioni.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Dal punto di vista aziendale:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>tolleranza ai guasti;<\/li>\n<li>strumenti Kubernetes (integrazione semplice con Gitlab CI, deployment senza soluzione di continuit\u00e0, ecc.);<\/li>\n<li>le password sono nei segreti (visibili solo a coloro a cui \u00e8 stato specificamente concesso l'accesso alle password);<\/li>\n<li>\u00e8 comodo creare ambienti aggiuntivi (per sviluppo, test, ecc.) all'interno di un'unica infrastruttura.<\/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.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\/it\/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=\"it_IT\" \/>\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\/it\/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 a Chelyabinsk e Bitrix in Kubernetes | ProHoster","description":"A Chelyabinsk si svolgono meet-up per amministratori di sistema Sysadminka, e nell'ultimo di essi ho presentato una relazione sulla nostra soluzione per eseguire applicazioni su 1C-Bitrix in Kubernetes. Bitrix, Kubernetes, Ceph \u2014.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/35581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=35581"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/35581\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=35581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=35581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=35581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}