{"id":277,"date":"2025-12-03T05:19:15","date_gmt":"2025-12-03T05:19:15","guid":{"rendered":"https:\/\/blog.ngocha.biz\/?p=277"},"modified":"2025-12-03T05:19:15","modified_gmt":"2025-12-03T05:19:15","slug":"gateway-api-for-service-mesh","status":"publish","type":"post","link":"https:\/\/blog.ngocha.biz\/?p=277","title":{"rendered":"How to Use Kubernetes Gateway API for Istio Service Mesh (GAMMA Approach)"},"content":{"rendered":"<p>In this blog we will look at how to use the Gateway API for internal <a href=\"https:\/\/devopscube.com\/istio-architecture\/\" rel=\"noreferrer\">Istio<\/a> traffic management (east-west traffic) using the GAMMA approach.<\/p>\n<p>We will also look at a real world case study of GAMMA approach used in production.<\/p>\n<p>In the earlier blog about <a href=\"https:\/\/devopscube.com\/istio-ingress-kubernetes-gateway-api\/\" rel=\"noreferrer\">Istio ingress with Gateway API<\/a>, we learned how Gateway API works with the Istio gateway controller to manage ingress and egress traffic.<\/p>\n<p>But the <a href=\"https:\/\/devopscube.com\/setup-envoy-gateway-api\/\"><strong>Gateway API<\/strong><\/a><strong> is not only for ingress<\/strong>. With the GAMMA initiative, we can now use Gateway API for internal service-to-service routing inside the mesh as well.<\/p>\n<p>Also, when using <a href=\"https:\/\/devopscube.com\/setup-istio-ambient-mode\/\" rel=\"noreferrer\">Istio Ambient Mesh mode<\/a>, the L7 traffic management is managed using gateway API.<\/p>\n<p>First, let\u2019s understand what GAMMA is.<\/p>\n<h2 id=\"gamma-the-future-of-mesh-routing\">GAMMA: The Future of Mesh Routing<\/h2>\n<p><a href=\"https:\/\/gateway-api.sigs.k8s.io\/mesh\/gamma\/?ref=devopscube.com\" rel=\"noreferrer\">GAMMA<\/a> stands for <strong>Gateway API for Mesh Management<\/strong> and Administration.<\/p>\n<p><a href=\"https:\/\/devopscube.com\/kubernetes-gateway-api\/\" rel=\"noreferrer\">Kubernetes Gateway API<\/a> was originally designed to manage ingress traffic. That means routing requests coming from outside the cluster to services inside the cluster (north-south traffic).<\/p>\n<p>GAMMA extends Gateway API to support <strong>internal service-to-service traffic<\/strong> (east-west traffic). This allows us to use the same Gateway API resources like <strong><code>HTTPRoute<\/code><\/strong> and <strong><code>GRPCRoute<\/code><\/strong> for both ingress and mesh traffic.<\/p>\n<div class=\"kg-card kg-callout-card kg-callout-card-blue\">\n<div class=\"kg-callout-emoji\">\ud83d\udca1<\/div>\n<div class=\"kg-callout-text\">Ideally we we are shifting away from Istio&#8217;s proprietary <code spellcheck=\"false\" style=\"white-space: pre-wrap;\">VirtualService<\/code> and use the Kubernetes standard <code spellcheck=\"false\" style=\"white-space: pre-wrap;\">HTTPRoute<\/code><\/div>\n<\/div>\n<p>Although we use the same <strong><code>HTTPRoute<\/code><\/strong> object, there is one <strong>key difference<\/strong> when using it for internal mesh traffic.<\/p>\n<p>When HTTPRoute is used for ingress traffic, we normally set the <strong>parentRefs to a Gateway<\/strong>, because the Gateway owns the IP and ports that receive external requests.<\/p>\n<p>But in the GAMMA approach, <strong>HTTPRoute parentRefs references a Kubernetes Service<\/strong> instead of Gateways. The HTTPRoute then controls how traffic arriving at that service is routed (weighting, traffic splitting, and more).<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/12\/image-5.png\" class=\"kg-image\" alt=\"Gateway API for Mesh Management\" loading=\"lazy\" width=\"2000\" height=\"1553\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/12\/image-5.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2025\/12\/image-5.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1600\/2025\/12\/image-5.png 1600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/12\/image-5.png 2371w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Another important point is that you cannot use the <strong>shared service + subsets<\/strong> <strong>pattern<\/strong> like we do in Istio with VirtualService and <strong><code>DestinationRule<\/code><\/strong>. The reason is that Gateway API is designed to be a vendor-neutral standard that <strong>works across different service mesh<\/strong> implementations, not only Istio.<\/p>\n<p>Now that we have an understanding of GAMMA, lets look at how to implement it practically.<\/p>\n<h2 id=\"implementing-canary-deployments-with-gamma\">Implementing Canary Deployments with GAMMA<\/h2>\n<p>In this hands-on setup, we will implement a canary deployment with GAMMA approach.<\/p>\n<p>Here is what we are going to build.<\/p>\n<ol>\n<li>Deploy two versions of the app<\/li>\n<li>Expose them through their own services<\/li>\n<li>Create a shared service that acts as the <strong>parent reference<\/strong> for the <strong><code>HTTPRoute<\/code><\/strong><\/li>\n<li>Create an HTTPRoute with the shared service as the parentRef, splitting traffic 90\/10 between the two service endpoints<\/li>\n<li>Create two DestinationRules to apply Istio features to the application traffic<\/li>\n<li>Finally, validate the setup with a client request.<\/li>\n<\/ol>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/12\/image-6.png\" class=\"kg-image\" alt=\"Implementing Canary Deployments with GAMMA\" loading=\"lazy\" width=\"2000\" height=\"1777\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/12\/image-6.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2025\/12\/image-6.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1600\/2025\/12\/image-6.png 1600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w2400\/2025\/12\/image-6.png 2400w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<\/p>\n<div class=\"kg-card kg-callout-card kg-callout-card-blue\">\n<div class=\"kg-callout-emoji\">\ud83d\udccc<\/div>\n<div class=\"kg-callout-text\">I am showing a canary setup for demo purposes. You can also route all traffic to a single service endpoint if needed.<\/div>\n<\/div>\n<h2 id=\"setup-prerequisites\">Setup Prerequisites<\/h2>\n<p>To follow this setup, you need to have the following.<\/p>\n<ol>\n<li>Kubernetes cluster with Istio Installed<\/li>\n<li>Gateway API CRD&#8217;s installed in the cluster.<\/li>\n<\/ol>\n<div class=\"kg-card kg-callout-card kg-callout-card-blue\">\n<div class=\"kg-callout-emoji\">\ud83d\udccc<\/div>\n<div class=\"kg-callout-text\">Refer <a href=\"https:\/\/devopscube.com\/setup-istio-on-kubernetes\/\" rel=\"noreferrer\">Istio Installtion Guide<\/a> if you dont have a Istio setup ready.<\/div>\n<\/div>\n<h2 id=\"create-istio-enabled-namespace\">Create Istio Enabled Namespace<\/h2>\n<p>We will deploy all the objects in the istio-test namespace.<\/p>\n<p>If you don\u2019t already have this namespace, use the command below to create it and enable Istio for it.<\/p>\n<pre><code class=\"language-bash\">kubectl create ns istio-test\n\nkubectl label namespace istio-test istio-injection=enabled<\/code><\/pre>\n<h2 id=\"deploy-the-workloads-backend-v1-v2\">Deploy the Workloads (Backend v1 &amp; v2)<\/h2>\n<p>For testing Gateway API with the mesh, we will deploy two versions of the application and expose them through separate services (<code>backend-v1<\/code> and <code>backend-v2<\/code>)<\/p>\n<p>Use the following manifest to deploy the apps and services.<\/p>\n<pre><code class=\"language-yaml\">cat &lt;&lt;'EOF' | kubectl apply -f -\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: backend-v1\n  namespace: istio-test\nspec:\n  replicas: 3\n  selector:\n    matchLabels: { app: backend, version: v1 }\n  template:\n    metadata:\n      labels: { app: backend, version: v1 }\n    spec:\n      containers:\n      - name: echo\n        image: hashicorp\/http-echo\n        args: [\"-text=hello from backend v1\"]\n        ports:\n        - containerPort: 5678\n---\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: backend-v2\n  namespace: istio-test\nspec:\n  replicas: 2\n  selector:\n    matchLabels: { app: backend, version: v2 }\n  template:\n    metadata:\n      labels: { app: backend, version: v2 }\n    spec:\n      containers:\n      - name: echo\n        image: hashicorp\/http-echo\n        args: [\"-text=hello from backend v2\"]\n        ports:\n        - containerPort: 5678\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: backend-v1\n  namespace: istio-test\nspec:\n  selector:\n    app: backend\n    version: v1\n  ports:\n  - name: http\n    port: 80\n    targetPort: 5678\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: backend-v2\n  namespace: istio-test\nspec:\n  selector:\n    app: backend\n    version: v2\n  ports:\n  - name: http\n    port: 80\n    targetPort: 5678\nEOF<\/code><\/pre>\n<h2 id=\"configure-the-root-service\">Configure the Root Service<\/h2>\n<p>Now we have <code>backend-v1<\/code> and <code>backend-v2<\/code> services.<\/p>\n<p>However, clients in the mesh need a single stable address (e.g., <code>http:\/\/backend<\/code>) to call. You can call this the <strong>root service<\/strong>. The mesh will then <strong>split between v1 and v2 services.<\/strong><\/p>\n<p>Use the following YAML to create the shared service (root service).<\/p>\n<pre><code class=\"language-yaml\">cat &lt;&lt;'EOF' | kubectl apply -f -\napiVersion: v1\nkind: Service\nmetadata:\n  name: backend\n  namespace: istio-test\nspec:\n  selector:\n    app: backend \n  ports:\n  - name: http\n    port: 80\n    targetPort: 5678\nEOF<\/code><\/pre>\n<h2 id=\"deploy-httproute-for-canary-routing\">Deploy HTTPRoute For Canary Routing<\/h2>\n<p>Now, lets create an <code>HTTPRoute<\/code> that binds to the shared <code>backend<\/code> Service. <\/p>\n<p>We will define a <strong>90\/10 c<\/strong>anary<strong> traffic splitting. <\/strong>Meaning,<strong> <\/strong>90% of traffic goes to V1 backend, and 10% goes to V2 backend.<\/p>\n<pre><code class=\"language-yaml\">cat &lt;&lt;'EOF' | kubectl apply -f -\napiVersion: gateway.networking.k8s.io\/v1\nkind: HTTPRoute\nmetadata:\n  name: backend-split\n  namespace: istio-test\nspec:\n  parentRefs:\n  - name: backend \n    kind: Service\n    group: \"\"\n    port: 80\n  rules:\n  - backendRefs:\n    - name: backend-v1\n      port: 80\n      weight: 90\n    - name: backend-v2\n      port: 80\n      weight: 10\nEOF\n<\/code><\/pre>\n<p>Validate the HTTPRoute<\/p>\n<pre><code class=\"language-bash\">$ kubectl get HTTPRoute -n istio-test\n\nNAME            HOSTNAMES   AGE\nbackend-split               9m48s<\/code><\/pre>\n<h2 id=\"destination-rule-to-apply-istio-features\">Destination Rule To Apply Istio Features<\/h2>\n<p>The  <code>HTTPRoute<\/code> we created  in the previous step primarily handles the routing. Meaning, it knows which service to send traffic.<\/p>\n<p>But it cannot implement advanced <em>connection<\/em> settings like Load Balancing algorithms, Circuit Breaking, outlier detection etc.  It is still handled by the the Istio <strong>DestinationRule<\/strong>.<\/p>\n<div class=\"kg-card kg-callout-card kg-callout-card-blue\">\n<div class=\"kg-callout-emoji\">\ud83d\udca1<\/div>\n<div class=\"kg-callout-text\"><b><strong style=\"white-space: pre-wrap;\">Note: <\/strong><\/b>The Gateway API is developing <code spellcheck=\"false\" style=\"white-space: pre-wrap;\">BackendLBPolicy<\/code>, for load-balancing, session-persistence, LB behavior etc but currently, <code spellcheck=\"false\" style=\"white-space: pre-wrap;\">DestinationRule<\/code> is the standard way to configure this in Istio<\/div>\n<\/div>\n<p>For our canary traffic splitting, lets create DestinationRule that applies <code>ROUND_ROBIN<\/code> algorithm and <code>ISTIO_MUTUAL<\/code> tls mode for encryption.<\/p>\n<p>We create two separate DestinationRule becuase, <code>backend-v1<\/code> and <code>backend-v2<\/code> are treated as independent destinations.<\/p>\n<p>Deploy the DestinationRule using the following manifest.<\/p>\n<pre><code class=\"language-yaml\">cat &lt;&lt;EOF | kubectl apply -f -\napiVersion: networking.istio.io\/v1beta1\nkind: DestinationRule\nmetadata:\n  name: backend-v1-settings\n  namespace: istio-test\nspec:\n  host: backend-v1.istio-test.svc.cluster.local\n  trafficPolicy:\n    loadBalancer:\n      simple: ROUND_ROBIN\n    tls:\n      mode: ISTIO_MUTUAL\n---\napiVersion: networking.istio.io\/v1beta1\nkind: DestinationRule\nmetadata:\n  name: backend-v2-settings\n  namespace: istio-test\nspec:\n  host: backend-v2.istio-test.svc.cluster.local\n  trafficPolicy:\n    loadBalancer:\n      simple: ROUND_ROBIN\n    tls:\n      mode: ISTIO_MUTUAL\nEOF<\/code><\/pre>\n<p>Lets validate the <code><strong>DestinationRule<\/strong><\/code> using <code>istioctl<\/code>.<\/p>\n<pre><code class=\"language-bash\">$ istioctl x describe service backend-v1 -n istio-test\n\nService: backend-v1\n   Port: http 80\/HTTP targets pod port 5678\nDestinationRule: backend-v1-settings for \"backend-v1.istio-test.svc.cluster.local\"\n   Traffic Policy TLS Mode: ISTIO_MUTUAL\n   Policies: load balancer\nSkipping Gateway information (no ingress gateway pods)<\/code><\/pre>\n<p><code><strong>DestinationRule: backend-v1-settings<\/strong><\/code> confirms that Istio has successfully linked the specific <code>DestinationRule<\/code> we created to the <code>backend-v1<\/code> service with tls and round robin algorithm.<\/p>\n<h2 id=\"validate-canary-traffic\">Validate Canary Traffic<\/h2>\n<p>Lets deploy a simple client pod with curl to validate the canary traffic.<\/p>\n<p>Deploy the following manifest.<\/p>\n<pre><code class=\"language-yaml\">cat &lt;&lt;EOF | kubectl apply -f - \napiVersion: v1\nkind: Pod\nmetadata:\n  name: client\n  namespace: istio-test\n  labels:\n    app: sleep\nspec:\n  containers:\n  - name: curl\n    image: curlimages\/curl:8.8.0\n    command:\n    - sh\n    - -c\n    - sleep 3650d\nEOF<\/code><\/pre>\n<p>Execute<\/p>\n<pre><code class=\"language-bash\">$ kubectl exec -n istio-test client -- sh -c 'for i in $(seq 1 20); do curl -s http:\/\/backend; done'\n\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v2 &lt;-- The Canary\nhello from backend v2 &lt;-- The Canary\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v1\nhello from backend v1<\/code><\/pre>\n<p>You should see approximately 18 responses from <code>hello from backend v1<\/code> and 2 responses from <code>hello from backend v2<\/code> as given above.<\/p>\n<p>Thats it!<\/p>\n<p>We have implemented a hybrid model that is becoming the standard for modern Istio. <\/p>\n<ol>\n<li><strong>Routing (GAMMA API)<\/strong>: <code>HTTPRoute<\/code> is splitting traffic (90\/10) <\/li>\n<li><strong>Policy (Istio API)<\/strong>: <code>DestinationRule<\/code> is securing and managing the connection to the specific workloads.<\/li>\n<\/ol>\n<h2 id=\"production-case-study\">Production Case Study <\/h2>\n<p><a href=\"https:\/\/www.careem.com\/?ref=devopscube.com\" rel=\"noreferrer\">Careem<\/a> (the &#8220;Super App&#8221; of the Middle East) migrated a platform handling <strong>5 Billion+ requests\/da<\/strong>y from Linkerd to Istio without a single second of downtime.<\/p>\n<p>Migrating between service meshes (e.g., Linkerd to Istio) is typically risky. Becuase the configuration APIs are not compatible so it becomes labor-intensive.<\/p>\n<p>For example, Linkerd uses <strong><code>ServiceProfile<\/code><\/strong> and <strong><code>annotations<\/code><\/strong> and Istio uses <strong><code>VirtualService<\/code><\/strong> and <strong><code>DestinationRule<\/code><\/strong>.<\/p>\n<p>Now think of <strong>migrating 5 billion daily requests<\/strong>. <\/p>\n<p>You will have to basically thousands of route configurations and risk downtime if the translatated confiruagtions are not perfect.<\/p>\n<p>But Careem used the <strong>Gateway API <\/strong> as a vendor-neutral abstraction layer.<\/p>\n<p>Meaning, instead of translating Linkerd configs to Istio configs, they used the &#8220;<strong><em>Define Once, Swap Implementation<\/em><\/strong>&#8221; strategy.<\/p>\n<p>What they did was, they rewrote their routing rules into standard <strong>Kubernetes Gateway API<\/strong> resources (<code>HTTPRoute<\/code>). It is supported by both latest Linkerd and Istio versions.<\/p>\n<p>By doing this, the routing logic was no longer tied to Linkerd or Istio CRDs.<\/p>\n<p>For migration here is what they did.<\/p>\n<ol>\n<li>They deployed the standard HTTPRoute resources.<\/li>\n<li>They installed Istio alongside the existing infrastructure configuring <strong>Permissive mTLS. That <\/strong>allowed services in different meshes to communicate without encryption errors.<\/li>\n<li>They used <strong>Flagger<\/strong> to automate the rollout. It was configured to manipulate standard <code>HTTPRoute<\/code> resources for traffic splitting.<\/li>\n<li>Then they triggered deployments to inject Istio sidecars, allowing Flagger to <strong>gradually shift traffic weights<\/strong> in the <code>HTTPRoute<\/code> from Linkerd-meshed pods to new Istio-meshed pods.<\/li>\n<li>This canary-based approach validated metrics at every step, ensuring <strong>zero downtime<\/strong> before fully promoting Istio and removing Linkerd.<\/li>\n<\/ol>\n<p>To ensure safety during the transition, they <strong>utilized a Blue\/Green Ingress<\/strong> strategy. Meaning, they set up a &#8216;Blue&#8217; gateway (Istio) alongside the &#8216;Green&#8217; gateway (Linkerd) and used DNS manipulation to route traffic into the specific mesh.<\/p>\n<p>Here is the reference architecture.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/12\/image-8.png\" class=\"kg-image\" alt=\"\" loading=\"lazy\" width=\"844\" height=\"858\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/12\/image-8.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/12\/image-8.png 844w\" sizes=\"auto, (min-width: 720px) 720px\"><figcaption><span style=\"white-space: pre-wrap;\">Source: Kubecon Presentation<\/span><\/figcaption><\/figure>\n<p>The key thing here is, there is not vendor specific lock-in now. If they ever change meshes again, the <code>HTTPRoute<\/code> definitions can stay.<\/p>\n<p>If you want to understand this migration in detail, please watch the G<a href=\"https:\/\/www.youtube.com\/watch?v=igJXmbwMYAc&#038;ref=devopscube.com\" rel=\"noreferrer\">AMMA in action<\/a> video.<\/p>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<p>The Gateway API is becoming the standard for Kubernetes Ingress and Mesh traffic management. <\/p>\n<p>While Istio\u2019s <strong><code>VirtualService<\/code><\/strong> and <strong><code>DestinationRule<\/code><\/strong> APIs are still widely used, GAMMA provides a vendor-neutral approach. Meaning, you can use HTTPRoute for internal traffic and decouple the routing logic from the underlying mesh implementation. <\/p>\n<p>It will also make migrations (as seen in the Careem case study) and multi-mesh operations significantly easier.<\/p>\n<p>Over to you.<\/p>\n<p>Have you started experimenting with Gateway API? Or are you planning for a migration?<\/p>\n<p>Either way, lets me know your thoughts in the comments.<\/p>\n<hr>\n<p><strong>Ngu\u1ed3n:<\/strong> <a href=\"https:\/\/devopscube.com\/gateway-api-for-service-mesh\/\" target=\"_blank\" rel=\"noopener noreferrer\">How to Use Kubernetes Gateway API for Istio Service Mesh (GAMMA Approach) \u2014 DevOpsCube<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Source: https:\/\/devopscube.com\/gateway-api-for-service-mesh\/<\/p>\n","protected":false},"author":1,"featured_media":278,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-277","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/277","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=277"}],"version-history":[{"count":0,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/277\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/media\/278"}],"wp:attachment":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=277"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}