{"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 svolgono i meetup degli amministratori di sistema Sysadminka, e all'ultimo di questi ho tenuto una presentazione sulla nostra soluzione per eseguire applicazioni su 1C-Bitrix in Kubernetes.<\/p>\n<p><\/p>\n<p>Bitrix, Kubernetes, Ceph \u2014 una combinazione perfetta?<\/p>\n<p><\/p>\n<p>Vi racconter\u00f2 come abbiamo assemblato una soluzione funzionante da tutto ci\u00f2.<\/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 meetup si \u00e8 svolto il 18 aprile a Chelyabinsk. Potete leggere di pi\u00f9 sui nostri meetup in <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 a farci 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 presentazione<\/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 fatto nel meetup. Suppongo per\u00f2 che le parole Bitrix, Docker, Kubernetes, Ceph vi siano familiari, almeno a livello di articoli di Wikipedia.<\/p>\n<p><\/p>\n<h4 id=\"chto-voobsche-est-gotovogo-pro-bitriks-v-kubernetes\">Cosa c'\u00e8 di pronto riguardo a Bitrix in Kubernetes?<\/h4>\n<p><\/p>\n<p>In tutta internet c'\u00e8 pochissima informazione sul funzionamento delle applicazioni Bitrix in Kubernetes.<br \/>\nHo trovato solo questi materiali:<\/p>\n<p><\/p>\n<p>Presentazione 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=\"Riproduci 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>Consiglio di ascoltarlo.<\/p>\n<p><\/p>\n<p>Sviluppo di una soluzione personalizzata da un 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\/\">su Habr\u00e9<\/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\u2026 in effetti, \u00e8 tutto.<\/p>\n<p><\/p>\n<p>Avviso che non abbiamo controllato la qualit\u00e0 delle soluzioni linkate sopra \ud83d\ude42<br \/>\nA proposito, per preparare la nostra soluzione ho parlato con Alexander Serbul, il cui intervento non era ancora disponibile, quindi nelle mie diapositive c'\u00e8 un punto che afferma \u00abBitrix non usa Kubernetes\u00bb.<\/p>\n<p><\/p>\n<p>Tuttavia, ci sono gi\u00e0 molti immagini Docker pronte per l'uso con 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 per creare una soluzione completa per Bitrix in Kubernetes?<br \/>\nNo. Ci sono molteplici 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 (ed \u00e8 ci\u00f2 che generalmente vogliamo in Kubernetes), l'applicazione in Kubernetes deve essere suddivisa in contenitori e dobbiamo assicurarci che ogni contenitore esegua una piccola funzione (e la esegua bene). Perch\u00e9 solo una? In breve, pi\u00f9 \u00e8 semplice, pi\u00f9 \u00e8 affidabile.<br \/>\nSe vuoi approfondire, ti invito a guardare 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 per lo pi\u00f9 costruite sul principio \u00abtutto in uno\u00bb, quindi abbiamo dovuto comunque costruire il nostro sistema e addirittura creare le immagini da zero.<\/p>\n<p><\/p>\n<p><strong>Il secondo: il codice del sito viene modificato dalla pannello di amministrazione.<\/strong><\/p>\n<p><\/p>\n<p>Abbiamo creato una nuova sezione sul sito \u2014 il codice \u00e8 stato aggiornato (\u00e8 stata aggiunta una directory con il nome della nuova sezione).<\/p>\n<p><\/p>\n<p>Sono state modificate le propriet\u00e0 del componente dal pannello di amministrazione \u2014 il codice \u00e8 cambiato.<\/p>\n<p><\/p>\n<p>Kubernetes non sa gestire questo \u2018per impostazione predefinita\u2019, i container devono essere immutabili (Stateless).<\/p>\n<p><\/p>\n<p>Motivo: ogni container (pod) nel cluster gestisce solo una parte del traffico. Se si modifica il codice solo in un container (pod), allora nei diversi pod il codice sar\u00e0 diverso, il sito funzioner\u00e0 in modo diverso e a utenti diversi verranno mostrate versioni diverse del sito. Non \u00e8 sostenibile.<\/p>\n<p><\/p>\n<p><strong>Terzo \u2014 bisogna affrontare la questione del deployment.<\/strong><\/p>\n<p><\/p>\n<p>Se abbiamo un monolite e un singolo server \u2018classico\u2019, tutto \u00e8 piuttosto semplice: distribuiamo una nuova base di codice, eseguiamo la migrazione del database, reindirizziamo il traffico alla nuova versione del codice. Il passaggio avviene istantaneamente.<br \/>\nSe abbiamo un sito in Kubernetes, suddiviso in microservizi, con molti container di codice \u2014 beh. Dobbiamo costruire i container con la nuova versione del codice, distribuirli al posto dei precedenti, eseguire correttamente la migrazione del database, e idealmente farlo senza che i visitatori se ne accorgano. Fortunatamente, in questo Kubernetes ci aiuta, supportando una serie di diversi tipi di deployment.<\/p>\n<p><\/p>\n<p><strong>La quarta \u2014 \u00e8 necessario affrontare la questione dello storage della statica<\/strong><\/p>\n<p><\/p>\n<p>Se il tuo sito occupa \"solo\" 10 gigabyte e lo distribuisci interamente in contenitori, otterrai contenitori da 10 gigabyte che verranno distribuiti all'infinito.<br \/>\n\u00c8 necessario memorizzare le parti pi\u00f9 \"pesanti\" del sito al di fuori dei contenitori, e si pone la questione su come farlo correttamente<\/p>\n<p><\/p>\n<h4 id=\"chego-net-v-nashem-reshenii\">Cosa non \u00e8 incluso nella nostra soluzione<\/h4>\n<p><\/p>\n<p>Tutto il codice di Bitrix non \u00e8 suddiviso in microfunzioni\/microservizi (in modo che la registrazione sia separata, il modulo del negozio online separato, ecc.). L'intero codice sorgente \u00e8 conservato in ogni contenitore nella sua interezza.<\/p>\n<p><\/p>\n<p>Non memorizziamo il database in Kubernetes (ho realizzato 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 \u00e8 in esecuzione su Kubernetes. La funzione \"controllo del sistema\" non funziona correttamente e per modificare il codice del sito dalla dashboard di amministrazione \u00e8 necessario prima premere il pulsante \"voglio modificare il codice\".<\/p>\n<p><\/p>\n<p>Abbiamo definito i problemi e la necessit\u00e0 di implementare la microservizialit\u00e0; l'obiettivo \u00e8 chiaro: creare un sistema funzionante 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>\u041c\u043d\u043e\u0433\u043e \u00ab\u0440\u0430\u0431\u043e\u0447\u0438\u0445\u00bb \u043f\u043e\u0434\u043e\u0432 \u0441 \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (worker&#8217;\u044b).<br \/>\nUn pod con cron job (obbligatoriamente solo uno).<br \/>\nUn pod di upgrade per modificare il codice del sito dal pannello di amministrazione (anche questo obbligatoriamente solo uno).<\/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 questioni:<\/p>\n<p><\/p>\n<ul>\n<li>Dove conservare le sessioni?<\/li>\n<li>Dove conservare la cache?<\/li>\n<li>Dove conservare la staticit\u00e0; non possiamo posizionare gigabyte di staticit\u00e0 in una miriade 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 con la creazione dell'immagine Docker.<\/p>\n<p><\/p>\n<p>L'opzione ideale \u00e8 avere un'unica immagine universale, da cui otteniamo sia i pod worker che i pod con i cron job, e i pod di upgrade.<\/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 della posta e cron.<\/p>\n<p><\/p>\n<p>Durante la creazione dell'immagine, l'intera base di codice del sito viene copiata nella directory \/app (eccetto le parti che sposteremo in uno storage condiviso separato).<\/p>\n<p><\/p>\n<h4 id=\"mikroservisnost-servisy\">Microservizialit\u00e0, 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 estrarre msmtp in un microservizio separato, Bitrix inizia a lamentarsi che non pu\u00f2 inviare email direttamente.<\/li>\n<li>Ogni container ha l'intero codice sorgente.<\/li>\n<li>Divieto di modifica del codice nei container.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>cron sotto:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>container con apache, php, cron<\/li>\n<li>viene fornito con l'intero codice sorgente<\/li>\n<li>divieto di modifica del codice nei container<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>upgrade sotto:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>container con nginx + container apache\/php-fpm + msmtp<\/li>\n<li>non ci sono divieti di modifica del codice nei container<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>archivio delle sessioni<\/strong><\/p>\n<p><\/p>\n<p><strong>archivio della cache di Bitrix<\/strong><\/p>\n<p><\/p>\n<p>\u00c8 importante: le password per connettersi a tutto, dal database all'email, sono conservate nei segreti di Kubernetes. Otteniamo un vantaggio, le password sono visibili solo a chi diamo accesso ai segreti, non a tutti coloro che hanno accesso al codice sorgente del progetto.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-dlya-statiki\">Archiviazione per la staticit\u00e0<\/h4>\n<p><\/p>\n<p>Si pu\u00f2 usare qualsiasi cosa: ceph, nfs (ma non raccomandiamo nfs per la produzione), storage di rete dai fornitori 'cloud', ecc.<\/p>\n<p><\/p>\n<p>Lo storage dovr\u00e0 essere collegato nei container nella directory \/upload\/ del sito e nelle altre directory della staticit\u00e0.<\/p>\n<p><\/p>\n<h4 id=\"baza-dannyh\">Database<\/h4>\n<p><\/p>\n<p>Per semplicit\u00e0, raccomandiamo di estrarre il database al di fuori di Kubernetes. Un database in Kubernetes \u00e8 un compito complicato, render\u00e0 lo schema molto pi\u00f9 complesso.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-sessiy\">Archivio delle sessioni<\/h4>\n<p><\/p>\n<p>Utilizziamo memcached \ud83d\ude42<\/p>\n<p><\/p>\n<p>Gestisce bene lo storage delle sessioni, si clusterizza, ed \u00e8 supportato \u00abnativamente\u00bb come session.save_path in php. Questo sistema \u00e8 stato collaudato molte volte anche nell'architettura monolitica classica, quando creavamo cluster con un gran numero di web server. Per il deployment 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 sono impostate le configurazioni per lo storage 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 saranno diversi in essi, quindi per ogni ambiente dobbiamo passare un nome host unico per le sessioni).<br \/>\nCache storage di Bitrix<\/p>\n<p><\/p>\n<p>Abbiamo bisogno di uno storage resiliente su 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 dallo stesso 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 qui in Bitrix si specifica dove abbiamo memorizzato 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 diversi approcci per eseguire 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 cron tasks (se si tratta di un'app web \u2014 con wget <noindex>https:\/\/$host$cronjobname<\/noindex>, oppure kubectl exec all'interno di uno dei pod worker, ecc.)<\/li>\n<li>ecc.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u0440\u0438\u0442\u044c \u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#171;\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 deployment \u0441 \u043f\u043e\u0434\u0430\u043c\u0438 \u0434\u043b\u044f \u043a\u0440\u043e\u043d\u0442\u0430\u0441\u043a\u043e\u0432&#187;<\/p>\n<p><\/p>\n<p>Come \u00e8 fatto:<\/p>\n<p><\/p>\n<ul>\n<li>aggiungiamo i cron tasks tramite ConfigMap o tramite il file config\/addcron<\/li>\n<li>eseguiamo un contenitore in un'unica istanza, identico al pod worker + permettiamo l'esecuzione dei cron tasks in esso<\/li>\n<li>si utilizza la stessa base di codice, grazie all'unificazione, la creazione del contenitore \u00e8 semplice<\/li>\n<\/ul>\n<p><\/p>\n<p>Cosa otteniamo di positivo:<\/p>\n<p><\/p>\n<ul>\n<li>abbiamo cron tasks funzionanti in un ambiente identico a quello degli sviluppatori (docker)<\/li>\n<li>\u043a\u0440\u043e\u043d\u0442\u0430\u0441\u043a\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e &#171;\u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c&#187; \u0434\u043b\u044f Kubernetes, \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0432\u0438\u0434\u0435 \u0438 \u0432 \u0442\u043e\u0439 \u0436\u0435 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435, \u0447\u0442\u043e \u0438 \u0440\u0430\u043d\u044c\u0448\u0435<\/li>\n<li>tutti i membri del team con diritti di commit nel ramo di produzione possono aggiungere cron tasks, non solo gli 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 pannello amministrativo<\/h3>\n<p><\/p>\n<p>Abbiamo parlato dell'upgrade del pod?<br \/>\nE come reindirizzare il traffico l\u00ec?<br \/>\nEvvia, abbiamo scritto un modulo per questo in php \ud83d\ude42 \u00c8 un piccolo modulo classico per Bitrix. Non \u00e8 ancora disponibile pubblicamente, ma prevediamo di rilasciarlo.<br \/>\nIl modulo viene 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 cos\u00ec:<\/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 i cookie che identificano l'amministratore del sito e consentono a Kubernetes di inviare traffico al pod di aggiornamento.<\/p>\n<p><\/p>\n<p>Quando le modifiche sono complete, bisogna premere git push; le modifiche al codice verranno inviate in 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, \u00e8 un po' un workaround, ma in questo modo manteniamo un'architettura a microservizi e non priviamo gli utenti di Bitrix della loro amata possibilit\u00e0 di modificare il codice dall'admin. Dopotutto, questa \u00e8 solo un'opzione; il problema della modifica del codice pu\u00f2 essere risolto in un altro modo.<\/p>\n<p><\/p>\n<h4 id=\"helm-chart\">Helm chart<\/h4>\n<p><\/p>\n<p>Per la costruzione di 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>\u041e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 worker, ugrade, cron \u043f\u043e\u0434\u043e\u0432, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 ingress&#8217;\u044b, \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 Kubernetes secrets \u0432 \u043f\u043e\u0434\u044b.<\/p>\n<p><\/p>\n<p>Conserviamo il codice in Gitlab e avviamo anche la costruzione di Helm 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 offre anche la possibilit\u00e0 di effettuare un rollback \"senza soluzione di continuit\u00e0\" nel caso in cui qualcosa vada storto durante il deployment. \u00c8 bello quando non sei in preda al panico a \"correggere il codice via FTP perch\u00e9 la produzione \u00e8 crollata\", ma \u00e8 Kubernetes a farlo automaticamente, 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 \/>\nDurante un commit su Gitlab, nel repository del progetto Gitlab avvia un pipeline che esegue il deployment della nuova versione dell\u2019ambiente.<\/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 (eseguiamo i test)<\/li>\n<li>clean up (eliminiamo l\u2019ambiente di test)<\/li>\n<li>push (inviamo in Docker registry)<\/li>\n<li>deploy (deployiamo l\u2019applicazione 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>Ecco fatto, procediamo!<br \/>\nOppure poniamo delle domande, se ce ne 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 \"tagliato\" Bitrix in container, ognuno dei quali esegue funzioni minime;<\/li>\n<li>abbiamo raggiunto lo stato stateless dei container;<\/li>\n<li>abbiamo risolto il problema dell\u2019aggiornamento di Bitrix in Kubernetes;<\/li>\n<li>tutte le funzionalit\u00e0 di Bitrix continuano a funzionare (quasi tutte);<\/li>\n<li>abbiamo gestito il deployment in Kubernetes e il rollback tra le versioni.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Dal punto di vista commerciale:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>alta disponibilit\u00e0;<\/li>\n<li>strumenti Kubernetes (integrazione semplice con Gitlab CI, deployment fluido, ecc);<\/li>\n<li>password nei segreti (visibili solo a coloro a cui \u00e8 stato direttamente concesso l'accesso alle password);<\/li>\n<li>\u00e8 comodo creare ambienti aggiuntivi (per sviluppo, test e altro) 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 4.9.10 - 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 \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\" \/>\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) 4.9.10\" \/>\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 \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\" \/>\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 i meetup degli amministratori di sistema Sysadminka, e all'ultimo di essi ho presentato la nostra soluzione per l'esecuzione delle applicazioni su 1C-Bitrix in Kubernetes. Bitrix, Kubernetes, Ceph: \u00e8 una combinazione fantastica? Racconter\u00f2 come abbiamo assemblato una soluzione funzionante da tutto ci\u00f2. Andiamo! Il meetup si \u00e8 svolto il 18 aprile a Chelyabinsk. Puoi leggere dei nostri meetup su Timepad e guardare","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 \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","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"},"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}]}}