{"id":3506,"date":"2020-10-16T19:15:53","date_gmt":"2020-10-16T17:15:53","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=3506"},"modified":"2020-10-17T10:06:36","modified_gmt":"2020-10-17T08:06:36","slug":"securing-microservice-communication-with-istio","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/securing-microservice-communication-with-istio\/","title":{"rendered":"Microservice \u0130leti\u015fimini Istio ile G\u00fcvenli Bir Hale Getirme"},"content":{"rendered":"<p>Tahmin edebilece\u011fimiz gibi g\u00fcn\u00fcm\u00fcz ihtiya\u00e7lar\u0131n\u0131n h\u0131zla artmas\u0131yla beraber, bir \u00e7ok organizasyon bu ihtiya\u00e7lara ayak uydurabilmek i\u00e7in teknolojisini h\u0131zla yenilemeye devam ediyor. Buradaki yakla\u015f\u0131m ise genellikle hem business&#8217;\u0131\/organizasyonu hem de teknolojiyi scale edebilmek i\u00e7in microservice architecture&#8217;\u0131 odakl\u0131 oluyor.<\/p>\n<p>Bildi\u011fimiz gibi bu yenileme s\u00fcreci i\u00e7erisinde bir \u00e7ok dokunmam\u0131z gereken konular\/alanlar mevcut. Bana g\u00f6re en kritik konulardan birisi, microservice&#8217;ler aras\u0131 ileti\u015fimin <strong>g\u00fcvenli<\/strong> bir hale getirilmesi.<\/p>\n<p>Sonu\u00e7ta hi\u00e7 birimiz hassas verilerimizin kolayl\u0131kla ele ge\u00e7irilebilmesini istemeyiz, de\u011fil mi?<\/p>\n<p>Bu makale kapsam\u0131nda ise &#8220;microservice&#8217;ler aras\u0131 ileti\u015fimi, <strong><a href=\"https:\/\/istio.io\/latest\/\" target=\"_blank\" rel=\"noopener noreferrer\">Istio<\/a> Service Mesh<\/strong> ile nas\u0131l g\u00fcvenli bir hale getirebiliriz&#8221; konusuna de\u011finmeye \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2020\/08\/istio_logo.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3510 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/08\/istio_logo.jpg\" alt=\"\" width=\"940\" height=\"570\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/08\/istio_logo.jpg 940w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/08\/istio_logo-300x182.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/08\/istio_logo-768x466.jpg 768w\" data-sizes=\"(max-width: 940px) 100vw, 940px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 940px; --smush-placeholder-aspect-ratio: 940\/570;\" \/><\/a><\/p>\n<p>Bildi\u011fimiz gibi microservice ekosistemi i\u00e7erisinde istio gibi bir service mesh teknolojisi kulland\u0131\u011f\u0131m\u0131zda, uygulamalar\u0131m\u0131z aras\u0131 ileti\u015fimi service mesh do\u011fas\u0131 gere\u011fi ele almaktad\u0131r.<\/p>\n<p>B\u00f6ylece uygulama taraf\u0131nda herhangi bir kod de\u011fi\u015fikli\u011fi yapmadan <strong>reliability<\/strong>, <strong>discovery<\/strong> ve <strong>monitoring<\/strong> gibi alanlarda istio&#8217;dan yararlanabilmekteyiz. Bunlar\u0131n yan\u0131 s\u0131ra microservice&#8217;ler aras\u0131 g\u00fcvenli ileti\u015fimi sa\u011flayabilmemiz i\u00e7in de bizlere farkl\u0131 \u00e7\u00f6z\u00fcmler sunmaktad\u0131r.<\/p>\n<p>Microservice&#8217;lerimiz her ne kadar <strong>g\u00fcvenli<\/strong> olarak kabul etti\u011fimiz internal ortamlar\u0131m\u0131zda \u00e7al\u0131\u015f\u0131yor olsa da, microservice&#8217;ler aras\u0131 ileti\u015fimi encrypted bir hale getirmek g\u00fcvenlik a\u00e7\u0131s\u0131ndan her t\u00fcrl\u00fc avantaj\u0131m\u0131za olacakt\u0131r.<\/p>\n<p>G\u00fcvenlik kapsam\u0131nda istio, iki farkl\u0131 authentication y\u00f6ntemini desteklemektedir.<\/p>\n<ul>\n<li>Service-to-service ileti\u015fimi i\u00e7in transport authentication (mTLS).<\/li>\n<li>Client-to-service ileti\u015fimi i\u00e7in ise JWT ile end-user authentication y\u00f6ntemi.<\/li>\n<\/ul>\n<h2>Mutual TLS ile Service-to-Service \u0130leti\u015fim G\u00fcvenli\u011fini Sa\u011flamak<\/h2>\n<p>Az \u00f6nce de bahsetti\u011fimiz gibi, kod taraf\u0131nda herhangi bir de\u011fi\u015fiklik yapmadan microservice&#8217;ler aras\u0131 g\u00fcvenli ileti\u015fimi istio ile sa\u011flayabilmekteyiz. Istio proxy, herhangi bir sertifikay\u0131 y\u00f6netmemize gerek kalmadan, <strong>443<\/strong> port&#8217;u \u00fczerindeki trafi\u011fi bizim i\u00e7in y\u00f6netip, uygulama&#8217;n\u0131n <strong>80<\/strong> port&#8217;una y\u00f6nlendirmektedir.<\/p>\n<p>Istio bu tarz i\u015flemler ve network&#8217;\u00fc intercept edebilmek i\u00e7in, a\u015fa\u011f\u0131daki diyagramdan da g\u00f6rebilece\u011fimiz gibi <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/\" target=\"_blank\" rel=\"noopener noreferrer\">Envoy<\/a>&#8216;un sidecar proxy&#8217;sini kullanmaktad\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2020\/08\/istio-arch.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3512 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/08\/istio-arch.jpg\" alt=\"\" width=\"1193\" height=\"808\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/08\/istio-arch.jpg 1193w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/08\/istio-arch-300x203.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/08\/istio-arch-1024x694.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/08\/istio-arch-768x520.jpg 768w\" data-sizes=\"(max-width: 1193px) 100vw, 1193px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1193px; --smush-placeholder-aspect-ratio: 1193\/808;\" \/><\/a>Mutual TLS authentication, client ve server olmak \u00fczere her iki y\u00f6nde de trafi\u011fin hem g\u00fcvenli hem de g\u00fcvenilir olmas\u0131n\u0131 sa\u011flamaktad\u0131r.<\/p>\n<p><strong>Bu ak\u0131\u015f\u0131 ise kabaca \u00f6zetlemek gerekirse;<\/strong><\/p>\n<p><a href=\"\/wp-content\/uploads\/2020\/09\/istio-mtls-arc.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3530 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/09\/istio-mtls-arc.jpg\" alt=\"\" width=\"641\" height=\"301\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/09\/istio-mtls-arc.jpg 641w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/09\/istio-mtls-arc-300x141.jpg 300w\" data-sizes=\"(max-width: 641px) 100vw, 641px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 641px; --smush-placeholder-aspect-ratio: 641\/301;\" \/><\/a>Bildi\u011fimiz gibi bir service bir trafik ald\u0131\u011f\u0131nda veya g\u00f6nderdi\u011finde, service mesh&#8217;in do\u011fas\u0131 gere\u011fi bu trafik her zaman \u00f6nce ilgili service&#8217;in local sidecar proxy&#8217;sinden ge\u00e7er. Dolay\u0131s\u0131yla mTLS kullan\u0131larak bir request at\u0131ld\u0131\u011f\u0131nda, istio bu trafi\u011fi client&#8217;\u0131n local sidecar&#8217;\u0131na y\u00f6nlendirmektedir. Bu local sidecar trafi\u011fi ald\u0131\u011f\u0131nda ise, server&#8217;\u0131n sidecar&#8217;\u0131 ile bir mTLS <a href=\"https:\/\/en.wikipedia.org\/wiki\/Transport_Layer_Security#TLS_handshake\" target=\"_blank\" rel=\"noopener noreferrer\">handshake<\/a> i\u015flemi ger\u00e7ekle\u015ftirmeye ba\u015flar.<\/p>\n<p>E\u011fer bu do\u011frulama i\u015flem ba\u015far\u0131l\u0131 ger\u00e7ekle\u015firse, client&#8217;\u0131n sidecar&#8217;\u0131 bu trafi\u011fi encpyt eder ve server&#8217;\u0131n sidecar&#8217;\u0131na g\u00f6nderir. Server sidecar&#8217;\u0131 ise bu trafi\u011fi decrypt ederek, trafi\u011fi gitmesi gereken noktaya y\u00f6nlendirir.<\/p>\n<p>Ek olarak istio, sertifikalar\u0131n olu\u015fturulmas\u0131 ve y\u00f6netilmesi i\u015flemini de bizler i\u00e7in p\u00fcr\u00fczs\u00fcz bir \u015fekilde ger\u00e7ekle\u015ftirmektedir. B\u00f6ylece operasyonel y\u00fcklerimizi de azalmaya yard\u0131mc\u0131 olmaktad\u0131r.<\/p>\n<h2>\u00d6rnek Bir Uygulama Deploy Edelim<\/h2>\n<p>\u00d6rnek ger\u00e7ekle\u015ftirebilmemiz i\u00e7in .NET Core ile \u00fcr\u00fcn ve stok bilgilerini d\u00f6nen basit birka\u00e7 API geli\u015ftirdim. \u0130lk olarak geli\u015ftirmi\u015f oldu\u011fum\u00a0&#8220;<em>Product<\/em>&#8220;, &#8220;<em>Stock<\/em>&#8221; ve &#8220;<em>Product Gateway<\/em>&#8221; API&#8217;lar\u0131n\u0131 kubernetes cluster&#8217;\u0131na deploy edece\u011fiz. Ard\u0131ndan istio mesh ile bu\u00a0API&#8217;lar aras\u0131nda ger\u00e7ekle\u015fecek olan ileti\u015fimi <strong>mTLS<\/strong> ile g\u00fcvenli bir hale getirece\u011fiz.<\/p>\n<p>\u00d6rne\u011fimizde &#8220;<em>Product Gateway<\/em>&#8221; API&#8217;\u0131n\u0131n, GET &#8220;<em>\/products\/1<\/em>&#8221; endpoint&#8217;ini kullanaca\u011f\u0131z. Bu endpoint k\u0131saca a\u015fa\u011f\u0131daki logic&#8217;i i\u00e7ermektedir ve basit olarak bir \u00fcr\u00fcn response&#8217;u d\u00f6nmektedir.<\/p>\n<pre class=\"lang:default decode:true \">[HttpGet(\"{id}\")]\r\npublic async Task Get(int id)\r\n{\r\n    HttpClient httpClient = _httpClientFactory.CreateClient();\r\n\r\n    string productAPIUrl = _configuration.GetValue(\"productAPIUrl\");\r\n    string stockAPIUrl = _configuration.GetValue(\"stockAPIUrl\");\r\n\r\n    productAPIUrl = $\"{productAPIUrl}\/products\/{id}\";\r\n    stockAPIUrl = $\"{stockAPIUrl}\/stocks?productId={id}\"; ;\r\n\r\n    Task productResponse = httpClient.GetAsync(productAPIUrl);\r\n    Task stockResponse = httpClient.GetAsync(stockAPIUrl);\r\n\r\n    await Task.WhenAll(productResponse, stockResponse);\r\n\r\n    if (productResponse.Result.IsSuccessStatusCode &amp;&amp; stockResponse.Result.IsSuccessStatusCode)\r\n    {\r\n        var jOption = new JsonSerializerOptions\r\n        {\r\n            PropertyNamingPolicy = JsonNamingPolicy.CamelCase\r\n        };\r\n\r\n        using var productResponseContent = await productResponse.Result.Content.ReadAsStreamAsync();\r\n        ProductDTO product = await JsonSerializer.DeserializeAsync(productResponseContent, jOption);\r\n\r\n        using var stockResponseContent = await stockResponse.Result.Content.ReadAsStreamAsync();\r\n        StockDTO stock = await JsonSerializer.DeserializeAsync(stockResponseContent, jOption);\r\n\r\n        var aggregatedProduct = new ProductAggregatedDTO\r\n        {\r\n            Id = product.Id,\r\n            Name = product.Name,\r\n            Quantity = stock.Quantity\r\n        };\r\n\r\n        return Ok(aggregatedProduct);\r\n    };\r\n\r\n    return NotFound();\r\n}<\/pre>\n<p>\u00d6rnek kodlara ise <em><a href=\"https:\/\/github.com\/GokGokalp\/dotnetcore-istio-mtls\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em> ula\u015fabilirsiniz.<\/p>\n<h3>Gereksinimler ve Varsay\u0131mlar<\/h3>\n<ul>\n<li>Kubernetes cluster&#8217;\u0131na ve temel containerization konsept bilgisine sahip olmak.<\/li>\n<li>Temel service mesh konsept bilgisine sahip olmak.<\/li>\n<\/ul>\n<p>Uygulamalar\u0131 deploy etmeye ba\u015flamadan \u00f6nce, istio sevice mesh&#8217;i kubernetes cluster&#8217;\u0131na kurmam\u0131z gerekmektedir.<\/p>\n<p>Farkl\u0131 platform&#8217;lara g\u00f6re kurulum i\u015flemlerini <em><a href=\"https:\/\/istio.io\/latest\/docs\/setup\/platform-setup\/\" target=\"_blank\" rel=\"noopener noreferrer\">buradaki<\/a><\/em> ad\u0131mlar\u0131 takip ederek ger\u00e7ekle\u015ftirebilirsiniz. Ben bu makale kapsam\u0131nda Docker Desktop ve Istio <strong>1.7.3<\/strong>\u00a0kullanaca\u011f\u0131m.<\/p>\n<p>Ba\u015far\u0131l\u0131 bir kurulum i\u015fleminden sonra da, a\u015fa\u011f\u0131daki gibi bir sonu\u00e7 g\u00f6r\u00fcyor olmal\u0131y\u0131z.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2020\/10\/istio-install.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3552 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/10\/istio-install.png\" alt=\"\" width=\"1338\" height=\"336\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-install.png 1338w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-install-300x75.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-install-1024x257.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-install-768x193.png 768w\" data-sizes=\"(max-width: 1338px) 100vw, 1338px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1338px; --smush-placeholder-aspect-ratio: 1338\/336;\" \/><\/a><\/p>\n<p>Son olarak otomatik sidecar injection i\u015flemini ger\u00e7ekle\u015ftirebilmemiz i\u00e7in, istedi\u011fimiz bir namespace&#8217;e a\u015fa\u011f\u0131daki gibi bir label eklememiz gerekmektedir.<\/p>\n<p>Ben burada &#8220;default&#8221; namespace&#8217;ini kullanaca\u011f\u0131m. B\u00f6ylece bu namespace alt\u0131nda konumlanacak olan uygulamalar, otomatik olarak mesh i\u00e7erisine dahil olacaklard\u0131r.<\/p>\n<pre class=\"lang:default decode:true\">kubectl label namespace default istio-injection=enabled<\/pre>\n<p>\u015eimdi \u00f6rnek API&#8217;lar\u0131n deployment i\u015flemlerine ba\u015flayabiliriz.<\/p>\n<p>Ilk olarak image&#8217;leri a\u015fa\u011f\u0131daki komut yard\u0131m\u0131yla olu\u015ftural\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">docker build -f ProductAPI\/Dockerfile . -t ecom-sample-product-api:v1\r\ndocker build -f StockAPI\/Dockerfile . -t ecom-sample-stock-api:v1\r\ndocker build -f ProductGatewayAPI\/Dockerfile . -t ecom-sample-product-gateway-api:v1<\/pre>\n<p>Ard\u0131ndan <em>burada<\/em> haz\u0131rlam\u0131\u015f oldu\u011fum &#8220;deploy.yaml&#8221; dosyas\u0131n\u0131 kullanarak, a\u015fa\u011f\u0131daki gibi deployment i\u015flemlerini tamamlayal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">kubectl apply -f deploy.yaml<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2020\/10\/kubectl-deploy-apps.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3553 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/10\/kubectl-deploy-apps.png\" alt=\"\" width=\"1338\" height=\"381\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/kubectl-deploy-apps.png 1338w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/kubectl-deploy-apps-300x85.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/kubectl-deploy-apps-1024x292.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/kubectl-deploy-apps-768x219.png 768w\" data-sizes=\"(max-width: 1338px) 100vw, 1338px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1338px; --smush-placeholder-aspect-ratio: 1338\/381;\" \/><\/a><\/p>\n<p>Deployment i\u015flemleri ba\u015far\u0131yla tamamland\u0131ktan sonra ise, pod&#8217;lar\u0131n sidecar&#8217;lar\u0131 ile beraber <strong>2\/2<\/strong> &#8220;Running&#8221; stat\u00fcs\u00fcne ge\u00e7ene kadar bekleyelim.<\/p>\n<p>Ayr\u0131ca a\u015fa\u011f\u0131daki komut yard\u0131m\u0131yla ilgili pod&#8217;un mesh i\u00e7erisine dahil olup olmad\u0131\u011f\u0131n\u0131 da kontrol edebiliriz.<\/p>\n<pre class=\"lang:default decode:true\">istioctl x describe pod product-gateway-api-v1-7996bf7cdf-dz289<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2020\/10\/istioctl-describe-pod.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3557 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/10\/istioctl-describe-pod.png\" alt=\"\" width=\"1398\" height=\"217\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istioctl-describe-pod.png 1398w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istioctl-describe-pod-300x47.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istioctl-describe-pod-1024x159.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istioctl-describe-pod-768x119.png 768w\" data-sizes=\"(max-width: 1398px) 100vw, 1398px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1398px; --smush-placeholder-aspect-ratio: 1398\/217;\" \/><\/a><\/p>\n<p>API&#8217;lar\u0131n sorunsuz bir \u015fekilde \u00e7al\u0131\u015ft\u0131klar\u0131n\u0131 test edebilmek i\u00e7in ise, herhangi bir pod \u00fczerinden a\u015fa\u011f\u0131daki gibi &#8220;<em>Product Gateway<\/em>&#8221; API&#8217;\u0131n &#8220;<em>\/products\/1<\/em>&#8221; endpoint&#8217;ine bir GET iste\u011finde bulunal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">kubectl exec \"$(kubectl get pod -l app=stock-api -o jsonpath={.items..metadata.name})\" -c stock-api -it sh\r\n\r\ncurl http:\/\/product-gateway-api.default.svc.cluster.local\/products\/1<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2020\/10\/test-request-to-pod.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3554 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/10\/test-request-to-pod.png\" alt=\"\" width=\"1338\" height=\"216\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/test-request-to-pod.png 1338w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/test-request-to-pod-300x48.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/test-request-to-pod-1024x165.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/test-request-to-pod-768x124.png 768w\" data-sizes=\"(max-width: 1338px) 100vw, 1338px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1338px; --smush-placeholder-aspect-ratio: 1338\/216;\" \/><\/a><\/p>\n<p>Yukar\u0131daki resimden de g\u00f6rebilece\u011fimiz gibi, &#8220;<em>Product<\/em><em> Gateway<\/em>&#8221; API&#8217;\u0131na\u00a0HTTP \u00fczerinden ba\u015far\u0131yla eri\u015febildik ve \u00fcr\u00fcn bilgisi sonucunu alabildik.<\/p>\n<p>API&#8217;lar problemsiz \u00e7al\u0131\u015ft\u0131\u011f\u0131na g\u00f6re \u015fimdi bu ileti\u015fimi end-to-end olarak <strong>mTLS<\/strong> ile g\u00fcvenli bir hale getirebiliriz.<\/p>\n<p>Genel olarak, az \u00f6nce HTTP \u00fczerinden ger\u00e7ekle\u015ftirmi\u015f oldu\u011fumuz i\u015flemi de g\u00fcvenli olarak kabul edebiliriz. \u00c7\u00fcnk\u00fc istio, 1.5 versiyonundan bu yana <strong>auto mTLS<\/strong> \u00f6zelli\u011fi <strong>etkin<\/strong> ve <strong>permissive<\/strong> mode olarak gelmektedir.<\/p>\n<p>Peki bunu nas\u0131l \u00f6zelle\u015ftirebiliriz? Haydi biraz daha detaya girelim.<\/p>\n<p>Istio i\u00e7erisinde mTLS seviyelerini uygulayabilece\u011fimiz \u00fc\u00e7 farkl\u0131 nokta bulunmaktad\u0131r.<\/p>\n<ul>\n<li>Mesh seviyesinde<\/li>\n<li>Namespace seviyesinde<\/li>\n<li>Service seviyesinde<\/li>\n<\/ul>\n<p>Bu seviyeler en k\u00fc\u00e7\u00fc\u011fe do\u011fru birbirlerini override ederek gitmektedir. \u00d6rne\u011fin farkl\u0131 namespace&#8217;ler alt\u0131nda veya ayn\u0131 namespace&#8217;de farkl\u0131 gereksinimlere ihtiya\u00e7 duyan uygulamalar\u0131m\u0131z olabilir. K\u0131sacas\u0131 gereksinimlerimiz do\u011frultusunda diledi\u011fimiz seviyede mTLS i\u015flemlerini ger\u00e7ekle\u015ftirebiliriz. Bu konu hakk\u0131ndaki detayl\u0131 bilgiye ise <em><a href=\"https:\/\/istio.io\/latest\/docs\/tasks\/security\/authentication\/authn-policy\/#globally-enabling-istio-mutual-tls-in-strict-mode\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em> eri\u015febilirsiniz.<\/p>\n<p>Ben &#8220;default&#8221; namespace&#8217;i kapsam\u0131nda mTLS&#8217;i a\u015fa\u011f\u0131daki gibi \u00f6zelle\u015ftirerek etkinle\u015ftirece\u011fim. Bu i\u015flemden beklentimiz ise, uygulamalar\u0131m\u0131z \u00fczerinde herhangi bir de\u011fi\u015fiklik yapmadan uygulamalar\u0131m\u0131z\u0131n &#8220;default&#8221; namespace&#8217;i alt\u0131nda <strong>sadece<\/strong> mTLS trafi\u011fini kabul etmelerini sa\u011flamak olacak.<\/p>\n<p>Bu i\u015flemi yapabilmek i\u00e7in ise a\u015fa\u011f\u0131daki gibi istio&#8217;nun &#8220;<em>PeerAuthentication<\/em>&#8221; custom resource&#8217;unu kullanaca\u011f\u0131z.<\/p>\n<pre class=\"lang:default decode:true\">apiVersion: \"security.istio.io\/v1beta1\"\r\nkind: \"PeerAuthentication\"\r\nmetadata:\r\n  name: \"default\"\r\n  namespace: \"default\"\r\nspec:\r\n  mtls:\r\n    mode: STRICT<\/pre>\n<p>Mutual TLS&#8217;i &#8220;default&#8221; namespace&#8217;i kapsam\u0131nda etkinle\u015ftirece\u011fimiz i\u00e7in, &#8220;<em>metadata<\/em>&#8221; alt\u0131nda bulunan &#8220;<em>namespace<\/em>&#8221; element&#8217;inin de\u011ferini &#8220;<em>default<\/em>&#8221; olarak set etmemiz gerekmektedir.<\/p>\n<p>Ayr\u0131ca <strong>STRICT<\/strong>, <strong>PERMISSIVE<\/strong>\u00a0ve <strong>DISABLED <\/strong>olmak \u00fczere \u00fc\u00e7 farkl\u0131 kullanabilece\u011fimiz mTLS mode&#8217;u bulunmaktad\u0131r. Auto mTLS \u00f6zelli\u011finin ise default olarak permissive mode&#8217;da geldi\u011finden bahsetmi\u015ftik. Biz \u00f6rnek gere\u011fi mTLS&#8217;i zorunlu k\u0131laca\u011f\u0131m\u0131z i\u00e7in, &#8220;<em>STRICT<\/em>&#8221; olan modu kullanaca\u011f\u0131z.<\/p>\n<p>Encrypted trafi\u011fin yan\u0131nda <strong>plain-text<\/strong> trafi\u011fe de izin vermek istiyorsak, &#8220;<em>PERMISSIVE<\/em>&#8221; modu&#8217;u da kullanabiliriz. \u00c7\u00fcnk\u00fc kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck problemlerden birisi, hen\u00fcz service mesh ekosistemine adapte olmam\u0131\u015f uygulamalar i\u00e7in trafi\u011fi kesmek ve bu s\u00fcreci daha karma\u015f\u0131k bir hale getirmektedir. \u00d6zellikle sizde bizim gibi hem <strong>Windows<\/strong> hem de <strong>Linux<\/strong> container&#8217;lar ile \u00e7al\u0131\u015f\u0131yorsan\u0131z, kar\u015f\u0131la\u015f\u0131lmas\u0131 ka\u00e7\u0131n\u0131lmaz bir durum haline geliyor.<\/p>\n<blockquote><p>K\u0131sacas\u0131 &#8220;<em>PERMISSIVE<\/em>&#8221; modu&#8217;u kullanarak, sistem i\u00e7erisine yeni migrate olmaya \u00e7al\u0131\u015fan uygulamalar\u0131n, bu migration s\u00fcre\u00e7lerini daha p\u00fcr\u00fczs\u00fcz bir hale getirebiliriz.<\/p><\/blockquote>\n<p>Bunlar\u0131n yan\u0131 s\u0131ra mTLS&#8217;i a\u015fa\u011f\u0131daki gibi port seviyesinde de \u00f6zelle\u015ftirebilmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<pre class=\"lang:default decode:true\">portLevelMtls:\r\n  8080:\r\n    mode: DISABLE<\/pre>\n<p>Peki, mTLS&#8217;i zorunlu k\u0131lmak istedi\u011fimiz i\u00e7in yukar\u0131daki <em>yaml<\/em> dosyas\u0131n\u0131 kubernetes \u00fczerinde a\u015fa\u011f\u0131daki gibi apply edelim.<\/p>\n<pre class=\"lang:default decode:true\">kubectl apply -f mtls.yaml<\/pre>\n<p>\u015eimdi uygulam\u0131\u015f oldu\u011fumuz mTLS zorunlulu\u011funun ge\u00e7erli olup olmad\u0131\u011f\u0131n\u0131 test edelim. Bunun i\u00e7in mesh i\u00e7erisine dahil olmayan bir test pod&#8217;una ihtiyac\u0131m\u0131z var.<\/p>\n<p>Test i\u015flemini ger\u00e7ekle\u015ftirebilmek i\u00e7in ise a\u015fa\u011f\u0131daki gibi &#8220;test&#8221; namespace&#8217;i alt\u0131nda istio taraf\u0131ndan y\u00f6netilmeyecek olan bir test pod&#8217;u olu\u015ftural\u0131m ve ard\u0131ndan &#8220;<em>Product Gateway<\/em>&#8221; API&#8217;\u0131na tekrardan HTTP \u00fczerinden bir istek atmaya \u00e7al\u0131\u015fal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">kubectl run -i --tty -n test --rm test --image=curlimages\/curl:7.71.1 --restart=Never -- sh\r\ncurl http:\/\/product-gateway-api.default.svc.cluster.local\/products\/1<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2020\/10\/istio-call-with-mtls.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3555 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/10\/istio-call-with-mtls.png\" alt=\"\" width=\"1338\" height=\"216\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-call-with-mtls.png 1338w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-call-with-mtls-300x48.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-call-with-mtls-1024x165.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-call-with-mtls-768x124.png 768w\" data-sizes=\"(max-width: 1338px) 100vw, 1338px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1338px; --smush-placeholder-aspect-ratio: 1338\/216;\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi bu sefer &#8220;<em>Product Gateway<\/em>&#8221; API&#8217;\u0131na HTTP \u00fczerinden eri\u015femedik. \u00c7\u00fcnk\u00fc &#8220;default&#8221; namespace&#8217;i alt\u0131nda bulunan uygulamalar\u0131m\u0131z, art\u0131k sadece mTLS trafi\u011fini kabul etmektedirler.<\/p>\n<p>Wohho! Uygulamalar\u0131m\u0131z art\u0131k bir t\u0131k daha fazla g\u00fcvenli durumda.<\/p>\n<h3>Peki bu mTLS i\u015flemleri arkaplanda nas\u0131l yap\u0131l\u0131yor. S\u0131k\u0131c\u0131 k\u0131s\u0131m i\u00e7in haz\u0131r m\u0131s\u0131n\u0131z?<\/h3>\n<p>\u00c7ok fazla detaya girmeden k\u0131saca inceleyelim.<\/p>\n<p>Bu i\u015flemleri daha net anlayabilmemiz i\u00e7in, envoy proxy&#8217;nin &#8220;Listener&#8221; ve &#8220;Cluster&#8221; configuration&#8217;lar\u0131n\u0131n detaylar\u0131n\u0131 incelemeliyiz.<\/p>\n<ul>\n<li>Listener i\u00e7in kabaca downstream request&#8217;ler i\u00e7in proxy configuration&#8217;lar\u0131d\u0131r diyebiliriz.<\/li>\n<li>Cluster i\u00e7in ise kabaca upstream request&#8217;lerden sorumlu proxy configuration&#8217;lar\u0131d\u0131r diyebiliriz.<\/li>\n<\/ul>\n<h3>Listener Taraf\u0131<\/h3>\n<p>\u0130lk olarak bir pod \u00fczerindeki listener&#8217;lar\u0131 a\u015fa\u011f\u0131daki gibi listeleyelim. Ben burada &#8220;<em>product-gateway-api<\/em>&#8221; pod&#8217;unu kullanaca\u011f\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">istioctl pc listeners product-gateway-api-v1-7996bf7cdf-dz289<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2020\/10\/pod-listeners.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3558 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/10\/pod-listeners.png\" alt=\"\" width=\"1442\" height=\"546\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/pod-listeners.png 1442w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/pod-listeners-300x114.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/pod-listeners-1024x388.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/pod-listeners-768x291.png 768w\" data-sizes=\"(max-width: 1442px) 100vw, 1442px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1442px; --smush-placeholder-aspect-ratio: 1442\/546;\" \/><\/a><\/p>\n<p>Yukar\u0131daki resimde de g\u00f6rebilece\u011fimiz \u00fczerine bir \u00e7ok listener bulunmakta. Bizim ise burada ilgilenecek oldu\u011fumuz &#8220;<strong>15006<\/strong>&#8221; portu. \u0130lk olarak bu listener bir pod&#8217;a gelen t\u00fcm inbound trafi\u011fi almaktad\u0131r. Yani &#8220;<em>product-gateway-api<\/em>&#8221; pod&#8217;una gelen t\u00fcm trafik, \u00f6nce bu listener taraf\u0131ndan handle edilmektedir.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2020\/10\/envoy-filter-chain.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3561 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/10\/envoy-filter-chain.jpg\" alt=\"\" width=\"641\" height=\"181\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/envoy-filter-chain.jpg 641w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/envoy-filter-chain-300x85.jpg 300w\" data-sizes=\"(max-width: 641px) 100vw, 641px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 641px; --smush-placeholder-aspect-ratio: 641\/181;\" \/><\/a><\/p>\n<p>Bir listener temel olarak i\u00e7erisinde \u00e7e\u015fitli configuration&#8217;lar ve gelen request&#8217;ler i\u00e7in farkl\u0131 filter&#8217;lar bulundurmaktad\u0131r. Yukar\u0131daki resimden de g\u00f6rebilece\u011fimiz \u00fczere, bu filter&#8217;lar bir &#8220;<em><a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/api-v3\/config\/listener\/v3\/listener_components.proto#envoy-v3-api-msg-config-listener-v3-filterchain\" target=\"_blank\" rel=\"noopener noreferrer\">filterChains<\/a><\/em>&#8221; elementi alt\u0131nda toplanmaktad\u0131r. Bu noktada bizim inceleyecek oldu\u011fumuz filter ise, TLS&#8217;in etkin oldu\u011funda devreye girecek olan filter.<\/p>\n<p>\u00d6ncelikle a\u015fa\u011f\u0131daki komut yard\u0131m\u0131 ile inbound listener detaylar\u0131n\u0131 elde edelim.<\/p>\n<pre class=\"lang:default decode:true\">istioctl pc listeners product-gateway-api-v1-7996bf7cdf-dz289 --address 0.0.0.0 --port 15006 -o json | less<\/pre>\n<p>Bu noktada ise, olduk\u00e7a uzun bir response alaca\u011f\u0131z. Fakat ben sadece gerekli g\u00f6rd\u00fc\u011f\u00fcm k\u0131s\u0131mlara de\u011finece\u011fim.<\/p>\n<p>\u0130lgilenecek oldu\u011fumuz filter&#8217;\u0131n, TLS etkin oldu\u011funda devreye girecek olan filter oldu\u011funu s\u00f6ylemi\u015ftik.<\/p>\n<p>Bu filter&#8217;\u0131 ise a\u015fa\u011f\u0131daki gibi ay\u0131rt edebiliriz.<\/p>\n<pre class=\"lang:default decode:true\">\"filterChains\": [\r\n    {\r\n        \"filterChainMatch\": {\r\n            \"prefixRanges\": [\r\n                {\r\n                    \"addressPrefix\": \"0.0.0.0\",\r\n                    \"prefixLen\": 0\r\n                }\r\n            ],\r\n            \"transportProtocol\": \"tls\"\r\n        },<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2020\/10\/listener-detail-1.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3559 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/10\/listener-detail-1.png\" alt=\"\" width=\"1442\" height=\"1326\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/listener-detail-1.png 1442w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/listener-detail-1-300x276.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/listener-detail-1-1024x942.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/listener-detail-1-768x706.png 768w\" data-sizes=\"(max-width: 1442px) 100vw, 1442px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1442px; --smush-placeholder-aspect-ratio: 1442\/1326;\" \/><\/a><\/p>\n<p>Bu filter i\u00e7erisindeki bizim i\u00e7in \u00f6nemli olan noktalardan bir tanesi &#8220;<strong>transportSocket<\/strong>&#8221; element&#8217;i. Bu element i\u00e7erisinde TLS i\u00e7in gerekli olan sertifika gibi bilgilerin yer ald\u0131\u011f\u0131n\u0131 g\u00f6rebiliriz.<\/p>\n<p>Biraz daha detaya girmek gerekirse, &#8220;<strong>tlsCertificateSdsSecretConfigs<\/strong>&#8221; element&#8217;ine bakt\u0131\u011f\u0131m\u0131zda TLS sertifikalar\u0131n\u0131n \u00e7ekilebilmesi i\u00e7in gerekli olan <em>Secret Discovery Service<\/em> (SDS) bilgilerinin burada yer ald\u0131\u011f\u0131n\u0131 g\u00f6rebiliriz. Ayr\u0131ca &#8220;<strong>validationContextSdsSecretConfig<\/strong>&#8221; element&#8217;inde ise, TLS sertifikalar\u0131n\u0131n do\u011frulama i\u015flemleri i\u00e7in gerekli olacak &#8220;<strong>ROOTCA<\/strong>&#8221; eri\u015fim bilgilerinin de yer ald\u0131\u011f\u0131n\u0131 g\u00f6rebiliriz.<\/p>\n<p>Mutual TLS mesh i\u00e7erisinde aktif oldu\u011fu i\u00e7in, &#8220;<strong>ROOTCA<\/strong>&#8221; eri\u015fim bilgileri do\u011frulama i\u015flemleri i\u00e7in zorunludur. Ayr\u0131ca bu gereklili\u011fi &#8220;<strong>requireClientCertificate<\/strong>&#8221; element&#8217;inin de\u011ferine bakarak da anlayabiliriz. Bizim senaryomuzda &#8220;<strong>true<\/strong>&#8221; oldu\u011funu da g\u00f6rebiliriz. Yani &#8220;<em>product-gateway-api<\/em>&#8221; pod&#8217;una istek yapan bir client, eri\u015fim sa\u011flayabilmesi i\u00e7in kendi sertifikas\u0131n\u0131 da sunmas\u0131 gerekmektedir.<\/p>\n<p>Client kendi sertifikas\u0131n\u0131 sundu\u011funda ise burada devreye envoy&#8217;un <strong>TLS Inspector<\/strong> filter&#8217;\u0131 devreye girer. Bu filter, <strong>SNI<\/strong>&#8216;\u0131n elde edilmesi gibi initial TLS handshake i\u015flemlerini ger\u00e7ekle\u015ftirir. B\u00f6ylece bu SNI bilgisi, &#8220;<em>filterChains<\/em>&#8221; e\u015fle\u015ftirme i\u015flemleri i\u00e7in kullan\u0131labilir bir hale gelir. Bu konu hakk\u0131nda daha detayl\u0131 bilgilere ise, <em><a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/intro\/life_of_a_request\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em> eri\u015febilirsiniz.<\/p>\n<h3>Cluster Taraf\u0131<\/h3>\n<p>\u015eimdi ise client taraf\u0131ndaki i\u015flemlere bir bakal\u0131m. Bunun i\u00e7in ise upstream request&#8217;in configuration&#8217;lar\u0131na bakmam\u0131z gerekmektedir.<\/p>\n<p>\u0130lk olarak a\u015fa\u011f\u0131daki komut yard\u0131m\u0131yla &#8220;<em>product-gateway-api<\/em>&#8221; pod&#8217;unun cluster \u00f6zetini elde edelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2020\/10\/pod-cluster-sum.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3563 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/10\/pod-cluster-sum.png\" alt=\"\" width=\"1442\" height=\"531\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/pod-cluster-sum.png 1442w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/pod-cluster-sum-300x110.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/pod-cluster-sum-1024x377.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/pod-cluster-sum-768x283.png 768w\" data-sizes=\"(max-width: 1442px) 100vw, 1442px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1442px; --smush-placeholder-aspect-ratio: 1442\/531;\" \/><\/a><\/p>\n<p>Burada g\u00f6rebilece\u011fimiz \u00fczere bir \u00e7ok endpoint bulunmakta. Biz ise \u00f6rnek ama\u00e7l\u0131 &#8220;<em>product-gateway-api<\/em>&#8221; pod&#8217;undan &#8220;<em>stock-api<\/em>&#8221; pod&#8217;una eri\u015fmeye \u00e7al\u0131\u015f\u0131l\u0131yorken kullan\u0131lan configuration detaylar\u0131na bir bakal\u0131m.<\/p>\n<p>Bunu yapabilmek i\u00e7in a\u015fa\u011f\u0131daki komut yard\u0131m\u0131yla &#8220;<em>stock-api.default.svc.cluster.local<\/em>&#8221; endpoint&#8217;inin detaylar\u0131n\u0131 elde edeleim.<\/p>\n<pre class=\"lang:default decode:true\">istioctl pc cluster product-gateway-api-v1-7996bf7cdf-dz289 --fqdn stock-api.default.svc.cluster.local  -o json | less<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2020\/10\/istio-cluster-detail-fqdn.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3564 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/10\/istio-cluster-detail-fqdn.png\" alt=\"\" width=\"1442\" height=\"1326\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-cluster-detail-fqdn.png 1442w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-cluster-detail-fqdn-300x276.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-cluster-detail-fqdn-1024x942.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-cluster-detail-fqdn-768x706.png 768w\" data-sizes=\"(max-width: 1442px) 100vw, 1442px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1442px; --smush-placeholder-aspect-ratio: 1442\/1326;\" \/><\/a><\/p>\n<p>Burada da listener&#8217;da oldu\u011fu gibi &#8220;<strong>transportSocket<\/strong>&#8221; element&#8217;inin TLS sertifika i\u015flemleri i\u00e7in yer ald\u0131\u011f\u0131n\u0131 g\u00f6rebiliriz. Ayr\u0131ca TLS i\u015flemleri i\u00e7in kullan\u0131lacak olan &#8220;<em>sni<\/em>&#8221; b\u00f6l\u00fcm\u00fc de burada yer almaktad\u0131r.<\/p>\n<h2>Toparlayal\u0131m<\/h2>\n<p>Hi\u00e7birimiz hassas verilerimizin kolayca elde edilebilmesini istemeyiz. Bu sebeple uygulamalar\u0131m\u0131z aras\u0131 ileti\u015fimin g\u00fcvenli bir \u015fekilde ger\u00e7ekle\u015fiyor olmas\u0131, olduk\u00e7a \u00f6nemli bir konu. Bu makale kapsam\u0131nda ise kod taraf\u0131nda herhangi bir de\u011fi\u015fiklik yapmadan, istio service mesh&#8217;i kullanarak uygulamalar\u0131m\u0131z aras\u0131 ileti\u015fimi g\u00fcvenli bir hale getirmeye \u00e7al\u0131\u015ft\u0131k. Istio ile mTLS&#8217;i global olarak etkinle\u015ftirebilmenin yan\u0131 s\u0131ra, farkl\u0131 scope&#8217;lara g\u00f6re de configure edebilmemize izin veriyor olmas\u0131 olduk\u00e7a harika bir esneklik. Ayr\u0131ca istio sertifikalar\u0131n y\u00f6netilmesi a\u00e7\u0131s\u0131ndan da, bizleri bir \u00e7ok operasyonel y\u00fckten kurtarmaktad\u0131r.<\/p>\n<h2>Referanslar<\/h2>\n<p>https:\/\/istio.io\/latest\/docs\/reference\/config\/security\/<br \/>\nhttps:\/\/istio.io\/latest\/docs\/ops\/diagnostic-tools\/proxy-cmd\/<br \/>\nhttps:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/api-v3\/config\/transport_socket\/transport_socket<br \/>\nhttps:\/\/developer.ibm.com\/technologies\/containers\/tutorials\/istio-security-mtls\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tahmin edebilece\u011fimiz gibi g\u00fcn\u00fcm\u00fcz ihtiya\u00e7lar\u0131n\u0131n h\u0131zla artmas\u0131yla beraber, bir \u00e7ok organizasyon bu ihtiya\u00e7lara ayak uydurabilmek i\u00e7in teknolojisini h\u0131zla yenilemeye devam ediyor. Buradaki yakla\u015f\u0131m ise genellikle hem business&#8217;\u0131\/organizasyonu hem de teknolojiyi scale edebilmek i\u00e7in microservice architecture&#8217;\u0131 odakl\u0131 oluyor. Bildi\u011fimiz gibi bu yenileme s\u00fcreci i\u00e7erisinde bir \u00e7ok&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/securing-microservice-communication-with-istio\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Microservice \u0130leti\u015fimini Istio ile G\u00fcvenli Bir Hale Getirme<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":3583,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[505,68,434,368],"tags":[584,587,588,440,589,585,586,535],"class_list":["post-3506","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-architectural","category-containerizing","category-microservices","tag-istio","tag-istio-mtls","tag-istio-security","tag-kubernetes","tag-kubernetes-service-mesh","tag-mtls","tag-mutual-tls","tag-service-mesh","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Microservice \u0130leti\u015fimini Istio ile G\u00fcvenli Bir Hale Getirme - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Microservice \u0130leti\u015fimini Istio ile G\u00fcvenli Bir Hale Getirme - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-16T17:15:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-10-17T08:06:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-service-mesh-mtls-config.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Microservice \u0130leti\u015fimini Istio ile G\u00fcvenli Bir Hale Getirme\",\"datePublished\":\"2020-10-16T17:15:53+00:00\",\"dateModified\":\"2020-10-17T08:06:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/\"},\"wordCount\":4337,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/istio-service-mesh-mtls-config.jpg\",\"keywords\":[\"istio\",\"istio mtls\",\"istio security\",\"kubernetes\",\"kubernetes service mesh\",\"mtls\",\"mutual tls\",\"service mesh\"],\"articleSection\":[\".NET Core\",\"Architectural\",\"Containerizing\",\"Microservices\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/\",\"name\":\"Microservice \u0130leti\u015fimini Istio ile G\u00fcvenli Bir Hale Getirme - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/istio-service-mesh-mtls-config.jpg\",\"datePublished\":\"2020-10-16T17:15:53+00:00\",\"dateModified\":\"2020-10-17T08:06:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/istio-service-mesh-mtls-config.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/istio-service-mesh-mtls-config.jpg\",\"width\":1200,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-microservice-communication-with-istio\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Securing Microservice Communication with Istio\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Microservice \u0130leti\u015fimini Istio ile G\u00fcvenli Bir Hale Getirme - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/","og_locale":"tr_TR","og_type":"article","og_title":"Microservice \u0130leti\u015fimini Istio ile G\u00fcvenli Bir Hale Getirme - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2020-10-16T17:15:53+00:00","article_modified_time":"2020-10-17T08:06:36+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-service-mesh-mtls-config.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Microservice \u0130leti\u015fimini Istio ile G\u00fcvenli Bir Hale Getirme","datePublished":"2020-10-16T17:15:53+00:00","dateModified":"2020-10-17T08:06:36+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/"},"wordCount":4337,"commentCount":0,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-service-mesh-mtls-config.jpg","keywords":["istio","istio mtls","istio security","kubernetes","kubernetes service mesh","mtls","mutual tls","service mesh"],"articleSection":[".NET Core","Architectural","Containerizing","Microservices"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/","url":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/","name":"Microservice \u0130leti\u015fimini Istio ile G\u00fcvenli Bir Hale Getirme - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-service-mesh-mtls-config.jpg","datePublished":"2020-10-16T17:15:53+00:00","dateModified":"2020-10-17T08:06:36+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-service-mesh-mtls-config.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/istio-service-mesh-mtls-config.jpg","width":1200,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/securing-microservice-communication-with-istio\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Securing Microservice Communication with Istio"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3506","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=3506"}],"version-history":[{"count":5,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3506\/revisions"}],"predecessor-version":[{"id":3593,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3506\/revisions\/3593"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/3583"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=3506"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=3506"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=3506"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}