{"id":79153,"date":"2020-04-24T19:42:43","date_gmt":"2020-04-24T17:42:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom"},"modified":"2020-04-24T19:42:43","modified_gmt":"2020-04-24T17:42:43","slug":"istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","title":{"rendered":"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/d1cad1dfa3513b5794c7be916a9dbb4b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W miar\u0119 zdobywania do\u015bwiadczenia w IT zaczynasz zauwa\u017ca\u0107, \u017ce systemy maj\u0105 sw\u00f3j charakter. Mog\u0105 by\u0107 pos\u0142uszne, milcz\u0105ce, kapry\u015bne, surowe. Mog\u0105 przyci\u0105ga\u0107 do siebie lub odpycha\u0107. Tak czy inaczej, musisz z nimi \u201edogadywa\u0107 si\u0119\u201d, lawirowa\u0107 mi\u0119dzy \u201eukrytymi niebezpiecze\u0144stwami\u201d i budowa\u0107 \u0142a\u0144cuchy ich interakcji.<\/p>\n<p><\/p>\n<p>I nam przypad\u0142a zaszczytna rola zbudowania chmurowej platformy, a w tym celu musieli\u015bmy \u201enam\u00f3wi\u0107\u201d kilka podsystem\u00f3w do wsp\u00f3\u0142pracy. Na szcz\u0119\u015bcie mamy \u201ej\u0119zyk API\u201d, zr\u0119czne r\u0119ce i mn\u00f3stwo entuzjazmu. <\/p>\n<p><\/p>\n<p>W tym artykule nie b\u0119dzie technicznego hardcore'u, ale opis problem\u00f3w, z kt\u00f3rymi si\u0119 zmierzyli\u015bmy podczas budowy chmury. Postanowi\u0142em opisa\u0107 nasz\u0105 drog\u0119 w formie lekkiej technicznej fantazji o tym, jak szukali\u015bmy wsp\u00f3lnego j\u0119zyka z systemami i co z tego wynik\u0142o. <\/p>\n<p><\/p>\n<p>Witaj w \u015brodku.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h3 id=\"nachalo-puti\">Pocz\u0105tek drogi<\/h3>\n<p><\/p>\n<p>Jaki\u015b czas temu przed naszym zespo\u0142em postawiono zadanie - uruchomienie chmurowej platformy dla naszych klient\u00f3w. Mieli\u015bmy wsparcie kierownictwa, zasoby, sprz\u0119t i wolno\u015b\u0107 w wyborze technologii do realizacji programowej cz\u0119\u015bci us\u0142ugi.<\/p>\n<p><\/p>\n<p>By\u0142y r\u00f3wnie\u017c pewne wymagania:<\/p>\n<p><\/p>\n<ul>\n<li>serwis potrzebuje wygodnego panelu u\u017cytkownika;<\/li>\n<li>platforma musi by\u0107 zintegrowana z istniej\u0105cym systemem billingowym;<\/li>\n<li>cz\u0119\u015b\u0107 programowo-sprz\u0119towa: OpenStack + Tungsten Fabric (Open Contrail), kt\u00f3re nasi in\u017cynierowie nauczyli si\u0119 do\u015b\u0107 dobrze \u201eprzygotowywa\u0107\u201d.<\/li>\n<\/ul>\n<p><\/p>\n<p>O tym, jak zbiera\u0142 si\u0119 zesp\u00f3\u0142, opracowywano interfejs panelu u\u017cytkownika i podejmowano decyzje projektowe, opowiemy innym razem, je\u015bli spo\u0142eczno\u015b\u0107 Habr b\u0119dzie zainteresowana.<br \/>\nNarz\u0119dzia, kt\u00f3re postanowili\u015bmy wykorzysta\u0107:<\/p>\n<p><\/p>\n<ul>\n<li>Python + Flask + Swagger + SQLAlchemy - ca\u0142kiem standardowy zestaw Python;<\/li>\n<li>Vue.js dla frontendu;<\/li>\n<li>interakcj\u0119 mi\u0119dzy komponentami i us\u0142ugami postanowili\u015bmy realizowa\u0107 za pomoc\u0105 Celery na AMQP.<\/li>\n<\/ul>\n<p><\/p>\n<p>Przewiduj\u0105c pytania o wyb\u00f3r Pythona, wyja\u015bni\u0119. J\u0119zyk zaj\u0105\u0142 swoj\u0105 nisz\u0119 w naszej firmie i wok\u00f3\u0142 niego powsta\u0142a ma\u0142a, ale jednak kultura. Dlatego zdecydowano si\u0119 budowa\u0107 us\u0142ug\u0119 w\u0142a\u015bnie na nim. Zw\u0142aszcza, \u017ce szybko\u015b\u0107 rozwoju w takich zadaniach cz\u0119sto ma kluczowe znaczenie. <\/p>\n<p><\/p>\n<p>Zacznijmy wi\u0119c nasze poznawanie.<\/p>\n<p><\/p>\n<h3 id=\"molchalivyy-bill--billing\">Milcz\u0105cy Bill - billing<\/h3>\n<p><\/p>\n<p><em>Z tym facetem znali\u015bmy si\u0119 od dawna. Zawsze siedzia\u0142 obok i co\u015b cicho liczy\u0142. Czasami przesy\u0142a\u0142 nam zapytania od u\u017cytkownik\u00f3w, wystawia\u0142 faktury dla klient\u00f3w, zarz\u0105dza\u0142 us\u0142ugami. Zwyk\u0142y pracowity facet. By\u0142y jednak trudno\u015bci. By\u0142 milcz\u0105cy, czasami zamy\u015blony i cz\u0119sto \u2014 skryty.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/262bb5c9d6234041d264f8e041e647fe.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Billing to pierwszy system, z kt\u00f3rym pr\u00f3bowali\u015bmy si\u0119 zaprzyja\u017ani\u0107. I pierwsza trudno\u015b\u0107, z jak\u0105 si\u0119 zmierzyli\u015bmy, pojawi\u0142a si\u0119 przy przetwarzaniu us\u0142ug.<\/p>\n<p><\/p>\n<p>Na przyk\u0142ad przy tworzeniu lub usuwaniu, zadanie trafia do wewn\u0119trznej kolejki billingowej. W ten spos\u00f3b zrealizowano system asynchronicznej pracy z us\u0142ugami. Aby przetwarza\u0107 nasze typy us\u0142ug, musieli\u015bmy \"uk\u0142ada\u0107\" nasze zadania w t\u0119 kolejk\u0119. I tutaj napotkali\u015bmy problem: brak dokumentacji. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/4d96251df014e315308c94f848bc6cd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u0105dz\u0105c po opisie API, mo\u017cna to zadanie rozwi\u0105za\u0107, jednak nie mieli\u015bmy czasu na in\u017cynieri\u0119 odwrotn\u0105, w zwi\u0105zku z czym przenie\u015bli\u015bmy logik\u0119 na zewn\u0105trz i zorganizowali\u015bmy kolejk\u0119 zada\u0144 na RabbitMQ. Operacja nad us\u0142ug\u0105 jest inicjowana przez klienta w panelu u\u017cytkownika, opakowywana w \"zadanie\" Celery na backendzie i wykonywana po stronie billingowej i OpenStacka. Celery umo\u017cliwia do\u015b\u0107 wygodne zarz\u0105dzanie zadaniami, organizowanie powt\u00f3rze\u0144 i \u015bledzenie statusu. Wi\u0119cej o \"selerze\" mo\u017cna poczyta\u0107, na przyk\u0142ad, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/433476\/\">tutaj<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Billing nie zatrzymywa\u0142 r\u00f3wnie\u017c projektu, w kt\u00f3rym sko\u0144czy\u0142y si\u0119 pieni\u0105dze. Rozmawiaj\u0105c z programistami, dowiedzieli\u015bmy si\u0119, \u017ce przy obliczaniu statystyk (a dok\u0142adnie tak\u0105 logik\u0119 musimy wdro\u017cy\u0107) istnieje z\u0142o\u017cona interakcja regu\u0142 zatrzymywania. Ale te modele nie pasuj\u0105 do naszych godzin. Zrealizowali\u015bmy to r\u00f3wnie\u017c przez zadania na Celery, przenosz\u0105c logik\u0119 zarz\u0105dzania us\u0142ugami na backend. <\/p>\n<p><\/p>\n<p>Obie powy\u017csze problemy doprowadzi\u0142y do tego, \u017ce kod troch\u0119 si\u0119 rozr\u00f3s\u0142 i w przysz\u0142o\u015bci b\u0119dziemy musieli zaj\u0105\u0107 si\u0119 refaktoryzacj\u0105, aby przenie\u015b\u0107 logik\u0119 pracy z zadaniami do osobnej us\u0142ugi. Musimy r\u00f3wnie\u017c przechowywa\u0107 cz\u0119\u015b\u0107 informacji o u\u017cytkownikach i ich us\u0142ugach w naszych tabelach, aby podtrzyma\u0107 t\u0119 logik\u0119.<\/p>\n<p><\/p>\n<p>Jeszcze jeden problem \u2014 milczenie.<\/p>\n<p><\/p>\n<p>Na cz\u0119\u015b\u0107 zapyta\u0144 do API Billy cicho odpowiada \"Ok\". Tak by\u0142o na przyk\u0142ad, gdy wykonywali\u015bmy wp\u0142ywy obiecanych p\u0142atno\u015bci w trakcie test\u00f3w (o tym p\u00f3\u017aniej). Zapytania by\u0142y poprawnie realizowane i nie widzieli\u015bmy b\u0142\u0119d\u00f3w. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/d03f2c381fd39dbf33f2a0c3eeb1294d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Musia\u0142em przeanalizowa\u0107 logi, pracuj\u0105c z systemem przez UI. Okaza\u0142o si\u0119, \u017ce sam billing wykonuje podobne zapytania, zmieniaj\u0105c zakres na konkretnego u\u017cytkownika, na przyk\u0142ad admina, przekazuj\u0105c go w parametrze su.<\/p>\n<p><\/p>\n<p>Og\u00f3lnie rzecz bior\u0105c, mimo luk w dokumentacji i drobnych niedoskona\u0142o\u015bci API, wszystko przebieg\u0142o do\u015b\u0107 dobrze. Logi s\u0105 czytelne nawet przy du\u017cym obci\u0105\u017ceniu, je\u015bli rozumie si\u0119, jak s\u0105 zbudowane i czego szuka\u0107. Struktura bazy danych jest z\u0142o\u017cona, ale ca\u0142kiem logiczna i w pewnym sensie atrakcyjna.<\/p>\n<p><\/p>\n<p>Podsumowuj\u0105c, g\u0142\u00f3wne problemy, kt\u00f3re napotkali\u015bmy na etapie interakcji, dotycz\u0105 szczeg\u00f3lnych cech realizacji konkretnego systemu: <\/p>\n<p><\/p>\n<ul>\n<li>niedokumentowane \u201efunkcje\u201d, kt\u00f3re w ten czy inny spos\u00f3b nas dotyczy\u0142y;<\/li>\n<li>zamkni\u0119ty kod \u017ar\u00f3d\u0142owy (billing napisany w C++), w konsekwencji \u2014 niemo\u017cno\u015b\u0107 rozwi\u0105zania problemu 1 w \u017caden spos\u00f3b, poza \u201emetod\u0105 pr\u00f3b i b\u0142\u0119d\u00f3w\u201d.<\/li>\n<\/ul>\n<p><\/p>\n<p>Na szcz\u0119\u015bcie produkt ma wystarczaj\u0105co rozbudowane API i zintegrowali\u015bmy w naszym panelu nast\u0119puj\u0105ce podsystemy:<\/p>\n<p><\/p>\n<ul>\n<li>modu\u0142 wsparcia technicznego \u2014 zapytania z panelu u\u017cytkownika s\u0105 transparentnie przekazywane do bilingu dla klient\u00f3w serwisu;<\/li>\n<li>modu\u0142 finansowy \u2014 pozwala na wystawianie faktur dla bie\u017c\u0105cych klient\u00f3w, dokonywanie obci\u0105\u017ce\u0144 i generowanie dokument\u00f3w p\u0142atniczych;<\/li>\n<li>modu\u0142 zarz\u0105dzania us\u0142ugami \u2014 dla niego musieli\u015bmy zaimplementowa\u0107 w\u0142asny procesor. Rozszerzalno\u015b\u0107 systemu okaza\u0142a si\u0119 dla nas korzystna, a my \"nauczyli\u015bmy\" Billy'ego nowego typu us\u0142ug.<br \/>\nTroch\u0119 z tym popracowali\u015bmy, ale s\u0105dz\u0119, \u017ce z Billym si\u0119 dogadamy.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"progulki-po-volframovym-polyam--tungsten-fabric\">Spaceruj\u0105c po polach tungstenowych \u2014 Tungsten Fabric<\/h3>\n<p><\/p>\n<p><em>Pola tungstenowe, usiane setkami kabli, przez kt\u00f3re przep\u0142ywaj\u0105 tysi\u0105ce bit\u00f3w informacji. Informacje s\u0105 zbierane w \"pakiety\", analizowane, tworz\u0105c z\u0142o\u017cone trasy, jakby za pomoc\u0105 magii.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/9b6dd46d9f15e0e3393a8c1222abbf2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To jest domena drugiego systemu, z kt\u00f3rym musieli\u015bmy si\u0119 zaprzyja\u017ani\u0107 \u2014 Tungsten Fabric (TF), dawny OpenContrail. Jej zadaniem jest zarz\u0105dzanie sprz\u0119tem sieciowym, zapewniaj\u0105c nam, jako u\u017cytkownikom, abstrakcj\u0119 programow\u0105. TF \u2014 SDN, inkapsuluje w sobie skomplikowan\u0105 logik\u0119 pracy z urz\u0105dzeniami sieciowymi. O samej technologii jest dobry artyku\u0142, na przyk\u0142ad, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/muk\/blog\/251959\/\">tutaj<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>System jest zintegrowany z OpenStack (o nim b\u0119dzie mowa poni\u017cej) przez wtyczk\u0119 Neutron\u2019a. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/5abe3992efaab3e016a0c51dc0070a94.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Interakcja us\u0142ug OpenStack.<\/em><\/p>\n<p><\/p>\n<p>Z t\u0105 system\u0105 zapoznali nas koledzy z dzia\u0142u eksploatacji. U\u017cywamy API systemu do zarz\u0105dzania sieciowym stosem naszych us\u0142ug. Na razie nie sprawia nam powa\u017cnych problem\u00f3w ani niedogodno\u015bci (o kolegach z DE nie b\u0119d\u0119 si\u0119 wypowiada\u0142), chocia\u017c zdarzy\u0142y si\u0119 te\u017c pewne zabawne sytuacje podczas interakcji.<\/p>\n<p><\/p>\n<p>Pierwszy problem wygl\u0105da\u0142 tak: komendy, kt\u00f3re wymaga\u0142y wy\u015bwietlenia du\u017cej ilo\u015bci danych na konsoli instancji po po\u0142\u0105czeniu przez SSH po prostu \"zawiesza\u0142y\" po\u0142\u0105czenie, podczas gdy przez VNC wszystko dzia\u0142a\u0142o poprawnie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/02bc97d63a1299e1dda08fce0f10fb97.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dla tych, kt\u00f3rzy nie znaj\u0105 problemu, wygl\u0105da to do\u015b\u0107 zabawnie: ls \/root wykonuje si\u0119 poprawnie, podczas gdy na przyk\u0142ad top \"zawiesza si\u0119\" ca\u0142kowicie. Na szcz\u0119\u015bcie ju\u017c wcze\u015bniej napotkali\u015bmy podobne problemy. Rozwi\u0105zano je dostosowuj\u0105c MTU na trasie od w\u0119z\u0142\u00f3w compute do router\u00f3w. Swoj\u0105 drog\u0105, to nie by\u0142 problem TF.<\/p>\n<p><\/p>\n<p>Kolejny problem czeka\u0142 za rogiem. W pewnym \"pi\u0119knym\" momencie magia routingu znikn\u0119\u0142a, tak po prostu. TF przesta\u0142 zarz\u0105dza\u0107 routingiem na sprz\u0119cie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/db2a75ffdf2940b2ca90f73835f7a321.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pracowali\u015bmy z OpenStack na poziomie admina, a nast\u0119pnie przechodzili\u015bmy na poziom odpowiedniego u\u017cytkownika. SDN, wydaje si\u0119, \"przechwytuje\" zakres u\u017cytkownika, w kt\u00f3rym wykonywane s\u0105 dzia\u0142ania. To, \u017ce to samo konto admina u\u017cywane jest do komunikacji TF i OpenStack, sprawi\u0142o, \u017ce w momencie prze\u0142\u0105czania na u\u017cytkownika \"magia\" znika\u0142a. Zdecydowali\u015bmy si\u0119 utworzy\u0107 osobne konto do pracy z systemem. Dzi\u0119ki temu mogli\u015bmy pracowa\u0107, nie \u0142ami\u0105c funkcjonalno\u015bci integracji.<\/p>\n<p><\/p>\n<h3 id=\"silikonovye-formy-zhizni--openstack\">Formy \u017cycia silikonowego \u2014 OpenStack<\/h3>\n<p><\/p>\n<p><em>Silikonowa istota o dziwacznej formie zamieszkuje pobliskie pola tungstenowe. Najbardziej przypomina dorastaj\u0105cego ch\u0142opca, kt\u00f3ry jednym machni\u0119ciem mo\u017ce nas zmia\u017cd\u017cy\u0107, ale nie emanuje oczywist\u0105 agresj\u0105. Nie budzi strachu, ale jego rozmiary budz\u0105 niepok\u00f3j. Podobnie jak z\u0142o\u017cono\u015b\u0107 tego, co dzieje si\u0119 wok\u00f3\u0142.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/8622d43e0cb963bc9ef2a2ce59a32499.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenStack jest rdzeniem naszej platformy.<\/p>\n<p><\/p>\n<p>OpenStack ma kilka podsystem\u00f3w, z kt\u00f3rych najbardziej aktywnie wykorzystujemy na razie Nova, Glance i Cinder. Ka\u017cdy z nich ma swoje API. Nova odpowiada za zasoby obliczeniowe i tworzenie instancji, Cinder \u2014 zarz\u0105dza wolumenami i ich snapshotami, Glance \u2014 to us\u0142uga obraz\u00f3w, kt\u00f3ra zarz\u0105dza szablonami system\u00f3w operacyjnych i metainformacjami o nich.<\/p>\n<p><\/p>\n<p>Ka\u017cda us\u0142uga uruchamiana jest w kontenerze, a brokerem wiadomo\u015bci jest \"bia\u0142y kr\u00f3lik\" \u2014 RabbitMQ.<\/p>\n<p><\/p>\n<p>Ten system sprawi\u0142 nam najwi\u0119cej nieoczekiwanych k\u0142opot\u00f3w.<\/p>\n<p><\/p>\n<p>I pierwszy problem nie kaza\u0142 na siebie d\u0142ugo czeka\u0107, gdy pr\u00f3bowali\u015bmy pod\u0142\u0105czy\u0107 dodatkowy wolumin do serwera. Cinder API kategorycznie odm\u00f3wi\u0142 wykonania tego zadania. Dok\u0142adniej m\u00f3wi\u0105c, je\u015bli wierzy\u0107 samemu OpenStack, po\u0142\u0105czenie jest nawi\u0105zywane, jednak wewn\u0105trz wirtualnego serwera urz\u0105dzenie dyskowe jest niedost\u0119pne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/b4755d893f3f8ad7d7aeab3af69f35cf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Postanowili\u015bmy \u201eobej\u015b\u0107 to\u201d i poprosili\u015bmy o t\u0119 sam\u0105 czynno\u015b\u0107 do Nova API. Wynik \u2014 urz\u0105dzenie jest poprawnie pod\u0142\u0105czone i dost\u0119pne wewn\u0105trz serwera. Wygl\u0105da na to, \u017ce problem pojawia si\u0119, gdy block-storage nie odpowiada Cinderowi.<\/p>\n<p><\/p>\n<p>Kolejna trudno\u015b\u0107 czeka\u0142a na nas przy pracy z dyskami. Systemowy wolumin nie m\u00f3g\u0142 zosta\u0107 od\u0142\u0105czony od serwera.<\/p>\n<p><\/p>\n<p>Znowu, sam OpenStack \u201eprzysi\u0119ga\u201d, \u017ce po\u0142\u0105czenie zosta\u0142o zniszczone i teraz mo\u017cna poprawnie pracowa\u0107 z woluminem osobno. Ale API kategorycznie odm\u00f3wi\u0142o przeprowadzenia operacji na dysku. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/952fd7cd11181605c52a7df71cd4f69f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tutaj postanowili\u015bmy szczeg\u00f3lnie nie walczy\u0107, a zmieni\u0107 podej\u015bcie do logiki dzia\u0142ania us\u0142ugi. Skoro istnieje instancja, musi istnie\u0107 tak\u017ce systemowy wolumin. Dlatego u\u017cytkownik tymczasowo nie mo\u017ce usun\u0105\u0107 lub od\u0142\u0105czy\u0107 systemowego \u201edysku\u201d, nie usuwaj\u0105c \u201eserwera\u201d.<\/p>\n<p><\/p>\n<p>OpenStack to do\u015b\u0107 skomplikowany zestaw system\u00f3w z w\u0142asn\u0105 logik\u0105 interakcji i zawi\u0142ym API. Pomaga nam dosy\u0107 szczeg\u00f3\u0142owa dokumentacja i, oczywi\u015bcie, metoda pr\u00f3b i b\u0142\u0119d\u00f3w (gdzie\u017cby bez niej).<\/p>\n<p><\/p>\n<h3 id=\"testovyy-zapusk\">Testowe uruchomienie<\/h3>\n<p><\/p>\n<p>Testowe uruchomienie przeprowadzili\u015bmy w grudniu ubieg\u0142ego roku. G\u0142\u00f3wnym zadaniem by\u0142o sprawdzenie w trybie produkcyjnym naszego projektu z punktu widzenia technicznego oraz UX. Publiczno\u015b\u0107 by\u0142a zapraszana selektywnie, a testowanie mia\u0142o charakter zamkni\u0119ty. Niemniej jednak pozostawili\u015bmy tak\u017ce mo\u017cliwo\u015b\u0107 zg\u0142oszenia dost\u0119pu do test\u00f3w na naszej stronie.<\/p>\n<p><\/p>\n<p>Sam test, oczywi\u015bcie, nie oby\u0142 si\u0119 bez komicznych moment\u00f3w, poniewa\u017c na tym nasze przygody dopiero si\u0119 zaczynaj\u0105. <\/p>\n<p><\/p>\n<p>Po pierwsze, nieco niepoprawnie ocenili\u015bmy zainteresowanie projektem i musieli\u015bmy szybko doda\u0107 w\u0119z\u0142y compute w trakcie testu. Zwyk\u0142y przypadek dla klastra, jednak by\u0142y tu tak\u017ce niuanse. W dokumentacji dla konkretnej wersji TF podana jest konkretna wersja j\u0105dra, na kt\u00f3rym testowano dzia\u0142anie z vRouter. Postanowili\u015bmy uruchamia\u0107 w\u0119z\u0142y z nowszymi j\u0105drami. W rezultacie TF nie otrzyma\u0142 tras z w\u0119z\u0142\u00f3w. Musieli\u015bmy nagle cofn\u0105\u0107 j\u0105dra.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/377208246d5e396317fb934a35ed1227.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Inny komiczny moment dotyczy funkcji przycisku \u201ezmie\u0144 has\u0142o\u201d w osobistym panelu. <\/p>\n<p><\/p>\n<p>Postanowili\u015bmy u\u017cy\u0107 JWT do organizacji dost\u0119pu do panelu u\u017cytkownika, aby unikn\u0105\u0107 pracy z sesjami. Poniewa\u017c systemy s\u0105 r\u00f3\u017cnorodne i szeroko rozproszone, zarz\u0105dzamy naszym tokenem, w kt\u00f3ry \"opakowujemy\" sesje z systemu billingowego oraz token z OpenStacka. Przy zmianie has\u0142a, token oczywi\u015bcie \"wygasa\", poniewa\u017c dane u\u017cytkownika staj\u0105 si\u0119 niewa\u017cne i trzeba go odnowi\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/daa27256d0b888b2c59d4bc6129f600d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zlekcewa\u017cyli\u015bmy ten aspekt, a zasob\u00f3w, by szybko doda\u0107 t\u0119 cz\u0119\u015b\u0107, po prostu zabrak\u0142o. Musieli\u015bmy usun\u0105\u0107 funkcjonalno\u015b\u0107 tu\u017c przed uruchomieniem test\u00f3w.<br \/>\nObecnie wykonujemy logout u\u017cytkownika, je\u015bli has\u0142o zosta\u0142o zmienione.<\/p>\n<p><\/p>\n<p>Mimo tych niuans\u00f3w, testowanie przebieg\u0142o dobrze. W ci\u0105gu kilku tygodni odwiedzi\u0142o nas oko\u0142o 300 os\u00f3b. Mieli\u015bmy okazj\u0119 zobaczy\u0107 produkt oczami u\u017cytkownik\u00f3w, przetestowa\u0107 go w realnych warunkach i zebra\u0107 warto\u015bciowe opinie. <\/p>\n<p><\/p>\n<h3 id=\"prodolzhenie-sleduet\">Ci\u0105g dalszy nast\u0105pi<\/h3>\n<p><\/p>\n<p>Dla wielu z nas to pierwszy projekt takiej skali. Wyci\u0105gn\u0119li\u015bmy szereg cennych lekcji o tym, jak pracowa\u0107 w zespole, podejmowa\u0107 decyzje architektoniczne i projektowe. Jak integrowa\u0107 z\u0142o\u017cone systemy przy ograniczonych zasobach i wprowadza\u0107 je na rynek. <\/p>\n<p><\/p>\n<p>Oczywi\u015bcie, jest nad czym pracowa\u0107 zar\u00f3wno w zakresie kodu, jak i na styku integracji system\u00f3w. Projekt jest do\u015b\u0107 m\u0142ody, ale jeste\u015bmy pe\u0142ni ambicji, aby przekszta\u0142ci\u0107 go w niezawodn\u0105 i wygodn\u0105 us\u0142ug\u0119.<\/p>\n<p><\/p>\n<p>Systemy ju\u017c uda\u0142o nam si\u0119 przekona\u0107. Bill pos\u0142usznie zajmuje si\u0119 obliczaniem, wystawianiem faktur i zapytaniami od u\u017cytkownik\u00f3w w swojej kom\u00f3rce. \u201eMagia\u201d tungstenowych p\u00f3l zapewnia nam stabilne po\u0142\u0105czenie. A tylko OpenStack czasami sprawia problemy, krzycz\u0105c co\u015b w stylu \u201eWSREP jeszcze nie przygotowa\u0142 w\u0119z\u0142a do u\u017cytku aplikacji\u201d. Ale to zupe\u0142nie inna historia\u2026<\/p>\n<p><\/p>\n<p>Niedawno uruchomili\u015bmy us\u0142ug\u0119.<br \/>\nWszystkie szczeg\u00f3\u0142y mo\u017cesz pozna\u0107 na naszej <noindex><a rel=\"nofollow\" href=\"https:\/\/clo.ru?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=product&amp;utm_term=first_clo\">stronie<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia powstania chmurowego serwisu, przyprawiona cyberpunkem\" src=\"\/wp-content\/uploads\/2020\/04\/32550980b529a5d7b395b3962218e53e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Zesp\u00f3\u0142 programistyczny CLO<\/em><\/p>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Przydatne linki<\/b><\/p>\n<p><strong>OpenStack<\/strong><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/nova\/latest\/\">https:\/\/docs.openstack.org\/nova\/latest\/<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/keystone\/latest\/\">https:\/\/docs.openstack.org\/keystone\/latest\/<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/cinder\/latest\/\">https:\/\/docs.openstack.org\/cinder\/latest\/<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/glance\/latest\/\">https:\/\/docs.openstack.org\/glance\/latest\/<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Tungsten Fabric<\/strong><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/docs.tungsten.io\/en\/latest\/user\/getting-started\/index.html\">http:\/\/docs.tungsten.io\/en\/latest\/user\/getting-started\/index.html<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.juniper.net\/documentation\/en_US\/contrail-cloud10.0\/topics\/concept\/contrail-cloud-openstack-integration-overview.html\">https:\/\/www.juniper.net\/documentation\/en_US\/contrail-cloud10.0\/topics\/concept\/contrail-cloud-openstack-integration-overview.html<\/a><\/noindex><\/li>\n<\/ul>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/first\/blog\/493606\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0442\u0430\u0436\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 IT \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043a\u043b\u0430\u0434\u0438\u0441\u0442\u044b\u043c\u0438, \u043c\u043e\u043b\u0447\u0430\u043b\u0438\u0432\u044b\u043c\u0438, \u0432\u0437\u0431\u0430\u043b\u043c\u043e\u0448\u043d\u044b\u043c\u0438, \u0441\u0443\u0440\u043e\u0432\u044b\u043c\u0438. \u041c\u043e\u0433\u0443\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c \u043a \u0441\u0435\u0431\u0435 \u0438\u043b\u0438 \u043e\u0442\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c. \u0422\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u00ab\u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f\u00bb \u0441 \u043d\u0438\u043c\u0438, \u043b\u0430\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u00ab\u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u0430\u043c\u043d\u044f\u043c\u0438\u00bb \u0438 \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0412\u043e\u0442 \u0438 \u043d\u0430\u043c \u0432\u044b\u043f\u0430\u043b\u0430 \u0447\u0435\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0447\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u00ab\u0443\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u00bb [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79154,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79153","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0442\u0430\u0436\u0430.\" \/>\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\/pl\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043f\u0440\u0438\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u043a\u0438\u0431\u0435\u0440\u043f\u0430\u043d\u043a\u043e\u043c | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0442\u0430\u0436\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom\" \/>\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=\"2020-04-24T17:42:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-24T17:42:43+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\udd47Historia tworzenia us\u0142ugi chmurowej, przyprawiona cyberpunkiem | ProHoster","description":"Wraz ze wzrostem do\u015bwiadczenia.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043f\u0440\u0438\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u043a\u0438\u0431\u0435\u0440\u043f\u0430\u043d\u043a\u043e\u043c | ProHoster","og:description":"\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0442\u0430\u0436\u0430.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","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":"2020-04-24T17:42:43+00:00","article:modified_time":"2020-04-24T17:42:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79153","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:43:24","updated":"2022-10-02 03:25:48","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/79153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=79153"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/79153\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/79154"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=79153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=79153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=79153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}