{"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\/da\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","title":{"rendered":"Southbridge i Tjeljabinsk og Bitrix i Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I Charkov afholdes der meetups for systemadministratorer, og p\u00e5 det seneste lavede jeg et opl\u00e6g om vores l\u00f8sning til at k\u00f8re applikationer p\u00e5 1C-Bitrix i Kubernetes.<\/p>\n<p><\/p>\n<p>Bitrix, Kubernetes, Ceph \u2014 en fremragende kombination?<\/p>\n<p><\/p>\n<p>Jeg vil fort\u00e6lle, hvordan vi samlet viste en fungerende l\u00f8sning ud af alt dette.<\/p>\n<p><\/p>\n<p>Lad os komme i gang!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge i Tjeljabinsk og Bitrix i 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>Meetup'en fandt sted den 18. april i Charkov. Om vores meetups kan du l\u00e6se i <noindex><a rel=\"nofollow\" href=\"https:\/\/sysadminka.timepad.ru\">Timepad<\/a><\/noindex> og se p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/channel\/UCMblNgU0Gt-TXb9GdVeeinw\/\">YouTube<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Hvis du \u00f8nsker at komme til os med et opl\u00e6g eller som deltager - s\u00e5 er du velkommen, skriv til vadim.isakanov@gmail.com og p\u00e5 Telegram t.me\/vadimisakanov. <\/p>\n<p><\/p>\n<h2 id=\"moy-doklad\">Mit opl\u00e6g<\/h2>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=MZqPNMUjr_M\" title=\"Pr\u00e6sentation om Bitrix i Kubernetes\"><img decoding=\"async\" alt=\"Southbridge i Tjeljabinsk og Bitrix i Kubernetes\" src=\"\/wp-content\/uploads\/eb02d3ceb8248faad927c2bcae0074de.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/yadi.sk\/i\/1q0YpFHBGBdtcg\">Slides<\/a><\/noindex><\/p>\n<p><\/p>\n<h2 id=\"reshenie-bitriks-v-kubernetes-versiya-southbridge-10\">L\u00f8sning \"Bitrix i Kubernetes, version Southbridge 1.0\"<\/h2>\n<p><\/p>\n<p>Jeg vil tale om vores l\u00f8sning i formatet \"for nybegyndere i Kubernetes\", hvordan det blev gjort p\u00e5 meetup'en. Men jeg antager, at du allerede kender til ordene Bitrix, Docker, Kubernetes, Ceph, i det mindste p\u00e5 niveau med artikler fra Wikipedia.<\/p>\n<p><\/p>\n<h4 id=\"chto-voobsche-est-gotovogo-pro-bitriks-v-kubernetes\">Hvad findes der overhovedet af materialer om Bitrix i Kubernetes?<\/h4>\n<p><\/p>\n<p>Der er meget lidt information p\u00e5 internettet om at k\u00f8re applikationer p\u00e5 Bitrix i Kubernetes.<br \/>\nJeg fandt kun disse materialer:<\/p>\n<p><\/p>\n<p>Opl\u00e6g af Alexander Serbul, 1C-Bitrix, og Anton Tuzlukov fra 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=\"Afspil 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>Jeg anbefaler at lytte til det.<\/p>\n<p><\/p>\n<p>Udvikling af en egen l\u00f8sning fra brugerens side <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\/\">p\u00e5 Habr\u00e9<\/a><\/noindex>.<br \/>\nJeg fandt ogs\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ESSch\/kubernetes\">denne l\u00f8sning<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Og... ja, det var det.<\/p>\n<p><\/p>\n<p>Jeg advarer om, at kvaliteten af l\u00f8sningerne i ovenst\u00e5ende links ikke er blevet kontrolleret \ud83d\ude42<br \/>\nForresten, mens jeg forberedte vores l\u00f8sning, talte jeg med Alexander Serbul, hans opl\u00e6g var endnu ikke tilg\u00e6ngeligt, derfor er der et punkt i mine slides, \"Bitrix bruger ikke Kubernetes\".<\/p>\n<p><\/p>\n<p>Men der er mange f\u00e6rdige Docker-billeder til at k\u00f8re Bitrix i Docker allerede: <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>Er dette tilstr\u00e6kkeligt til at skabe en fuldgyldig l\u00f8sning for Bitrix i Kubernetes?<br \/>\nNej. Der er mange problemer, der skal l\u00f8ses.<\/p>\n<p><\/p>\n<h4 id=\"v-chem-problemy-s-bitriks-v-kubernetes\">Hvad er problemerne med Bitrix i Kubernetes?<\/h4>\n<p><\/p>\n<p><strong>Den f\u00f8rste \u2014 f\u00e6rdige billeder fra Dockerhub er ikke egnet til Kubernetes.<\/strong><\/p>\n<p><\/p>\n<p>Hvis vi \u00f8nsker at bygge en mikrotjenestearkitektur (og i Kubernetes vil vi typisk gerne det), skal applikationen i Kubernetes opdeles i containere og sikre, at hver container udf\u00f8rer \u00e9n lille funktion (og g\u00f8r det godt). Hvorfor kun \u00e9n? Kort sagt \u2014 jo simplere, jo mere p\u00e5lideligt.<br \/>\nFor en l\u00e6ngere forklaring - se venligst denne artikel og 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>Docker-billeder i Dockerhub er hovedsageligt bygget med princippet \"alt i \u00e9t\", s\u00e5 vi m\u00e5tte alligevel lave vores egen cykel og til og med skabe billeder fra bunden.<\/p>\n<p><\/p>\n<p><strong>Den anden \u2014 websitets kode \u00e6ndres fra administrationspanelet.<\/strong><\/p>\n<p><\/p>\n<p>Vi har oprettet en ny sektion p\u00e5 hjemmesiden \u2013 koden er blevet opdateret (der er tilf\u00f8jet et bibliotek med navnet p\u00e5 den nye sektion).<\/p>\n<p><\/p>\n<p>Vi har \u00e6ndret egenskaberne for komponenten fra adminpanelet \u2013 koden er \u00e6ndret.<\/p>\n<p><\/p>\n<p>Kubernetes kan ikke arbejde med dette 'som standard'; containere skal v\u00e6re uforanderlige (Stateless).<\/p>\n<p><\/p>\n<p>\u00c5rsag: hver container (pod) i klyngen h\u00e5ndterer kun en del af trafikken. Hvis man \u00e6ndrer koden kun i \u00e9n container (pod), vil der v\u00e6re forskellige versioner af koden i forskellige pods, og hjemmesiden vil opf\u00f8re sig forskelligt, hvilket betyder, at forskellige brugere vil se forskellige versioner af hjemmesiden. Det er ikke en holdbar l\u00f8sning.<\/p>\n<p><\/p>\n<p><strong>For det tredje \u2013 det er n\u00f8dvendigt at l\u00f8se sp\u00f8rgsm\u00e5let om deployment.<\/strong><\/p>\n<p><\/p>\n<p>Hvis vi har et monolitisk system og \u00e9n 'klassisk' server, s\u00e5 er det ret simpelt: vi deployer en ny kodebase, udf\u00f8rer database-migration, og skifter trafikken til den nye version af koden. Skiftet sker straks.<br \/>\nHvis vores hjemmeside k\u00f8rer p\u00e5 Kubernetes, opdelt i mikrotjenester, og der er mange containere med kode \u2013 uh-oh. Vi skal samle containere med den nye version af koden, udskifte dem med de gamle, korrekt udf\u00f8re database-migration, og ideelt set g\u00f8re det usynligt for bes\u00f8gende. Heldigvis hj\u00e6lper Kubernetes os her ved at underst\u00f8tte en hel r\u00e6kke forskellige typer deployment.<\/p>\n<p><\/p>\n<p><strong>For det fjerde \u2013 det er n\u00f8dvendigt at l\u00f8se sp\u00f8rgsm\u00e5let om opbevaring af statiske filer.<\/strong><\/p>\n<p><\/p>\n<p>Hvis din hjemmeside kun vejer \u2018kun\u2019 10 gigabyte, og du deployer den helt i containere, f\u00e5r du containere, der vejer 10 gigabyte, som vil blive deployet i en evighed.<br \/>\nDet er n\u00f8dvendigt at opbevare de 'tungeste' dele af hjemmesiden uden for containerne, og der opst\u00e5r sp\u00f8rgsm\u00e5let om, hvordan man korrekt g\u00f8r dette.<\/p>\n<p><\/p>\n<h4 id=\"chego-net-v-nashem-reshenii\">Hvad der ikke er i vores l\u00f8sning.<\/h4>\n<p><\/p>\n<p>Hele Bitrix-koden er ikke opdelt i mikro-funktioner\/mikrotjenester (s\u00e5dan at registrering er adskilt, internetbutiksmodulet er adskilt osv.). Vi opbevarer hele kodebasen i hver container.<\/p>\n<p><\/p>\n<p>Vi gemmer ogs\u00e5 ikke databasen i Kubernetes (jeg har dog implementeret l\u00f8sninger med databasen i Kubernetes til udviklingsmilj\u00f8er, men ikke til produktion).<\/p>\n<p><\/p>\n<p>Webstedets administratorer vil alligevel bem\u00e6rke, at webstedet k\u00f8rer i Kubernetes. 'Systemcheck'-funktionen fungerer ikke korrekt, og for at redigere koden p\u00e5 hjemmesiden fra adminpanelet skal man f\u00f8rst trykke p\u00e5 knappen 'Jeg vil redigere koden'.<\/p>\n<p><\/p>\n<p>Vi har identificeret problemerne, vi er blevet enige om n\u00f8dvendigheden af at implementere mikrotjenester, og m\u00e5let er klart \u2014 at f\u00e5 et fungerende system til k\u00f8rsel af applikationer p\u00e5 Bitrix i Kubernetes, samtidig med at vi bevarer b\u00e5de Bitrix's funktioner og Kubernetes's fordele. Vi starter implementeringen.<\/p>\n<p><\/p>\n<h4 id=\"arhitektura\">Arkitektur<\/h4>\n<p><\/p>\n<p>Mange \"arbejds\" pods med webservere (workers).<br \/>\nEn pod med cron-jobs (af dem kun \u00e9n er obligatorisk).<br \/>\nEn upgrade pod til redigering af webstedskoden fra administrationspanelet (ogs\u00e5 obligatorisk kun \u00e9n).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge i Tjeljabinsk og Bitrix i Kubernetes\" src=\"\/wp-content\/uploads\/e26a787c11f78811b15a89f597331ef1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi l\u00f8ser sp\u00f8rgsm\u00e5lene:<\/p>\n<p><\/p>\n<ul>\n<li>Hvor opbevarer vi sessioner?<\/li>\n<li>Hvor opbevarer vi cache?<\/li>\n<li>Hvor opbevarer vi statiske filer, vi kan ikke l\u00e6gge gigabytes af statisk indhold i en bunke containere?<\/li>\n<li>Hvordan vil databasen fungere?<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"docker-obraz\">Docker-billede<\/h4>\n<p><\/p>\n<p>Vi starter med at bygge Docker-billedet.<\/p>\n<p><\/p>\n<p>Den ideelle l\u00f8sning \u2014 vi har et universelt billede, baseret p\u00e5 det f\u00e5r vi b\u00e5de worker-pods, pods med cron-jobs og upgrade pods.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/centosadmin\/bitrixenv\">Vi har lige lavet et s\u00e5dant billede<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Det inkluderer nginx, apache\/php-fpm (kan v\u00e6lges ved bygning), msmtp til e-mail forsendelse, og cron.<\/p>\n<p><\/p>\n<p>N\u00e5r billedet bygges, kopieres den fulde kodebase til direktoret \/app (med undtagelse af de dele, vi vil flytte til en separat delt lager).<\/p>\n<p><\/p>\n<h4 id=\"mikroservisnost-servisy\">Mikrotjenester, tjenester<\/h4>\n<p><\/p>\n<p><strong>worker pods:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Container med nginx + container apache\/php-fpm + msmtp<\/li>\n<li>msmtp kunne ikke flyttes til en separat mikrotjeneste, Bitrix begynder at klage over, at det ikke kan sende e-mails direkte.<\/li>\n<li>Hver container har den fulde kodebase.<\/li>\n<li>Forbud mod \u00e6ndring af kode i containere.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>cron pod:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>container med apache, php, cron<\/li>\n<li>komplet med den fulde kodebase<\/li>\n<li>forbud mod \u00e6ndring af kode i containere<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>upgrade pod:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>container med nginx + container apache\/php-fpm + msmtp<\/li>\n<li>der er ikke noget forbud mod \u00e6ndring af kode i containere<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>sessionslager<\/strong><\/p>\n<p><\/p>\n<p><strong>cachelager for Bitrix<\/strong><\/p>\n<p><\/p>\n<p>Det er ogs\u00e5 vigtigt: adgangskoder til alt fra databasen til e-mail opbevarer vi i kubernetes secrets. Vi f\u00e5r en bonus, adgangskoderne er kun synlige for dem, vi giver adgang til hemmelighederne, og ikke alle, der har adgang til kodebasen.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-dlya-statiki\">Lager til statisk indhold<\/h4>\n<p><\/p>\n<p>Du kan bruge hvad som helst: ceph, nfs (men vi anbefaler ikke nfs til produktion), netv\u00e6rkslager fra \"cloud\"-udbydere, osv.<\/p>\n<p><\/p>\n<p>Lageret skal tilsluttes i containere til \/upload\/ webstedets direkte og andre direktiver med statisk indhold.<\/p>\n<p><\/p>\n<h4 id=\"baza-dannyh\">Database<\/h4>\n<p><\/p>\n<p>For enkelhed anbefaler vi at tage databasen uden for Kubernetes. En database i Kubernetes er en separat kompleks opgave, som vil g\u00f8re ops\u00e6tningen v\u00e6sentligt mere kompliceret.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-sessiy\">sessionslager<\/h4>\n<p><\/p>\n<p>Vi bruger memcached \ud83d\ude42<\/p>\n<p><\/p>\n<p>Det h\u00e5ndterer sessioner godt, kan klynge og underst\u00f8ttes \"nativt\" som session.save_path i php. Et s\u00e5dant system er blevet afpr\u00f8vet mange gange f\u00f8r i klassisk monolitisk arkitektur, hvor vi byggede klynger med mange webservere. Til deployment bruger vi 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 - her er indstillingerne for opbevaring af sessioner i memcached angivet i billedet<\/p>\n<p><\/p>\n<p>Vi har brugt milj\u00f8variable til at overf\u00f8re oplysninger om v\u00e6rter med 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 \/>\nDette giver mulighed for at bruge den samme kode i dev, stage, test, prod milj\u00f8er (navnene p\u00e5 memcached-v\u00e6rterne vil v\u00e6re forskellige, s\u00e5 vi skal overf\u00f8re unikt navn p\u00e5 v\u00e6rter til sessioner i hvert milj\u00f8).<br \/>\nCache-lager Bitrix<\/p>\n<p><\/p>\n<p>Vi har brug for et fejltolerant lager, hvor alle pods kan skrive til og l\u00e6se fra.<\/p>\n<p><\/p>\n<p>Vi bruger ogs\u00e5 memcached.<br \/>\nDenne l\u00f8sning anbefales af Bitrix selv.<\/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 - her i Bitrix angives, hvor vores cache opbevares<\/p>\n<p><\/p>\n<p>Vi bruger ogs\u00e5 milj\u00f8variable.<\/p>\n<p><\/p>\n<h3 id=\"krontaski\">Cron-opgaver<\/h3>\n<p><\/p>\n<p>Der er forskellige tilgange til at udf\u00f8re cron-opgaver i Kubernetes.<\/p>\n<p><\/p>\n<ul>\n<li>separat deployment med en pod til at udf\u00f8re cron-opgaver<\/li>\n<li>cronjob til at udf\u00f8re cron-opgaver (hvis det er en webapp - med wget <noindex>https:\/\/$host$cronjobname<\/noindex>, eller kubectl exec ind i en af worker-podene, osv.)<\/li>\n<li>etc.<\/li>\n<\/ul>\n<p><\/p>\n<p>Der kan argumenteres for, hvad der er mest korrekt, men i dette tilf\u00e6lde har vi valgt varianten \"separate deployment med pods til cron jobs\".<\/p>\n<p><\/p>\n<p>S\u00e5dan er det gjort:<\/p>\n<p><\/p>\n<ul>\n<li>cron-opgaver tilf\u00f8jes via ConfigMap eller via filen config\/addcron<\/li>\n<li>i \u00e9t eksemplar k\u00f8rer vi en container, der er identisk med worker-poden + tillader udf\u00f8relse af cron-opgaver i den<\/li>\n<li>den samme kodebase bruges, hvilket g\u00f8r containeropbygningen enkel<\/li>\n<\/ul>\n<p><\/p>\n<p>Hvad f\u00e5r vi ud af det:<\/p>\n<p><\/p>\n<ul>\n<li>vi har fungerende cron-opgaver i et milj\u00f8, der ligner udviklernes milj\u00f8 (docker)<\/li>\n<li>Cron jobs skal ikke \"omskrives\" til Kubernetes, de fungerer som f\u00f8r i den samme kodebase.<\/li>\n<li>alle teammedlemmer med commit-rettigheder i produktionsgrenen kan tilf\u00f8je cron-opgaver, ikke kun administratorer<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"modul-southbridge-k8sdeploy-i-redaktirovanie-koda-iz-admin-paneli\">Modulet Southbridge K8SDeploy og koderedigering fra admin-panelet<\/h3>\n<p><\/p>\n<p>Vi talte jo om opgraderingen af pod-en?<br \/>\nHvordan dirigerer vi trafik dertil?<br \/>\nHurra, vi har skrevet et modul til dette i php \ud83d\ude42 Det er et lille klassisk modul til Bitrix. Det er endnu ikke offentligt tilg\u00e6ngeligt, men vi planl\u00e6gger at \u00e5bne det.<br \/>\nModulet installeres som et almindeligt modul i Bitrix:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge i Tjeljabinsk og Bitrix i Kubernetes\" src=\"\/wp-content\/uploads\/ba9f895ce645862c7ba003d523cd5656.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og det ser s\u00e5dan ud:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge i Tjeljabinsk og Bitrix i Kubernetes\" src=\"\/wp-content\/uploads\/916ae9243fae9f6405cc68174ec5bb2b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det giver mulighed for at angive en cookie, der identificerer websitets administrator, og g\u00f8r det muligt for Kubernetes at sende trafik til opgraderingspodden.<\/p>\n<p><\/p>\n<p>N\u00e5r \u00e6ndringerne er afsluttet, skal du trykke p\u00e5 git push, s\u00e5 vil kode\u00e6ndringerne blive sendt til git. Systemet vil dern\u00e6st bygge et billede med den nye version af koden og \"rulle\" det ud p\u00e5 klyngen og erstatte de gamle pods.<\/p>\n<p><\/p>\n<p>Ja, det er lidt klodset, men vi bevarer samtidig den mikroservices arkitektur og fjerner ikke den mulighed fra Bitrix-brugere, som de holder af, at redigere koden fra adminpanelet. I sidste ende er det en mulighed; opgaven med at redigere koden kan l\u00f8ses p\u00e5 andre m\u00e5der.<\/p>\n<p><\/p>\n<h4 id=\"helm-chart\">Helm chart<\/h4>\n<p><\/p>\n<p>Til at bygge applikationer i Kubernetes bruger vi som regel pakkeadministratoren Helm.<br \/>\nTil vores Bitrix-l\u00f8sning i Kubernetes har Sergey Bondarev, vores f\u00f8rende systemadministrator, skrevet et specielt Helm chart.<\/p>\n<p><\/p>\n<p>Han udf\u00f8rer bygningen af worker, opgraderer, cron pods, konfigurerer ingresses, tjenester og overf\u00f8rer variabler fra Kubernetes secrets til pods.<\/p>\n<p><\/p>\n<p>Vi gemmer koden i Gitlab, og vi starter ogs\u00e5 byggeprocessen af Helm fra Gitlab.<\/p>\n<p><\/p>\n<p>Kort sagt ser det s\u00e5dan ud:<\/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 tillader ogs\u00e5 at g\u00f8re en \"s\u00f8ml\u00f8s\" rollback, hvis noget g\u00e5r galt under deployment. Det er rart, n\u00e5r det ikke er dig, der panisk \"fixer koden via ftp, fordi produktionen er nede\", men Kubernetes g\u00f8r det automatisk, og uden nedetid.<\/p>\n<p><\/p>\n<h4 id=\"deploy\">Deploy<\/h4>\n<p><\/p>\n<p>Ja, vi er fans af Gitlab &amp; Gitlab CI, vi bruger det \ud83d\ude42<br \/>\nVed commit i Gitlab til projektets repository aktiverer Gitlab en pipeline, der udf\u00f8rer deployment af den nye version af milj\u00f8et.<\/p>\n<p><\/p>\n<p>Trin:<\/p>\n<p><\/p>\n<ul>\n<li>build (bygger et nyt Docker-billede)<\/li>\n<li>test (tester)<\/li>\n<li>clean up (fjerner testmilj\u00f8et)<\/li>\n<li>push (sender det til Docker registry)<\/li>\n<li>deploy (udruller applikationen i Kubernetes via Helm).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge i Tjeljabinsk og Bitrix i Kubernetes\" src=\"\/wp-content\/uploads\/74e565a0793b90c3cc19b8c7dedaff34.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hurra, det er klar, vi implementerer!<br \/>\nEller ogs\u00e5 stiller vi sp\u00f8rgsm\u00e5l, hvis der er nogen.<\/p>\n<p><\/p>\n<h2 id=\"itak-chto-my-sdelali\">S\u00e5, hvad har vi gjort?<\/h2>\n<p><\/p>\n<p><strong>Fra et teknisk synspunkt:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>dockeriseret Bitrix;<\/li>\n<li>\"sk\u00e5ret\" Bitrix op i containere, hvor hver udf\u00f8rer minimum af funktioner;<\/li>\n<li>opn\u00e5et stateless tilstand for containerne;<\/li>\n<li>l\u00f8st problemet med opdatering af Bitrix i Kubernetes;<\/li>\n<li>alle funktioner i Bitrix fortsatte med at fungere (n\u00e6sten alle);<\/li>\n<li>arbejdede med deployment i Kubernetes og rollback mellem versioner.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Fra et forretningsm\u00e6ssigt synspunkt:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>fejltolerance;<\/li>\n<li>Kubernetes-v\u00e6rkt\u00f8jer (nem integration med Gitlab CI, s\u00f8ml\u00f8s deployment, osv.);<\/li>\n<li>adgangskoder i secrets (synlige kun for dem, der har direkte adgang til adgangskoderne);<\/li>\n<li>Det er praktisk at skabe yderligere milj\u00f8er (til udvikling, test osv.) inden for en samlet infrastruktur.<\/li>\n<\/ul>\n<p>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/456608\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u0442\u0430\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 Sysadminka, \u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0438\u0437 \u043d\u0438\u0445 \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043e \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 1\u0421-\u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes. \u0411\u0438\u0442\u0440\u0438\u043a\u0441, Kubernetes, \u0421eph \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u043c\u0435\u0441\u044c? \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u0438\u0437 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041f\u043e\u0435\u0445\u0430\u043b\u0438! \u041c\u0438\u0442\u0430\u043f \u043f\u0440\u043e\u0448\u0435\u043b 18 \u0430\u043f\u0440\u0435\u043b\u044f \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435. \u041f\u0440\u043e \u043d\u0430\u0448\u0438 \u043c\u0438\u0442\u0430\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 Timepad \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35581","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u0442\u0430\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 Sysadminka, \u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0438\u0437 \u043d\u0438\u0445 \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043e \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 1\u0421-\u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes. \u0411\u0438\u0442\u0440\u0438\u043a\u0441, Kubernetes, \u0421eph \u2014.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 i Tjeljabinsk og Bitrix i Kubernetes | ProHoster","description":"I Tjeljabinsk afholdes der meetups for systemadministratorer Sysadminka, og p\u00e5 det seneste afholdte jeg en pr\u00e6sentation om vores l\u00f8sning til at k\u00f8re applikationer p\u00e5 1C-Bitrix i Kubernetes. Bitrix, Kubernetes, Ceph \u2014.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/35581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=35581"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/35581\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=35581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=35581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=35581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}