{"id":32777,"date":"2019-10-31T21:48:52","date_gmt":"2019-10-31T18:48:52","guid":{"rendered":"https:\/\/prohoster.info\/blog\/netramesh-legkovesnoe-service-mesh-reshenie\/"},"modified":"2019-10-31T21:48:52","modified_gmt":"2019-10-31T18:48:52","slug":"netramesh-legkovesnoe-service-mesh-reshenie","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/netramesh-legkovesnoe-service-mesh-reshenie","title":{"rendered":"Netramesh \u2013 lekkie rozwi\u0105zanie service mesh","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>W trakcie przechodzenia od monolitycznej aplikacji do architektury mikroserwisowej napotykamy nowe problemy.<\/p>\n<p><\/p>\n<p>W monolitycznej aplikacji zazwyczaj wystarczy po prostu okre\u015bli\u0107, w kt\u00f3rej cz\u0119\u015bci systemu wyst\u0105pi\u0142 b\u0142\u0105d. Prawdopodobnie problem le\u017cy w kodzie samego monolitu lub w bazie danych. Jednak kiedy zaczynamy szuka\u0107 problemu w architekturze mikroserwisowej, sytuacja nie jest ju\u017c tak oczywista. Musimy znale\u017a\u0107 ca\u0142\u0105 \u015bcie\u017ck\u0119, kt\u00f3r\u0105 przeszed\u0142 \u017c\u0105danie od pocz\u0105tku do ko\u0144ca, wyr\u00f3\u017cniaj\u0105c j\u0105 spo\u015br\u00f3d setek mikroserwis\u00f3w. Co wi\u0119cej, wiele z nich ma r\u00f3wnie\u017c w\u0142asne magazyny, w kt\u00f3rych mog\u0105 wyst\u0119powa\u0107 zar\u00f3wno b\u0142\u0119dy logiczne, jak i problemy z wydajno\u015bci\u0105 oraz odporno\u015bci\u0105 na awarie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Netramesh \u2013 lekkie rozwi\u0105zanie service mesh\" src=\"\/wp-content\/uploads\/2019\/04\/f583f3d8d4a2239411628aa8f4d06041.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u0142ugo szuka\u0142em narz\u0119dzia, kt\u00f3re pomog\u0142oby poradzi\u0107 sobie z takimi problemami (pisa\u0142em o tym na Habra: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/avito\/blog\/419319\/\">1<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/avito\/blog\/433650\/\">2<\/a><\/noindex>), ale ostatecznie stworzy\u0142em w\u0142asne rozwi\u0105zanie open-source. W artykule opisuj\u0119 zalety podej\u015bcia service mesh i dziel\u0119 si\u0119 nowym narz\u0119dziem do jego wdro\u017cenia. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Rozproszony tracing jest powszechnym rozwi\u0105zaniem problemu znajdowania b\u0142\u0119d\u00f3w w rozproszonych systemach. Ale co, je\u015bli w systemie nie wdro\u017cono jeszcze takiego podej\u015bcia do zbierania informacji o interakcjach sieciowych, lub co gorsza, w cz\u0119\u015bci systemu to dzia\u0142a, a w cz\u0119\u015bci nie, poniewa\u017c nie dodano go do starych us\u0142ug? Aby okre\u015bli\u0107 dok\u0142adn\u0105 przyczyn\u0119 problemu, nale\u017cy mie\u0107 pe\u0142ny obraz tego, co dzieje si\u0119 w systemie. Szczeg\u00f3lnie wa\u017cne jest, aby rozumie\u0107, kt\u00f3re mikroserwisy uczestnicz\u0105 w kluczowych dla biznesu \u015bcie\u017ckach.<\/p>\n<p><\/p>\n<p>W tym przypadku z pomoc\u0105 mo\u017ce przyj\u015b\u0107 podej\u015bcie service mesh, kt\u00f3re zajmie si\u0119 ca\u0142\u0105 machin\u0105 zbierania informacji sieciowych na poziomie ni\u017cszym ni\u017c same us\u0142ugi. To podej\u015bcie pozwala nam przechwytywa\u0107 ca\u0142y ruch i analizowa\u0107 go na bie\u017c\u0105co. Co wi\u0119cej, aplikacje nie musz\u0105 o tym nic wiedzie\u0107.<\/p>\n<p><\/p>\n<h1 id=\"service-mesh-podhod\">Podej\u015bcie service mesh<\/h1>\n<p><\/p>\n<p>G\u0142\u00f3wn\u0105 ide\u0105 podej\u015bcia service mesh jest dodanie jeszcze jednej warstwy infrastrukturalnej nad sieci\u0105, kt\u00f3ra pozwoli nam na realizacj\u0119 r\u00f3\u017cnych zada\u0144 zwi\u0105zanych z interakcj\u0105 mi\u0119dzy us\u0142ugami. Wi\u0119kszo\u015b\u0107 wdro\u017ce\u0144 dzia\u0142a w nast\u0119puj\u0105cy spos\u00f3b: do ka\u017cdej mikrous\u0142ugi dodawany jest dodatkowy kontener sidecar z przezroczystym proxy, przez kt\u00f3re przechodzi ca\u0142y przychodz\u0105cy i wychodz\u0105cy ruch us\u0142ugi. I to w\u0142a\u015bnie tam mo\u017cemy realizowa\u0107 r\u00f3wnowa\u017cenie obci\u0105\u017cenia, stosowa\u0107 polityki bezpiecze\u0144stwa, wprowadza\u0107 ograniczenia liczby zapyta\u0144 oraz zbiera\u0107 istotne informacje na temat interakcji us\u0142ug w produkcji.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Netramesh \u2013 lekkie rozwi\u0105zanie service mesh\" src=\"\/wp-content\/uploads\/2019\/04\/b1f8636e3b99a3814138b6443b3e0799.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h1 id=\"resheniya\">Rozwi\u0105zania<\/h1>\n<p><\/p>\n<p>Ju\u017c istnieje kilka wdro\u017ce\u0144 tego podej\u015bcia: <noindex><a rel=\"nofollow\" href=\"https:\/\/istio.io\/\">Istio<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/linkerd.io\/2\/overview\/\">linkerd2<\/a><\/noindex>. Oferuj\u0105 one wiele funkcji od razu po zainstalowaniu. Jednak r\u00f3wnocze\u015bnie wi\u0105\u017ce si\u0119 to z du\u017cym obci\u0105\u017ceniem zasob\u00f3w. Im wi\u0119kszy klaster, w kt\u00f3rym dzia\u0142a taki system, tym wi\u0119cej zasob\u00f3w jest potrzebnych do utrzymania nowej infrastruktury. W Avito korzystamy z klastr\u00f3w Kubernetes, w kt\u00f3rych znajduj\u0105 si\u0119 tysi\u0105ce instancji us\u0142ug (a ich liczba wci\u0105\u017c szybko ro\u015bnie). W obecnej wersji Istio zu\u017cywa ~300Mb pami\u0119ci operacyjnej na ka\u017cd\u0105 instancj\u0119 us\u0142ugi. Z powodu du\u017cej liczby funkcji przezroczyste r\u00f3wnowa\u017cenie obci\u0105\u017cenia r\u00f3wnie\u017c wp\u0142ywa na ca\u0142kowity czas odpowiedzi us\u0142ug (nawet do 10ms).<\/p>\n<p><\/p>\n<p>W efekcie przyjrzeli\u015bmy si\u0119, jakie dok\u0142adnie mo\u017cliwo\u015bci s\u0105 nam potrzebne tu i teraz, i zdecydowali\u015bmy, \u017ce g\u0142\u00f3wnym powodem, dla kt\u00f3rego zacz\u0119li\u015bmy wdra\u017ca\u0107 takie rozwi\u0105zania, by\u0142a mo\u017cliwo\u015b\u0107 zbierania informacji \u015bledz\u0105cych (tracing) z ca\u0142ego systemu w spos\u00f3b przezroczysty. Chcieli\u015bmy r\u00f3wnie\u017c mie\u0107 kontrol\u0119 nad interakcj\u0105 us\u0142ug i przeprowadza\u0107 r\u00f3\u017cne operacje na nag\u0142\u00f3wkach, kt\u00f3re s\u0105 przesy\u0142ane mi\u0119dzy us\u0142ugami. <\/p>\n<p><\/p>\n<p>Ostatecznie doszli\u015bmy do naszego rozwi\u0105zania:\u200a <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/netra_ru\">Netramesh<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"netramesh\">Netramesh<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/netra_ru\">Netramesh<\/a><\/noindex> \u2014 to lekkie rozwi\u0105zanie service mesh z mo\u017cliwo\u015bci\u0105 niesko\u0144czonego skalowania niezale\u017cnie od liczby us\u0142ug w systemie.<\/p>\n<p><\/p>\n<p>G\u0142\u00f3wnymi celami nowego rozwi\u0105zania by\u0142y niski narzut na zasoby oraz wysoka wydajno\u015b\u0107. Z podstawowych mo\u017cliwo\u015bci chcieli\u015bmy od razu mie\u0107 mo\u017cliwo\u015b\u0107 przezroczystego przesy\u0142ania span\u00f3w \u015bledz\u0105cych do naszego systemu Jaeger.<\/p>\n<p><\/p>\n<p>Obecnie wi\u0119kszo\u015b\u0107 rozwi\u0105za\u0144 chmurowych jest realizowana w Golang. Oczywi\u015bcie, s\u0105 ku temu powody. Pisanie aplikacji sieciowych w Golang, kt\u00f3re dzia\u0142aj\u0105 asynchronicznie z obs\u0142ug\u0105 wej\u015bcia-wyj\u015bcia i skaluj\u0105 si\u0119 w miar\u0119 potrzeby, jest wygodne i do\u015b\u0107 proste. Co r\u00f3wnie\u017c bardzo wa\u017cne, wydajno\u015b\u0107 jest wystarczaj\u0105ca do wykonania tego zadania. Dlatego r\u00f3wnie\u017c wybrali\u015bmy Golang.<\/p>\n<p><\/p>\n<h1 id=\"proizvoditelnost\">Wydajno\u015b\u0107<\/h1>\n<p><\/p>\n<p>Skupili\u015bmy nasze wysi\u0142ki na osi\u0105gni\u0119ciu maksymalnej wydajno\u015bci. Dla rozwi\u0105zania, kt\u00f3re jest wdra\u017cane obok ka\u017cdego wyst\u0105pienia us\u0142ugi, konieczne jest niewielkie zu\u017cycie pami\u0119ci operacyjnej i czasu procesora. Oczywi\u015bcie, op\u00f3\u017anienie odpowiedzi r\u00f3wnie\u017c powinno by\u0107 jak najmniejsze.<\/p>\n<p><\/p>\n<p>Sp\u00f3jrzmy, jakie wyniki uzyskali\u015bmy. <\/p>\n<p><\/p>\n<h2 id=\"ram\">RAM<\/h2>\n<p><\/p>\n<p>Netramesh zu\u017cywa ~10Mb bez ruchu i maksymalnie 50Mb przy obci\u0105\u017ceniu do 10000 RPS na jedno wyst\u0105pienie.<\/p>\n<p><\/p>\n<p>Proxy Istio envoy zawsze zu\u017cywa ~300Mb w naszych klastrach z tysi\u0105cami wyst\u0105pie\u0144. Uniemo\u017cliwia to skalowanie go w ca\u0142ym klastrze.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Netramesh \u2013 lekkie rozwi\u0105zanie service mesh\" src=\"\/wp-content\/uploads\/2019\/04\/665b46c30183d502900027b7b3fcf2aa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Netramesh \u2013 lekkie rozwi\u0105zanie service mesh\" src=\"\/wp-content\/uploads\/2019\/04\/d862122a15eb92402e35cb68c448f7c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Z Netramesh uzyskali\u015bmy zmniejszenie zu\u017cycia pami\u0119ci o ~10 razy.<\/p>\n<p><\/p>\n<h2 id=\"cpu\">CPU<\/h2>\n<p><\/p>\n<p>Zu\u017cycie CPU jest stosunkowo r\u00f3wne pod obci\u0105\u017ceniem. Zale\u017cy od liczby zapyta\u0144 na jednostk\u0119 czasu do sidecar. Warto\u015bci przy 3000 zapytaniach na sekund\u0119 w szczycie:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Netramesh \u2013 lekkie rozwi\u0105zanie service mesh\" src=\"\/wp-content\/uploads\/2019\/04\/6dbae38c42706dc3fbb833fdaf058b48.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Netramesh \u2013 lekkie rozwi\u0105zanie service mesh\" src=\"\/wp-content\/uploads\/2019\/04\/5a2eff682a457b620cbf71b520d90ca4.jpg\" style=\"display:block;margin: 0 auto;\" \/> <\/p>\n<p><\/p>\n<p>Jest jeszcze jeden wa\u017cny aspekt: Netramesh to rozwi\u0105zanie bez control plane i bez obci\u0105\u017cenia nie zu\u017cywa czasu procesora. W przypadku Istio sidecary zawsze aktualizuj\u0105 punkty ko\u0144cowe us\u0142ug. W rezultacie mo\u017cemy zobaczy\u0107 taki obrazek bez obci\u0105\u017cenia:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Netramesh \u2013 lekkie rozwi\u0105zanie service mesh\" src=\"\/wp-content\/uploads\/2019\/04\/6e0212c6d34f8fdabf7b2f50a4f8137a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>U\u017cywamy HTTP\/1 do komunikacji mi\u0119dzy us\u0142ugami. Zwi\u0119kszenie czasu odpowiedzi w Istio przy proxy z envoy wynosi\u0142o do 5-10ms, co jest do\u015b\u0107 du\u017co dla us\u0142ug, kt\u00f3re s\u0105 gotowe odpowiada\u0107 w milisekundzie. W przypadku Netramesh ten czas zmniejszy\u0142 si\u0119 do 0.5-2ms.<\/p>\n<p><\/p>\n<h1 id=\"masshtabiruemost\">Skalowalno\u015b\u0107<\/h1>\n<p><\/p>\n<p>Niewielka ilo\u015b\u0107 zasob\u00f3w, jak\u0105 zu\u017cywa ka\u017cde proxy, pozwala umie\u015bci\u0107 je blisko ka\u017cdej us\u0142ugi. Netramesh zosta\u0142 celowo stworzony bez komponentu control plane, aby zachowa\u0107 lekko\u015b\u0107 ka\u017cdego sidecara. Cz\u0119sto w rozwi\u0105zaniach service mesh control plane rozprzestrzenia informacje o odkrywaniu us\u0142ug do ka\u017cdego sidecara. Razem z ni\u0105 przychodzi r\u00f3wnie\u017c informacja o timeoutach i ustawieniach r\u00f3wnowa\u017cenia. Wszystko to pozwala na wiele przydatnych rzeczy, ale niestety zwi\u0119ksza rozmiar sidecar\u00f3w. <\/p>\n<p><\/p>\n<h1 id=\"service-discovery\">Odkrywanie us\u0142ug<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Netramesh \u2013 lekkie rozwi\u0105zanie service mesh\" src=\"\/wp-content\/uploads\/2019\/04\/26bc86ed2ebf15a8d51388982e23e16d.jpg\" style=\"display:block;margin: 0 auto;\" \/> <\/p>\n<p><\/p>\n<p>Netramesh nie dodaje \u017cadnych dodatkowych mechanizm\u00f3w do odkrywania us\u0142ug. Ca\u0142y ruch jest przezroczysto proxowany przez sidecar netra. <\/p>\n<p><\/p>\n<p>Netramesh obs\u0142uguje protok\u00f3\u0142 aplikacyjny HTTP\/1. Aby go zdefiniowa\u0107, u\u017cywa konfigurowalnej listy port\u00f3w. Zwykle w systemie znajduje si\u0119 kilka port\u00f3w, przez kt\u00f3re odbywa si\u0119 interakcja w ramach HTTP. Na przyk\u0142ad do interakcji mi\u0119dzy us\u0142ugami i zewn\u0119trznymi \u017c\u0105daniami wykorzystujemy porty 80, 8890, 8080. W takim przypadku mo\u017cna je okre\u015bli\u0107 za pomoc\u0105 zmiennej \u015brodowiskowej <code>NETRA_HTTP_PORTS<\/code>.<\/p>\n<p><\/p>\n<p>Je\u015bli u\u017cywasz Kubernetes jako orkiestratora i jego mechanizmu Service do wewn\u0119trznej interakcji mi\u0119dzy us\u0142ugami w klastrze, mechanizm pozostaje dok\u0142adnie taki sam. Najpierw mikroserwis otrzymuje adres IP us\u0142ugi za pomoc\u0105 kube-dns i nawi\u0105zuje nowe po\u0142\u0105czenie. To po\u0142\u0105czenie jest nawi\u0105zywane najpierw z lokalnym netra-sidecar, a wszystkie pakiety TCP pierwotnie przychodz\u0105 do netra. Nast\u0119pnie netra-sidecar nawi\u0105zuje po\u0142\u0105czenie z pierwotnym punktem docelowym. NAT na pod IP na nodzie pozostaje dok\u0142adnie taki sam jak bez netra.<\/p>\n<p><\/p>\n<h1 id=\"raspredelennyy-tracing-i-prokidyvanie-konteksta\">Rozproszony tracing i przekazywanie kontekstu<\/h1>\n<p><\/p>\n<p>Netramesh zapewnia funkcjonalno\u015b\u0107 niezb\u0119dn\u0105 do wysy\u0142ania span\u00f3w trace'\u00f3w o interakcji HTTP. Netra-sidecar analizuje protok\u00f3\u0142 HTTP, mierzy op\u00f3\u017anienia \u017c\u0105da\u0144, wydobywa niezb\u0119dne informacje z nag\u0142\u00f3wk\u00f3w HTTP. Ostatecznie otrzymujemy wszystkie trace'y w jednym systemie Jaeger. Do szczeg\u00f3\u0142owej konfiguracji mo\u017cna r\u00f3wnie\u017c u\u017cywa\u0107 zmiennych \u015brodowiskowych, kt\u00f3re zapewnia oficjalna biblioteka <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-go#environment-variables\">jaeger go library<\/a><\/noindex>. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Netramesh \u2013 lekkie rozwi\u0105zanie service mesh\" src=\"\/wp-content\/uploads\/2019\/04\/22a2d3be2cef1e495702ad75e062676f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Netramesh \u2013 lekkie rozwi\u0105zanie service mesh\" src=\"\/wp-content\/uploads\/2019\/04\/20ff67f0c7f3590dce3d41db2a10267e.jpg\" style=\"display:block;margin: 0 auto;\" \/> <\/p>\n<p><\/p>\n<p>Ale jest problem. Dop\u00f3ki us\u0142ugi nie b\u0119d\u0105 generowa\u0107 i przekazywa\u0107 specjalnego nag\u0142\u00f3wka uber, nie zobaczymy po\u0142\u0105czonych span\u00f3w trace w systemie. A to jest to, czego potrzebujemy do szybkiego znajdowania przyczyn problem\u00f3w. Tutaj Netramesh znowu ma rozwi\u0105zanie. Proxy odczytuj\u0105 nag\u0142\u00f3wki HTTP i, je\u015bli nie zawieraj\u0105 uber trace id, generuj\u0105 go. Netramesh przechowuje r\u00f3wnie\u017c informacje o przychodz\u0105cych i wychodz\u0105cych \u017c\u0105daniach w sidecarze i dopasowuje je poprzez wzbogacenie o niezb\u0119dne nag\u0142\u00f3wki wychodz\u0105cych \u017c\u0105da\u0144. Wszystko, co nale\u017cy zrobi\u0107 w us\u0142ugach, to przekaza\u0107 jeden nag\u0142\u00f3wek <code>X-Request-Id<\/code>, kt\u00f3ry mo\u017cna skonfigurowa\u0107 za pomoc\u0105 zmiennej \u015brodowiskowej <code>NETRA_HTTP_REQUEST_ID_HEADER_NAME<\/code>. Aby zarz\u0105dza\u0107 rozmiarem kontekstu w Netramesh, mo\u017cna ustawi\u0107 nast\u0119puj\u0105ce zmienne \u015brodowiskowe: <code>NETRA_TRACING_CONTEXT_EXPIRATION_MILLISECONDS<\/code> (czas, przez kt\u00f3ry b\u0119dzie przechowywany kontekst) i <code>NETRA_TRACING_CONTEXT_CLEANUP_INTERVAL<\/code> (cz\u0119stotliwo\u015b\u0107 czyszczenia kontekstu).<\/p>\n<p><\/p>\n<p>Mo\u017cliwe jest r\u00f3wnie\u017c \u0142\u0105czenie kilku \u015bcie\u017cek w Twoim systemie przez oznaczanie ich specjalnym znacznikiem sesji. Netra umo\u017cliwia ustawienie <code>HTTP_HEADER_TAG_MAP<\/code> aby przekszta\u0142ci\u0107 nag\u0142\u00f3wki HTTP w odpowiadaj\u0105ce im znaczniki \u015bledzenia. Mo\u017ce to by\u0107 szczeg\u00f3lnie przydatne do testowania. Po zako\u0144czeniu test\u00f3w funkcjonalnych mo\u017cesz sprawdzi\u0107, kt\u00f3ra cz\u0119\u015b\u0107 systemu zosta\u0142a dotkni\u0119ta, filtruj\u0105c wed\u0142ug odpowiedniego klucza sesji.<\/p>\n<p><\/p>\n<h1 id=\"opredelenie-istochnika-zaprosa\">Okre\u015blenie \u017ar\u00f3d\u0142a \u017c\u0105dania<\/h1>\n<p><\/p>\n<p>Aby okre\u015bli\u0107, sk\u0105d pochodzi \u017c\u0105danie, mo\u017cna skorzysta\u0107 z funkcji automatycznego dodawania nag\u0142\u00f3wka \u017ar\u00f3d\u0142owego. Przy u\u017cyciu zmiennej \u015brodowiskowej <code>NETRA_HTTP_X_SOURCE_HEADER_NAME<\/code> mo\u017cna okre\u015bli\u0107 nazw\u0119 nag\u0142\u00f3wka, kt\u00f3ry b\u0119dzie automatycznie ustawiany. Przy u\u017cyciu <code>NETRA_HTTP_X_SOURCE_VALUE<\/code> mo\u017cna ustawi\u0107 warto\u015b\u0107, do kt\u00f3rej b\u0119dzie przypisywany nag\u0142\u00f3wek X-Source we wszystkich wychodz\u0105cych \u017c\u0105daniach. <\/p>\n<p><\/p>\n<p>Pozwala to na jednolite rozprzestrzenienie tego przydatnego nag\u0142\u00f3wka w ca\u0142ej sieci. Nast\u0119pnie mo\u017cna go ju\u017c u\u017cywa\u0107 w us\u0142ugach i dodawa\u0107 do log\u00f3w oraz metryk.<\/p>\n<p><\/p>\n<h1 id=\"routing-trafika-i-vnutrennosti-netramesh\">Routowanie ruchu i wn\u0119trze Netramesh<\/h1>\n<p><\/p>\n<p>Netramesh sk\u0142ada si\u0119 z dw\u00f3ch g\u0142\u00f3wnych komponent\u00f3w. Pierwszy, netra-init, ustawia regu\u0142y sieciowe do przechwytywania ruchu. U\u017cywa <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Lookyan\/netramesh\/blob\/master\/iptables-rules.sh\">regu\u0142 przekierowania iptables<\/a><\/noindex> do przechwytywania ca\u0142ego lub cz\u0119\u015bci ruchu na sidecar, kt\u00f3ry jest drugim g\u0142\u00f3wnym komponentem Netramesh. Mo\u017cna skonfigurowa\u0107, kt\u00f3re porty maj\u0105 by\u0107 przechwytywane dla przychodz\u0105cych i wychodz\u0105cych sesji TCP: <code>INBOUND_INTERCEPT_PORTS, OUTBOUND_INTERCEPT_PORTS<\/code>.<\/p>\n<p><\/p>\n<p>Narz\u0119dzie to ma r\u00f3wnie\u017c ciekaw\u0105 funkcj\u0119 \u2014 router probabilistyczny. Je\u015bli korzystasz z Netramesh wy\u0142\u0105cznie do zbierania znacznika \u015bledzenia, to w \u015brodowisku produkcyjnym mo\u017cesz zaoszcz\u0119dzi\u0107 zasoby i w\u0142\u0105czy\u0107 routowanie probabilistyczne przy u\u017cyciu zmiennych <code>NETRA_INBOUND_PROBABILITY<\/code> i <code>NETRA_OUTBOUND_PROBABILITY<\/code> (od 0 do 1). Warto\u015b\u0107 domy\u015blna wynosi 1 (przechwytywany jest ca\u0142y ruch).<\/p>\n<p><\/p>\n<p>Po pomy\u015blnym przechwyceniu netra sidecar nawi\u0105zuje nowe po\u0142\u0105czenie i u\u017cywa <code>SO_ORIGINAL_DST<\/code> opcji gniazda do uzyskania pierwotnego punktu docelowego. Nast\u0119pnie Netra otwiera nowe po\u0142\u0105czenie do pierwotnego adresu IP i nawi\u0105zuje dwustronn\u0105 komunikacj\u0119 TCP mi\u0119dzy stronami, nas\u0142uchuj\u0105c ca\u0142y przechodz\u0105cy ruch. Je\u015bli port jest okre\u015blony jako HTTP, Netra stara si\u0119 go przetworzy\u0107 i \u015bledzi\u0107. Je\u015bli przetwarzanie HTTP nie powiedzie si\u0119, Netra przechodzi na TCP i przezroczyste proxyuje bajty.<\/p>\n<p><\/p>\n<h1 id=\"postroenie-grafa-zavisimostey\">Budowanie grafu zale\u017cno\u015bci<\/h1>\n<p><\/p>\n<p>Po uzyskaniu du\u017cej ilo\u015bci informacji o \u015bledzeniu w Jaegerze, chcemy uzyska\u0107 pe\u0142ny graf interakcji w systemie. Jednak je\u015bli tw\u00f3j system jest odpowiednio obci\u0105\u017cony i gromadzi miliardy span\u00f3w \u015bledzenia w ci\u0105gu dnia, ich agregacja staje si\u0119 do\u015b\u0107 trudnym zadaniem. Istnieje oficjalny spos\u00f3b na to: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/spark-dependencies\">spark-dependencies<\/a><\/noindex>. Niemniej jednak zajmie to godziny, aby zbudowa\u0107 pe\u0142ny graf i zmusi do pobrania z Jaeger wszystkich danych z ostatnich 24 godzin. <\/p>\n<p><\/p>\n<p>Je\u015bli u\u017cywasz Elasticsearch do przechowywania span\u00f3w \u015bledzenia, mo\u017cesz skorzysta\u0107 z <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Lookyan\/jaeger-dependencies\">prostej narz\u0119dzia napisanego w Golang<\/a><\/noindex>, kt\u00f3re stworzy taki sam graf w ci\u0105gu minut, wykorzystuj\u0105c funkcje i mo\u017cliwo\u015bci Elasticsearch.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Netramesh \u2013 lekkie rozwi\u0105zanie service mesh\" src=\"\/wp-content\/uploads\/2019\/04\/26eb13e066ed8482010fde103d3832fd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h1 id=\"kak-ispolzovat-netramesh\">Jak u\u017cywa\u0107 Netramesh<\/h1>\n<p><\/p>\n<p>Netra mo\u017ce by\u0107 \u0142atwo dodana do dowolnej us\u0142ugi dzia\u0142aj\u0105cej pod kontrol\u0105 dowolnego orkiestratora. Mo\u017cna zobaczy\u0107 przyk\u0142ad <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2HVRv7D\">tutaj<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Na chwil\u0119 obecn\u0105 Netra nie ma mo\u017cliwo\u015bci automatycznego wdra\u017cania sidecara do us\u0142ug, ale s\u0105 plany na jego realizacj\u0119. <\/p>\n<p><\/p>\n<h1 id=\"buduschee-netramesh\">Przysz\u0142o\u015b\u0107 Netramesh<\/h1>\n<p><\/p>\n<p>G\u0142\u00f3wnym celem <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/netra_ru\">Netramesh<\/a><\/noindex> jest osi\u0105gni\u0119cie minimalnych koszt\u00f3w zasob\u00f3w i wysokiej wydajno\u015bci, zapewniaj\u0105c podstawowe mo\u017cliwo\u015bci do observability i kontroli interakcji mi\u0119dzy us\u0142ugami. <\/p>\n<p><\/p>\n<p>W przysz\u0142o\u015bci Netramesh otrzyma wsparcie dla innych protoko\u0142\u00f3w aplikacyjnych poza HTTP. W najbli\u017cszej przysz\u0142o\u015bci pojawi si\u0119 mo\u017cliwo\u015b\u0107 routingu L7.<\/p>\n<p><\/p>\n<p>U\u017cyj Netramesh, je\u015bli spotykasz si\u0119 z podobnymi problemami, i pisz do nas z pytaniami i sugestiami.<\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/avito\/blog\/449974\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043e\u0442 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043c\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438. \u0412 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430. \u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u043a\u043e\u0434\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430, \u043b\u0438\u0431\u043e \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u0432\u0441\u0451 \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e. \u041d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u0435\u0441\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24554,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32777","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=\"\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043e\u0442 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043c\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438. \u0412 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\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\/netramesh-legkovesnoe-service-mesh-reshenie\" \/>\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\udd47Netramesh \u2013 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0435 service mesh \u0440\u0435\u0448\u0435\u043d\u0438\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043e\u0442 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043c\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438. \u0412 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/netramesh-legkovesnoe-service-mesh-reshenie\" \/>\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-31T18:48:52+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:48:52+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\udd47Netramesh \u2013 lekkie rozwi\u0105zanie service mesh | ProHoster","description":"W trakcie przej\u015bcia od monolitycznej aplikacji do architektury mikroserwisowej stykamy si\u0119 z nowymi problemami. W aplikacji monolitycznej zazwyczaj wystarczy po prostu okre\u015bli\u0107, w kt\u00f3rej cz\u0119\u015bci systemu to si\u0119 wydarzy\u0142o.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/netramesh-legkovesnoe-service-mesh-reshenie","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\udd47Netramesh \u2013 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0435 service mesh \u0440\u0435\u0448\u0435\u043d\u0438\u0435 | ProHoster","og:description":"\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043e\u0442 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043c\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438. \u0412 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/netramesh-legkovesnoe-service-mesh-reshenie","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-31T18:48:52+00:00","article:modified_time":"2019-10-31T18:48:52+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32777","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 12:29:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:20:44","updated":"2026-01-21 12:29: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\/32777","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=32777"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/32777\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/24554"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=32777"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=32777"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=32777"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}