{"id":1889,"date":"2024-02-02T12:46:49","date_gmt":"2024-02-02T12:46:49","guid":{"rendered":"https:\/\/imesh.ai\/blog\/?p=1889"},"modified":"2024-02-06T04:24:33","modified_gmt":"2024-02-06T04:24:33","slug":"kubernetes-gateway-api-implementation","status":"publish","type":"post","link":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/","title":{"rendered":"Kubernetes Gateway API Implementation in 3 Steps"},"content":{"rendered":"\n<p>We discussed the <a href=\"https:\/\/imesh.ai\/blog\/migrating-ingress-to-kubernetes-gateway-api\/\">3 R\u2019s migration strategy to switch from Ingress to Gateway API<\/a>. This blog will walk you through its demo. The demo will show you how to gradually shift traffic from Ingress and implement Kubernetes Gateway API in your cluster.<\/p>\n\n\n\n<p>I will use <em>Gateway <\/em>and <em>HTTPRoute <\/em>resources of the Gateway API. As a quick recap:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>Gateway<\/em><\/strong> is used to get the traffic inside the cluster<\/li>\n\n\n\n<li><strong><em>HTTPRoute<\/em><\/strong><em> <\/em>CRD is used to apply routing rules, matches, filters, etc., on incoming traffic.<\/li>\n<\/ul>\n\n\n\n<p>You will also see header injection and path-based matching with Gateway API.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Steps to implement Kubernetes Gateway API<\/h2>\n\n\n\n<p>I will follow the given 3-step process for the demo to implement Gateway API:<br><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"#step0\">Step #0: Demo overview and prerequisites<\/a><\/li>\n\n\n\n<li><a href=\"#step1\">Step #1: Deploy the banking application and Ingress<\/a><\/li>\n\n\n\n<li><a href=\"#step2\">Step #2: Deploy <em>Gateway<\/em> and <em>HTTPRoute <\/em>CRDs of Gateway API<\/a><\/li>\n\n\n\n<li><a href=\"#step3\">Step #3: Weighted traffic distribution between Ingress and Gateway API<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading step0\" id=\"step0\">Step #0: Demo overview and prerequisites<\/h3>\n\n\n\n<p>I will start by deploying the banking application, which has <em>dashboard<\/em>, <em>account<\/em>, and <em>profile <\/em>services (see Fig.A).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"960\" height=\"540\" src=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-with-dashboard-profile-and-account-services.png\" alt=\"banking application with dashboard, profile, and account services\" class=\"wp-image-1891\" srcset=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-with-dashboard-profile-and-account-services.png 960w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-with-dashboard-profile-and-account-services-300x169.png 300w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-with-dashboard-profile-and-account-services-768x432.png 768w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-with-dashboard-profile-and-account-services-400x225.png 400w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-with-dashboard-profile-and-account-services-800x450.png 800w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"has-text-align-center\"><em>Fig.A &#8211; Banking application with dashboard, account, and profile services<\/em><\/p>\n\n\n\n<p>I will then expose the <em>dashboard<\/em> and <em>profile <\/em>services using Ingress. Later, you will see how to use K8s Gateway API CRDs (<em>Gateway <\/em>and <em>HTTPRoute<\/em>) to route traffic to the same services and then gradually shift the traffic from Ingress to Gateway API.<\/p>\n\n\n\n<p>The only prerequisite for the demo is to have the Nginx controller and Istio Ingress configured in the cluster. Check out the blog, <a href=\"https:\/\/imesh.ai\/blog\/how-to-get-started-with-istio-in-kubernetes-in-5-steps\/\">How to get started with Istio in Kubernetes in 5 steps<\/a>, to get started with Istio.<\/p>\n\n\n\n<p>I will use the Nginx controller for Ingress, and Istio Ingress will implement Gateway API CRDs. I will also add the name of the respective controller to the request header to identify the controller. This will be helpful in step #3.<\/p>\n\n\n\n<p>All the YAMLs used in the demo are in the <a href=\"https:\/\/github.com\/imesh-ai\/webinar\/tree\/main\/Migrating%20from%20Ingress%20to%20K8s%20Gateway%20API\">IMESH GitHub repo<\/a>. You can also watch the demo in action in the video below:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Migrating from Ingress to Kubernetes Gateway API | Demo | Nginx Ingress | Istio Ingress\" width=\"1130\" height=\"636\" src=\"https:\/\/www.youtube.com\/embed\/KKBBZgaGo-A?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading step1\" id=\"step1\">Step #1: Deploy the banking application and Ingress<\/h3>\n\n\n\n<p>Create a <em>banking-app<\/em> namespace and deploy the banking application. Use the following command to see if the services are up and running:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code>kubectl get all -n banking-app<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"1024\" height=\"390\" src=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-deployment-status-1024x390.png\" alt=\"banking application deployment status\" class=\"wp-image-1892\" srcset=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-deployment-status-1024x390.png 1024w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-deployment-status-300x114.png 300w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-deployment-status-768x292.png 768w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-deployment-status-400x152.png 400w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-deployment-status-800x304.png 800w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-deployment-status-1160x442.png 1160w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-application-deployment-status.png 1382w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>First, I will expose the <em>profile <\/em>service using the following Ingress configuration:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code>apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n&nbsp; name: banking-app-profile-ingress\n&nbsp; namespace: banking-app\n&nbsp; annotations:\n&nbsp; &nbsp; service.beta.kubernetes.io\/port_80_no_probe_rule: \"true\"\n&nbsp; &nbsp; service.beta.kubernetes.io\/azure-load-balancer-health-probe-request-path: \/\n&nbsp; &nbsp; nginx.ingress.kubernetes.io\/server-snippet: |\n&nbsp; &nbsp; &nbsp; more_set_headers \"controller: NGINX\";\nspec:\n&nbsp; ingressClassName: \"nginx\"\n&nbsp; rules:\n&nbsp; &nbsp; - http:\n&nbsp; &nbsp; &nbsp; &nbsp; paths:\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - path: \/users\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pathType: Prefix\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; backend:\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; service:\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name: profile\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; port:\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; number: 8081<\/code><\/pre>\n\n\n\n<p>You can see that Nginx is set as the Ingress controller from <em>ingressClassName: \u201cnginx\u201d<\/em>. The <em>path <\/em>field defines that whenever a request comes to <em>\/users<\/em> path, it will be forwarded to the <em>profile <\/em>service.<\/p>\n\n\n\n<p>Once you apply the Ingress configuration, you can verify it by trying to reach the service with a <em>curl <\/em>command. Use the controller\u2019s IP address, which you can find using the following command, to curl the <em>profile <\/em>service:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code>kubectl get all -n your_ingress_nginx_namespace<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"1024\" height=\"135\" src=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/ingress-nginx-controller-ip-1024x135.png\" alt=\"ingress nginx controller ip\" class=\"wp-image-1893\" srcset=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/ingress-nginx-controller-ip-1024x135.png 1024w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/ingress-nginx-controller-ip-300x40.png 300w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/ingress-nginx-controller-ip-768x101.png 768w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/ingress-nginx-controller-ip-400x53.png 400w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/ingress-nginx-controller-ip-800x106.png 800w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/ingress-nginx-controller-ip-1160x153.png 1160w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/ingress-nginx-controller-ip.png 1537w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Curl <em>profile <\/em>service:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code>curl -v your_controller_ip\/users<\/code><\/pre>\n\n\n\n<p>You will see a response as the following:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"328\" src=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/curl-profile-service-and-check-the-response-1024x328.png\" alt=\"curl profile service and check the response\" class=\"wp-image-1894\" srcset=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/curl-profile-service-and-check-the-response-1024x328.png 1024w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/curl-profile-service-and-check-the-response-300x96.png 300w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/curl-profile-service-and-check-the-response-768x246.png 768w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/curl-profile-service-and-check-the-response-1536x492.png 1536w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/curl-profile-service-and-check-the-response-400x128.png 400w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/curl-profile-service-and-check-the-response-800x256.png 800w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/curl-profile-service-and-check-the-response-1160x371.png 1160w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/curl-profile-service-and-check-the-response.png 1865w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Similarly, you can apply the below Ingress configuration to expose the <em>dashboard<\/em> service:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code>apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  name: banking-app-dashboard-ingress\n  namespace: banking-app\n  annotations:\n    service.beta.kubernetes.io\/port_80_no_probe_rule: \"true\"\n    service.beta.kubernetes.io\/azure-load-balancer-health-probe-request-path: \/\n    nginx.ingress.kubernetes.io\/server-snippet: |\n      more_set_headers \"controller: NGINX\";\nspec:\n  ingressClassName: \"nginx\"\n  rules:\n    - http:\n        paths:\n          - path: \/\n            pathType: Prefix\n            backend:\n              service:\n                name: dashboard\n                port:\n                  number: 3000<\/code><\/pre>\n\n\n\n<p>You can verify it by entering the controller IP in the browser, which will open the dashboard:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"589\" src=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-dashboard-in-browser-1024x589.png\" alt=\"banking dashboard in browser\" class=\"wp-image-1896\" srcset=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-dashboard-in-browser-1024x589.png 1024w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-dashboard-in-browser-300x173.png 300w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-dashboard-in-browser-768x442.png 768w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-dashboard-in-browser-400x230.png 400w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-dashboard-in-browser-800x461.png 800w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-dashboard-in-browser-1160x668.png 1160w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/banking-dashboard-in-browser.png 1395w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>So, we have successfully deployed the banking application, and exposed <em>profile <\/em>and <em>dashboard <\/em>services using Nginx Ingress. Let us now deploy and use Gateway API CRDs to expose the same services.<\/p>\n\n\n\n<h3 class=\"wp-block-heading step2\" id=\"step2\">Step #2: Deploy Gateway and HTTPRoute CRDs of Gateway API<\/h3>\n\n\n\n<p>Use the following <em>Gateway <\/em>configuration and deploy it:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code>apiVersion: gateway.networking.k8s.io\/v1\nkind: Gateway\nmetadata:\n&nbsp; name: banking-gateway\n&nbsp; namespace: banking-app\n&nbsp; annotations:\n&nbsp; &nbsp; service.beta.kubernetes.io\/port_80_no_probe_rule: \"true\" # FOR AZURE\nspec:\n&nbsp; gatewayClassName: istio\n&nbsp; listeners:\n&nbsp; &nbsp; - name: default\n&nbsp; &nbsp; &nbsp; port: 80\n&nbsp; &nbsp; &nbsp; protocol: HTTP\n&nbsp; &nbsp; &nbsp; allowedRoutes:\n&nbsp; &nbsp; &nbsp; &nbsp; namespaces:\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; from: All<\/code><\/pre>\n\n\n\n<p>I\u2019m specifying Istio Ingress as the controller here (<em>gatewayClassName: istio<\/em>). The configuration opens a listener at port 80, and all the routes from any namespace can communicate with it.<\/p>\n\n\n\n<p><strong>Note that we took the IP of the Ingress controller (<\/strong><strong><em>nginx-ingress<\/em><\/strong><strong>) to access the services exposed through Ingress in step #1. In Gateway API, the <\/strong><strong><em>Gateway <\/em><\/strong><strong>creates a new resource\/pod with an external IP on its own.<\/strong><\/p>\n\n\n\n<p>You can use the following command to get the IP:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code>kubectl get all -n banking-app<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"239\" src=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/gateway-resource-external-ip-1024x239.png\" alt=\"kubectl get all -n banking-app\" class=\"wp-image-1897\" srcset=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/gateway-resource-external-ip-1024x239.png 1024w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/gateway-resource-external-ip-300x70.png 300w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/gateway-resource-external-ip-768x179.png 768w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/gateway-resource-external-ip-400x93.png 400w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/gateway-resource-external-ip-800x187.png 800w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/gateway-resource-external-ip-1160x271.png 1160w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/gateway-resource-external-ip.png 1422w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>The <em>Gateway <\/em>resource only opens a listener and does not know where to route the traffic it receives. This is where you can use <em>HTTPRoute <\/em>resources and define routing logic for the traffic hitting the Gateway.<\/p>\n\n\n\n<p>Use the following <em>HTTPRoute<\/em> configuration to route traffic to the <em>profile <\/em>service:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code>apiVersion: gateway.networking.k8s.io\/v1\nkind: HTTPRoute\nmetadata:\n&nbsp; name: profile-route\n&nbsp; namespace: banking-app\nspec:\n&nbsp; parentRefs:\n&nbsp; &nbsp; - name: banking-gateway\n&nbsp; rules:\n&nbsp; &nbsp; - matches:\n&nbsp; &nbsp; &nbsp; &nbsp; - path:\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: PathPrefix\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value: \/users\n&nbsp; &nbsp; &nbsp; filters:\n&nbsp; &nbsp; &nbsp; &nbsp; - type: ResponseHeaderModifier\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; responseHeaderModifier:\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; add:\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - name: Controller\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value: ISTIO\n&nbsp; &nbsp; &nbsp; backendRefs:\n&nbsp; &nbsp; &nbsp; &nbsp; - name: profile\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; port: 8081<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <em>parentRefs <\/em>field in the configuration specifies the <em>Gateway <\/em>to which the <em>HTTPRoute <\/em>should be attached. (An <em>HTTPRoute <\/em>can be attached to multiple <em>Gateways<\/em>.)&nbsp;<\/li>\n\n\n\n<li>The routing logic is the same as the Ingress one in step #1:\n<ul class=\"wp-block-list\">\n<li>any requests to the path <em>\/users<\/em> will be routed to the <em>profile <\/em>service,&nbsp;<\/li>\n\n\n\n<li>and it uses Istio Ingress as the controller.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>(Notice that in the Ingress configurations in step #1, I used annotations to add the controller name to the request header. Since the annotation is Nginx-specific, it is not portable and cannot be used with other controllers. However, in the Gateway API, the <em>filters <\/em>field \u2014 where I have specified the controller name to be added in the header \u2014 is a property of the <em>HTTPRoute <\/em>CRD. It is portable and can be used across a variety of Kubernetes Gateway API implementations.)<\/p>\n\n\n\n<p>Similar to the route for <em>profile <\/em>service, apply the following <em>HTTPRoute <\/em>file to expose the <em>dashboard <\/em>service:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code>apiVersion: gateway.networking.k8s.io\/v1\nkind: HTTPRoute\nmetadata:\n  name: dashboard-route\n  namespace: banking-app\nspec:\n  parentRefs:\n    - name: banking-gateway\n  rules:\n    - filters:\n        - type: ResponseHeaderModifier\n          responseHeaderModifier:\n            add:\n              - name: Controller\n                value: ISTIO\n      backendRefs:\n        - name: dashboard\n          port: 3000<\/code><\/pre>\n\n\n\n<p>You can use the <em>Gateway <\/em>resource\u2019s external IP to verify Gateway API CRD implementation:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use <em>curl -v your_Gateway_pod_ip\/users <\/em>to check the <em>profile <\/em>service<\/li>\n\n\n\n<li>Enter the IP on a browser to access the banking dashboard.<\/li>\n<\/ul>\n\n\n\n<p>So far, we have implemented both Ingress and Kubernetes Gateway API CRDs, and they co-exist in the cluster. Now, let us load balance between them and gradually shift the traffic from Ingress to Gateway API.<\/p>\n\n\n\n<h3 class=\"wp-block-heading step3\" id=\"step3\">Step #3: Weighted traffic distribution between Ingress and Gateway API<\/h3>\n\n\n\n<p>To ensure a safe migration from Ingress to K8s Gateway API, start by shifting 10% of the traffic to Gateway API while Ingress serves 90% of the requests (see Fig.B). This step is helpful to check for errors and see if Gateway API can handle the load.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"540\" src=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/weighted-traffic-distribution-between-ingress-and-k8s-gateway-api.png\" alt=\"weighted traffic distribution between ingress and k8s gateway api\" class=\"wp-image-1898\" srcset=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/weighted-traffic-distribution-between-ingress-and-k8s-gateway-api.png 960w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/weighted-traffic-distribution-between-ingress-and-k8s-gateway-api-300x169.png 300w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/weighted-traffic-distribution-between-ingress-and-k8s-gateway-api-768x432.png 768w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/weighted-traffic-distribution-between-ingress-and-k8s-gateway-api-400x225.png 400w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/weighted-traffic-distribution-between-ingress-and-k8s-gateway-api-800x450.png 800w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"has-text-align-center\"><em>Fig.B &#8211; Weighted traffic distribution between Ingress (90) and Kubernetes Gateway API (10)<\/em><br><\/p>\n\n\n\n<p>You can use any load balancer to implement weighted traffic distribution. I\u2019m using HAProxy load balancer locally, for this demo. You can install it using any package manager.<\/p>\n\n\n\n<p>First, modify the HAProxy configuration file to ensure you have the right configs. You can do that by entering the following command:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code>sudo vim \/etc\/haproxy\/haproxy.cfg<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"725\" height=\"442\" src=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/haproxy-configuration-for-weighted-traffic-distribution.png\" alt=\"haproxy configuration for weighted traffic distribution.png\" class=\"wp-image-1900\" style=\"aspect-ratio:1.6402714932126696;width:840px;height:auto\" srcset=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/haproxy-configuration-for-weighted-traffic-distribution.png 725w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/haproxy-configuration-for-weighted-traffic-distribution-300x183.png 300w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/haproxy-configuration-for-weighted-traffic-distribution-400x244.png 400w\" sizes=\"(max-width: 725px) 100vw, 725px\" \/><\/figure>\n<\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>You can see that I have exposed a front end at port 80, which is using my WLAN adapter IP. The IP opens the banking dashboard in the browser.<\/li>\n\n\n\n<li>I have also specified 2 backends with respective traffic weights:\n<ul class=\"wp-block-list\">\n<li><em>server 1 <\/em>represents Ingress and serves 90% of requests; <em>server 2 <\/em>represents Gateway API CRDs and they serve 10% of total traffic.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Ensure that <em>server 1 <\/em>and <em>server 2 <\/em>have the IPs of the Ingress controller and <em>Gateway<\/em> pod, respectively.<\/li>\n<\/ul>\n\n\n\n<p>After you save the configuration changes, reload HAProxy:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code>sudo systemctl reload haproxy<\/code><\/pre>\n\n\n\n<p>Now, the load balancer with weighted traffic distribution has been applied. You can see the banking dashboard by entering the front-end IP in a browser.<\/p>\n\n\n\n<p>To verify the 90-10 traffic distribution between the Ingress controller and Gateway API, send 10 requests to the front end and watch for the header value using the following commands:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code>for i in $(seq 1 10) ; do curl sI http:\/\/your-lb-ip; done | grep -c NGINX\nfor i in $(seq 1 10) ; do curl sI http:\/\/your-lb-ip; done | grep -c ISTIO<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"87\" src=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/verifying-weighted-traffic-distribution-between-nginx-controller-and-istio-ingress-1024x87.png\" alt=\"verifying weighted traffic distribution between nginx controller and istio ingress\" class=\"wp-image-1901\" srcset=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/verifying-weighted-traffic-distribution-between-nginx-controller-and-istio-ingress-1024x87.png 1024w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/verifying-weighted-traffic-distribution-between-nginx-controller-and-istio-ingress-300x25.png 300w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/verifying-weighted-traffic-distribution-between-nginx-controller-and-istio-ingress-768x65.png 768w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/verifying-weighted-traffic-distribution-between-nginx-controller-and-istio-ingress-1536x130.png 1536w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/verifying-weighted-traffic-distribution-between-nginx-controller-and-istio-ingress-400x34.png 400w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/verifying-weighted-traffic-distribution-between-nginx-controller-and-istio-ingress-800x68.png 800w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/verifying-weighted-traffic-distribution-between-nginx-controller-and-istio-ingress-1160x98.png 1160w, https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/verifying-weighted-traffic-distribution-between-nginx-controller-and-istio-ingress.png 1870w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>See that the Nginx controller handles 9 requests and Istio Ingress receives only one. You can gradually increase the weight to Istio Ingress and implement K8s Gateway API completely.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kubernetes Gateway API support and resources<\/h2>\n\n\n\n<p>DevOps and architects can benefit greatly by shifting from Ingress and implementing Kubernetes Gateway API. It involves multitenancy, specifications, advanced traffic management, and extensibility benefits. You can explore them in the blog, <a href=\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-vs-ingress\/\">Kubernetes Gateway API vs Kubernetes Ingress<\/a>.&nbsp;<\/p>\n\n\n\n<p>At IMESH, we provide enterprise solutions for DevOps organizations migrating and adopting K8s Gateway API. We have videos and materials to help you understand and start with Gateway API:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/youtu.be\/Wt9AJJqxqK4?si=Wnk057KjL09EBw6O\">Getting Started With Kubernetes Gateway API Using Istio | Demo | IMESH<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/youtu.be\/s95-g7AL-qE?si=34h2ldhjBXOQMM5Q\">Kubernetes Gateway API vs Ingress | IMESH | Demo<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/youtu.be\/ag3FxIOzEOc?si=jDsYjrapsw8hCnx1\">Migrating from Ingress to Kubernetes Gateway API | The 3 R\u2019s Strategy<\/a>&nbsp;&nbsp;&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><a href=\"mailto:contact@imesh.ai\">Contact us<\/a> if you need support with Gateway API adoption in your enterprise.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We discussed the 3 R\u2019s migration strategy to switch from Ingress to<span class=\"excerpt-more\"><\/span><\/p>\n","protected":false},"author":9,"featured_media":1902,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[121],"tags":[120],"class_list":["post-1889","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kubernetes-gateway-api","tag-kubernetes-gateway-api"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kubernetes Gateway API Implementation in 3 Steps<\/title>\n<meta name=\"description\" content=\"Ingress is frozen. Gateway API is the new norm. Learn how to shift traffic from Ingress and carry out Kubernetes Gateway API implementation in 3 steps.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kubernetes Gateway API Implementation in 3 Steps\" \/>\n<meta property=\"og:description\" content=\"Ingress is frozen. Gateway API is the new norm. Learn how to shift traffic from Ingress and carry out Kubernetes Gateway API implementation in 3 steps.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/\" \/>\n<meta property=\"og:site_name\" content=\"IMESH\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-02T12:46:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-02-06T04:24:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/How-to-Implement-Kubernetes-Gateway-API-in-3-Steps.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Md Azmal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Md Azmal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/\"},\"author\":{\"name\":\"Md Azmal\",\"@id\":\"https:\/\/imesh.ai\/blog\/#\/schema\/person\/fdb37d3095697308d103c83ffdf37f10\"},\"headline\":\"Kubernetes Gateway API Implementation in 3 Steps\",\"datePublished\":\"2024-02-02T12:46:49+00:00\",\"dateModified\":\"2024-02-06T04:24:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/\"},\"wordCount\":1299,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/imesh.ai\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/How-to-Implement-Kubernetes-Gateway-API-in-3-Steps.png\",\"keywords\":[\"Kubernetes Gateway API\"],\"articleSection\":[\"Kubernetes Gateway API\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/\",\"url\":\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/\",\"name\":\"Kubernetes Gateway API Implementation in 3 Steps\",\"isPartOf\":{\"@id\":\"https:\/\/imesh.ai\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/How-to-Implement-Kubernetes-Gateway-API-in-3-Steps.png\",\"datePublished\":\"2024-02-02T12:46:49+00:00\",\"dateModified\":\"2024-02-06T04:24:33+00:00\",\"description\":\"Ingress is frozen. Gateway API is the new norm. Learn how to shift traffic from Ingress and carry out Kubernetes Gateway API implementation in 3 steps.\",\"breadcrumb\":{\"@id\":\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#primaryimage\",\"url\":\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/How-to-Implement-Kubernetes-Gateway-API-in-3-Steps.png\",\"contentUrl\":\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/How-to-Implement-Kubernetes-Gateway-API-in-3-Steps.png\",\"width\":1024,\"height\":576,\"caption\":\"How to Implement Kubernetes Gateway API in 3 Steps\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/imesh.ai\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kubernetes Gateway API Implementation in 3 Steps\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/imesh.ai\/blog\/#website\",\"url\":\"https:\/\/imesh.ai\/blog\/\",\"name\":\"IMESH Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/imesh.ai\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/imesh.ai\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/imesh.ai\/blog\/#organization\",\"name\":\"IMESH\",\"url\":\"https:\/\/imesh.ai\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/imesh.ai\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2023\/03\/IMESH-LOGO-scaled.jpg\",\"contentUrl\":\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2023\/03\/IMESH-LOGO-scaled.jpg\",\"width\":2560,\"height\":1665,\"caption\":\"IMESH\"},\"image\":{\"@id\":\"https:\/\/imesh.ai\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/imeshai\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/imesh.ai\/blog\/#\/schema\/person\/fdb37d3095697308d103c83ffdf37f10\",\"name\":\"Md Azmal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/imesh.ai\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2023\/03\/1563300189291-150x150.jpg\",\"contentUrl\":\"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2023\/03\/1563300189291-150x150.jpg\",\"caption\":\"Md Azmal\"},\"description\":\"Azmal is one of the founding engineers at IMESH, who focuses on boosting enterprise performance and security using Istio and Envoy. He's a versatile full-stack developer skilled in building scalable and performant applications in the cloud. Azmal's interest in cybersecurity and networking has led him to work on various research projects in network security.\",\"sameAs\":[\"https:\/\/imesh.ai\",\"https:\/\/www.linkedin.com\/in\/md-azmal-570308160\"],\"url\":\"https:\/\/imesh.ai\/blog\/author\/azmal-mdimesh-ai\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kubernetes Gateway API Implementation in 3 Steps","description":"Ingress is frozen. Gateway API is the new norm. Learn how to shift traffic from Ingress and carry out Kubernetes Gateway API implementation in 3 steps.","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:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/","og_locale":"en_US","og_type":"article","og_title":"Kubernetes Gateway API Implementation in 3 Steps","og_description":"Ingress is frozen. Gateway API is the new norm. Learn how to shift traffic from Ingress and carry out Kubernetes Gateway API implementation in 3 steps.","og_url":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/","og_site_name":"IMESH","article_published_time":"2024-02-02T12:46:49+00:00","article_modified_time":"2024-02-06T04:24:33+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/How-to-Implement-Kubernetes-Gateway-API-in-3-Steps.png","type":"image\/png"}],"author":"Md Azmal","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Md Azmal","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#article","isPartOf":{"@id":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/"},"author":{"name":"Md Azmal","@id":"https:\/\/imesh.ai\/blog\/#\/schema\/person\/fdb37d3095697308d103c83ffdf37f10"},"headline":"Kubernetes Gateway API Implementation in 3 Steps","datePublished":"2024-02-02T12:46:49+00:00","dateModified":"2024-02-06T04:24:33+00:00","mainEntityOfPage":{"@id":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/"},"wordCount":1299,"commentCount":0,"publisher":{"@id":"https:\/\/imesh.ai\/blog\/#organization"},"image":{"@id":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#primaryimage"},"thumbnailUrl":"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/How-to-Implement-Kubernetes-Gateway-API-in-3-Steps.png","keywords":["Kubernetes Gateway API"],"articleSection":["Kubernetes Gateway API"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/","url":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/","name":"Kubernetes Gateway API Implementation in 3 Steps","isPartOf":{"@id":"https:\/\/imesh.ai\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#primaryimage"},"image":{"@id":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#primaryimage"},"thumbnailUrl":"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/How-to-Implement-Kubernetes-Gateway-API-in-3-Steps.png","datePublished":"2024-02-02T12:46:49+00:00","dateModified":"2024-02-06T04:24:33+00:00","description":"Ingress is frozen. Gateway API is the new norm. Learn how to shift traffic from Ingress and carry out Kubernetes Gateway API implementation in 3 steps.","breadcrumb":{"@id":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#primaryimage","url":"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/How-to-Implement-Kubernetes-Gateway-API-in-3-Steps.png","contentUrl":"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/How-to-Implement-Kubernetes-Gateway-API-in-3-Steps.png","width":1024,"height":576,"caption":"How to Implement Kubernetes Gateway API in 3 Steps"},{"@type":"BreadcrumbList","@id":"https:\/\/imesh.ai\/blog\/kubernetes-gateway-api-implementation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/imesh.ai\/blog\/"},{"@type":"ListItem","position":2,"name":"Kubernetes Gateway API Implementation in 3 Steps"}]},{"@type":"WebSite","@id":"https:\/\/imesh.ai\/blog\/#website","url":"https:\/\/imesh.ai\/blog\/","name":"IMESH Blog","description":"","publisher":{"@id":"https:\/\/imesh.ai\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/imesh.ai\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/imesh.ai\/blog\/#organization","name":"IMESH","url":"https:\/\/imesh.ai\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/imesh.ai\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2023\/03\/IMESH-LOGO-scaled.jpg","contentUrl":"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2023\/03\/IMESH-LOGO-scaled.jpg","width":2560,"height":1665,"caption":"IMESH"},"image":{"@id":"https:\/\/imesh.ai\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/imeshai"]},{"@type":"Person","@id":"https:\/\/imesh.ai\/blog\/#\/schema\/person\/fdb37d3095697308d103c83ffdf37f10","name":"Md Azmal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/imesh.ai\/blog\/#\/schema\/person\/image\/","url":"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2023\/03\/1563300189291-150x150.jpg","contentUrl":"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2023\/03\/1563300189291-150x150.jpg","caption":"Md Azmal"},"description":"Azmal is one of the founding engineers at IMESH, who focuses on boosting enterprise performance and security using Istio and Envoy. He's a versatile full-stack developer skilled in building scalable and performant applications in the cloud. Azmal's interest in cybersecurity and networking has led him to work on various research projects in network security.","sameAs":["https:\/\/imesh.ai","https:\/\/www.linkedin.com\/in\/md-azmal-570308160"],"url":"https:\/\/imesh.ai\/blog\/author\/azmal-mdimesh-ai\/"}]}},"jetpack_featured_media_url":"https:\/\/imesh.ai\/blog\/wp-content\/uploads\/2024\/02\/How-to-Implement-Kubernetes-Gateway-API-in-3-Steps.png","_links":{"self":[{"href":"https:\/\/imesh.ai\/blog\/wp-json\/wp\/v2\/posts\/1889","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/imesh.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/imesh.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/imesh.ai\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/imesh.ai\/blog\/wp-json\/wp\/v2\/comments?post=1889"}],"version-history":[{"count":4,"href":"https:\/\/imesh.ai\/blog\/wp-json\/wp\/v2\/posts\/1889\/revisions"}],"predecessor-version":[{"id":1908,"href":"https:\/\/imesh.ai\/blog\/wp-json\/wp\/v2\/posts\/1889\/revisions\/1908"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/imesh.ai\/blog\/wp-json\/wp\/v2\/media\/1902"}],"wp:attachment":[{"href":"https:\/\/imesh.ai\/blog\/wp-json\/wp\/v2\/media?parent=1889"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/imesh.ai\/blog\/wp-json\/wp\/v2\/categories?post=1889"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/imesh.ai\/blog\/wp-json\/wp\/v2\/tags?post=1889"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}