{"id":29766,"date":"2021-09-22T09:22:16","date_gmt":"2021-09-22T07:22:16","guid":{"rendered":"https:\/\/nearshore-it.eu\/artykuly\/mikroserwisy-service-mesh-z-istio\/"},"modified":"2024-11-07T15:40:03","modified_gmt":"2024-11-07T14:40:03","slug":"mikroserwisy-service-mesh-z-istio","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/mikroserwisy-service-mesh-z-istio\/","title":{"rendered":"Mikroserwisy \u2013 Service Mesh z Istio"},"content":{"rendered":"\n<div class=\"table-of-contents\">\n    <p class=\"title\">Przejd\u017a do:<\/p>\n    <ol>\n                    <li><a href=\"#czym-jest-istio\">1.  Czym jest Istio<\/a><\/li>\n                    <li><a href=\"#co-dostajemy-prosto-z-pudelka\">2.  Co dostajemy prosto z pude\u0142ka<\/a><\/li>\n                    <li><a href=\"#przyklad-uzycia-istio-zarzadzanie-ruchem-sieciowym\">3.  Przyk\u0142ad u\u017cycia Istio \u2013 zarz\u0105dzanie ruchem sieciowym<\/a><\/li>\n                    <li><a href=\"#podsumowanie\">4.  Podsumowanie<\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"czym-jest-istio\">Czym jest Istio<\/h2>\n\n\n\n<p>Istio jest implementacj\u0105 koncepcji Service Mesh, projektem open-source, stworzonym przez zesp\u00f3\u0142 Google i IBM we wsp\u00f3\u0142pracy z zespo\u0142em Envoy z firmy Lyft. Istio wykorzystuje sprawdzone proxy Envoya, aby zapewni\u0107 korzy\u015bci oferowane przez takie podej\u015bcie do warstwy sieci w klastrze. G\u0142\u00f3wne zalety to: dodanie podstawowej konfiguracji, kt\u00f3ra dostarcza po\u0142\u0105czenie sieciowe, oraz zabezpieczenie i monitorowanie istniej\u0105cych serwis\u00f3w bez zmian w kodzie istniej\u0105cych aplikacji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kubernetes-istio-jak-to-dziala-razem\">Kubernetes \u2013 Istio: jak to dzia\u0142a razem?<\/h3>\n\n\n\n<p>Istio w ekosystemie Kubernetesa dzieli si\u0119 na dwa komponenty: <strong>data plane i control plane.<\/strong><\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.09.22_obraz1_b.png\" alt=\"Istio Service Mesh\" class=\"wp-image-35798\" title=\"\"><\/figure>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Data plane<\/strong> to kolektywna nazwa dla wszystkich proxy Envoy, przez kt\u00f3re przechodzi komunikacja w klastrze. Proxy przechwytuj\u0105 ca\u0142y ruch sieciowy i nak\u0142adaj\u0105 na niego regu\u0142y dostarczone przez nas w konfiguracji. Niekt\u00f3re z mo\u017cliwo\u015bci, jakie daje nam Istio z wykorzystaniem Envoya:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Szczeg\u00f3\u0142owa kontrola ruchu sieciowego za pomoc\u0105 zasad routingu dla HTTP, gRCP, WebSocket oraz pakiet\u00f3w TCP.<\/li>\n\n\n\n<li>Odporno\u015b\u0107 na problemy w funkcjonowaniu sieci, takie jak retry, failovers i circut breakery.<\/li>\n\n\n\n<li>Zabezpieczenie sieci za pomoc\u0105 polityk bezpiecze\u0144stwa oraz limitowanie obci\u0105\u017cenia kontrolowane konfiguracyjnie.<\/li>\n<\/ul>\n\n\n\n<p><strong>Control plane (Istiod)<\/strong> to zestaw komponent\u00f3w, kt\u00f3re dynamicznie zarz\u0105dzaj\u0105 dzia\u0142aniem naszego Service Mesh. Poszczeg\u00f3lne komponenty s\u0105 odpowiedzialne za:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Service discovery i load balancing (Istio utrzymuje tzw. service registry, dzi\u0119ki kt\u00f3remu proxy Envoya mog\u0105 kierowa\u0107 ruchem i rozk\u0142ada\u0107 obci\u0105\u017cenie sieciowe na wiele instancji serwis\u00f3w).<\/li>\n\n\n\n<li>Konfiguracj\u0119 routingu z poziomu plik\u00f3w konfiguracyjnych, kt\u00f3re s\u0105 t\u0142umaczone i nast\u0119pnie propagowane do niskopoziomowego API Envoya.<\/li>\n\n\n\n<li>Obs\u0142ug\u0119 bezpiecze\u0144stwa komunikacji wewn\u0105trz klastra za pomoc\u0105 mTSL oraz zarz\u0105dzanie certyfikatami dla tej\u017ce komunikacji.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"co-dostajemy-prosto-z-pudelka\"><strong>Co dostajemy prosto z pude\u0142ka<\/strong><\/h2>\n\n\n\n<p>Instalacj\u0119 Istio mo\u017cemy rozpocz\u0105\u0107 od wykorzystania jednego z przygotowanych profili konfiguracji, a nast\u0119pnie wprowadza\u0107 dodatkowe zmiany adekwatnie do naszych potrzeb.<\/p>\n\n\n\n<p>Na pocz\u0105tek najlepiej jest skorzysta\u0107 z <span class=\"NormalTextRun CommentStart BCX0 SCXW149707252\">profilu domy\u015blnego<\/span><span class=\"NormalTextRun BCX0 SCXW149707252\">,<\/span>&nbsp;kt\u00f3ry poza bazow\u0105 konfiguracj\u0105 <em>control plane<\/em> i <em>proxy<\/em> dostarcza dodatkowo komponent <em>istio-ingressgateway. <\/em>Pozwala nam on na monitorowanie i kontrol\u0119 ruchu sieciowego wchodz\u0105cego do wewn\u0105trz klastra Kubernetesa.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.09.22_tabela.png\" alt=\"Istio\" class=\"wp-image-35779\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>W bazowej instalacji, bez jakichkolwiek dodatkowych zmian, otrzymujemy w pakiecie mo\u017cliwo\u015bci monitorowania ruchu w klastrze, automatycznie zbierane s\u0105 r\u00f3wnie\u017c <a href=\"https:\/\/istio.io\/latest\/docs\/reference\/config\/metrics\/\" target=\"_blank\" rel=\"noopener\">metryki<\/a> (takie jak liczba oraz czas zapyta\u0144 i odpowiedzi). Jednocze\u015bnie mo\u017cemy te\u017c \u015bledzi\u0107 ka\u017cde zapytanie skierowane do klastra, jak r\u00f3wnie\u017c wykrywa\u0107 problemy w komunikacji, takie jak w\u0105skie gard\u0142a lub zwi\u0119kszenie b\u0142\u0119dnych odpowiedzi z jednego z mikroserwis\u00f3w.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.09.22_obraz2.png\" alt=\"Istio Service Mesh zarz\u0105dzanie ruchem sieciowym\" class=\"wp-image-35782\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Dodatkowo ca\u0142y ruch sieciowy wewn\u0105trz klastra jest automatycznie szyfrowany z u\u017cyciem mechanizmu mTLS, czyli wzajemnego uwierzytelniania mikroserwis\u00f3w za pomoc\u0105 certyfikat\u00f3w X.509, kt\u00f3rych zarz\u0105dzaniem r\u00f3wnie\u017c zajmuje si\u0119 Istio.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.09.22_obraz3_b.png\" alt=\"Istio Service Mesh\" class=\"wp-image-35799\" title=\"\"><\/figure>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Jak wida\u0107, sporo zyskujemy ju\u017c przez samo u\u017cycie Istio, bez jakichkolwiek dodatkowych konfiguracji z naszej strony. Jednak przy niewielkim wysi\u0142ku wykorzystanie Istio otwiera przed nami bardzo du\u017co dodatkowych mo\u017cliwo\u015bci. Poni\u017cej opisz\u0119 jedn\u0105 z nich.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"przyklad-uzycia-istio-zarzadzanie-ruchem-sieciowym\">Przyk\u0142ad u\u017cycia Istio \u2013 zarz\u0105dzanie ruchem sieciowym<\/h2>\n\n\n\n<p>Za\u0142\u00f3\u017cmy, \u017ce pracujemy nad aplikacj\u0105 z\u0142o\u017con\u0105 z kilku aplikacji, kt\u00f3rej architektur\u0119 przedstawiono na poni\u017cszym schemacie.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.09.22_obraz4.png\" alt=\"Istio Mesh\" class=\"wp-image-35784\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>W szczeg\u00f3lno\u015bci zwr\u00f3\u0107my uwag\u0119, \u017ce zainstalowano trzy wersje serwisu \u2018review\u2019, chocia\u017c na ten moment wydaje si\u0119, \u017ce ruch sieciowy trafia tylko do wersji v1.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.09.22_obraz5.png\" alt=\" class=\" class=\"wp-image-35785\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Konfiguracja Istio potwierdza, \u017ce tylko wersja v1 mo\u017ce przyjmowa\u0107 zapytania z serwisu <em>productpage<\/em>. Za\u0142\u00f3\u017cmy dodatkowo, \u017ce nieu\u017cywany na ten moment modu\u0142 <em>ratings<\/em> s\u0142u\u017cy do &nbsp;nowej funkcjonalno\u015bci, dost\u0119pnej dopiero od v2 us\u0142ugi <em>reviews<\/em>. Je\u015bli w ten sytuacji chcieliby\u015bmy skierowa\u0107 cz\u0119\u015b\u0107 zapyta\u0144 (w naszej konfiguracji 10%) do nowej wersji us\u0142ugi (tzw. canary deployment), mo\u017cemy to zrobi\u0107 za pomoc\u0105 niewielkiej modyfikacji istniej\u0105cej konfiguracji.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.09.22_obraz6.png\" alt=\"Istio Mesh\" class=\"wp-image-35786\" title=\"\"><\/figure>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Efekt takiej zmiany na ruch sieciowy w naszej aplikacji wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.09.22_obraz7.png\" alt=\" class=\" class=\"wp-image-35787\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Jak wida\u0107, oko\u0142o 10% ruchu do serwisu <em>reviews<\/em> trafia teraz do wersji v2, kt\u00f3ra prawid\u0142owo komunikuje si\u0119 z serwisem <em>ratings<\/em>. Kolejnymi krokami mog\u0142yby by\u0107 monitorowanie nowych us\u0142ug i stopniowe manipulowanie wagami a\u017c do ostatecznego ca\u0142kowitego przej\u015bcia na now\u0105 wersj\u0119 funkcjonalno\u015bci.<\/p>\n\n\n\n<p>Zwr\u00f3\u0107my jednak uwag\u0119, \u017ce ruch sieciowy w poprzednim przyk\u0142adzie by\u0142 kierowany do konkretnych wersji serwisu <em>reviews<\/em> losowo, tym samym nie mamy kontroli nad tym, pod jakim warunkiem lub dla jakiego u\u017cytkownika nowa funkcjonalno\u015b\u0107 b\u0119dzie dost\u0119pna.<\/p>\n\n\n\n<p>W kolejnym przyk\u0142adzie chcemy udost\u0119pni\u0107 dla u\u017cytkownik\u00f3w aplikacji mo\u017cliwo\u015b\u0107 wzi\u0119cia udzia\u0142u w testowaniu nowej funkcjonalno\u015bci. Wi\u0105\u017ce si\u0119 to z kierowaniem wybranej cz\u0119\u015bci ruchu sieciowego do nowej us\u0142ugi na podstawie atrybutu zapyta\u0144 HTTP. W realizacji tego zadania pomo\u017ce nam dodawanie niestandardowego headera do wszystkich zapyta\u0144 (np. <em>x-beta<\/em>) i kierowanie ruchem na jego podstawie.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.09.22_obraz8.png\" alt=\"Istio\" class=\"wp-image-35788\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Taka prosta zmiana w naszej pocz\u0105tkowej konfiguracji pozwala na zrealizowanie opisanego wymagania.<\/strong><\/p>\n\n\n\n<p>Alternatywnym podej\u015bciem do powy\u017cszej sytuacji, zmniejszaj\u0105cym ryzyko nieprawid\u0142owego dzia\u0142ania nowej funkcjonalno\u015bci, jest wykorzystanie mechanizmu traffic mirroring. W tej konfiguracji decydujemy si\u0119 kierowa\u0107 ca\u0142y ruch sieciowy do stabilnej wersji v1, jednocze\u015bnie wysy\u0142aj\u0105c kopi\u0119 ca\u0142ego ruchu do wersji v2, kt\u00f3ra w tym momencie jest niedost\u0119pna dla u\u017cytkownik\u00f3w, ale mo\u017cliwa jest analiza i testowanie niesprawdzonej wersji w \u015brodowisku produkcyjnym.<\/p>\n\n\n\n<p>Poni\u017csza konfiguracja umo\u017cliwia opisany wy\u017cej <strong>traffic mirroring:<\/strong><\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.09.22_obraz9.png\" alt=\" class=\" class=\"wp-image-35790\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>W tej konfiguracji 100% ruchu jest skierowane do wersji v1, jednocze\u015bnie 100% ruchu jest te\u017c kierowane do v2, z tym \u017ce u\u017cytkownik otrzyma odpowied\u017a zawsze ze stabilnej wersji serwisu. Mo\u017cemy oczywi\u015bcie kontrolowa\u0107 ilo\u015b\u0107 ruchu odbijanego w stron\u0119 v2 za pomoc\u0105 parametru konfiguracji <em>mirrorPercentage.<\/em><\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.09.22_obraz7.png\" alt=\"Istio Mesh\" class=\"wp-image-35787\" title=\"\"><\/figure>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"podsumowanie\">Podsumowanie<\/h2>\n\n\n\n<p>Istio to bardzo rozbudowane narz\u0119dzie, a opisane przyk\u0142ady to tylko niewielka cz\u0119\u015b\u0107 jego du\u017co wi\u0119kszych mo\u017cliwo\u015bci. I chocia\u017c pr\u00f3g wej\u015bcia nie jest najmniejszy, to zdecydowanie jest warto ze wzgl\u0119du na korzy\u015bci. Zdecydowanym u\u0142atwieniem jest mo\u017cliwo\u015b\u0107 rozpocz\u0119cia od domy\u015blnej konfiguracji, kt\u00f3ra wymaga niewielu zmian w istniej\u0105cej aplikacji. Mam nadziej\u0119, \u017ce ten artyku\u0142 zach\u0119ci was do wypr\u00f3bowania Istio w waszych projektach.<\/p>\n\n\n\n<p><strong>Przeczytaj tak\u017ce: <\/strong><a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/mikroserwisy-nowa-jakosc-w-miedzynarodowych-projektach-it\"><strong>Mikroserwisy <em>\u2013<\/em> nowa jako\u015b\u0107 w mi\u0119dzynarodowych projektach IT<\/strong><\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jednym z wyzwa\u0144 dynamicznej architektury mikroserwisowej jest tworzenie i utrzymywanie po\u0142\u0105cze\u0144 pomi\u0119dzy jej elementami. Poszczeg\u00f3lne serwisy mog\u0105 by\u0107 dynamicznie dodawane, aktualizowane i usuwane, dodatkowo ka\u017cdy z nich mo\u017ce by\u0107 zeskalowany do wielu instancji, niekoniecznie w tej samej wersji aplikacji. Niew\u0105tpliwie poziom skomplikowania wymusza potrzeb\u0119 posiadania mechanizmu, kt\u00f3ry pozwoli upro\u015bci\u0107 warstw\u0119 komunikacji i zdejmie z developer\u00f3w wi\u0119kszo\u015b\u0107 ci\u0119\u017caru wi\u0105\u017c\u0105cego si\u0119 z prac\u0105 w tym \u015brodowisku. Jednym z takich mechanizm\u00f3w jest Service Mesh, w kt\u00f3rym wykorzystany jest tzw. wzorzec sidecar, czyli element proxy przypi\u0119ty do ka\u017cdego kontenera aplikacji. Razem proxy obs\u0142uguj\u0105 komunikacj\u0119 w klastrze Kubernetesa, tworz\u0105c siatk\u0119. Mechanizm siatki pozwala na optymalizacj\u0119 wydajno\u015bci sieci, u\u0142atwia jej zabezpieczenie oraz umo\u017cliwia monitorowanie ruchu. W poprzednim artykule znajdziecie wi\u0119cej szczeg\u00f3\u0142\u00f3w na temat <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/service-mesh-ale-komu-to-potrzebne\">Service Mesh<\/a>, a w tym artykule bli\u017cej przyjrzyjmy si\u0119 Istio i mo\u017cliwo\u015bciom, jakie daje.<\/p>\n","protected":false},"author":108,"featured_media":29798,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":282,"footnotes":""},"categories":[1,582],"tags":[614],"offering":[522],"class_list":["post-29766","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-technologie","tag-application-development","offering-tech-blog"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29766","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/108"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=29766"}],"version-history":[{"count":5,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29766\/revisions"}],"predecessor-version":[{"id":33966,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29766\/revisions\/33966"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/29798"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=29766"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=29766"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=29766"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=29766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}