<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Pablo Loschi on Medium]]></title>
        <description><![CDATA[Stories by Pablo Loschi on Medium]]></description>
        <link>https://medium.com/@pgold30?source=rss-2f0bedd32a9b------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*E2glGxVhP7xeDTJ-L7Fpnw.gif</url>
            <title>Stories by Pablo Loschi on Medium</title>
            <link>https://medium.com/@pgold30?source=rss-2f0bedd32a9b------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 19:59:40 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@pgold30/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Stop Letting Kubernetes Upgrades Break Your GitOps Repos: Janos 2.4]]></title>
            <link>https://pgold30.medium.com/stop-letting-kubernetes-upgrades-break-your-gitops-repos-introducing-janos-2-2-9a3d7cc79af0?source=rss-2f0bedd32a9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/9a3d7cc79af0</guid>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[platform-engineering]]></category>
            <category><![CDATA[cloud-native]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[gitops]]></category>
            <dc:creator><![CDATA[Pablo Loschi]]></dc:creator>
            <pubDate>Wed, 16 Sep 2026 11:28:41 GMT</pubDate>
            <atom:updated>2026-09-24T12:10:19.169Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/844/1*6LIh8WkZgL_trqPG99YhUw.png" /><figcaption>Janos: audit, preview, and migrate Kubernetes manifests</figcaption></figure><p>Kubernetes upgrades are hard enough without stale APIs hiding in GitOps repos. Janos 2.4.0 audits manifests and selected live resources, previews supported migrations, and makes cases needing human judgment explicit. It is now available as a scoped package on npm.</p><h3>Why this exists</h3><p>A Kubernetes upgrade often fails in the repo before it fails in the cluster. A manifest can sit untouched for years, then hit an API removal: batch/v1beta1 CronJobs and policy/v1beta1 PodSecurityPolicies, for example, stopped being served in Kubernetes 1.25. A global search-and-replace is tempting, but some migrations need new fields or human decisions.</p><p>That is the gap I built <a href="https://github.com/pgold30/janos">Janos</a> for. Named after the two-faced Roman god of transitions, it helps teams audit GitOps source manifests, preview a diff, migrate supported cases, and turn unresolved cases into visible CI failures. The aim is a reviewable workflow, not a promise that every old object has a safe automatic replacement.</p><h3>Try the 2.4.0 release</h3><p>Janos is now available on npm as <a href="https://www.npmjs.com/package/@pgold30/janos">@pgold30/janos</a> (Node.js 18+). The executable is still called janos:</p><pre>npm install --global @pgold30/janos@2.4.0<br>janos --audit -d ./k8s --target-version 1.25<br>janos -d ./k8s --target-version 1.25 --dry-run --diff<br>janos -d ./k8s --target-version 1.25 -i<br>janos --audit -d ./k8s --target-version 1.25 --check</pre><p>The sequence is deliberate: audit first, inspect the proposed changes, apply supported migrations interactively, then make --check part of CI. --target-version limits work to the Kubernetes release you are preparing for. For a one-off audit without a global install, run:</p><pre>npm exec --yes --package=@pgold30/janos@2.4.0 -- janos --audit -d ./k8s</pre><p>Use the scoped package name. Older examples using npx janos refer to an unscoped npm name that is not the published package.</p><h3>What changed since 2.2?</h3><ul><li><strong>PodSecurityPolicy is a manual migration.</strong> Kubernetes 1.25 removed the API, but there is no drop-in replacement object. Janos now leaves the PSP unchanged, points to Pod Security Admission, and fails --check instead of outputting another removed API version.</li><li><strong>Complex rules check required schema details.</strong> CRDs need an existing structural schema; webhooks need explicit sideEffects and admissionReviewVersions; CSRs need a signer, request, and valid usages; and supported HPA metrics need valid v2 targets. When those details cannot be inferred safely, Janos reports manual work.</li><li><strong>Cluster reports show what they actually know.</strong> For the fixed set of kinds it queries through kubectl, Janos prefers a matching last-applied manifest, then falls back to the API currently served by the cluster. Coverage counts expose that distinction. --cluster --audit --check --require-original fails if an original manifest is unavailable.</li><li><strong>Pre-commit hooks handle every passed file.</strong> The 2.4.0 hooks process multiple filenames, including names with spaces, and the migration hook checks files again after writing.</li></ul><p>The repository also has a <a href="https://github.com/pgold30/janos/tree/master/examples">before/after gallery</a> with successful migrations and cases deliberately left for human review.</p><h3>What a safe edit looks like</h3><p>For a simple CronJob, Janos can change the API version while leaving comments on unchanged YAML nodes in place:</p><pre># Managed by the platform team<br>apiVersion: batch/v1beta1<br>kind: CronJob<br>metadata:<br>  name: nightly-cleanup # runs at 00:00 UTC</pre><p>The preview changes batch/v1beta1 to batch/v1. For structural changes, replaced sections can be reformatted or lose comments, so review the diff before committing. The checks cover known requirements; they are not a substitute for validating against your target API server. For complex resources, use a disposable test cluster and kubectl apply --dry-run=server --validate=strict before production.</p><h3>Where Janos fits alongside other tools</h3><p><a href="https://pluto.docs.fairwinds.com/">Pluto</a> and <a href="https://github.com/doitintl/kube-no-trouble">Kube No Trouble</a> are useful for deprecation discovery, including Helm history. Janos is strongest when you own the source YAML and want audit → preview → edit → CI in one workflow. Its cluster collector does not inspect every kind or Helm release history; keep scanning the source repos.</p><p>Janos can also generate a starter Gateway API HTTPRoute from an Ingress with --ingress-to-gateway. Review its parent references, TLS, backends, and annotations. For controller-specific behavior, compare with the Kubernetes Gateway API project&#39;s <a href="https://github.com/kubernetes-sigs/ingress2gateway">ingress2gateway</a> and its provider-specific output.</p><p>There are <a href="https://github.com/pgold30/janos#-advanced-usage--integrations">GitHub Action and pre-commit examples</a> for enforcing the result in pull requests. Start with a dry-run on a small directory, check the diff, and expand only after the target cluster accepts the output.</p><h3>Help make the next release better</h3><p>Janos is Apache-2.0 open source. Try <a href="https://www.npmjs.com/package/@pgold30/janos">the npm package</a>, inspect <a href="https://github.com/pgold30/janos/tree/master/examples">the examples</a>, and tell me which migration still needs human work. The <a href="https://github.com/pgold30/janos/blob/master/ROADMAP.md">roadmap</a> prioritizes versioned schema validation, broader cluster evidence, and better GitOps inputs. Concrete failing manifests and target Kubernetes versions are especially useful in a <a href="https://github.com/pgold30/janos/issues">GitHub issue</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9a3d7cc79af0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The 2026 Guide to Managing Wildcard TLS with Kubernetes Gateway API]]></title>
            <link>https://itnext.io/the-2026-guide-to-managing-wildcard-tls-with-kubernetes-gateway-api-f1ae1de1ad64?source=rss-2f0bedd32a9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/f1ae1de1ad64</guid>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[lets-encrypt]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[system-architecture]]></category>
            <dc:creator><![CDATA[Pablo Loschi]]></dc:creator>
            <pubDate>Tue, 10 Feb 2026 10:27:27 GMT</pubDate>
            <atom:updated>2026-02-16T20:43:39.605Z</atom:updated>
            <content:encoded><![CDATA[<h4><strong>From hacky replication scripts to clean architecture: How the Gateway API made copying secrets obsolete.</strong></h4><p>Back in 2018, I wrote <a href="https://medium.com/p/5ed1ea30bb93"><strong>this guide</strong></a> on managing wildcard certificates in Kubernetes. It unexpectedly hit the top of Google search results because it solved a painful problem: avoiding Let’s Encrypt rate limits by manually replicating secrets across namespaces.</p><p>But 7 years is a lifetime in the container world. The v1alpha1 APIs are dead, Ingress is being superseded, and the idea of copying a private key to 50 different namespaces now feels... wrong.</p><p>We spent years building tools to patch architectural limitations, like copying secrets across namespaces. Today, we don’t need better patches; we have better architecture. The Gateway API proves that the smartest solution isn’t managing complexity — it’s designing it away.</p><p>Here is how to handle Wildcard TLS in 2026 using the <strong>Gateway API</strong> — the “no-copy” approach.</p><h3>The Evolution: From Ingress to Gateway</h3><p>In the “Old World” (Ingress), TLS termination happened at the Ingress controller, but the configuration was often fragmented. If you had an Ingress in the marketing namespace, it needed the TLS secret to exist inside the marketing namespace.</p><p>This forced us to create hacky “Reflector” scripts or use tools like kubernetes-replicator to clone our one precious Wildcard Certificate into every single namespace.</p><p><strong>Enter Gateway API.</strong></p><p>The Gateway API separates the <strong>Listener</strong> (Port 443 and TLS Configuration) from the <strong>Route</strong> (Application logic).</p><ul><li><strong>The Ops Team</strong> manages the Gateway in a secure namespace (e.g., infra). The Wildcard Certificate lives here and <em>only</em> here.</li><li><strong>The Dev Team</strong> manages HTTPRoutes in their app namespaces. They attach to the Gateway <em>without ever touching the certificates</em>.</li></ul><h3>Step 1: The Certificate (Centralized)</h3><p>We still use <strong>cert-manager</strong>, but we only issue the certificate once, in one place. We no longer need sidecars or replication scripts.</p><pre>apiVersion: cert-manager.io/v1<br>kind: Certificate<br>metadata:<br>  name: wildcard-mycompany-com<br>  namespace: infra  # The certificate stays HERE.<br>spec:<br>  secretName: wildcard-secret<br>  issuerRef:<br>    name: letsencrypt-prod<br>    kind: ClusterIssuer<br>  commonName: &quot;*.mycompany.com&quot;<br>  dnsNames:<br>  - &quot;*.mycompany.com&quot;</pre><h3>Step 2: The Gateway (The “Shared Edge”)</h3><p>This is the replacement for your Ingress Controller setup. We define a Gateway that listens on HTTPS and references the secret we just created.</p><p>Crucially, we configure allowedRoutes to allow <strong>All Namespaces</strong> to attach to this listener.</p><p><em>Note: The </em><em>gatewayClassName below is for the GKE Global Load Balancer. If you are using Regional LBs, check your provider&#39;s documentation.</em></p><pre>apiVersion: gateway.networking.k8s.io/v1<br>kind: Gateway<br>metadata:<br>  name: shared-gateway<br>  namespace: infra<br>spec:<br>  gatewayClassName: gke-l7-global-external-managed<br>  listeners:<br>  - name: https<br>    protocol: HTTPS<br>    port: 443<br>    tls:<br>      mode: Terminate<br>      certificateRefs:<br>      - name: wildcard-secret # Referenced locally in &#39;infra&#39;<br>    allowedRoutes:<br>      namespaces:<br>        from: All  # &lt;--- This is the magic. No copying needed.</pre><p><em>Ensure you have enabled the Gateway API on your GKE cluster (</em><em>gcloud container clusters update ... --gateway-api=standard)</em></p><h3>Step 3: The Application (No Secrets Needed)</h3><p>Now, a developer in the checkout namespace wants to deploy their app. They don&#39;t need to ask you for the cert. They don&#39;t need a Reflector script. They just define a Route.</p><p><strong>Best Practice:</strong> Notice the sectionName. This explicitly binds the route to the HTTPS listener we defined above, preventing ambiguity if you add port 80 later.</p><pre>apiVersion: gateway.networking.k8s.io/v1<br>kind: HTTPRoute<br>metadata:<br>  name: checkout-route<br>  namespace: checkout # Different namespace!<br>spec:<br>  parentRefs:<br>  - name: shared-gateway<br>    namespace: infra # Pointing to the central Gateway<br>    sectionName: https # Explicitly bind to the secure listener<br>  hostnames:<br>  - &quot;checkout.mycompany.com&quot;<br>  rules:<br>  - matches:<br>    - path:<br>        type: PathPrefix<br>        value: /<br>    backendRefs:<br>    - name: checkout-service<br>      port: 80</pre><h3>Production Checklist: Don’t Forget These!</h3><p>While the YAML above works, a production environment needs two more things to avoid downtime.</p><p><strong>1. The DNS Reality Check</strong></p><p>In the old Ingress world, every Ingress might have had its own IP. In the Gateway world, you have <strong>one single IP</strong> for the entire platform.</p><p>You must configure your DNS provider (e.g., Cloud DNS or Route53) to point *.mycompany.com (A Record) to the <strong>Gateway&#39;s IP Address</strong>. If you don&#39;t do this, the traffic never hits the Gateway to be routed.</p><blockquote><em>Pro Tip: Use </em><strong><em>ExternalDNS</em></strong><em> with the Gateway source enabled. It will automatically read the hostnames from your HTTPRoutes and update Cloud DNS for you. No manual A-records needed.</em></blockquote><p><strong>2. The “502 Bad Gateway” Trap</strong></p><p>GKE Gateway Load Balancers are strict about health checks. If your checkout-service doesn&#39;t return a 200 OK on its root path (or its configured readiness probe), the Gateway will return a 502 error instantly.</p><p>Ensure your deployments have valid readinessProbe configurations:</p><pre># Inside your Deployment spec<br>readinessProbe:<br>  httpGet:<br>    path: /healthz<br>    port: 8080<br>  initialDelaySeconds: 5<br>  periodSeconds: 10</pre><h3>Summary</h3><p>In 2018, we solved this problem with v1alpha1 APIs and bash loops. In 2026, we solve it with declarative architecture.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ej2HKfD5Qj8e7KBfOAxibw.png" /><figcaption>Ingress VS Gateway</figcaption></figure><p>We spent time building tools to patch architectural limitations, like copying secrets across namespaces. Today, we don’t need better patches; we have better architecture. The Gateway API proves that the smartest solution isn’t managing complexity — it’s designing it away.</p><p>So, that’s it. I hope you find it useful, and the steps are easy to follow. Please comment and/or ask questions if I missed something — I’d love to get your feedback.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f1ae1de1ad64" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/the-2026-guide-to-managing-wildcard-tls-with-kubernetes-gateway-api-f1ae1de1ad64">The 2026 Guide to Managing Wildcard TLS with Kubernetes Gateway API</a> was originally published in <a href="https://itnext.io/">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to use GKE's new Custom Compute Classes]]></title>
            <link>https://pgold30.medium.com/how-to-use-gkes-new-custom-compute-classes-1d3472aab284?source=rss-2f0bedd32a9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/1d3472aab284</guid>
            <category><![CDATA[ccc]]></category>
            <category><![CDATA[gcp]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[finops]]></category>
            <category><![CDATA[gke]]></category>
            <dc:creator><![CDATA[Pablo Loschi]]></dc:creator>
            <pubDate>Wed, 23 Oct 2024 08:58:25 GMT</pubDate>
            <atom:updated>2024-11-11T22:50:55.052Z</atom:updated>
            <content:encoded><![CDATA[<h4>Solving availability and cost savings even during high-traffic season!</h4><p><em>At Verve we are handling a high volume of traffic with hundreds of millions of events daily (clicks, </em>impressions<em>, actions, in-app events, etc.).<br>This means we need to be able to scale our servers fast to handle traffic spikes and control who has access to our servers and with which permissions.<br>We have built our infrastructure on top of K8s to allow elasticity and scalability.</em></p><p>We recently published a <a href="https://cloud.google.com/blog/products/infrastructure/how-verve-achieves-37-percent-performance-gains-with-new-gke-features-and-c4-deliver">blog post with Google</a> related to a few topics (add link!), GKE Gateway LB envoy-based, C4, and CCC. Here we will cover CCC in depth.</p><h3>Context</h3><p><em>We use 100% spot nodes did some proper benchmarks for our application and assigned scores for each node type based on performance/ spot price, It is quite common that in certain regions we reach stockouts due to GCP not having the resource capacity</em></p><p>This is a graph showing the score for each instance type on our app</p><figure><img alt="performance/ spot price (lower is better)" src="https://cdn-images-1.medium.com/max/1024/1*aJMky9eaENmKLY5wWbiXCQ.png" /><figcaption><em>Performance / spot price (lower is better)</em></figcaption></figure><p>Google recently released CCC (custom compute class aka AWS Carpenter)you can find the blog post <a href="https://cloud.google.com/blog/products/containers-kubernetes/introducing-new-gke-custom-compute-class-api">here</a> and the official docs <a href="https://cloud.google.com/kubernetes-engine/docs/concepts/about-custom-compute-classes">here</a></p><p>GKE custom compute classes<strong> maximize obtainability and reliability by providing fall-back compute priorities. </strong>This increases the chances of successful autoscaling while giving you control over the resources that get spun up. If your priority resource is unable to scale up, GKE will automatically try the second priority of node selection, and then continue to other lower priorities on the list.</p><p>One cool feature is activeMigration which <strong>Reconcile to preferential infrastructure, meaning </strong>Custom compute classes enable <strong>active migration of workloads</strong> to preferential node shapes, such as those based on cost or performance optimization. If workloads initially land on lower priority nodes, GKE automatically tries to migrate workloads to higher priority nodes over time, as availability allows.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/411/0*XFRSZAr9ZZ-0A1oD.png" /></figure><p>Compute classes provide a <strong>consistent node configuration API</strong> that abstracts away node configuration complexity for developers. App teams can consume compute classes with a simple nodeSelector label or rely on namespace-scoped <strong>default compute classes</strong>.</p><h3>Requirements</h3><ul><li>GKE version &gt; 1.30.3.1451000+</li><li>Ensure that you have node auto-provisioning enabled in your cluster</li></ul><p>TF block:</p><pre>  ...cluster_autoscaling = {<br>    &quot;auto_repair&quot; : false,<br>    &quot;auto_upgrade&quot; : false,<br>    &quot;autoscaling_profile&quot; : &quot;OPTIMIZE_UTILIZATION&quot;,<br>    &quot;disk_size&quot; : 30,<br>    &quot;disk_type&quot; : &quot;pd-standard&quot;,<br>    &quot;enabled&quot; : true,<br>    &quot;gpu_resources&quot; : [],<br>    &quot;max_cpu_cores&quot; : 10000000000000,<br>    &quot;max_memory_gb&quot; : 10000000000000,<br>    &quot;min_cpu_cores&quot; : 0,<br>    &quot;min_memory_gb&quot; : 0,<br>    &quot;autoprovisioningLocations&quot;: [<br>     &quot;asia-southeast1-b&quot;<br>    ]<br>  }...</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_350-OZy9DOR5QcVsv3-FA.png" /><figcaption>From Console , set a really high number for this in cpu/ram! to not be hard limited</figcaption></figure><h3>Howto</h3><p>Create a Compute class</p><pre>apiVersion: cloud.google.com/v1<br>kind: ComputeClass<br>metadata:<br>  name: adserver<br>spec:<br>  priorities:<br>    - machineType: n2d-standard-64<br>      spot: true<br>      storage:<br>        bootDiskType: pd-balanced<br>        bootDiskSize: 30<br>    - machineType: n4-standard-64<br>      spot: true<br>      storage:<br>        bootDiskSize: 30<br>#no pd-balanced since n4 supports only hyperdisk<br>    - machineType: n2-standard-64<br>      spot: true<br>      storage:<br>        bootDiskType: pd-balanced<br>        bootDiskSize: 30<br>    - machineType: n2d-standard-64<br>      spot: false<br>      storage:<br>        bootDiskType: pd-balanced<br>        bootDiskSize: 30<br>  autoscalingPolicy:<br>    consolidationDelayMinutes: 5<br>    consolidationThreshold: 70<br>#In this configuration, GKE removes unused nodes after five minutes, and nodes only become candidates for consolidation if both their CPU and memory utilization is less than 70%.<br>  activeMigration:<br>    optimizeRulePriority: true<br>  nodePoolAutoCreation:<br>    enabled: true</pre><p>In this example, the GKE Cluster Autoscaler first tries to spin up an n2d node std 64, then n4,n2 all spot, and if none of those work we fall back to not spot n2d. <a href="https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning">Node auto-provisioning</a> (NAP) is enabled in this example and creates new node pools automatically as needed.</p><p>As a developer, I just need to make sure that my workload is using that</p><pre>...<br>  spec:<br>    nodeSelector:<br>      cloud.google.com/compute-class: adserver<br>....</pre><p>To further streamline the developer experience, you can designate a custom compute class as the default for specific Kubernetes namespaces. When a compute class is set as the namespace default, any workloads deployed within that namespace automatically inherit the compute class configuration, eliminating the need for repetitive workload-level settings. To create a namespace-level adserver custom compute class, set a namespace label using the cloud.google.com/default-compute-class key, for example:</p><pre>kubectl label namespaces adserver cloud.google.com/default-compute-class=adserver</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/576/1*QpVq-zcAuCIhJomT9-0hLA.png" /><figcaption>You can view the events of the Crd</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*i-ref0UxQK8qIy_KO7Rltw.png" /><figcaption>Auto created nodepool</figcaption></figure><p>With this, we aim to solve both availability and cost savings, even during high-traffic season.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1d3472aab284" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Automatically migrating to K8s 1.24 (and beyond) with Janos]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://pgold30.medium.com/automatically-migrating-to-k8s-1-24-and-beyond-with-janos-88b09485cb07?source=rss-2f0bedd32a9b------2"><img src="https://cdn-images-1.medium.com/max/1400/0*xiz2hPCkFrn3JfU3.jpg" width="1400"></a></p><p class="medium-feed-snippet">TLDR: Janos will keep your YAML manifest up to date, automatically migrating Kubernetes deprecated APIs</p><p class="medium-feed-link"><a href="https://pgold30.medium.com/automatically-migrating-to-k8s-1-24-and-beyond-with-janos-88b09485cb07?source=rss-2f0bedd32a9b------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://pgold30.medium.com/automatically-migrating-to-k8s-1-24-and-beyond-with-janos-88b09485cb07?source=rss-2f0bedd32a9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/88b09485cb07</guid>
            <category><![CDATA[api]]></category>
            <category><![CDATA[cka]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[updates]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Pablo Loschi]]></dc:creator>
            <pubDate>Thu, 26 Jan 2023 10:41:59 GMT</pubDate>
            <atom:updated>2023-01-26T10:49:33.491Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Automatically migrating to K8s 1.16 (and beyond) with Janos]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://pgold30.medium.com/automatically-migrating-to-k8s-1-16-and-beyond-with-janos-e2fd00cd8a2f?source=rss-2f0bedd32a9b------2"><img src="https://cdn-images-1.medium.com/max/1200/0*jBby8f5BSJjh-3dI.jpg" width="1200"></a></p><p class="medium-feed-snippet">I thought I&#x2019;d strike again with a small hands-on tutorial on using Janos, a tool we created to simplify the migration to EKS 1.16 as&#x2026;</p><p class="medium-feed-link"><a href="https://pgold30.medium.com/automatically-migrating-to-k8s-1-16-and-beyond-with-janos-e2fd00cd8a2f?source=rss-2f0bedd32a9b------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://pgold30.medium.com/automatically-migrating-to-k8s-1-16-and-beyond-with-janos-e2fd00cd8a2f?source=rss-2f0bedd32a9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/e2fd00cd8a2f</guid>
            <category><![CDATA[kubernetes-upgrades]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[yaml]]></category>
            <category><![CDATA[k8s]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Pablo Loschi]]></dc:creator>
            <pubDate>Fri, 12 Mar 2021 14:52:13 GMT</pubDate>
            <atom:updated>2021-03-12T14:52:13.410Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How we approach DevOps at SumUp]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/inside-sumup/devops-engineer-sre-at-sumup-602750c02318?source=rss-2f0bedd32a9b------2"><img src="https://cdn-images-1.medium.com/max/2600/1*-ZwQENQMdao7cUJmCNlguw.png" width="2736"></a></p><p class="medium-feed-snippet">Meet Pablo Loschi, one of our DevOps Engineers in Berlin.</p><p class="medium-feed-link"><a href="https://medium.com/inside-sumup/devops-engineer-sre-at-sumup-602750c02318?source=rss-2f0bedd32a9b------2">Continue reading on Inside SumUp »</a></p></div>]]></description>
            <link>https://medium.com/inside-sumup/devops-engineer-sre-at-sumup-602750c02318?source=rss-2f0bedd32a9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/602750c02318</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[sumup]]></category>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[sre]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Pablo Loschi]]></dc:creator>
            <pubDate>Tue, 18 Feb 2020 13:04:28 GMT</pubDate>
            <atom:updated>2020-02-21T15:03:05.719Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Kong Proof-of-Concept using Minikube]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://itnext.io/kong-proof-of-concept-using-minikube-5f8ca932083f?source=rss-2f0bedd32a9b------2"><img src="https://cdn-images-1.medium.com/max/731/1*NfnYWlxONWOJrBDbZEWvtg.png" width="731"></a></p><p class="medium-feed-snippet">How to build a proof-of-concept in about 15 minutes</p><p class="medium-feed-link"><a href="https://itnext.io/kong-proof-of-concept-using-minikube-5f8ca932083f?source=rss-2f0bedd32a9b------2">Continue reading on ITNEXT »</a></p></div>]]></description>
            <link>https://itnext.io/kong-proof-of-concept-using-minikube-5f8ca932083f?source=rss-2f0bedd32a9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/5f8ca932083f</guid>
            <category><![CDATA[service-mesh]]></category>
            <category><![CDATA[minikube]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[kong]]></category>
            <dc:creator><![CDATA[Pablo Loschi]]></dc:creator>
            <pubDate>Tue, 26 Nov 2019 14:28:35 GMT</pubDate>
            <atom:updated>2020-08-26T09:25:07.378Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Kong ACL example]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/engineering-applift/kong-acl-example-77a033d59034?source=rss-2f0bedd32a9b------2"><img src="https://cdn-images-1.medium.com/max/1020/1*vi1keg-mSEHuQCMcPK_orw.png" width="1020"></a></p><p class="medium-feed-snippet">First we will deploy one sample application, called cafe, that lets you order either tea via the tea service or coffee via the coffee&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/engineering-applift/kong-acl-example-77a033d59034?source=rss-2f0bedd32a9b------2">Continue reading on Engineering @ Applift »</a></p></div>]]></description>
            <link>https://medium.com/engineering-applift/kong-acl-example-77a033d59034?source=rss-2f0bedd32a9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/77a033d59034</guid>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[kong]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[jwt]]></category>
            <category><![CDATA[api]]></category>
            <dc:creator><![CDATA[Pablo Loschi]]></dc:creator>
            <pubDate>Tue, 23 Apr 2019 13:59:21 GMT</pubDate>
            <atom:updated>2019-05-03T08:10:14.207Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Konga in Kubernetes]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://pgold30.medium.com/konga-in-kubernetes-cd9c31e71c75?source=rss-2f0bedd32a9b------2"><img src="https://cdn-images-1.medium.com/max/1433/1*Hr482IoDHmKJWNaHVsB6Tw.png" width="1433"></a></p><p class="medium-feed-snippet">Konga is a fully featured open source, multi-user GUI, that makes the hard task of managing multiple Kong installations a breeze.</p><p class="medium-feed-link"><a href="https://pgold30.medium.com/konga-in-kubernetes-cd9c31e71c75?source=rss-2f0bedd32a9b------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://pgold30.medium.com/konga-in-kubernetes-cd9c31e71c75?source=rss-2f0bedd32a9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/cd9c31e71c75</guid>
            <category><![CDATA[konga]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[kong]]></category>
            <dc:creator><![CDATA[Pablo Loschi]]></dc:creator>
            <pubDate>Thu, 11 Apr 2019 08:57:24 GMT</pubDate>
            <atom:updated>2019-04-11T08:57:24.746Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[KONG in Kubernetes]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/engineering-applift/kong-in-kubernetes-1c4ef3c47dae?source=rss-2f0bedd32a9b------2"><img src="https://cdn-images-1.medium.com/max/1020/1*vi1keg-mSEHuQCMcPK_orw.png" width="1020"></a></p><p class="medium-feed-snippet">&#x2018;What is KONG?</p><p class="medium-feed-link"><a href="https://medium.com/engineering-applift/kong-in-kubernetes-1c4ef3c47dae?source=rss-2f0bedd32a9b------2">Continue reading on Engineering @ Applift »</a></p></div>]]></description>
            <link>https://medium.com/engineering-applift/kong-in-kubernetes-1c4ef3c47dae?source=rss-2f0bedd32a9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/1c4ef3c47dae</guid>
            <category><![CDATA[kong]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[jwt]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Pablo Loschi]]></dc:creator>
            <pubDate>Tue, 15 Jan 2019 16:57:55 GMT</pubDate>
            <atom:updated>2019-04-23T14:30:54.797Z</atom:updated>
            <cc:license>https://creativecommons.org/licenses/by-nd/4.0/</cc:license>
        </item>
    </channel>
</rss>