{"id":12445,"date":"2022-11-28T06:00:01","date_gmt":"2022-11-28T11:00:01","guid":{"rendered":"https:\/\/blog.litespeedtech.com\/?p=12445"},"modified":"2022-11-28T06:00:01","modified_gmt":"2022-11-28T11:00:01","slug":"gateway-api-power-for-litespeed-ingress-controller","status":"publish","type":"post","link":"https:\/\/lswp.store\/index.php\/2022\/11\/28\/gateway-api-power-for-litespeed-ingress-controller\/","title":{"rendered":"Gateway API Power for LiteSpeed Ingress Controller"},"content":{"rendered":"<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone size-full wp-image-12447\" src=\"https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway.png\" alt=\"Gateway API Power for LiteSpeed Ingress Controller\" width=\"1000\" height=\"500\" srcset=\"https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway.png 1000w, https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-300x150.png 300w, https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-768x384.png 768w, https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-600x300.png 600w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/p>\n<p>The LiteSpeed Ingress Controller expands the very powerful LiteSpeed WebADC engine into the Kubernetes cluster space for load-balancing. Introducing new <a href=\"https:\/\/gateway-api.sigs.k8s.io\/\">Gateway API<\/a> power for LiteSpeed Ingress Controller.<\/p>\n<p>The LiteSpeed <a href=\"https:\/\/docs.litespeedtech.com\/cloud\/kubernetes\/gateway\/\">documentation<\/a> introduces the features available in the Gateway API. The <a href=\"https:\/\/gateway-api.sigs.k8s.io\/\">Gateway API introduction<\/a> focuses on the role-oriented nature of the new features and these are very useful. This blog will go further and show you some of the advanced features available using the Gateway API which were previously available but only as proprietary extensions.<\/p>\n<p>The Gateway API now standardizes some of the more complex needs many customers have in their Kubernetes environments. In particular red-blue and canary deployments. These features have been available using the LiteSpeed Ingress Controller for <a href=\"https:\/\/docs.litespeedtech.com\/cloud\/kubernetes\/installation\/\">some time<\/a> and this blog will show you a new way to implement them.<\/p>\n<h2 id=\"red-blue-and-canary-deployments\">Red-Blue and Canary Deployments<\/h2>\n<p>As described in the <a href=\"https:\/\/docs.litespeedtech.com\/cloud\/kubernetes\/adv-deployments\/#use-cases\">Advanced Deployments<\/a> section of the LiteSpeed documentation, when you have a new image of software and want to try it out on a subset of users. Say, give it to 10% of your user population and see if there are problems. This is typically described as a &#8220;canary deployment.&#8221; You might want to increase the percentage until most of the population is using it, and then pass over control completely to the new group.<\/p>\n<p>Or you may want to set up the deployment, and swap it over knowing you can swap it back quickly. That&#8217;s a &#8220;red-blue deployment.&#8221;<\/p>\n<p>Also supported by Gateway is 100% header-based routing for the safest of canary deployments.<\/p>\n<h3 id=\"red-blue-deployment\">Red-blue deployment<\/h3>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-12451\" src=\"https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-redblue.png\" alt=\"Red-Blue Deployment with Gateway via LiteSpeed\" width=\"800\" height=\"600\" srcset=\"https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-redblue.png 800w, https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-redblue-300x225.png 300w, https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-redblue-768x576.png 768w, https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-redblue-600x450.png 600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/p>\n<p>Our first example will be to modify the Gateway example described in our documentation for <a href=\"https:\/\/docs.litespeedtech.com\/cloud\/kubernetes\/gateway\/#running-the-test-with-olsup-gw.sh\">olsup-gw.sh<\/a> and we&#8217;ll create a red-blue deployment where you can switch between the old and new software quickly and easily. The modifications we&#8217;ll make below can be applied to the running pods and will take effect when executed.<\/p>\n<p>The first step would be to download and extract the samples. Note that the version number is in the file and we&#8217;d recommend taking the newest version. For the version 0.2.0:<\/p>\n<div id=\"cb1\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb1-1\">$ <span class=\"fu\">wget<\/span> https:\/\/github.com\/litespeedtech\/helm-chart\/raw\/main\/helm-chart-sources\/ls-k8s-webadc\/samples\/ls-k8s-webadc-0.2.0.tgz<\/span>\n<span id=\"cb1-2\">$ <span class=\"fu\">tar<\/span> xf ls-k8s-webadc-0.2.0.tgz<\/span>\n<span id=\"cb1-3\">$ <span class=\"bu\">cd<\/span> ls-k8s-webadc<\/span><\/code><\/pre>\n<\/div>\n<p>And then bring up the sample gateway. We&#8217;ll be using it as a test base here.<\/p>\n<div id=\"cb2\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb2-1\">$ <span class=\"ex\">.\/olsup-gw.sh<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>In that example you have a Deployment, Service, Gateway and HTTPRoute. For the new version you wish to deploy, you&#8217;ll need a new Deployment and Service to make your new software available. Modeled on the <code>examples\/ols-backend.yaml<\/code>, the new Deployment definition is named <code>new-backend.yaml<\/code> and looks like this:<\/p>\n<pre><code>apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: new-backend\nspec:\n  selector:\n    matchLabels:\n      app: new-backend\n  replicas: 2\n  template:\n    metadata:\n      labels:\n        app: new-backend\n    spec:\n      containers:\n      - name: new-backend\n        image: k8s.gcr.io\/echoserver:1.10\n        imagePullPolicy: Always\n        ports:\n        - containerPort: 8080\n<\/code><\/pre>\n<p>The only differences are the names which must change and the image itself, which would always change for a new version. For this example, we&#8217;re using an image which is completely different so that we can see when it uses the new image.<\/p>\n<p>For the Service definition, create a new file named <code>new-backend-svc.yaml<\/code> modeled after <code>ols-backend-svc.yaml<\/code>:<\/p>\n<pre><code>apiVersion: v1\nkind: Service\nmetadata:\n  name: new-backend-svc\nspec:\n  selector:\n    app: new-backend\n  ports:\n  - port: 80\n    targetPort: 8080\n    name: new-backend-http\n<\/code><\/pre>\n<p>All that is changed are the names. Apply them so they&#8217;ll be available:<\/p>\n<div id=\"cb5\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb5-1\">$ <span class=\"ex\">kubectl<\/span> apply -f new-backend.yaml -n sandbox<\/span>\n<span id=\"cb5-2\">$ <span class=\"ex\">kubectl<\/span> apply -f new-backend-svc.yaml -n sandbox<\/span><\/code><\/pre>\n<\/div>\n<p>Surprisingly, the Gateway definition does not have to change at all. Only the HTTPRoute needs to change. From the original definition, modify it to add a single line, <code>weight: 100<\/code> and save it as <code>httproute-red-weight-old.yaml<\/code>:<\/p>\n<pre><code>apiVersion: gateway.networking.k8s.io\/v1beta1\nkind: HTTPRoute\nmetadata:\n  name: ols-gateway.com\nspec:\n  parentRefs:\n  - name: ols-gateway.com\n  hostnames:\n  - ols-gateway.com\n  rules:\n  - matches:\n    - path:\n        value: \/\n        type: PathPrefix\n    backendRefs:\n    - name: ols-backend-svc\n      port: 80\n      weight: 100\n<\/code><\/pre>\n<p>You can then immediately apply it. It will have no affect because weight is not based on a percentage or any other numbering system and defaults to 1. However, most examples use the percentage based assumption for simplicity and compatability.<\/p>\n<div id=\"cb7\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb7-1\">$ <span class=\"ex\">kubectl<\/span> apply -f httproute-red-weight-old.yaml -n sandbox<\/span><\/code><\/pre>\n<\/div>\n<p>As described in the gateway doc, you can test it using curl. <code>kubectl get gateway -n sandbox ols-gateway.com<\/code> will return the address. You can then use it with curl:<\/p>\n<div id=\"cb8\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb8-1\">$ <span class=\"ex\">curl<\/span> https:\/\/ADDRESS\/ -H <span class=\"st\">'Host: ols-gateway.com'<\/span> -k<\/span><\/code><\/pre>\n<\/div>\n<p>This should return the LiteSpeed server default screen&#8217;s HTML.<\/p>\n<p>To begin the new &#8220;blue&#8221; deployment, create a new definition and save it as <code>httproute-blue-weight-new.yaml<\/code><\/p>\n<pre><code>apiVersion: gateway.networking.k8s.io\/v1beta1\nkind: HTTPRoute\nmetadata:\n  name: new-gateway.com\nspec:\n  parentRefs:\n  - name: ols-gateway.com\n  hostnames:\n  - ols-gateway.com\n  rules:\n  - matches:\n    - path:\n        value: \/\n        type: PathPrefix\n    backendRefs:\n    - name: new-backend-svc\n      port: 80\n      weight: 100\n<\/code><\/pre>\n<p>Because it uses the existing gateway parentRefs name, we use the existing name and the existing hostname. However, we use the service name we created and assign a weight of 100 to represent that it gets 100% of the traffic. When you are ready to give it a try, you can apply it:<\/p>\n<div id=\"cb10\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb10-1\">$ <span class=\"ex\">kubectl<\/span> apply -f httproute-blue-weight-new.yaml -n sandbox<\/span><\/code><\/pre>\n<\/div>\n<p>For the moment, both the old and new software will see traffic. To turn traffic off on the old site, copy the <code>httproute-red-weight-old.yaml<\/code> file to <code>httproute-blue-weight-old.yaml<\/code> and edit it, changing the weight to 0:<\/p>\n<pre><code>apiVersion: gateway.networking.k8s.io\/v1beta1\nkind: HTTPRoute\nmetadata:\n  name: ols-gateway.com\nspec:\n  parentRefs:\n  - name: ols-gateway.com\n  hostnames:\n  - ols-gateway.com\n  rules:\n  - matches:\n    - path:\n        value: \/\n        type: PathPrefix\n    backendRefs:\n    - name: ols-backend-svc\n      port: 80\n      weight: 0\n<\/code><\/pre>\n<p>And apply it:<\/p>\n<div id=\"cb12\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb12-1\">$ <span class=\"ex\">kubectl<\/span> apply -f httproute-blue-weight-old.yaml -n sandbox<\/span><\/code><\/pre>\n<\/div>\n<p>If you again run the same curl you ran above, you can see the change in the output to a listing of the HTTP header. Keeping the files around gives you a quick and easy way to switch between old and new software.<\/p>\n<p>To remove all that you did you can reverse the entire process, with the final step being to take down the sample gateway:<\/p>\n<div id=\"cb13\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb13-1\">$ <span class=\"ex\">kubectl<\/span> delete -f httproute-blue-weight-old.yaml -n sandbox<\/span>\n<span id=\"cb13-2\">$ <span class=\"ex\">kubectl<\/span> delete -f httproute-blue-weight-new.yaml -n sandbox<\/span>\n<span id=\"cb13-3\">$ <span class=\"ex\">kubectl<\/span> delete -f new-backend-svc.yaml -n sandbox<\/span>\n<span id=\"cb13-4\">$ <span class=\"ex\">kubectl<\/span> delete -f new-backend.yaml -n sandbox<\/span>\n<span id=\"cb13-5\">$ <span class=\"ex\">.\/olsdown-gw.sh<\/span><\/span><\/code><\/pre>\n<\/div>\n<h3 id=\"canary-testing-with-headers\">Canary testing with headers<\/h3>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-12449\" src=\"https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-canary.png\" alt=\"Canary Deployments with Gateway via LiteSpeed\" width=\"800\" height=\"600\" srcset=\"https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-canary.png 800w, https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-canary-300x225.png 300w, https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-canary-768x576.png 768w, https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway-canary-600x450.png 600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/p>\n<p>The HTTP protocol includes easily modified request headers which allow a tester to reach the new software without giving the regular browser user access to it. Gateway allows you to match on received headers and query strings which gives you a choice of which method to test with. Query strings can be modified in a brower and thus make some sense for testing there, but since many applications count on the contents of a query string to be specifically defined, this example will use headers which are easily manipulated with curl. Note that using query strings is no more complicated than the method using headers here.<\/p>\n<p>Either method gives developers and testers a way to deploy into a live environment without worrying about affecting production users since users will not generally have access to these mechanisms. As a last step in development before final deployment, it can be important as it gives you assurance that you can survive live internet attacks, access to real databases, performance verification, load testing and everything that the real environment provides.<\/p>\n<p>We&#8217;ll be using the LiteSpeed Gateway samples and the deployment and service we created above.<\/p>\n<p>As above, start by running the <code>olsup-gw.sh<\/code> script and apply the deployment and service we created above.<\/p>\n<div id=\"cb14\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb14-1\">$ <span class=\"ex\">.\/olsup-gw.sh<\/span><\/span>\n<span id=\"cb14-2\">$ <span class=\"ex\">kubectl<\/span> apply -f new-backend.yaml -n sandbox<\/span>\n<span id=\"cb14-3\">$ <span class=\"ex\">kubectl<\/span> apply -f new-backend-svc.yaml -n sandbox<\/span><\/code><\/pre>\n<\/div>\n<p>Also as above, the Gateway definition does not have to change at all. Even the HTTPRoute does not need to change as the absence of the new header will not affect traffic to the old backend.<\/p>\n<p>To begin a canary deployment, create a new canary definition and save it as <code>httproute-canary-hdr.yaml<\/code><\/p>\n<pre><code>apiVersion: gateway.networking.k8s.io\/v1beta1\nkind: HTTPRoute\nmetadata:\n  name: new-gateway.com\nspec:\n  parentRefs:\n  - name: ols-gateway.com\n  hostnames:\n  - ols-gateway.com\n  rules:\n  - matches:\n    - headers:\n      - name: canary\n        value: new\n      path:\n        value: \/\n        type: PathPrefix\n    backendRefs:\n    - name: new-backend-svc\n      port: 80\n<\/code><\/pre>\n<p>Because it uses the existing gateway parentRefs name, we use the existing name and the existing hostname. However, we use the service name we created and assign a header <code>canary:new<\/code>. When you are ready to give it a try, you can apply it:<\/p>\n<div id=\"cb16\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb16-1\">$ <span class=\"ex\">kubectl<\/span> apply -f httproute-canary-hdr.yaml -n sandbox<\/span><\/code><\/pre>\n<\/div>\n<p>Test access to the old software using the old access technique with curl:<\/p>\n<div id=\"cb17\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb17-1\">$ <span class=\"ex\">curl<\/span> https:\/\/ADDRESS\/ -H <span class=\"st\">'Host: ols-gateway.com'<\/span> -k<\/span><\/code><\/pre>\n<\/div>\n<p>Test access to the new software by adding the required header:<\/p>\n<div id=\"cb18\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb18-1\">$ <span class=\"ex\">curl<\/span> https:\/\/ADDRESS\/ -H <span class=\"st\">'Host: ols-gateway.com'<\/span> -k -H <span class=\"st\">'canary:new'<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>To remove all that you did you can reverse the entire process, with the final step being to take down the sample gateway:<\/p>\n<div id=\"cb19\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb19-1\">$ <span class=\"ex\">kubectl<\/span> delete -f httproute-canary-hdr.yaml -n sandbox<\/span>\n<span id=\"cb19-2\">$ <span class=\"ex\">kubectl<\/span> delete -f new-backend-svc.yaml -n sandbox<\/span>\n<span id=\"cb19-3\">$ <span class=\"ex\">kubectl<\/span> delete -f new-backend.yaml -n sandbox<\/span>\n<span id=\"cb19-4\">$ <span class=\"ex\">.\/olsdown-gw.sh<\/span><\/span><\/code><\/pre>\n<\/div>\n<h3 id=\"canary-deployment-90-10\">Canary deployment 90%-10%<\/h3>\n<p>Our final example will be to modify the Gateway example described in our documentation for <a href=\"https:\/\/docs.litespeedtech.com\/cloud\/kubernetes\/gateway\/#running-the-test-with-olsup-gw.sh\">olsup-gw.sh<\/a> and we&#8217;ll create a canary deployment where 90% of the traffic goes to the old software and 10% to the new. We&#8217;ll be using the LiteSpeed Gateway samples and the deployment and service we created above.<\/p>\n<p>As above start by running the <code>olsup-gw.sh<\/code> script and apply the deployment and service we created above.<\/p>\n<div id=\"cb20\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb20-1\">$ <span class=\"ex\">.\/olsup-gw.sh<\/span><\/span>\n<span id=\"cb20-2\">$ <span class=\"ex\">kubectl<\/span> apply -f new-backend.yaml -n sandbox<\/span>\n<span id=\"cb20-3\">$ <span class=\"ex\">kubectl<\/span> apply -f new-backend-svc.yaml -n sandbox<\/span><\/code><\/pre>\n<\/div>\n<p>As above, the Gateway definition does not have to change at all. Only the HTTPRoute needs to change. From the original definition, modify it to add a single line, <code>weight: 90<\/code> and save it as <code>httproute-canary-weight-old.yaml<\/code>:<\/p>\n<pre><code>apiVersion: gateway.networking.k8s.io\/v1beta1\nkind: HTTPRoute\nmetadata:\n  name: ols-gateway.com\nspec:\n  parentRefs:\n  - name: ols-gateway.com\n  hostnames:\n  - ols-gateway.com\n  rules:\n  - matches:\n    - path:\n        value: \/\n        type: PathPrefix\n    backendRefs:\n    - name: ols-backend-svc\n      port: 80\n      weight: 90\n<\/code><\/pre>\n<p>You can then immediately apply it. It will have no affect because weight is not based on a percentage or any other numbering system and defaults to 1. However, most examples use the percentage based assumption for simplicity and compatability.<\/p>\n<div id=\"cb22\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb22-1\">$ <span class=\"ex\">kubectl<\/span> apply -f httproute-canary-weight-old.yaml<\/span><\/code><\/pre>\n<\/div>\n<p>As described in the gateway doc, you can test it using curl. <code>kubectl get gateway -n sandbox ols-gateway.com<\/code> will return the address. You can then use it with curl:<\/p>\n<div id=\"cb23\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb23-1\">$ <span class=\"ex\">curl<\/span> http:\/\/ADDRESS\/ -H <span class=\"st\">'Host: ols-gateway.com'<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>This should return the LiteSpeed server default header.<\/p>\n<p>To begin a canary deployment, create a new canary definition and save it as <code>httproute-canary-weight-new.yaml<\/code><\/p>\n<pre><code>apiVersion: gateway.networking.k8s.io\/v1beta1\nkind: HTTPRoute\nmetadata:\n  name: new-gateway.com\nspec:\n  parentRefs:\n  - name: ols-gateway.com\n  hostnames:\n  - ols-gateway.com\n  rules:\n  - matches:\n    - path:\n        value: \/\n        type: PathPrefix\n    backendRefs:\n    - name: new-backend-svc\n      port: 80\n      weight: 10\n<\/code><\/pre>\n<p>Because it uses the existing gateway parentRefs name, we use the existing name and the existing hostname. However, we use the service name we created and assign a weight of 10 to represent that it gets 10% of the traffic. When you are ready to give it a try, you can apply it:<\/p>\n<pre><code>kubectl apply -f httproute-canary-weight-new.yaml -n sandbox\n<\/code><\/pre>\n<p>Because of caching there&#8217;s no good way to test it. When a curl is done from the same machine, you&#8217;ll get the same entry you get the first time. Take our word for the fact that 10% of the traffic will be sent to the canary backend.<\/p>\n<p>To remove all that you did you can reverse the entire process, with the final step being to take down the sample gateway:<\/p>\n<div id=\"cb26\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb26-1\">$ <span class=\"ex\">kubectl<\/span> delete -f httproute-canary-weight-old.yaml -n sandbox<\/span>\n<span id=\"cb26-2\">$ <span class=\"ex\">kubectl<\/span> delete -f httproute-canary-weight-new.yaml -n sandbox<\/span>\n<span id=\"cb26-3\">$ <span class=\"ex\">kubectl<\/span> delete -f new-backend-svc.yaml -n sandbox<\/span>\n<span id=\"cb26-4\">$ <span class=\"ex\">kubectl<\/span> delete -f new-backend.yaml -n sandbox<\/span>\n<span id=\"cb26-5\">$ <span class=\"ex\">.\/olsdown-gw.sh<\/span><\/span><\/code><\/pre>\n<\/div>\n<h2 id=\"just-scratching-the-surface\">Just scratching the surface<\/h2>\n<p>All of these techniques just scratch the surface of what you can do with gateway. We&#8217;ve demonstrated switching between old and new dynamically, using a header and using weights. As mentioned above you can also use query strings. You can also select on host name using wildcards (better than those for Ingress), and multiple levels of path, headers and query strings. You can add, set or delete headers to allow control of your backends. There are a whole set of role features. Gateway adds a whole new world to Kubernetes.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>LiteSpeed Web ADC&#8217;s powerful Kubernetes solution now includes Gateway API power for LiteSpeed Ingress Controller.<\/p>\n","protected":false},"author":1,"featured_media":12447,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[26],"tags":[155],"class_list":["post-12445","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-load-balancer","tag-kubernetes"],"jetpack_featured_media_url":"https:\/\/lswp.store\/wp-content\/uploads\/2022\/11\/k8s-gateway.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lswp.store\/index.php\/wp-json\/wp\/v2\/posts\/12445","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lswp.store\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lswp.store\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lswp.store\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lswp.store\/index.php\/wp-json\/wp\/v2\/comments?post=12445"}],"version-history":[{"count":0,"href":"https:\/\/lswp.store\/index.php\/wp-json\/wp\/v2\/posts\/12445\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lswp.store\/index.php\/wp-json\/wp\/v2\/media\/12447"}],"wp:attachment":[{"href":"https:\/\/lswp.store\/index.php\/wp-json\/wp\/v2\/media?parent=12445"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lswp.store\/index.php\/wp-json\/wp\/v2\/categories?post=12445"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lswp.store\/index.php\/wp-json\/wp\/v2\/tags?post=12445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}