{"id":35006,"date":"2019-10-31T22:01:47","date_gmt":"2019-10-31T19:01:47","guid":{"rendered":"https:\/\/prohoster.info\/blog\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps\/"},"modified":"2019-10-31T22:01:47","modified_gmt":"2019-10-31T19:01:47","slug":"5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","title":{"rendered":"5 zasad zdrowego rozs\u0105dku dla tworzenia aplikacji cloud-native","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Aplikacje \u201echmurowo-zorientowane\u201d (cloud native) lub po prostu \u201echmurowe\u201d s\u0105 tworzone specjalnie do pracy w infrastrukturach chmurowych. Zwykle budowane s\u0105 jako zestaw lu\u017ano powi\u0105zanych mikrous\u0142ug, zapakowanych w kontenery, kt\u00f3re s\u0105 zarz\u0105dzane przez platform\u0119 chmurow\u0105. Takie aplikacje s\u0105 domy\u015blnie gotowe na awarie, co oznacza, \u017ce niezawodnie dzia\u0142aj\u0105 i skaluj\u0105 si\u0119 nawet przy powa\u017cnych awariach na poziomie infrastruktury. Drug\u0105 stron\u0105 medalu s\u0105 zestawy ogranicze\u0144 (kontrakty), kt\u00f3re platforma chmurowa nak\u0142ada na aplikacje kontenerowe, aby m\u00f3c nimi zarz\u0105dza\u0107 w trybie automatycznym.<\/p>\n<p><img decoding=\"async\" alt=\"5 zasad zdrowego rozs\u0105dku dla tworzenia aplikacji cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/1f4af6f356ed36d3fbd8adef333501fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPomimo doskona\u0142ej \u015bwiadomo\u015bci potrzeby i znaczenia przej\u015bcia na aplikacje chmurowe, wiele organizacji wci\u0105\u017c nie wie, od czego zacz\u0105\u0107. W tym wpisie zaprezentujemy szereg zasad, kt\u00f3rych przestrzeganie podczas tworzenia aplikacji kontenerowych pozwoli zrealizowa\u0107 potencja\u0142 platform chmurowych i osi\u0105gn\u0105\u0107 niezawodne dzia\u0142anie oraz skalowanie aplikacji nawet przy powa\u017cnych awariach na poziomie infrastruktury IT. Ostatecznym celem przedstawionych tutaj zasad jest nauczenie si\u0119 tworzenia aplikacji, kt\u00f3re mog\u0105 by\u0107 automatycznie zarz\u0105dzane przez platformy chmurowe, takie jak Kubernetes.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Zasady projektowania oprogramowania<\/h3>\n<p>\nW \u015bwiecie programowania zasady oznaczaj\u0105 do\u015b\u0107 og\u00f3lne regu\u0142y, kt\u00f3re nale\u017cy przestrzega\u0107 podczas tworzenia oprogramowania. Mo\u017cna je zastosowa\u0107 w pracy z dowolnym j\u0119zykiem programowania. Ka\u017cda zasada ma swoje cele, a narz\u0119dziem do ich osi\u0105gni\u0119cia s\u0105 zazwyczaj wzorce i praktyki. Istnieje r\u00f3wnie\u017c szereg fundamentalnych zasad tworzenia jako\u015bciowego oprogramowania, z kt\u00f3rych wynikaj\u0105 wszystkie pozosta\u0142e. Przyk\u0142ady fundamentalnych zasad to:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/KISS_(%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF)\">KISS<\/a><\/noindex> (Keep it simple, stupid) \u2013 nie komplikowa\u0107;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Don%E2%80%99t_repeat_yourself\">DRY<\/a><\/noindex> (Don\u2019t repeat yourself) \u2013 nie powtarza\u0107 si\u0119;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/YAGNI\">YAGNI<\/a><\/noindex> (You aren\u2019t gonna need it) \u2013 nie tworzy\u0107 tego, czego nie ma bezpo\u015bredniej potrzeby;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8\">SoC<\/a><\/noindex> (Separation of concerns) \u2013 oddziela\u0107 odpowiedzialno\u015bci.<\/li>\n<\/ul>\n<p>\nJak wida\u0107, zasady te nie okre\u015blaj\u0105 \u017cadnych konkretnych regu\u0142, lecz dotycz\u0105 tzw. przes\u0142anek zdrowego rozs\u0105dku opartych na praktycznym do\u015bwiadczeniu, kt\u00f3re dzieli wielu programist\u00f3w i do kt\u00f3rych regularnie si\u0119 odwo\u0142uj\u0105.<br \/>\nPonadto istnieje <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/SOLID_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)\">SOLID<\/a><\/noindex> \u2013 zestaw pi\u0119ciu podstawowych zasad programowania i projektowania obiektowego, sformu\u0142owanych przez Roberta Martina. SOLID obejmuje og\u00f3lne i otwarte na interpretacj\u0119 zasady, kt\u00f3re \u2013 je\u015bli stosowane \u0142\u0105cznie \u2013 pomagaj\u0105 w tworzeniu bardziej jako\u015bciowych system\u00f3w oprogramowania i ich lepszym utrzymywaniu w d\u0142ugim okresie.<\/p>\n<p>Zasady SOLID odnosz\u0105 si\u0119 do sfery OOP i formu\u0142owane s\u0105 w j\u0119zyku poj\u0119\u0107 i koncepcji takich jak klasy, interfejsy i dziedziczenie. Analogicznie, r\u00f3wnie\u017c dla aplikacji chmurowych mo\u017cna sformu\u0142owa\u0107 zasady rozwoju, przy czym podstawowym elementem nie b\u0119dzie klasa, a kontener. Stosuj\u0105c te zasady, mo\u017cna tworzy\u0107 aplikacje kontenerowe, kt\u00f3re lepiej odpowiadaj\u0105 celom i zadaniom platform chmurowych, takich jak Kubernetes.<\/p>\n<h3>Konteneryzacja w chmurze: podej\u015bcie Red Hat<\/h3>\n<p>\nDzi\u015b do kontener\u00f3w mo\u017cna stosunkowo \u0142atwo pakowa\u0107 praktycznie ka\u017cd\u0105 aplikacj\u0119. Jednak aby aplikacje mog\u0142y by\u0107 skutecznie automatyzowane i orkiestracje w ramach platformy chmurowej typu Kubernetes, wymagane s\u0105 dodatkowe wysi\u0142ki.<br \/>\nPodstaw\u0105 dla poni\u017cszych pomys\u0142\u00f3w by\u0142a metodologia <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/SOLID_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)\">The Twelve-Factor App<\/a><\/noindex> i wiele innych prac dotycz\u0105cych r\u00f3\u017cnych aspekt\u00f3w tworzenia aplikacji internetowych, od zarz\u0105dzania kodem \u017ar\u00f3d\u0142owym po modele skalowalno\u015bci. Opisane zasady odnosz\u0105 si\u0119 tylko do rozwoju aplikacji kontenerowych, kt\u00f3re s\u0105 zbudowane na bazie mikroserwis\u00f3w i przeznaczone dla platform chmurowych, takich jak Kubernetes. Podstawowym elementem w naszych rozwa\u017caniach jest obraz kontenera, a przez docelowe \u015brodowisko wykonawcze kontener\u00f3w rozumiemy platform\u0119 orkiestracji kontener\u00f3w. Celem proponowanych zasad jest stworzenie kontener\u00f3w, dla kt\u00f3rych na wi\u0119kszo\u015bci platform orkiestracji mo\u017cna automatyzowa\u0107 zadania zwi\u0105zane z dystrybucj\u0105 (scheduling \u2013 wyb\u00f3r hosta do uruchomienia instancji kontenera), skalowaniem i monitorowaniem. Zasady s\u0105 przedstawiane w dowolnej kolejno\u015bci.<\/p>\n<h3>Zasada jednolito\u015bci zada\u0144 (Single Concern Principle, SCP)<\/h3>\n<p>\nTa zasada jest w du\u017cej mierze podobna do zasady pojedynczej odpowiedzialno\u015bci (Single Responsibility Principle, <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%B5%D0%B4%D0%B8%D0%BD%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8\">SRP<\/a><\/noindex>), kt\u00f3ry jest cz\u0119\u015bci\u0105 zestawu SOLID i stwierdza, \u017ce ka\u017cdy obiekt powinien mie\u0107 jedn\u0105 odpowiedzialno\u015b\u0107, a ta odpowiedzialno\u015b\u0107 powinna by\u0107 ca\u0142kowicie enkapsulowana w klasie. Istota SRP polega na tym, \u017ce ka\u017cda odpowiedzialno\u015b\u0107 to pow\u00f3d do zmian, a klasa powinna mie\u0107 tylko jeden pow\u00f3d do zmiany.<\/p>\n<p>W SCP zamiast s\u0142owa \u201eodpowiedzialno\u015b\u0107\u201d (responsibility) u\u017cywamy s\u0142owa \u201ezadanie\u201d (concern), aby wskaza\u0107 na wy\u017cszy poziom abstrakcji i szersze przeznaczenie kontenera w por\u00f3wnaniu do klasy OOP. Je\u015bli celem SRP jest posiadanie tylko jednego powodu do zmian, to za SCP stoi ch\u0119\u0107 zwi\u0119kszenia mo\u017cliwo\u015bci ponownego u\u017cycia i wymiany kontener\u00f3w. Przestrzegaj\u0105c SRP i tworz\u0105c kontener, kt\u00f3ry rozwi\u0105zuje jedno zadanie i robi to w spos\u00f3b funkcjonalnie kompletny, zwi\u0119kszasz szanse na ponowne u\u017cycie tego kontenera w r\u00f3\u017cnych kontekstach aplikacji.<\/p>\n<p>Zasada SCP stwierdza, \u017ce ka\u017cdy kontener powinien rozwi\u0105zywa\u0107 jedno jedyne zadanie i robi\u0107 to dobrze. Co wi\u0119cej, SCP w \u015bwiecie kontener\u00f3w osi\u0105ga si\u0119 \u0142atwiej ni\u017c SRP w \u015bwiecie OOP, poniewa\u017c kontenery zwykle wykonuj\u0105 jeden proces, a przez wi\u0119kszo\u015b\u0107 czasu ten proces rozwi\u0105zuje jedno jedyne zadanie.<\/p>\n<p>Je\u015bli jaki\u015b mikrous\u0142uga kontenerowa musi rozwi\u0105zywa\u0107 kilka zada\u0144 jednocze\u015bnie, mo\u017cna j\u0105 rozbi\u0107 na kontenery jednozadaniowe i po\u0142\u0105czy\u0107 je w ramach jednego podu (jednostki wdro\u017ceniowej platformy kontenerowej) przy u\u017cyciu wzorc\u00f3w sidecar i kontener\u00f3w inicjalizacyjnych. Ponadto SCP u\u0142atwia wymian\u0119 starego kontenera (np. serwera WWW lub brokera wiadomo\u015bci) na nowy, kt\u00f3ry rozwi\u0105zuje to samo zadanie, ale ma rozszerzon\u0105 funkcjonalno\u015b\u0107 lub lepiej si\u0119 skaluj\u0119.<\/p>\n<p><img decoding=\"async\" alt=\"5 zasad zdrowego rozs\u0105dku dla tworzenia aplikacji cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/a029e1ca36ace66550c94087e4aecc8e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Zasada wysokiej obserwowalno\u015bci (High Observability Principle, HOP)<\/h3>\n<p>\nPodczas korzystania z kontener\u00f3w jako zunifikowanego sposobu pakowania i uruchamiania aplikacji same aplikacje s\u0105 traktowane jako \u201eczarna skrzynka\u201d. Jednak je\u015bli s\u0105 to kontenery chmurowe, musz\u0105 one dostarcza\u0107 \u015brodowisku wykonawczemu specjalne interfejsy API, aby monitorowa\u0107 integralno\u015b\u0107 kontener\u00f3w i w razie potrzeby podejmowa\u0107 odpowiednie dzia\u0142ania. Bez tego nie uda si\u0119 zunifikowa\u0107 automatyzacji aktualizacji kontener\u00f3w i zarz\u0105dzania ich cyklem \u017cycia, co z kolei pogorszy niezawodno\u015b\u0107 i u\u017cyteczno\u015b\u0107 systemu oprogramowania.<\/p>\n<p><img decoding=\"async\" alt=\"5 zasad zdrowego rozs\u0105dku dla tworzenia aplikacji cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/7df1320108d9b635c10c6cf41d5dfef6.jpg\" style=\"display:block;margin: 0 auto;\" \/> <br \/>\nW praktyce aplikacja kontenerowa powinna przynajmniej posiada\u0107 API do r\u00f3\u017cnych typ\u00f3w kontroli integralno\u015bci: test\u00f3w aktywno\u015bci (liveness) i test\u00f3w gotowo\u015bci (readiness). Je\u015bli aplikacja aspiruje do wi\u0119cej, powinna dostarcza\u0107 r\u00f3wnie\u017c inne \u015brodki kontroli swojego stanu. Na przyk\u0142ad, rejestrowanie wa\u017cnych zdarze\u0144 przez STDERR i STDOUT w celu agregacji log\u00f3w za pomoc\u0105 Fluentd, Logstash i innych podobnych narz\u0119dzi. A tak\u017ce integracj\u0119 z bibliotekami \u015bledzenia i zbierania metryk, takimi jak OpenTracing, Prometheus itd.<\/p>\n<p>Og\u00f3lnie, aplikacj\u0119 mo\u017cna nadal traktowa\u0107 jako \u201eczarn\u0105 skrzynk\u0119\u201d, ale musi by\u0107 ona wyposa\u017cona we wszystkie API, kt\u00f3re s\u0105 potrzebne platformie, aby optymalnie j\u0105 monitorowa\u0107 i zarz\u0105dza\u0107 ni\u0105.<\/p>\n<h3>Zasada dostosowania do cyklu \u017cycia (Life-cycle Conformance Principle, LCP)<\/h3>\n<p>\nLCP jest antytez\u0119 HOP. Je\u015bli HOP stwierdza, \u017ce kontener musi dostarcza\u0107 platformie interfejsy API do odczytu, LCP wymaga od aplikacji zdolno\u015bci do odbierania informacji od platformy. Co wi\u0119cej, kontener musi nie tylko odbiera\u0107 zdarzenia, ale tak\u017ce na nie reagowa\u0107. St\u0105d nazwa zasady, kt\u00f3r\u0105 mo\u017cna traktowa\u0107 jako wymaganie dostarczenia platformie interfejs\u00f3w API do zapisu.<\/p>\n<p><img decoding=\"async\" alt=\"5 zasad zdrowego rozs\u0105dku dla tworzenia aplikacji cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/f32f5d133597ae3905206badc6677f92.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPlatformy maj\u0105 r\u00f3\u017cne typy zdarze\u0144, kt\u00f3re pomagaj\u0105 zarz\u0105dza\u0107 cyklem \u017cycia kontenera. Jednak to sama aplikacja powinna decydowa\u0107, kt\u00f3re z nich przyjmowa\u0107 i jak na nie reagowa\u0107.<\/p>\n<p>Jest oczywiste, \u017ce niekt\u00f3re zdarzenia s\u0105 wa\u017cniejsze od innych. Na przyk\u0142ad, je\u015bli aplikacja \u017ale znosi awaryjne zako\u0144czenie pracy, musi odbiera\u0107 wiadomo\u015bci signal: terminate (SIGTERM) i jak najszybciej inicjowa\u0107 procedur\u0119 zako\u0144czenia, aby zd\u0105\u017cy\u0107 przed otrzymaniem signal: kill (SIGKILL), kt\u00f3ry nast\u0119puje po SIGTERM.<\/p>\n<p>Ponadto dla cyklu \u017cycia aplikacji istotne mog\u0105 by\u0107 takie zdarzenia, jak PostStart i PreStop. Na przyk\u0142ad, po uruchomieniu aplikacji mo\u017ce by\u0107 wymagany pewien czas na \"rozgrzewk\u0119\", zanim b\u0119dzie mog\u0142a odpowiada\u0107 na zapytania. Lub aplikacja mo\u017ce wymaga\u0107 szczeg\u00f3lnego zwolnienia zasob\u00f3w podczas zako\u0144czenia pracy.<\/p>\n<h3>Zasada niezmienno\u015bci obrazu kontenera (Image Immutability Principle, IIP)<\/h3>\n<p>\nPowszechnie uwa\u017ca si\u0119, \u017ce aplikacje kontenerowe powinny pozostawa\u0107 niezmienne po zbudowaniu, nawet je\u015bli s\u0105 uruchamiane w r\u00f3\u017cnych \u015brodowiskach. St\u0105d wynika potrzeba eksternalizacji przechowywania danych w czasie wykonywania (innymi s\u0142owy, u\u017cywania do tego zewn\u0119trznych narz\u0119dzi), a tak\u017ce polegania na zewn\u0119trznych, dostosowanych do konkretnego \u015brodowiska wykonawczego, konfiguracjach, zamiast modyfikowa\u0107 lub tworzy\u0107 unikalne kontenery dla ka\u017cdego \u015brodowiska. Po jakichkolwiek zmianach w aplikacji obraz kontenera powinien by\u0107 odbudowywany i wdra\u017cany we wszystkich u\u017cywanych \u015brodowiskach. Przy okazji, w zarz\u0105dzaniu systemami IT stosuje si\u0119 podobn\u0105 zasad\u0119, znan\u0105 jako zasada niezmienno\u015bci serwer\u00f3w i infrastruktury. <\/p>\n<p>Celem IIP jest zapobieganie tworzeniu oddzielnych obraz\u00f3w kontener\u00f3w dla r\u00f3\u017cnych \u015brodowisk wykonawczych i u\u017cywanie wsz\u0119dzie tego samego obrazu wraz z odpowiedni\u0105 konfiguracj\u0105 dla konkretnego \u015brodowiska. Przestrzeganie tej zasady umo\u017cliwia realizacj\u0119 takich istotnych z perspektywy automatyzacji praktyk system\u00f3w chmurowych, jak cofnienie (roll-back) i wdro\u017cenie (roll-forward) aktualizacji aplikacji.<\/p>\n<p><img decoding=\"async\" alt=\"5 zasad zdrowego rozs\u0105dku dla tworzenia aplikacji cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/86b93724830b37f82bf289b797407480.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Zasada jednorazowo\u015bci proces\u00f3w (Process Disposability Principle, PDP)<\/h3>\n<p>\nJedn\u0105 z najwa\u017cniejszych cech kontenera jest jego efemeryczno\u015b\u0107: instancja kontenera jest \u0142atwa do stworzenia i \u0142atwa do zniszczenia, dlatego w ka\u017cdej chwili mo\u017cna j\u0105 \u0142atwo zast\u0105pi\u0107 inn\u0105 instancj\u0105. Powod\u00f3w takiej wymiany mo\u017ce by\u0107 wiele: niezdanie testu na sprawno\u015b\u0107, skalowanie aplikacji, przenoszenie na inny host, wyczerpanie zasob\u00f3w platformy lub inne sytuacje. <\/p>\n<p><img decoding=\"async\" alt=\"5 zasad zdrowego rozs\u0105dku dla tworzenia aplikacji cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/858287b23c276363313e35cf18b81190.jpg\" style=\"display:block;margin: 0 auto;\" \/> <br \/>\nW zwi\u0105zku z tym, aplikacje kontenerowe powinny przechowywa\u0107 swoje dane za pomoc\u0105 zewn\u0119trznych narz\u0119dzi lub wykorzystywa\u0107 wewn\u0119trzne schematy rozproszone z redundancj\u0105. Dodatkowo, aplikacja powinna uruchamia\u0107 si\u0119 szybko i ko\u0144czy\u0107 dzia\u0142anie w kr\u00f3tkim czasie, a tak\u017ce by\u0107 gotowa na niespodziewan\u0105 awari\u0119 sprz\u0119tu.<\/p>\n<p>Jedn\u0105 z praktyk, kt\u00f3ra wspiera wdra\u017canie tej zasady, jest tworzenie ma\u0142ych kontener\u00f3w. \u015arodowiska chmurowe mog\u0105 automatycznie dobiera\u0107 hosta do uruchomienia instancji kontenera, dlatego im mniejszy rozmiar kontenera, tym szybciej si\u0119 uruchomi \u2013 po prostu szybciej skopiuje si\u0119 na docelowego hosta przez sie\u0107.<\/p>\n<h3>Zasada samowystarczalno\u015bci (Self-containment Principle, S-CP)<\/h3>\n<p>\nZgodnie z t\u0105 zasad\u0105, na etapie budowy kontenera wszystkie niezb\u0119dne komponenty s\u0105 w niego w\u0142\u0105czane. Kontener powinien by\u0107 tworzony z za\u0142o\u017ceniem, \u017ce w systemie jest tylko czyste j\u0105dro Linux, dlatego wszystkie dodatkowe biblioteki musz\u0105 by\u0107 umieszczone w samym kontenerze. Tam r\u00f3wnie\u017c powinny znajdowa\u0107 si\u0119 takie elementy, jak \u015brodowisko wykonawcze dla odpowiedniego j\u0119zyka programowania, platforma aplikacji (je\u015bli to konieczne) oraz inne zale\u017cno\u015bci, kt\u00f3re b\u0119d\u0105 potrzebne podczas dzia\u0142ania aplikacji kontenerowej. <\/p>\n<p><img decoding=\"async\" alt=\"5 zasad zdrowego rozs\u0105dku dla tworzenia aplikacji cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/ecc7425510d63e4914c0c9a7e90b02a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Wyj\u0105tki s\u0105 robione jedynie dla konfiguracji, kt\u00f3re r\u00f3\u017cni\u0105 si\u0119 w zale\u017cno\u015bci od \u015brodowiska, i powinny by\u0107 dostarczane na etapie wykonania, na przyk\u0142ad za po\u015brednictwem Kubernetes ConfigMap.<\/p>\n<p>Aplikacja mo\u017ce zawiera\u0107 kilka skonteneryzowanych komponent\u00f3w, na przyk\u0142ad oddzielny kontener DBMS w sk\u0142adzie kontenerowej aplikacji webowej. Zgodnie z zasad\u0105 S-CP, te kontenery powinny by\u0107 zachowane oddzielnie, tak aby kontener DBMS zawiera\u0142 wszystko, co potrzebne do dzia\u0142ania bazy danych, a kontener aplikacji webowej \u2013 wszystko niezb\u0119dne do dzia\u0142ania aplikacji webowej, w tym serwer webowy. W wyniku tego, w trakcie dzia\u0142ania kontener aplikacji webowej b\u0119dzie zale\u017cny od kontenera DBMS i b\u0119dzie si\u0119 z nim komunikowa\u0142 w razie potrzeby.<\/p>\n<h3>Zasada ograniczenia na etapie wykonania (Runtime Confinement Principle, RCP)<\/h3>\n<p>\nZasada S-CP okre\u015bla, jak powinien by\u0107 zbudowany kontener i co powinien zawiera\u0107 binarny plik obrazu. Jednak kontener to nie tylko \u201eczarna skrzynka\u201d, kt\u00f3ra ma tylko jedn\u0105 cech\u0119 \u2013 rozmiar pliku. W trakcie dzia\u0142ania kontener zyskuje tak\u017ce inne wymiary: obj\u0119to\u015b\u0107 u\u017cywanej pami\u0119ci, czas procesora oraz inne zasoby systemowe.<\/p>\n<p><img decoding=\"async\" alt=\"5 zasad zdrowego rozs\u0105dku dla tworzenia aplikacji cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/a52e6a656892e57479ac014a3e6f4316.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI tutaj przyda si\u0119 zasada RCP, zgodnie z kt\u00f3r\u0105 kontener powinien oddziela\u0107 swoje wymagania dotycz\u0105ce zasob\u00f3w systemowych i przekazywa\u0107 je platformie. Maj\u0105c profile zasob\u00f3w ka\u017cdego kontenera (jakie zasoby CPU, pami\u0119ci, sieci i systemu dyskowego s\u0105 mu potrzebne), platforma mo\u017ce optymalnie realizowa\u0107 dyspozycj\u0119 i automatyczne skalowanie, zarz\u0105dza\u0107 wydajno\u015bci\u0105 IT oraz utrzymywa\u0107 poziomy SLA dla kontener\u00f3w.<\/p>\n<p>Opr\u00f3cz zaspokajania wymaga\u0144 dotycz\u0105cych zasob\u00f3w kontenera, aplikacja r\u00f3wnie\u017c musi przestrzega\u0107 wyznaczonych przez siebie ram. W przeciwnym razie, w przypadku niedoboru zasob\u00f3w, platforma z wi\u0119kszym prawdopodobie\u0144stwem umie\u015bci j\u0105 na li\u015bcie aplikacji, kt\u00f3re nale\u017cy przerwa\u0107 lub migrowa\u0107.<\/p>\n<p>M\u00f3wi\u0105c o orientacji na chmur\u0119, przede wszystkim mamy na my\u015bli spos\u00f3b dzia\u0142ania. <br \/>\nPowy\u017cej sformu\u0142owali\u015bmy szereg og\u00f3lnych zasad, kt\u00f3re stanowi\u0105 metodologiczny fundament do budowania wysokiej jako\u015bci aplikacji kontenerowych dla \u015brodowisk chmurowych.<\/p>\n<p>Warto zauwa\u017cy\u0107, \u017ce opr\u00f3cz tych og\u00f3lnych zasad b\u0119dziesz r\u00f3wnie\u017c potrzebowa\u0107 dodatkowych zaawansowanych metod i technik pracy z kontenerami. Ponadto mamy kilka kr\u00f3tkich zalece\u0144, kt\u00f3re maj\u0105 bardziej konkretny charakter i powinny by\u0107 stosowane (lub nie) w zale\u017cno\u015bci od sytuacji:<\/p>\n<ul>\n<li>Staraj si\u0119 zmniejsza\u0107 rozmiar obraz\u00f3w: usuwaj pliki tymczasowe i nie instaluj niepotrzebnych pakiet\u00f3w \u2013 im mniejszy rozmiar kontenera, tym szybciej jest on budowany i kopiowany na docelowy host przez sie\u0107.<\/li>\n<li>Skup si\u0119 na losowych identyfikatorach u\u017cytkownik\u00f3w (User-ID): nie u\u017cywaj polecenia sudo ani \u017cadnych specjalnych identyfikator\u00f3w u\u017cytkownik\u00f3w do uruchamiania swoich kontener\u00f3w.<\/li>\n<li>Oznaczaj wa\u017cne porty: numery port\u00f3w mo\u017cna ustala\u0107 tak\u017ce w czasie dzia\u0142ania, ale lepiej wskaza\u0107 je za pomoc\u0105 polecenia EXPOSE \u2013 innym ludziom i programom b\u0119dzie \u0142atwiej korzysta\u0107 z Twoich obraz\u00f3w. <\/li>\n<li>Przechowuj dane trwa\u0142e na wolumenach: dane, kt\u00f3re musz\u0105 pozosta\u0107 po zniszczeniu kontenera, nale\u017cy zapisywa\u0107 na wolumenach.<\/li>\n<li>Zadawaj metadane obrazu: tagi, etykiety i adnotacje u\u0142atwiaj\u0105 korzystanie z obraz\u00f3w \u2013 inni deweloperzy b\u0119d\u0105 ci wdzi\u0119czni.<\/li>\n<li>Synchronizuj hosta i obrazy: niekt\u00f3re aplikacje kontenerowe wymagaj\u0105 synchronizacji kontenera z hostem zgodnie z okre\u015blonymi atrybutami, takimi jak czas czy identyfikator maszyny.<\/li>\n<li>Na koniec dzielimy si\u0119 szablonami i najlepszymi praktykami, kt\u00f3re pomog\u0105 w efektywnym wprowadzaniu wymienionych powy\u017cej zasad:<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/luebken\/container-patterns\">www.slideshare.net\/luebken\/container-patterns<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/userguide\/eng-image\/dockerfile_best-practices\">docs.docker.com\/engine\/userguide\/eng-image\/dockerfile_best-practices<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"http:\/\/docs.projectatomic.io\/container-best-practices\">docs.projectatomic.io\/container-best-practices<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openshift.com\/enterprise\/3.0\/creating_images\/guidelines.html\">docs.openshift.com\/enterprise\/3.0\/creating_images\/guidelines.html<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/system\/files\/conference\/hotcloud16\/hotcloud16_burns.pdf\">www.usenix.org\/system\/files\/conference\/hotcloud16\/hotcloud16_burns.pdf<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/leanpub.com\/k8spatterns\/\">leanpub.com\/k8spatterns<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/\">12factor.net<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?intcmp=701f20000012s47AAA&amp;PKFormID=0x5789474c4\"><b>Webinar po nowej wersji OpenShift Container Platform \u2013 4<\/b><\/a><\/noindex><br \/>\n11 czerwca o 11:00<\/p>\n<p>Czego si\u0119 nauczysz:<\/p>\n<ul>\n<li>Niezmienny Red Hat Enterprise Linux CoreOS<\/li>\n<li>Siatka us\u0142ug OpenShift<\/li>\n<li>Framework operatora<\/li>\n<li>Framework Knative<\/li>\n<\/ul>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/455024\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u00ab\u041e\u0431\u043b\u0430\u0447\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00bb (cloud native) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445. \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0438 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0441\u043b\u0430\u0431\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439. \u0422\u0430\u043a\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u0441\u0431\u043e\u044f\u043c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u0434\u0435\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u043e\u0442\u043a\u0430\u0437\u0430\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043c\u0435\u0434\u0430\u043b\u0438 \u2013 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26340,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-35006","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u00ab\u041e\u0431\u043b\u0430\u0447\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00bb (cloud native) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445.\" \/>\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\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps\" \/>\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\udd475 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0437\u0434\u0440\u0430\u0432\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f cloud-native apps | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u00ab\u041e\u0431\u043b\u0430\u0447\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00bb (cloud native) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps\" \/>\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:01:47+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:01:47+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\udd475 zasad zdrowego rozs\u0105dku w tworzeniu aplikacji cloud-native | ProHoster","description":"Aplikacje \u201ecloud-native\u201d lub po prostu \u201echmurowe\u201d s\u0105 tworzone specjalnie do pracy w infrastrukturze chmurowej.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","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\udd475 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0437\u0434\u0440\u0430\u0432\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f cloud-native apps | ProHoster","og:description":"\u00ab\u041e\u0431\u043b\u0430\u0447\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00bb (cloud native) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445.","og:url":"https:\/\/prohoster.info\/pl\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","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:01:47+00:00","article:modified_time":"2019-10-31T19:01:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35006","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 21:27:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:11:30","updated":"2026-01-21 21:27:19","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\/35006","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=35006"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/35006\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/26340"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=35006"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=35006"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=35006"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}