<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kubeshop</title>
    <description>The latest articles on DEV Community by Kubeshop (@kubeshop_io).</description>
    <link>https://dev.to/kubeshop_io</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F847485%2F2d71ce76-1709-4278-8282-ff30870ef2ed.jpg</url>
      <title>DEV Community: Kubeshop</title>
      <link>https://dev.to/kubeshop_io</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kubeshop_io"/>
    <language>en</language>
    <item>
      <title>Monokle 1.8.0 Release Notes</title>
      <dc:creator>Kubeshop</dc:creator>
      <pubDate>Mon, 06 Jun 2022 10:56:38 +0000</pubDate>
      <link>https://dev.to/kubeshop/monokle-180-release-notes-1ojo</link>
      <guid>https://dev.to/kubeshop/monokle-180-release-notes-1ojo</guid>
      <description>&lt;p&gt;Team Monokle is proud to announce version 1.8.0 of &lt;a href="https://monokle.kubeshop.io/"&gt;Monokle by Kubeshop&lt;/a&gt; - an open-source desktop tool created to make all things related to Kubernetes manifests and resources simple. &lt;/p&gt;

&lt;p&gt;The main features of this release include: &lt;br&gt;
&lt;strong&gt;Compare Anything&lt;/strong&gt; - a cool and useful option created by overhauling the original Diffing Panel&lt;br&gt;
&lt;strong&gt;Instant visibility&lt;/strong&gt; of used images and their metadata&lt;br&gt;
&lt;strong&gt;Helm value interactions made easy&lt;/strong&gt; by hover over pop-up window showing the value of any reference &lt;br&gt;
We also improved the general user experience, largely based on your feedback. Thank you!  &lt;/p&gt;

&lt;h2&gt;
  
  
  Compare Anything - Literally!
&lt;/h2&gt;

&lt;p&gt;Today, we’re relaunching cluster compare as &lt;strong&gt;Compare Anything&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;While everyone seems to like comparing and deploying local resources to a cluster, we decided to take this a step further to provide optimal visibility for teams deploying at scale.&lt;/p&gt;

&lt;p&gt;With Compare Anything, you can do just that! Easily compare resources from different sources across your entire environment with Monokle - a place where you can get the insights you need to manage Kubernetes resources at scale.&lt;/p&gt;

&lt;p&gt;Compare Anything allows you to compare any two resource sets including:&lt;/p&gt;

&lt;p&gt;Clusters in two separate regions to see how they differ&lt;br&gt;
Helm chart’s standalone and high-availability setups&lt;br&gt;
Production and development Kustomize overlays&lt;br&gt;
Helm and Kustomize Preview to troubleshoot migration&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cmtE28yt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wo5sns7i6z9a51pn0dh9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cmtE28yt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wo5sns7i6z9a51pn0dh9.png" alt="Image description" width="880" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Full visibility of all used images and their metadata
&lt;/h2&gt;

&lt;p&gt;Use the new image tab option from the left menu to list and view all images used across resources &lt;br&gt;
Highlight the images in the editor with the possibility to quickly select any image&lt;br&gt;
Show image ref in the outgoing links pop-over&lt;br&gt;
Refactoring functionality allos you to easily change the image tag across all related resources&lt;br&gt;
Show information about the image from Docker hub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wfX48EWO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nvue4mo6i2e2tt97gd6c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wfX48EWO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nvue4mo6i2e2tt97gd6c.png" alt="Image description" width="880" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BEGFWvhf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rsl3bxdc5t9wnwv81e8d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BEGFWvhf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rsl3bxdc5t9wnwv81e8d.png" alt="Image description" width="880" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Helm interactions:
&lt;/h2&gt;

&lt;p&gt;Scale usage of Helm templates and handle more cases with our improved highlighting of Values properties in your Helm templates.&lt;/p&gt;

&lt;p&gt;Quickly preview the value references while working with Helm templates with our new hover-over feature. &lt;br&gt;
Values file link directly highlights and scrolls to the exact code line containing the property.&lt;/p&gt;

&lt;h2&gt;
  
  
  Save filter pre-sets for future use
&lt;/h2&gt;

&lt;p&gt;When filtering the resources, you now have the option to save the current filter as a preset in order to load it again at a later time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--38i9HtuC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8d67x7374yj5v1sitmg9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--38i9HtuC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8d67x7374yj5v1sitmg9.png" alt="Image description" width="880" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  UI/UX improvements: Header, Settings, &amp;amp; Shortcuts
&lt;/h2&gt;

&lt;p&gt;We’ve redesigned the header of the application to make it easier to use and understand:&lt;/p&gt;

&lt;p&gt;While in local mode&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qhGvCRg9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i1uvzrvs30oztioj9252.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qhGvCRg9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i1uvzrvs30oztioj9252.png" alt="Image description" width="880" height="45"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;While previewing cluster resources (cluster mode)&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b9lTv0X1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cw5l2u2bglby5rmhj7fc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b9lTv0X1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cw5l2u2bglby5rmhj7fc.png" alt="Image description" width="880" height="45"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While previewing the output of a Helm or Kustomize&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H-QV1b7Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qflw6ogfsfobkdmhj8fr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H-QV1b7Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qflw6ogfsfobkdmhj8fr.png" alt="Image description" width="880" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We separated the Settings panel into 3 tabs so you can navigate your projects accordingly:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ro25VFeo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qov4k1jv8q2v8dte7x96.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ro25VFeo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qov4k1jv8q2v8dte7x96.png" alt="Image description" width="796" height="842"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And last but definitely not least, we created a panel showing all keyboard shortcuts so you can work faster and more comfortably.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HrAV0ju6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yvm7qc81vpypffjv3z9a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HrAV0ju6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yvm7qc81vpypffjv3z9a.png" alt="Image description" width="880" height="619"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Other notable fixes &amp;amp; improvements
&lt;/h2&gt;

&lt;p&gt;New keyboard shortcuts:&lt;br&gt;
Ctrl/Cmd + R to reload cluster resources in Cluster Mode&lt;br&gt;
Ctrl/Cmd + Backspace to delete the currently selected file or resource&lt;br&gt;
Filter resources by multiple kinds&lt;br&gt;
As always, you can download the release directly from our &lt;a href="https://monokle.kubeshop.io/download"&gt;website&lt;/a&gt; and get in touch to complain or praise the Monokle Team on our &lt;a href="https://discord.gg/uNuhy6GDyn"&gt;Discord Server&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;We’re looking forward to hearing from you!&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>programming</category>
      <category>cloud</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Common Errors Found in Kubernetes Manifests</title>
      <dc:creator>Kubeshop</dc:creator>
      <pubDate>Thu, 12 May 2022 12:31:31 +0000</pubDate>
      <link>https://dev.to/kubeshop/common-errors-found-in-kubernetes-manifests-1p32</link>
      <guid>https://dev.to/kubeshop/common-errors-found-in-kubernetes-manifests-1p32</guid>
      <description>&lt;p&gt;You’ve spent weeks researching Kubernetes and its concepts, from clusters to control planes to pods to ConfigMap. Against all odds, you have finally launched a testing cluster on AWS. As a developer, this is all uncharted territory for you. Because Kubernetes is part of the “new” full-stack your organization has embraced, you need to learn a new way of deploying code.&lt;/p&gt;

&lt;p&gt;Eventually, you write the Kubernetes manifest that defines your deployment, type out:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl apply -f /path/to/your-manifest.yaml hit ENTER and…&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
An error.&lt;/p&gt;

&lt;p&gt;Do you know what the error means?&lt;/p&gt;

&lt;p&gt;Even if you’ve seen it before or read about it somewhere deep in the Kubernetes docs, how do you go about fixing it? How to adapt to the way your organization deploys on Kubernetes with pre-deployment tools that point out errors long before you spend time running kubectl apply and kubectl logs...&lt;/p&gt;

&lt;p&gt;For a while now, we have been building &lt;strong&gt;Monokle&lt;/strong&gt; - an open-source visual tool, a Kubernetes manifest IDE to help YAML experts and newbies alike to edit, debug and manage manifests easier and better.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Kubernetes YAML Manifest?
&lt;/h2&gt;

&lt;p&gt;A Kubernetes manifest is a YAML file that describes each component or resource of your deployment and the state you want your cluster to be in once applied.&lt;br&gt;
Here is an example for a ReplicaSet and three Nginx pods:&lt;/p&gt;

&lt;p&gt;`apiVersion: apps/v1&lt;/p&gt;

&lt;p&gt;kind: Deployment&lt;/p&gt;

&lt;p&gt;metadata:&lt;/p&gt;

&lt;p&gt;name: nginx&lt;/p&gt;

&lt;p&gt;labels:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app: nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;spec:&lt;/p&gt;

&lt;p&gt;selector:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;matchLabels:

  app: nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;template:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;metadata:

  labels:

    app: nginx

spec:

  containers:

  - image: nginx

    name: nginx

    ports:

    - containerPort: 8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;`&lt;/p&gt;

&lt;p&gt;Once you’ve created a Deployment, you can always edit your manifest file and re-apply it using &lt;code&gt;kubectl apply&lt;/code&gt;… to declare a new state, scale the number of pods, or clean up your cluster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Kubernetes manifests meet Helm and Kustomize
&lt;/h2&gt;

&lt;p&gt;If you’ve spent time in the Kubernetes ecosystem, you’ve probably heard about tools such as Helm and Kustomize. Both extend manifests to improve the developer experience around Kubernetes.&lt;/p&gt;

&lt;p&gt;Let’s be clear about what they are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://helm.sh/"&gt;Helm&lt;/a&gt;: A package manager for Kubernetes that uses Charts, which are Go-based templates that ultimately generate YAML-based manifests for deployments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, you can use a simple command like &lt;code&gt;helm install prometheus prometheus-community/prometheus&lt;/code&gt; to deploy a functional monitoring agent (and all its requisite resources) on your existing cluster without writing a single line of YAML.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://kustomize.io/"&gt;Kustomize&lt;/a&gt;: A configuration management tool for customizing Kubernetes objects. With Kustomize, you can take an existing manifest and apply overrides without touching the original YAML file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While these tools can help avoid some errors, by either delivering community-validated manifests or narrowing the changes you make on existing manifests, unfortunately &lt;strong&gt;they don’t help you to validate your manifests, suggest fixes nor to display relationships across the resources.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why are Kubernetes manifest errors hard to find?
&lt;/h2&gt;

&lt;p&gt;Some manifest-related errors show up right away, like in the scenario that kicked this piece off.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;error: error validating&lt;/code&gt; output is a good signal that you need to open your manifest file and look for a syntax error or a missing resource. Others only cause havoc after &lt;code&gt;kubectl apply&lt;/code&gt;… exits in a way that implies everything is OK, yet show up as errors later. You can get sucked into the cycle of searching for the different &lt;code&gt;STATUS&lt;/code&gt; codes shown by &lt;code&gt;kubectl get pods&lt;/code&gt; and reading page after page of Kubernetes documentation for details. That’s because &lt;code&gt;kubectl apply…&lt;/code&gt;exits only once your cluster has accepted your deployment, not when the deployment is running error-free with full functionality. You might never know your deployment has failed until you run &lt;code&gt;kubectl get pods&lt;/code&gt; or try navigating to your application. Monokle will point out syntax and all kinds of other possible errors and dependencies saving developers time before actual deployments happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few common Kubernetes manifest errors
&lt;/h2&gt;

&lt;p&gt;To help you solve some errors you might already have on your plate, let’s jump into some of the most common, why they happen, and how to solve them. &lt;/p&gt;

&lt;h2&gt;
  
  
  1. Indentation
&lt;/h2&gt;

&lt;p&gt;As a configuration language, YAML uses maps and arrays to understand how the resources in your manifest are related to one another.&lt;/p&gt;

&lt;p&gt;Both lists and maps are defined in YAML using indentation. So, your resources and configurations must be correctly associated.&lt;/p&gt;

&lt;p&gt;YAML is quite relaxed with the rules around indentation, not forcing any number of spaces per line, so the important rules are to use spaces and be consistent with indentation throughout your manifests.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Maps vs. arrays
&lt;/h2&gt;

&lt;p&gt;In YAML, maps are key-value dictionaries, while arrays are essentially lists, and they have unique syntaxes.&lt;/p&gt;

&lt;p&gt;To borrow from our example manifest above, this is a map:&lt;/p&gt;

&lt;p&gt;`metadata:&lt;/p&gt;

&lt;p&gt;name: nginx&lt;/p&gt;

&lt;p&gt;labels:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app: nginx`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And here’s a list:&lt;br&gt;
&lt;code&gt;&lt;br&gt;
      containers:&lt;br&gt;
      - image: nginx&lt;br&gt;
          name: nginx&lt;br&gt;
          ports:&lt;br&gt;
          - containerPort: 8080&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The difference? Lists are set off by hyphens (-).&lt;/p&gt;

&lt;p&gt;Maps are used when there’s a single value for a given key.&lt;/p&gt;

&lt;p&gt;Arrays define a list of similar objects, like several containers that should deploy in conjunction.&lt;/p&gt;

&lt;p&gt;Often the reasons for using one versus the other in a manifest aren’t clear, and only make sense once you’ve dove into documentation.&lt;br&gt;
‍&lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;code&gt;invalid type for…&lt;/code&gt; or &lt;code&gt;got "string", expected "integer"&lt;/code&gt;, aka expected vs. received values
&lt;/h2&gt;

&lt;p&gt;Let's say you need to define the port that a container should expose itself on, and instead of supplying an integer&lt;code&gt;—port: 80&lt;/code&gt;—you supply a string—&lt;code&gt;port: "80"&lt;/code&gt;. Kubernetes won’t know how to handle the wrong type of value, and the error output you receive in return might not be particularly helpful in finding the line responsible.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Typos
&lt;/h2&gt;

&lt;p&gt;Hard-to-catch issues, (e.g., starting a manifest with a typelike &lt;code&gt;apiVerion&lt;/code&gt; instead of &lt;code&gt;apiVersion&lt;/code&gt;), can create error validation errors that often don't help to diagnose the issue.&lt;/p&gt;

&lt;p&gt;If you’ve validated your indentation and know you have strings and integers where they should be, check again for spelling or camelCase erros—no YAML validator will be able to find those for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Invalid references between resources
&lt;/h2&gt;

&lt;p&gt;Manifest will likely reference other resources, such as ConfigMaps, secrets defined elsewhere in the file, or a separate file entirely.&lt;br&gt;
References must be right for a deployment to work. Typos or changed resource labels will often prompt this error if references elsewhere in the manifest(s) haven’t been updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Invalid output from Helm charts and Kustomize
&lt;/h2&gt;

&lt;p&gt;One downside to these useful tools is that they can abstract away too much, especially for developers who are still getting comfortable with manifests.&lt;/p&gt;

&lt;p&gt;For example, when you run Kustomize, it returns a big YAML file or multiple smaller files.&lt;/p&gt;

&lt;p&gt;Your only options for double-checking the output are&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reading through it with a fine-toothed comb,&lt;/li&gt;
&lt;li&gt;running each portion through external validation tools, or&lt;/li&gt;
&lt;li&gt;jumping into the deploy-troubleshoot-deploy cycle right away.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same goes for Helm. It’s a helpful resource for getting started, but because you’re not working on the YAML “by hand,” you don’t know what’s happening inside the files.&lt;/p&gt;

&lt;p&gt;So, just because a manifest comes from Helm doesn’t mean it’s error-free or doesn’t need some customization on your part.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using built-in tools for testing Kubernetes manifest errors
&lt;/h2&gt;

&lt;p&gt;Kubernetes comes with a few methods of simplifying how you identify errors in manifests.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl apply --dry-run&lt;/code&gt;: This runs a local dry run that can help catch some glaring errors by printing the object that would be sent but doesn’t give you much information about how the server will apply your manifest. Using &lt;code&gt;--dry-run=server&lt;/code&gt; goes one step further by testing your manifest against the server’s state, but it doesn’t persist the resource(s) you’re trying to apply.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl rollout&lt;/code&gt;: Follow up &lt;code&gt;kubectl apply&lt;/code&gt;... with &lt;code&gt;kubectl rollout status deployment your-app&lt;/code&gt; to see the status of your cluster, where it is still waiting, and whether it’s successful, shortening the gap between attempting a rollout and knowing if it’s failed.&lt;/p&gt;

&lt;p&gt;Add a &lt;code&gt;rollout&lt;/code&gt; to your CI/CD pipeline: You can block your CI pipeline from finishing while you wait for &lt;code&gt;kubectl rollout&lt;/code&gt; to exit, and if there’s a non-zero return code, you can fail the task.&lt;/p&gt;

&lt;p&gt;Add a readiness/liveness probe: The easiest way to know that a deployment is successful is by pinging your application at an appropriate endpoint and getting a 200 OK response. Kubernetes supports this with simple liveness containers that let you know if your application is running as expected.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;‍While these can help you catch errors a little faster once you’ve started a deployment, they’re still too late.&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pre-test for Kubernetes manifest errors with a manifest IDE
&lt;/h2&gt;

&lt;p&gt;So far, we’ve covered the state of manifest testing and some tips on common manifest mistakes.&lt;br&gt;
One problem remains: : How do you make the process of editing and managing manifests more efficient?&lt;/p&gt;

&lt;p&gt;The status quo—a cycle of deploying and failing and fixing ad infinitum—means you’re still engineering YAML files, not developing new features for your application and team .&lt;/p&gt;

&lt;p&gt;Enter &lt;a href="https://monokle.kubeshop.io/"&gt;Monokle&lt;/a&gt;, an open-source visual tool that simplifies everyday tasks around Kubernetes to help developers be more productive without tedious YAML-engineering. It uses built-in intelligence and syntax checking, giving a comprehensive view of manifests integrity spoting errors before you deployments.&lt;/p&gt;

&lt;p&gt;As a result, you can be effective in Kubernetes on day one without looking up a single YAML syntax rule.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OQobP_No--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sosv626te2jl5a2h99zj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OQobP_No--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sosv626te2jl5a2h99zj.png" alt="Image description" width="880" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Monokle's basic components are:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;File Explorer&lt;/strong&gt;&lt;br&gt;
Monokle’s File Explorer helps you find all your relevant manifest files, which is particularly useful for those complex deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Navigator&lt;/strong&gt;&lt;br&gt;
The Navigator converts the complex relationships between Kubernetes resources into easily-understood workloads, networks, and access controls and even gives you visual syntax or reference error alerts, including their number and severity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Editor&lt;/strong&gt;&lt;br&gt;
And the Editor, which can also switch to a form-fill mode for less YAML-engineering, highlights errors with a detailed explanation and a suggested fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monokle also lets you:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debug and validate the output of Kustomizations and Helm charts,&lt;/li&gt;
&lt;li&gt;View diffs between local and remote resources, and&lt;/li&gt;
&lt;li&gt;Navigating between resource relationships and dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Finishing Up‍
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://monokle.kubeshop.io/"&gt;Monokle&lt;/a&gt; has everything needed to end a cycle of hunting manifest errors. Download it directly from &lt;a href="https://github.com/kubeshop/monokle"&gt;GitHub&lt;/a&gt; or check out our &lt;a href="https://kubeshop.github.io/monokle/"&gt;documentation&lt;/a&gt;. It’s a desktop application that works on macOS, Linux, and Windows.&lt;/p&gt;

&lt;p&gt;We’d love to hear from you. Please join us on &lt;a href="https://discord.gg/6zupCZFQbe"&gt;Discord&lt;/a&gt;!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Tracetest is released. What’s next?</title>
      <dc:creator>Kubeshop</dc:creator>
      <pubDate>Tue, 10 May 2022 13:03:23 +0000</pubDate>
      <link>https://dev.to/kubeshop/tracetest-is-released-whats-next-1ma</link>
      <guid>https://dev.to/kubeshop/tracetest-is-released-whats-next-1ma</guid>
      <description>&lt;p&gt;We &lt;a href="https://github.com/kubeshop/tracetest"&gt;released Tracetest&lt;/a&gt; to the public last week. Yay! But what is next?&lt;/p&gt;

&lt;p&gt;Our team worked really hard to release the initial MVP version of Tracetest.  &lt;/p&gt;

&lt;p&gt;Did you hear about our release? In short - Tracetest allows you to utilize the Opentelemetry tracing instrumentation to do deep integration and end-to-end testing…easily. You can read about it in the last blog post,  &lt;a href="https://kubeshop.io/blog/introducing-tracetest-trace-based-testing-with-opentelemetry"&gt;“Introducing Tracetest - Trace-based Testing with OpenTelemetry”&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It was a ‘soft launch’, as the initial release is more of a prototype than a product. We are fans of Marty Cagan’s thoughts about delivering quickly by starting with a Minimal Viable Prototype rather than Product, so we focused on making the first version show the complete flow and enable us to solicit feedback. &lt;/p&gt;

&lt;p&gt;In spite of the ‘prototype’ nature, we were blown away by the reception &amp;amp; great comments we received via slack and our &lt;a href="https://discord.gg/eBvEQRVyKX"&gt;Discord channel&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;“I'm an OTel maintainer. I saw y'all tweet about this and it looks dope!” -Austin &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“I watched &lt;a href="https://www.youtube.com/watch?v=WMRicNlaehc"&gt;https://www.youtube.com/watch?v=WMRicNlaehc&lt;/a&gt; and it’s a really cool idea!” -Matt&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“We took a look at this in the past day or two and I have to say, we're very interested in this product.” -Dustin&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The team was pumped to hear the comments, so we dove back into planning the next major release, which will be a true MVP. Our motto is - &lt;strong&gt;We are going to put the ‘Product’ into ‘MVP’&lt;/strong&gt;.  We came up with a simple measure to decide if the tool can be declared a ‘Product’ - &lt;em&gt;we have to be able to test Tracetest’s service with Tracetest&lt;/em&gt;. &lt;a href="https://www.techopedia.com/definition/30784/dogfooding#:~:text=The%20term%20%22dogfooding%22%20is%20an,is%20confident%20about%20its%20products."&gt;Dogfooding&lt;/a&gt; our own product.&lt;/p&gt;

&lt;p&gt;With that goal in mind, we compiled a list of the capability we all wanted to add, combined it into a list, filtered it down to a smaller list, conducted a prioritization exercise, and, from that exercise, decided on a core set of capabilities to add.  Many of these are ‘meat and potatoes’ - basics the product must have to be functional. Some of the highlights include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Moving the assertion engine to the backend (Golang) &amp;amp; enabling tests to be run on a CI pipeline.&lt;/li&gt;
&lt;li&gt;A full revamp of the UX.&lt;/li&gt;
&lt;li&gt;Improving our selector logic that allows spans to be accurately targeted in a non-brittle manner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As an OSS project, we are developing in public, so you can follow our progress. We have a &lt;a href="https://github.com/kubeshop/tracetest/milestone/2"&gt;milestone titled MVProduct&lt;/a&gt; with a due date of June 7th, and the team has already dived into the development.&lt;/p&gt;

&lt;h2&gt;
  
  
  How can you help?
&lt;/h2&gt;

&lt;p&gt;There are a few ways:  &lt;/p&gt;

&lt;p&gt;1) Tell us how you would like to use the product via our &lt;a href="https://discord.gg/eBvEQRVyKX"&gt;Discord channel&lt;/a&gt;, what you would like to see in it, and the direction you would like us to take in the future.  &lt;/p&gt;

&lt;p&gt;2) Try it out! We have a public demo at &lt;a href="https://demo.tracetest.io"&gt;demo.tracetest.io&lt;/a&gt;. We will be updating it as we code, so it will be getting better and better over the next month as we progress.&lt;/p&gt;

&lt;p&gt;3) Talk to us directly. I am available on &lt;a href="https://discord.gg/eBvEQRVyKX"&gt;Discord&lt;/a&gt;, on the CNCF or o11y slack (Ken Hamric).  I will be looking for teams to talk to about their use case. &lt;/p&gt;

&lt;p&gt;In return for your time, I can promise undying gratitude, possibly a shirt in the future (TODO!), and rapid response from the dev team in translating your needs into working code.&lt;/p&gt;

&lt;p&gt;Thanks for your interest, and please give us a star on &lt;a href="https://github.com/kubeshop/tracetest"&gt;Github&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;-Tracetest Team&lt;/p&gt;

</description>
      <category>observability</category>
      <category>opentelemetry</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>Monokle 1.7.0 Release — Kubeshop</title>
      <dc:creator>Kubeshop</dc:creator>
      <pubDate>Tue, 10 May 2022 12:39:13 +0000</pubDate>
      <link>https://dev.to/kubeshop/monokle-170-release-kubeshop-2h3a</link>
      <guid>https://dev.to/kubeshop/monokle-170-release-kubeshop-2h3a</guid>
      <description>&lt;p&gt;The Monokle Team at Kubeshop is proud to announce version 1.7.0 of &lt;a href="https://monokle.kubeshop.io/"&gt;Monokle&lt;/a&gt; - Manifest IDE, our open-source desktop tool to help you with all-things-related to Kubernetes manifests. &lt;br&gt;
In this release, the main focus was improved manifest validation. We also improved Helm interactions and the general user experience, largely based on your feedback. Thank you!  &lt;/p&gt;

&lt;h2&gt;
  
  
  Open Policy Agent validation
&lt;/h2&gt;

&lt;p&gt;The Monokle team wants to help developers with the tools they need to spend less time fixing and debugging so that they can build the next big feature.&lt;br&gt;
We notice that both startups and enterprises want to comply with best practices and security standards, yet they often meet friction in tooling. Validating your policies in a separate process gets skipped and enforcing it at admission time comes with a poor developer experience.&lt;br&gt;
That’s why Monokle now brings &lt;strong&gt;policy validation&lt;/strong&gt; directly into your editor. &lt;br&gt;
You will no longer need to dive through documentation as help will appear in real-time while editing.&lt;/p&gt;

&lt;p&gt;Getting started with policy validation is simple. Open the validation pane at the left and you will see a pre-made list of rules. A big shout out to the DefSec team at &lt;a href="https://www.aquasec.com/"&gt;Aqua Security&lt;/a&gt; as full credit for these rules goes to them. Once you’re familiarized with the rules, enable those relevant to you and that’s it!&lt;/p&gt;

&lt;p&gt;Please note that this initial release only works on vanilla Kubernetes manifests and is disabled for Helm and Kustomizations. Let us know what you think about the Open Policy Agent integration and feel free to send us a message when you are missing a rule or are interested in building a plugin with your own set of rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Helm
&lt;/h2&gt;

&lt;p&gt;Now you can list the templates under each Chart in the Helm Pane:&lt;/p&gt;

&lt;p&gt;Mouse over directive templates to display the location of the Values file associated with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cluster workflows
&lt;/h2&gt;

&lt;p&gt;Disable or enable editing resources in cluster mode:&lt;/p&gt;

&lt;h2&gt;
  
  
  UI/UX Improvements
&lt;/h2&gt;

&lt;p&gt;Pin your favorite projects on the top of the “getting started” page:&lt;/p&gt;

&lt;p&gt;First-timer? Don’t worry, we created a tooltip that guides you through the main features:&lt;/p&gt;

&lt;h2&gt;
  
  
  Other notable fixes and improvements
&lt;/h2&gt;

&lt;p&gt;Fixed the Deploy Resource action on Ubuntu.&lt;br&gt;
Updates: get a hint when to reload Monokle after a new version has been applied&lt;br&gt;
Refreshed the look and feel of the start page&lt;br&gt;
As always you can download the release from our website and get in touch to complain or praise Monokle on our Discord Server - looking forward to hearing from you&lt;/p&gt;

</description>
      <category>programming</category>
      <category>devops</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Dogfooding Testkube - Part1 - How to Test a Testing Framework</title>
      <dc:creator>Kubeshop</dc:creator>
      <pubDate>Wed, 20 Apr 2022 14:04:25 +0000</pubDate>
      <link>https://dev.to/kubeshop/dogfooding-testkube-part1-how-to-test-a-testing-framework-4gl9</link>
      <guid>https://dev.to/kubeshop/dogfooding-testkube-part1-how-to-test-a-testing-framework-4gl9</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href="https://kubeshop.io/blog/dogfooding-testkube-part1-how-to-test-a-testing-framework"&gt;This post originally published on the Kubeshop blog.&lt;br&gt;
&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;People are fallible. We often need to make decisions based on incomplete information which results in unpredictable behavior. Engineers are often trained to limit those mistakes, but we’re still humans - not robots -  and our code is not perfect and can often result in errors.&lt;/p&gt;

&lt;p&gt;Engineers (who are also humans - yes - nerds are also humans!) for decades have faced the topic of testing their products. There are numerous tools, frameworks, and techniques for testing code. There are unit testing, functional testing, integration testing, performance testing, stress testing, and many more.&lt;/p&gt;

&lt;p&gt;The problem is even trickier when we do things in Kubernetes, which is an “open-source system for automating deployment, scaling, and management of containerized applications.” It handles a lot of the deployment complexity for you but working with it requires a lot of knowledge - and not just for beginners or junior developers, but seniors also need time to become familiar with how everything works.&lt;/p&gt;

&lt;p&gt;As Kubernetes is gaining a lot of momentum recently in modern companies, the tooling around it not always is good enough to balance the speed of development and complexity of the platform, so a lot of companies are struggling with in-house tools - they are great to write - but hard to maintain (like any tool). &lt;/p&gt;

&lt;p&gt;We, the Testkube engineers at Kubeshop, also want to test our code and the final product, which is a quite small but complicated Kubernetes service with operators, APIs, kubectl plugins, and various other components - everything merges to reduce the complexity of running tests in Kubernetes cluster for the end-user.&lt;/p&gt;

&lt;p&gt;ut wait a minute we've just written a testing tool? right? Why not use it to test itself? Yeah!! - we love testing stuff - It could sound like a crazy idea but for example, the Go language (and many other languages) can be compiled by itself, so why not test our  testing framework with our testing framework? Also, we’ll get some additional feedback on what to test and how it behaves in a real environment.&lt;/p&gt;

&lt;h1&gt;
  
  
  Considerations
&lt;/h1&gt;

&lt;p&gt;Now let’s get back a little - that crazy idea needs to be planned to make it real. To test our software we’re using a range of testing techniques, starting with unit testing. In Go and almost all modern languages, it’s quite straightforward: you can use the internal testing library and add some assertion library and you're done. &lt;/p&gt;

&lt;p&gt;But it’s only part of the problem - now you can be sure of the quality of the dots (parts of code) in your architectural diagram. What about connections between those dots? That’s the job of integration tests that could be written in a language that other parts are written with - you can take packages and simulate connections between them in the same way as they are orchestrated in real code - but it’s still not the same.&lt;/p&gt;

&lt;p&gt;But what to do later? - there is still a lot of complexity that needs to be handled like networking, running Kubernetes plugins, getting results in isolated environments (which Kubernetes is), performance issues (those, fortunately, we don’t have a lot), or other system-related topics. &lt;/p&gt;

&lt;p&gt;Some of the above issues can be addressed by End-To-End (e2e) tests which can take part or the whole of the system and test in a semi-production environment simulating real usage. We decided it would be a good fit for Testkube - as some abstraction over testing frameworks and techniques. &lt;/p&gt;

&lt;p&gt;Some questions arose during this work - what should be the scheduler for running tests? Should we write some shell scripts or other Github actions manually? What if we want to extend testing suites with different executors? - Probably it would not be flexible. After some ideation sessions, we decided to use Testkube to run our already defined tests against our Testkube clusters, almost all parts were there (like authorizing to cluster with kubectl) so the only missing parts were the installation of the Testkube kubectl plugin and running defined tests.&lt;/p&gt;

&lt;p&gt;So we’ve set up our CI pipelines in GitHub and started running tests to test testing tools. &lt;/p&gt;

&lt;h1&gt;
  
  
  Testing Our Testing Tool
&lt;/h1&gt;

&lt;p&gt;Testkube is cloud-native based on top of Kubernetes. Additionally, we’ve designed it using OpenAPI spec with API-design first in mind. We’ve started by preparing a testing workflow in GitHub which can run Testkube tests - you need only configured access to Kubernetes cluster with &lt;code&gt;kubectl&lt;/code&gt; and then install and run Testkube against your tests. &lt;/p&gt;

&lt;p&gt;You can find the full Github workflow step for deployment &lt;a href="https://github.com/kubeshop/helm-charts/blob/main/.github/workflows/helm-releaser-Testkube-charts.yaml#L145"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And for starting tests &lt;a href="https://github.com/kubeshop/helm-charts/blob/main/.github/workflows/helm-releaser-Testkube-charts.yaml#L226"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y9GxGJDC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6nqqvf29omg1tnj04pio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y9GxGJDC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6nqqvf29omg1tnj04pio.png" alt="Image description" width="880" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;‍‍Starting test suite with valid in-cluster configuration in GitHub workflows. &lt;/p&gt;

&lt;h1&gt;
  
  
  Test Planning &amp;amp; Execution
&lt;/h1&gt;

&lt;p&gt;To start testing you should need a plan - define what are the critical, most important paths in your service, what is the happy path for them, and how to manage automation of feeding test data (this could be tricky in some old systems without APIs or with complicated access - but if standard testing tools are not enough for you, Testkube will help you here too - simply write your own tests executor).  &lt;/p&gt;

&lt;p&gt;Next, you’ll need to create Postman tests. Several tips could help you write your tests against services in Kubernetes clusters. &lt;/p&gt;

&lt;p&gt;To pass data from outside you can use &lt;a href="https://learning.postman.com/docs/sending-requests/variables/"&gt;environment variables in the postman &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To feed external data use the &lt;code&gt;-p PARAM=VALUE&lt;/code&gt; flag when starting Testkube tests.&lt;br&gt;
You can use the &lt;code&gt;URI&lt;/code&gt; variable to use the same test code for testing in different environments (e.g. &lt;a href="http://localhost:8080"&gt;http://localhost:8080/&lt;/a&gt; on your local machine, and &lt;a href="https://my-service.my-namespace:8080"&gt;https://my-service.my-namespace:8080/&lt;/a&gt; inside your cluster using internal DNS service) - so it’s almost the same as testing against your local instance of the system. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yay! We’ve noticed what has been done here - it’s the first time we’ve built foundations for testing Testkube with Testkube (like in the Inception movie)!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s get back to tests - what was the planning/thinking process? &lt;/p&gt;

&lt;p&gt;So to start we need to define some tests - we decided to go with API testing first as it feels natural for us (automatic OpenAPI spec validation in Testkube is still in the phase of designing) - and it's the most critical component of our system - and additionally Postman was in place - it allowed us to make quick prototyping on top of our local instances of &lt;a href="https://kubeshop.github.io/testkube/openapi/"&gt;Testkube API server&lt;/a&gt;. It was a good decision to go with design first with OpenAPI spec - testing is really easy with that - just prepare some data, pass them to endpoints and check results - Postman is your tool here! - tests and assertions can be written in javascript. Additionally you have a templating engine in place that can inject Postman internal environment variables everywhere.&lt;/p&gt;

&lt;p&gt;We’ve started by writing test suites against our APIs. They can be easily written and run against local development instances. After everything is designed, we could move test code into clusters. With parameterized tests, you can easily write tests on your local development infrastructure and move it into a cluster when you’re ready (I was writing tests against a local go language API server running on my local MacBook). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--28J4a8dz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eaetcvl8s02xptyjedr9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--28J4a8dz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eaetcvl8s02xptyjedr9.png" alt="Image description" width="880" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’ve created a plan for the “happy path” of our test resource, like creating a new test, running it, and checking if it was run on top of Testkube.Postman has great ability to orchestrate requests and pass data from one to another - we’ve used env variables for that&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sl9i1myv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2v13oka5rrgegv8mc1zb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sl9i1myv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2v13oka5rrgegv8mc1zb.png" alt="Image description" width="880" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The environment variables will behave like global variables for a whole Postman test run, you can easily set and get them. We’ve used them extensively to generate random test names and pass created execution ids or execution names. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tKa7_uIl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/36j6pqw19fr00sa3uo9r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tKa7_uIl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/36j6pqw19fr00sa3uo9r.png" alt="Image description" width="880" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There were also some assertions with the use of the integrated &lt;code&gt;pm.expect&lt;/code&gt; assertions library in Postman. &lt;/p&gt;

&lt;p&gt;After the test suite was completed I could simply move it into the cluster with a little effort like defining valid cluster endpoints as we’ve already planned that all URIs will be changed in a valid test run on a cluster with a valid Kubernetes DNS based service address.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rPqf2H-c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n4c878typ89424v4wn7e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rPqf2H-c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n4c878typ89424v4wn7e.png" alt="Image description" width="880" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re interested in the code of our test, feel free to check it here (&lt;a href="https://github.com/kubeshop/Testkube/blob/main/test/e2e/Testkube-Sanity.postman_collection.json"&gt;just import file as Postman collection&lt;/a&gt;) it’s just exported Postman collections JSON file that tests against our &lt;a href="https://kubeshop.github.io/testkube/openapi/"&gt;Testkube API defined in OpenAPI spec&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was nice that Postman - which we knew how to use (as most of us used it to call APIs for some previous development) - can be run so easily in the Kubernetes cluster. &lt;/p&gt;

&lt;p&gt;Everything was run in our GitHub workflows with the use of Actions. The test is run after successful helm chart build and deployment to one of our clusters. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BGSOwrnm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/29eg2vbh0al36ivt1zmx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BGSOwrnm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/29eg2vbh0al36ivt1zmx.png" alt="Image description" width="880" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ldkI0wVd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qe4r2i9814o1m2pnia0m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ldkI0wVd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qe4r2i9814o1m2pnia0m.png" alt="Image description" width="880" height="919"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The output of this step is simply Testkube output which can be analyzed in case of a failing build.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;When you’re testing your code in Kubernetes you’re facing a lot of problems, starting from an isolated environment for your service (where calling tests against your services is very limited), and at the end getting results from your test run is not so straightforward. Fortunately, Testkube can help you there, we can manage these (and probably many more in future) issues for you - test engineers should focus only on testing their code. &lt;/p&gt;

&lt;p&gt;As our work is not completed yet - just some foundations were built - the next steps will be for sure to extend this testing suite to increase coverage and to test some edge cases or even parallel tests running. &lt;/p&gt;

&lt;p&gt;The question always is: was it worthy putting quite a big effort into such tests? - the answer (like for most cases) is only one - YES! For us, &lt;strong&gt;123 failed builds&lt;/strong&gt; were found already! So it was great to have really fast feedback before our users notice any issues.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x8BXeu-A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4su500ow2vu6rloqorm3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x8BXeu-A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4su500ow2vu6rloqorm3.png" alt="Image description" width="880" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additionally, the second step will be also to test our frontend app - but here we’ll use a different tool for testing React-based applications - look for part 2 of this post ;). &lt;/p&gt;

&lt;p&gt;If you’re interested in Testkube you can check out our work on &lt;a href="https://github.com/kubeshop/testkube"&gt;Github&lt;/a&gt;, don’t hesitate to say “hello” on our &lt;a href="https://discord.gg/CzpqtfPjXV"&gt;Discord channel&lt;/a&gt; - we're a very open community of engineering enthusiasts who are trying to make a change in Kubernetes' world. &lt;/p&gt;

&lt;p&gt;If you’re interested in our other projects you can check &lt;a href="https://kusk.io/"&gt;Kusk&lt;/a&gt; (OpenAPI spec powered API gateway) or &lt;a href="https://monokle.io/"&gt;Monokle&lt;/a&gt; (your manifests manager).&lt;/p&gt;

&lt;p&gt;This was part 1 of Dogfooding Testkube - please follow our &lt;a href="https://twitter.com/thekubeshop"&gt;Twitter&lt;/a&gt;/&lt;a href="https://discord.gg/hfq44wtR6Q"&gt;Discord&lt;/a&gt; to get notifications when part 2 will be ready! &lt;/p&gt;

</description>
      <category>testing</category>
      <category>kubernetes</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>Testing Electron Apps with Playwright</title>
      <dc:creator>Kubeshop</dc:creator>
      <pubDate>Wed, 20 Apr 2022 13:49:06 +0000</pubDate>
      <link>https://dev.to/kubeshop/testing-electron-apps-with-playwright-3f89</link>
      <guid>https://dev.to/kubeshop/testing-electron-apps-with-playwright-3f89</guid>
      <description>&lt;p&gt;When projects and teams are just starting out, testing is usually not the main focus. However, as projects grow and get more users more emphasis is placed on testing, in particular, automated testing which can be reused and can be done as part of development tasks.&lt;/p&gt;

&lt;p&gt;In this regard Monokle is not that different from other projects or teams, we needed to hit the ground running and just build something, see where it goes and focus on tests later on. Now we’re in a position where we need to make sure that core functionality is not unintentionally affected as new features get added, so having a baseline integration test that runs with our nightly builds makes total sense. &lt;/p&gt;

&lt;p&gt;But hey... better late than never and so our story with Electron and integration tests begins.&lt;/p&gt;

&lt;p&gt;Monokle is built using Electron which is used to build desktop applications across multiple platforms using a web framework like react. There are multiple testing frameworks out there but very few which are able to run on multiple OS’s and test Electron applications such as Monokle. We decided to use Playwright - as it is both open-source and seems to have Electron support baked in.&lt;/p&gt;

&lt;p&gt;Playwright works similarly to other testing frameworks (Selenium, Cypress); it launches the actual application and mimics the actions a user would do, clicking on elements, writing things in text inputs, going through different flows. Assertions are added to make sure the expected results happen in the UI - for example, the opening of a panel or changing a label. Although more time-consuming, launching an application in this way is preferable to running it from source code, since this more closely mimics the end-user experience. There might be small differences.&lt;/p&gt;

&lt;h1&gt;
  
  
  Let’s dive into the actual tests
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Install dependencies
&lt;/h2&gt;

&lt;p&gt;First, we need to install some dependencies:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install –save-dev @playwright/test playwright playwright-core xvfb-maybe asar&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Playwright is the testing library we are using;&lt;/li&gt;
&lt;li&gt;xvfb-maybe is used to run the tests;&lt;/li&gt;
&lt;li&gt;asar is used to parse OS packages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Create configuration file
&lt;/h2&gt;

&lt;p&gt;Create a &lt;strong&gt;playwright.config.ts&lt;/strong&gt; similar to this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import {PlaywrightTestConfig} from '@playwright/test';

const config: PlaywrightTestConfig = {

 testDir: './&amp;lt;test-directory&amp;gt;',

 timeout: 60000,

 expect: {

   toMatchSnapshot: {threshold: 0.2},

 },

};


export default config;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Write boilerplate
&lt;/h2&gt;

&lt;p&gt;To find parse and run the electron final build we used the functions &lt;strong&gt;(findLatestBuild, parseElectronApp)&lt;/strong&gt; from &lt;a href="https://github.com/spaceagetv/electron-playwright-example/blob/master/e2e-tests/electron-playwright-helpers.ts#L157-L423" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The credit for these very useful functions goes to &lt;a href="https://github.com/spaceagetv" rel="noopener noreferrer"&gt;Spaceage&lt;/a&gt; who made them.&lt;/p&gt;

&lt;p&gt;Copy-paste those functions into an &lt;a href="https://github.com/kubeshop/monokle/blob/main/tests/electronHelpers.ts" rel="noopener noreferrer"&gt;electronHelpers.ts&lt;/a&gt; file.&lt;/p&gt;

&lt;p&gt;In the same file create a &lt;strong&gt;startApp&lt;/strong&gt; function which will be used in our tests to start the actual app.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

/**

* Find the latest build and start monokle app for testing

*/

export async function startApp(): Promise&amp;lt;StartAppResponse&amp;gt; {

 // find the latest build in the out directory

 const latestBuild = findLatestBuild();

 // parse the directory and find paths and other info

 const appInfo = parseElectronApp(latestBuild);

 const electronApp = await electron.launch({

   args: [appInfo.main],

   executablePath: appInfo.executable,

   recordVideo: {

     dir: '&amp;lt;recording-path&amp;gt;',

     size: {

       width: 1200,

       height: 800

     },

   },

 });


/**

 // wait for splash-screen to pass

 await electronApp.firstWindow();

 while (electronApp.windows().length === 2) {

   // eslint-disable-next-line no-await-in-loop

   await pause(100);

 }


 const windows = electronApp.windows();

 if (windows.length !== 1) {

   throw new Error('too many windows open');

 }

 const appWindow: Page = windows[0];

 appWindow.on('console', console.log);


/**

 // Capture a screenshot.

 await appWindow.screenshot({

   path: 'screenshots/initial-screen.png'

 });


 return {appWindow, appInfo, electronApp};

}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In the end, the &lt;strong&gt;electronHelpers.ts&lt;/strong&gt; should look something like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

export async function startApp(): Promise&amp;lt;StartAppResponse&amp;gt; {

  ...

}


export async function findLatestBuild() {

  ...

}


export async function parseElectronApp() {

  ...

}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Writing actual tests
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import {Page} from 'playwright';

import {test} from '@playwright/test';

import {ElectronApplication} from 'playwright-core';

import {ElectronAppInfo, startApp} from './electronHelpers';


let appWindow: Page;

let appInfo: ElectronAppInfo;

let electronApp: ElectronApplication;


test.beforeAll(async () =&amp;gt; {

 const startAppResponse = await startApp();

 appWindow = startAppResponse.appWindow;

 appInfo = startAppResponse.appInfo;

 electronApp = startAppResponse.electronApp;

});


test('test click', async () =&amp;gt; {

 // Click button.

 await appWindow.click('text=Click me');

// Exit app.

 await electronApp.close();

});


test.afterAll(async () =&amp;gt; {

 await appWindow.screenshot({path: 'screenshots/final-screen.png'});

 await appWindow.context().close();

 await appWindow.close();

});


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The code snippet above can give a pretty good idea of what can be done with an Electron app which is very similar to testing a website. Also, there is extensive documentation on the playwright website on how to: access elements, click, fill in text input and other values, scroll, and so on.&lt;/p&gt;

&lt;p&gt;To execute the tests add a script to your package.json file with this command: &lt;code&gt;xvfb-maybe npx playwright test - and run it with “npm run &amp;lt;script name&amp;gt;”&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Using Models for UI Tests
&lt;/h1&gt;

&lt;p&gt;One thing which is not Electron specific but it comes with the Playwright library is using models: &lt;a href="https://playwright.dev/docs/test-pom" rel="noopener noreferrer"&gt;https://playwright.dev/docs/test-pom&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Structuring your code around these models will result in: code reusability, lighter tests in terms of code written, and an easier understanding of what a test is supposed to do. &lt;/p&gt;

&lt;p&gt;POMs can also help when some UI refactoring comes knocking at the door because the code is structured in a more versatile way.&lt;/p&gt;

&lt;p&gt;An example of how a model would look like:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import {Locator, Page} from 'playwright';


export class TestModal {


 private _page: Page;


 private readonly _okButton: Locator;


 constructor(page: Page) {

   this._page = page;


   this._okButton = page.locator('#button-identifier');

 }


 async clickSave() {

   await this._okButton.click();

 }


}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h1&gt;
  
  
  Mocking/Handing OS file selections or different actions between &lt;a href="https://www.electronjs.org/docs/latest/api/ipc-renderer" rel="noopener noreferrer"&gt;IPCRenderer&lt;/a&gt;&amp;lt;&amp;gt;&lt;a href="https://www.electronjs.org/docs/latest/api/ipc-main" rel="noopener noreferrer"&gt;IPCMain&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;My time using Playwright was really nice until we had to automate a file selection flow, which seems very simple: open a file or a folder from the computer. &lt;/p&gt;

&lt;p&gt;This sounds like a breeze. It was difficult to find any documentation on how to do this in a straightforward way.&lt;/p&gt;

&lt;p&gt;The way we’re opening file selection windows is using &lt;a href="https://www.electronjs.org/docs/latest/api/dialog" rel="noopener noreferrer"&gt;dialog.showSaveDialogSync&lt;/a&gt; from the Electron framework and Playwright is not able to click on that window since it is native and not created within the Electron app environment.&lt;/p&gt;

&lt;p&gt;To automate opening a specific file or folder in our tests we had to add a new handler for that specific event, but IPC channels cannot be overwritten and they can have only one listener. So we did the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inject some code in the app which will have a different channel when the app is in automation mode;&lt;/li&gt;
&lt;li&gt;Start the app with an automation flag only in testing(this leaves the app usable for other use cases);&lt;/li&gt;
&lt;li&gt;In tests use the same channel name as when we started the application and override the handler.
```
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;const name = 'some name';&lt;/p&gt;

&lt;p&gt;const chanel = 'select-file-automation';&lt;/p&gt;

&lt;p&gt;await electronApp.evaluate(({ ipcMain }, params) =&amp;gt; {&lt;/p&gt;

&lt;p&gt;ipcMain.handle(params.chanel, () =&amp;gt; {&lt;/p&gt;

&lt;p&gt;return [params.name];&lt;/p&gt;

&lt;p&gt;});&lt;/p&gt;

&lt;p&gt;}, { chanel, name });&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Using this logic we are able to easily test OS-specific functionalities such as working with folders and files which are crucial for a code editor such as Monokle.

#Automate on GitHub
To get the most of our tests, we’ve added them in our nightly builds so we can see if we’ve broken anything during the day. The reason for not adding them to run on every commit was that it takes ~20 minutes for everything to run, which would have led to extended waiting times in our development cycle.

We have set up Playwright to take screenshots and record videos, these files can be accessed from the Github actions as well to get a real-time view of how the tests are working or failing.

Go to: the action =&amp;gt; click on it =&amp;gt; click on summary =&amp;gt; click on output.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/273w3eduea7xpfarjl74.png)

Below is a snippet for running Electron tests as part of Github actions. We have a complete flow [here](https://github.com/kubeshop/monokle/blob/main/.github/workflows/monokle-ui-tests.yml).

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;name: ui-tests&lt;/p&gt;

&lt;p&gt;on:&lt;/p&gt;

&lt;p&gt;push:&lt;/p&gt;

&lt;p&gt;branches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;test-branch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;workflow_dispatch:&lt;/p&gt;

&lt;p&gt;jobs:&lt;/p&gt;

&lt;p&gt;ui-tests-mac:&lt;/p&gt;

&lt;p&gt;runs-on: macOS-latest&lt;/p&gt;

&lt;p&gt;steps:&lt;/p&gt;

&lt;p&gt;... prepare for tests, install &amp;amp;build&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name: E2E Test for Electron 🧪&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;run: npm run ui-test&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name: Upload Test Results 🗃&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;if: always()&lt;/p&gt;

&lt;p&gt;uses: actions/upload-artifact@v2&lt;/p&gt;

&lt;p&gt;with:&lt;/p&gt;

&lt;p&gt;name: playwright-output&lt;/p&gt;

&lt;p&gt;path: test-output/**&lt;/p&gt;

&lt;p&gt;ui-tests-windows:&lt;/p&gt;

&lt;p&gt;runs-on: windows-latest&lt;/p&gt;

&lt;p&gt;steps:&lt;/p&gt;

&lt;p&gt;... prepare for tests, install &amp;amp;build&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name: E2E Test for Electron 🧪&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;run: npm run ui-test&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name: Upload Test Results 🗃&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;if: always()&lt;/p&gt;

&lt;p&gt;uses: actions/upload-artifact@v2&lt;/p&gt;

&lt;p&gt;with:&lt;/p&gt;

&lt;p&gt;name: playwright-output&lt;/p&gt;

&lt;p&gt;path: test-output/**&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
#Future steps
As the Monokle project grows so will our end to end testing, here are a few steps we plan to add in the near future:

Breakout the logic from the [electronHelpers.ts](https://github.com/kubeshop/monokle/blob/main/tests/electronHelpers.ts) file into an npm library which can be maintained and reused independently of our projects;
Breakout specific [antd](https://ant.design/docs/react/customize-theme) logic(modal, tree, pane) models into a library which can be reused for testing by other people;
Expand the tests we have for the general functionality of Monokle.
A complete example of our working tests and how to run them can be found on the Monokle open source repo [here](https://github.com/kubeshop/monokle/tree/main/tests) and in the corresponding [documentation](https://github.com/kubeshop/monokle/blob/main/docs/testing.md).

As always you can download the release from [GitHub](https://github.com/kubeshop/monokle) and get in touch to complain or praise Monokle on our [Discord Server](https://discord.gg/uNuhy6GDyn) - looking forward to hearing from you!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>testing</category>
      <category>kubernetes</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Monokle 101 - Managing Your Kubernetes Manifests</title>
      <dc:creator>Kubeshop</dc:creator>
      <pubDate>Wed, 20 Apr 2022 13:35:53 +0000</pubDate>
      <link>https://dev.to/kubeshop/monokle-101-managing-your-kubernetes-manifests-5amb</link>
      <guid>https://dev.to/kubeshop/monokle-101-managing-your-kubernetes-manifests-5amb</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href="https://kubeshop.io/blog/monokle-101-managing-your-kubernetes-manifests"&gt;This post originally published on the Kubeshop blog.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Managing Kubernetes manifests can be a difficult, time consuming task if you don’t have an easy way to manage them at scale. That is, if you don’t have &lt;a href="https://monokle.kubeshop.io/"&gt;Monokle&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kubeshop/monokle"&gt;Monokle is an open source desktop tool&lt;/a&gt; that takes the grunt work out of working with your Kubernetes manifests, it gives you a high-level view of their contained resources and relationships with the options to edit, refactor, preview, diff, and navigate before deploying them to your clusters. &lt;/p&gt;

&lt;p&gt;And you don’t need more than a working knowledge of YAML to do it.&lt;/p&gt;

&lt;p&gt;Monokle’s user interface includes a smörgåsbord (this writer is Swedish...) of components to help you work with your manifests;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A resource navigator to help you navigate your resources&lt;/li&gt;
&lt;li&gt;Intelligent source and form editors for your resource YAMLs&lt;/li&gt;
&lt;li&gt;Dedicated views and preview functionality for Kustomize and Helm Charts&lt;/li&gt;
&lt;li&gt;Cluster view and compare functionality&lt;/li&gt;
&lt;li&gt;Templates to help you get started with new resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZmeJsBQN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uyusmytgkfc93jg99x79.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZmeJsBQN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uyusmytgkfc93jg99x79.png" alt="Image description" width="880" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And so much more!&lt;/p&gt;

&lt;h1&gt;
  
  
  Getting Started
&lt;/h1&gt;

&lt;p&gt;Upon installing and opening Monokle, you might begin by opening an existing folder containing any number of manifest files. Monokle’s UI is built to help you easily visualize their contained resources and relationships between them. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UiGjz1Al--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bva4bpe7bz0gad6ikvt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UiGjz1Al--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bva4bpe7bz0gad6ikvt.png" alt="Image description" width="880" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With a simple hover of your cursor you can visualize incoming links and outgoing links to your resources, clicking into any of these links will navigate you to the target resource. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lL4Rnwr_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lkgxlr1pwax3edhax534.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lL4Rnwr_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lkgxlr1pwax3edhax534.png" alt="Image description" width="366" height="112"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Monokle validates all resource links it finds and indicates to the user whether there is an error - making it easy to find - and fix - any invalid links in your set of resources. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N_acGrvZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w2vxgh9wzkw70j3euzp0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N_acGrvZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w2vxgh9wzkw70j3euzp0.png" alt="Image description" width="880" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beyond links, if you make changes to names, references, or any other line items within your resources source, Monokle will immediately alert you if anything you do is inconsistent with the required syntax or schema.&lt;/p&gt;

&lt;p&gt;If you’re not fluent in YAML most resources will have a form-based editor allowing you to make changes to any value in a simple and easy-to-understand format. Those changes are reflected within the source code as you work. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XdZ6vsil--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eboet3up3p2za28ysczh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XdZ6vsil--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eboet3up3p2za28ysczh.png" alt="Image description" width="880" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Working with Kustomize
&lt;/h1&gt;

&lt;p&gt;Monokle has built-in support for Kustomize - allowing you to see all customizations and patch files detected in your folders:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F_bX7Lpo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5gmmxgwyfkd591ql5xlg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F_bX7Lpo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5gmmxgwyfkd591ql5xlg.png" alt="Image description" width="880" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An extremely powerful functionality is the possibility to preview a kustomization;  Monokle will run Kustomize and show you all the resources that were generated by Kustomize in the resource navigator - including links, errors and warnings for each resource. You can easily update the kustomization and update your preview to interactively debug and validate the output created by Kustomize before you deploy these to your cluster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H_9qWxIQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ft0r8uepkfin53fvcqo6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H_9qWxIQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ft0r8uepkfin53fvcqo6.png" alt="Image description" width="880" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Working with Helm Charts
&lt;/h1&gt;

&lt;p&gt;Monokle offers a similar function for &lt;a href="https://helm.sh/"&gt;Helm&lt;/a&gt; - allowing you to visualize your Helm charts and their values files:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WPfTuzu3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y2zpixh3e55tp27m2kxb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WPfTuzu3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y2zpixh3e55tp27m2kxb.png" alt="Image description" width="880" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just like for Kustomize you can preview a Helm Chart which will run Helm in the background and show you the generated resources in the resource navigator:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DHthlgFj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5p171if7yd23z9h8203u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DHthlgFj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5p171if7yd23z9h8203u.png" alt="Image description" width="880" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can interactively make changes to your values file and recreate the preview at any time, allowing you to validate the output of Helm before applying it to your cluster.&lt;/p&gt;

&lt;h1&gt;
  
  
  Connecting to Clusters
&lt;/h1&gt;

&lt;p&gt;Not only does Monokle allow you to work with local manifest files - it also allows you to explore and work with resources in your cluster - including all the link and content validation available for local resources.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Tw0stuK6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h0ukflucq9fhdh18n405.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tw0stuK6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h0ukflucq9fhdh18n405.png" alt="Image description" width="880" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since the number of resources in your cluster can be overwhelming, Monokle allows you to filter your resources through different criteria via the central Navigator column. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V_-dSVoe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1bqmmh946hffljss162z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V_-dSVoe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1bqmmh946hffljss162z.png" alt="Image description" width="880" height="1261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another useful tool when working with a cluster is the Diff functionality - allowing you to both compare individual resources to those in your cluster - or you can compare an entire set of resources to see how they differ from those already deployed in your cluster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ntYq8tFk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lj86762gbgjbnycon4f4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ntYq8tFk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lj86762gbgjbnycon4f4.png" alt="Image description" width="880" height="623"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In either case, you can easily deploy your local resources after diffing - or replace your local resources with those in your cluster instead.&lt;/p&gt;

&lt;h1&gt;
  
  
  Creating Resources
&lt;/h1&gt;

&lt;p&gt;While much of the above has been focused on existing resources either locally or in your cluster, Monokle has a number of features to help you create new resources from scratch, including a library of templates that can help you quickly get up and running with simple Kubernetes objects:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WbtXdp4K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/818i27eed5yvpdy07a8z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WbtXdp4K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/818i27eed5yvpdy07a8z.png" alt="Image description" width="880" height="1239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using a template will prompt you for basic information required to generate the corresponding resources and will result in ready-to-deploy resources that can be deployed to your cluster(s) without any further modifications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PHjdraiC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ry1jy1y3yvxdymnypppg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PHjdraiC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ry1jy1y3yvxdymnypppg.png" alt="Image description" width="880" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  You’re just getting started!
&lt;/h1&gt;

&lt;p&gt;We’ve just scratched the surface of all the functionality provided by Monokle to make your everyday manifest-related tasks easier - check out our &lt;a href="https://kubeshop.github.io/monokle/"&gt;documentation&lt;/a&gt; to see what else you can do - or download Monokle from &lt;a href="https://github.com/kubeshop/monokle/"&gt;GitHub&lt;/a&gt; and join our &lt;a href="https://discord.gg/kMJxmuYTMu"&gt;Discord community&lt;/a&gt; to ask questions and suggest improvements. &lt;/p&gt;

&lt;p&gt;Thank you!&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>programming</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>TestKube: A New Approach to Cloud Native Testing</title>
      <dc:creator>Kubeshop</dc:creator>
      <pubDate>Wed, 20 Apr 2022 13:25:02 +0000</pubDate>
      <link>https://dev.to/kubeshop/testkube-a-new-approach-to-cloud-native-testing-28cb</link>
      <guid>https://dev.to/kubeshop/testkube-a-new-approach-to-cloud-native-testing-28cb</guid>
      <description>&lt;p&gt;&lt;em&gt;This post was originally published on the New Stack.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When companies talk about modernizing their tech stack or removing legacy infrastructure, it often includes everything except their testing toolchain — they are just happy when it isn’t broken.&lt;/p&gt;

&lt;p&gt;While almost everything from simple web apps to stateful databases have moved toward more cloud native architectures, the way we test our applications is frequently still firmly stuck in another era.&lt;/p&gt;

&lt;p&gt;It’s not without reason: Testing is usually tightly integrated with development tooling and related workflows because running them as part of builds allows us to easily check that the built artifacts are working as they should. However, this also creates a tightly coupled stack that is brittle to change and not resilient in the face of failure.&lt;/p&gt;

&lt;p&gt;Cloud native is all about making things more modular, reusable and loosely coupled, yet a tightly coupled testing toolchain is the antithesis of these ideals. Being tied to certain tools and related workflows limits testing modularity across single tests, entire workflows and disparate infrastructures.&lt;/p&gt;

&lt;p&gt;When only a small bug fix or functionality is added, integrated CI/CD workflows often force you to rerun your entire test suite, even when only a single test run may be needed. Once you have a workflow set up, what you are allowed to do as a tester is often limited by your CI/CD tooling and the access you’re given. And it’s often up to you to cobble together a coherent test-result dashboard based on the tools used to build and test your applications. Finally, once you have built your testing workflow for one cluster or platform, it is probably easier to start fresh again rather than try to port it elsewhere and even keeping it relevant for your current infrastructure can be a challenge.&lt;/p&gt;

&lt;h1&gt;
  
  
  Making Testing Cloud Native
&lt;/h1&gt;

&lt;p&gt;Just putting testing on a cloud native platform like Kubernetes won’t help that much either. Provisioning test environments is also somewhat easier, especially with a GitOps approach, but grappling with different environments, cluster networking, remote access and so forth is still a challenge. And unfortunately, many testing tools aren’t “made for k8s,” which can result in clunky approaches when using them to test applications running on Kubernetes.&lt;/p&gt;

&lt;p&gt;To help overcome these challenges and bring testing into the cloud native era, a few things are necessary. First, making your pipelines more reusable and modular to be used in any CI/CD or testing framework allows you to quickly adapt to changes in your solution without the need to adapt or create a completely different pipeline that is tightly coupled to the CI/CD or testing framework. Secondly, tests should be aware of the state of your infrastructure and integrated into it. By making testing cloud native, we can all bring code to production faster and more confidently.&lt;/p&gt;

&lt;h1&gt;
  
  
  Testing on Kubernetes for the Cloud Native Era
&lt;/h1&gt;

&lt;p&gt;Building off the insights above, we’ve created TestKube, an open source lightweight testing framework for Kubernetes that takes a somewhat opinionated approach to testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Tests are included in the state of your cluster.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tests are defined and executed using Kubernetes constructs and services in the cluster itself, ensuring that your applications and services are always “testable,” instead of having to rely on correctly configured, externally available tools and artifacts at any time. Test execution is performed from within the cluster itself, removing the need to configure/open your Kubernetes network for the sake of test execution, and no external dependencies are needed to validate that things are working as they should.&lt;/p&gt;

&lt;p&gt;Test execution can be triggered by both internal and external triggers — kubectl commands, Kubernetes resource updates, or by CI/CD systems interacting directly with the TestKube API server. Need to rerun a single test to validate a ConfigMap update? No problem! Or run the entire test suite after your application has been deployed, triggered by ArgoCD? TestKube has you covered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Test workflows and results are modular.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Test scripts, orchestrations and executors follow a generic format that is possible to use/implement for any type of test — functional, performance, security, conformance, etc. Test results are aggregated in a common format and exposed to external tooling via APIs or as standard metrics that can be consumed by tools like Prometheus, Grafana and such. This modularity allows teams to repurpose and reuse tests as needed and moves away from being tied to the abilities of a single CI/CD tool for test-related activities on Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Testing is environment aware and integrated.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The underlying architecture is open and modular. Since native Kubernetes constructs, like custom resources and ConfigMaps, are used to configure and orchestrate tests, GitOps workflows and tooling can ensure that tests in your cluster are always up to date. QA engineers can focus on building the right tests for your applications without having to worry about how or when to deploy them into your cluster or environment for execution, while they still have the power to both run tests and analyze test results as needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0gaDjgiB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zutb7o66os8o586w3b72.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0gaDjgiB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zutb7o66os8o586w3b72.jpeg" alt="Image description" width="444" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Where We Are and Where We Are Going
&lt;/h1&gt;

&lt;p&gt;Given the ambitious goals set out above, Testkube is definitely a work in progress but already in a state to deliver on several of them. We’ve started with supporting the execution of Postman Collections for APIs and Cypress tests for UIs, and we plan to support more types of scripts, including Selenium, K6, JMeter, SoapUI and Cucumber. Check out the latest 0.8.0 release to see how you can orchestrate multiple scripts into complex integration tests and get integrated results via TestKube’s test result dashboard.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kubeshop/testkube"&gt;TestKube on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubeshop.github.io/testkube/"&gt;TestKube documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discord.com/invite/6zupCZFQbe?utm_source=thenewstack&amp;amp;utm_medium=website&amp;amp;utm_campaign=platform"&gt;Talk to us on Discord&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>From YAML Engineer to YAML Herder</title>
      <dc:creator>Kubeshop</dc:creator>
      <pubDate>Wed, 20 Apr 2022 13:16:04 +0000</pubDate>
      <link>https://dev.to/kubeshop/from-yaml-engineer-to-yaml-herder-hjf</link>
      <guid>https://dev.to/kubeshop/from-yaml-engineer-to-yaml-herder-hjf</guid>
      <description>&lt;p&gt;_&lt;a href="https://thenewstack.io/from-yaml-engineer-to-yaml-herder/"&gt;This post originally published on the New Stack&lt;/a&gt;.&lt;br&gt;
_&lt;br&gt;
A common trope in the Kubernetes world is that you are not a DevOps engineer or site reliability engineer, but rather a YAML engineer. Everywhere you look, there is another YAML manifest to be wrangled.&lt;/p&gt;

&lt;p&gt;Creating, editing, updating, and applying these manifests is the daily grind of the YAML engineer. Tools for inspecting and understanding objects in a cluster are good and plenty, but integrated tools for pre-deployment tasks related to creating, editing, validating and debugging manifests is scarce. As the size and complexity of these manifests grows, trying to manage boilerplate code and finding small differences between your current context and the production cluster you are trying to fix comes close to being impossible. ​​Hours can be spent hunting down trivial mistakes, and those hours are not cheap. Your entire team — or business! — can be blocked while an elusive YAML-indentation holds your production environment hostage.&lt;/p&gt;

&lt;p&gt;Attempting to manage YAML files by hand is moving us away from the DevOps ideal of infrastructure as cattle and toward infrastructure as pets. Nurturing each fat-finger mistake or CVE update back to health is a painstaking process. YAML engineers are veterinarians, nursing each individual YAML pet back to health.&lt;/p&gt;

&lt;p&gt;There has to be a better way to manage manifests and turn YAML engineers into herders of YAML cattle.&lt;/p&gt;

&lt;h1&gt;
  
  
  From Cloud Native DevX to OpX
&lt;/h1&gt;

&lt;p&gt;Looking across the aisle to the cloud native developer, we see a totally different world. Modern integrated development environments, like &lt;a href="https://github.com/features/codespaces"&gt;Github Codespaces&lt;/a&gt; and &lt;a href="https://www.gitpod.io/"&gt;Gitpod&lt;/a&gt;, are all about accelerating the “inner loop” for the developer, so they can focus on writing code rather than wrangling details. With cloud-based IDEs, even helping a colleague or reviewing code becomes a click away.&lt;/p&gt;

&lt;p&gt;Ephemeral dev environments don’t make you lose your current context. Just open a new workspace with their environment, make your edits or comments, and switch back to your work. Being able to describe this process in code reaps many benefits, from reducing configuration drift to creating many possibilities for automation.&lt;/p&gt;

&lt;p&gt;We need to find a way to translate the advantage of the cloud native developer experience (DevX) into better operations experience (OpX). YAML engineers do not have the same number of choices to accelerate their inner loop. Code editors will have some support, either natively or via plugins (which probably don’t work well together) or they can choose to use yet another CLI (yech 🤮). What is really needed is a “manifest IDE” that helps with all of these tasks in a well-integrated and consistent way, creating the cloud native OpX.&lt;/p&gt;

&lt;h1&gt;
  
  
  Monokle: Bringing OpX to Cloud Native
&lt;/h1&gt;

&lt;p&gt;Monokle is your open source YAML IDE to bring real OpX to the cloud native world. Monokle makes it easy to manage and debug YAML manifests before you deploy them to your cluster.&lt;/p&gt;

&lt;p&gt;To begin with, Monokle helps you quickly get a high-level view of your manifests, along with their contained resources and relationships. It allows you to visualize and navigate resources both within and outside your cluster, and diff them against any changes you want to make. It validates references between resources to ensure you haven’t misspelled an object name or namespace, and lets you fix those interactively to make sure your changes are getting the job done.&lt;/p&gt;

&lt;p&gt;Once you understand how your manifests work and work together, Monokle lets you easily edit resources without having to learn or look up YAML syntax. You can refactor manifests while still maintaining the integrity of names and references throughout all of them. Finally, if you are using kustomize or Helm, you can preview and debug the resources they generate; validate their links, values, etc. You can even compare a set of generated resources to those already running in your cluster, all to ensure that when you hit the “deploy” button, all will go as smoothly as you had promised in the pre-release meeting.&lt;/p&gt;

&lt;p&gt;Monokle brings OpX to YAML engineers who want to turn their YAML manifests into cattle, rather than having to treat them like pets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B5a7veHp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7poiplwi6gma0az3weyt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B5a7veHp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7poiplwi6gma0az3weyt.png" alt="Image description" width="880" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Monokle sits squarely between traditional developer IDEs and operational cluster dashboards. IDEs are great at managing individual manifests, but generally fail to give the “big picture” when it comes to providing a manifest-centric view of defined resources and their relationships and related workflows. Cluster dashboards, on the other hand, generally don’t provide any functionality for working with manifests. They are all about inspecting and managing resources already running in your cluster and do not focus on pre-deployment artifacts or workflows.&lt;/p&gt;

&lt;p&gt;Monokle fills this gap by providing a holistic view of your Kubernetes manifests and focusing directly on related workflows — editing, validation, debugging, diffing, deploying, etc. Monokle works nicely together with both IDEs and cluster dashboards, complementing them with manifest-centric functionality and workflows.&lt;/p&gt;

&lt;h1&gt;
  
  
  Getting Started with Monokle
&lt;/h1&gt;

&lt;p&gt;Monokle is in its open source infancy; there are so many directions it could take, problems to solve and users to make happy! Ultimately though, it’s about making life easier for the people managing manifests. If you are looking to improve your cloud native OpX, give Monokle a try. Download it or build from GitHub, and let us know what we can do to make you a happier YAML engineer.&lt;/p&gt;

&lt;h1&gt;
  
  
  Links
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Get &lt;a href="https://github.com/kubeshop/monokle"&gt;Monokle on GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Get in touch with us &lt;a href="https://discord.gg/uNuhy6GDyn"&gt;on Discord&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out &lt;a href="http://monokle.io/"&gt;monokle.io&lt;/a&gt; for content and videos.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>opensource</category>
      <category>cloudnative</category>
      <category>kubeshop</category>
    </item>
    <item>
      <title>Can You GitOps Your APIs?</title>
      <dc:creator>Kubeshop</dc:creator>
      <pubDate>Wed, 20 Apr 2022 13:09:09 +0000</pubDate>
      <link>https://dev.to/kubeshop/can-you-gitops-your-apis-329p</link>
      <guid>https://dev.to/kubeshop/can-you-gitops-your-apis-329p</guid>
      <description>&lt;p&gt;&lt;em&gt;This post originally published on &lt;a href="https://thenewstack.io/can-you-gitops-your-apis"&gt;The New Stack&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The management of large-scale infrastructure is increasingly turning toward GitOps and Infrastructure as Code. In the classic pets-vs.-cattle analogy (sorry to the vegans), these techniques allow you to easily replicate and replace infrastructure when things go wrong, dramatically reducing the cost and complexity of management.&lt;/p&gt;

&lt;p&gt;In addition, they become a single source of truth to understand the current state of your infrastructure and what has changed.&lt;/p&gt;

&lt;p&gt;At the same time, just like “Software is eating the world,” APIs are eating software. OK, maybe not eating, but certainly powering.&lt;/p&gt;

&lt;p&gt;They are everywhere and have become the standard way to expose functionality. However, the way we currently create and build our APIs does not always match our best practices for running infrastructure.&lt;/p&gt;

&lt;h1&gt;
  
  
  Code-First vs. Design-First APIs
&lt;/h1&gt;

&lt;p&gt;A code-first approach to APIs is a more traditional approach. Developers receive business requirements and code the API, leaving the formal documentation until later, or most commonly, not at all. Platform teams will be blocked until the initial release then be required to do a lot of manual testing to make sure everything is configured correctly.&lt;/p&gt;

&lt;p&gt;On the other hand, in a design-first approach to API development, APIs are first defined then coded. This definition provides clear and unambiguous documentation and acts as the “source of truth” for all aspects of the team’s development from frontend to backend to microservices, similar to the way Git becomes your source of truth in GitOps. Design-first APIs create a common understanding of both functional and non-functional aspects of your software’s behavior. In a nutshell, it answers the question: “What can I make this API do?”&lt;/p&gt;

&lt;h1&gt;
  
  
  Designing Your APIs
&lt;/h1&gt;

&lt;p&gt;The &lt;a href="https://swagger.io/specification/?utm_source=thenewstack&amp;amp;utm_medium=website&amp;amp;utm_campaign=platform"&gt;OpenAPI specification&lt;/a&gt; has become ubiquitous in the modern world of developing APIs because it is a simple and standard way to describe and document your APIs. In addition, one major benefit of OpenAPI is that it is machine-readable. Based on the content of your OpenAPI definition, software can be written that interacts with your API. For example, Swagger UI provides a nice user interface where developers can test and become familiar with your API and &lt;a href="https://github.com/OpenAPITools/openapi-generator?utm_source=thenewstack&amp;amp;utm_medium=website&amp;amp;utm_campaign=platform"&gt;OpenAPIGenerator&lt;/a&gt; can generate clients and servers from your OpenAPI definition.&lt;/p&gt;

&lt;p&gt;Once defined, this definition can drive a multitude of downstream activities, including generating stubs to ensure developers adhere to the API, creating mocks to enable testing, building and integrating documentation, and constructing deployment artifacts. These tasks can often be done in parallel and in an automated fashion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bX4ZsfWv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t79hadcekss6ksevxa90.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bX4ZsfWv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t79hadcekss6ksevxa90.png" alt="Image description" width="880" height="755"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  State of APIs in Kubernetes
&lt;/h1&gt;

&lt;p&gt;Currently, to expose your API in Kubernetes, ingress resources need to be written and you will need an ingress controller, often referred to as an API gateway, to update the state of the cluster to allow traffic to reach your applications and services. Traditional ingress controllers can be hard to learn and manage and even when you do, it is a manual process. For every ingress controller you use, you need to learn their feature set, resource format(s) and configuration attributes. Some ingress controllers have their configuration spread across multiple Kubernetes resources, making it difficult to get a full picture of the application’s configuration. This issue is made worse when you factor in quality-of-service configurations, such as timeouts and retries, which can be their own resources.&lt;/p&gt;

&lt;p&gt;Therefore, to successfully deploy their APIs to Kubernetes, developers or their DevOps teammates currently need to spend their time learning new Kubernetes resource formats and keeping those up to date as their API evolves, rather than actually designing and implementing their APIs. And their DevOps engineers need to worry about developers tampering with meticulously crafted Helm charts rather than just writing their APIs!&lt;/p&gt;

&lt;p&gt;Kubernetes needs a “single pane of glass” source of truth of the app’s configuration and how the API works to bring it into the GitOps era.&lt;/p&gt;

&lt;h1&gt;
  
  
  Bringing GitOps to Your Kubernetes APIs With OpenAPI and Kusk
&lt;/h1&gt;

&lt;p&gt;The OpenAPI specification gives us the ability to declaratively define APIs. It also already contains most of the information we need for an ingress configuration, is extensible via extension annotations, and given the ubiquity of OpenAPI, many API developers are comfortable with this format. Using OpenAPI as a source of truth reduces repetition by bringing information already in your OpenAPI specification into ingress resources. It also eliminates the need to learn how to write ingress resources.&lt;/p&gt;

&lt;p&gt;Enter Kusk and Kusk Gateway, an open source attempt to fill that gap in the OpenAPI-Kubernetes toolchain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EB19x8vY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uadyvfgr88x0wav4f0lh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EB19x8vY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uadyvfgr88x0wav4f0lh.png" alt="Image description" width="880" height="282"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;(overly simplified Kusk workflow)&lt;br&gt;
These are the basics of Kusk Gateway.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Kusk (Swedish for coachman) automates the generation of ingress resources for various popular ingress controllers by treating your OpenAPI specification as the source of truth for their configuration. Kusk currently supports generating configurations for Ambassador, Traefik, Linkerd and Nginx-Ingress. And thanks to an x-kusk OpenAPI extension, API developers can add Kubernetes and QoS-related metadata to their OpenAPI definition, which Kusk will automatically transform to ingress-controller-specific configurations, including things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CORS configuration&lt;/li&gt;
&lt;li&gt;Timeouts&lt;/li&gt;
&lt;li&gt;Mapping transformations&lt;/li&gt;
&lt;li&gt;Namespace/service configuration&lt;/li&gt;
&lt;li&gt;Rate-limiting&lt;/li&gt;
&lt;li&gt;more to come (security, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Platform teams can feed Kusk the API’s specification and have ingress resources ready to go and up to date with any changes being made to the API. And just like with GitOps, this can be automated as part of the CI/CD pipeline, meaning no manual editing and fewer errors.&lt;/p&gt;

&lt;p&gt;While Kusk helps you adopt an OpenAPI-first approach to API development with an existing ingress controller, it doesn’t really allow you to tap into the full potential of your OpenAPI definition, which is why the Kusk project also includes a dedicated ingress controller that uses OpenAPI as its primary source of configuration: Kusk Gateway. Using Kusk Gateway as the ingress controller, API developers and DevOps engineers can use an OpenAPI definition directly to configure the exposure of their APIs — no intermediate configuration generation necessary!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VV99TQQc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n3fdaehxsq0skjnf4l91.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VV99TQQc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n3fdaehxsq0skjnf4l91.png" alt="Image description" width="880" height="635"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Kusk Gateway approach to OpenAPI-first development provides a number of benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engineers don’t have to learn new configuration format(s) and create corresponding configurations for deploying APIs on Kubernetes.&lt;/li&gt;
&lt;li&gt;The OpenAPI definition becomes the source of truth for both functional and QoS/deployment aspects of an API instead of this information being managed in separate configuration files.&lt;/li&gt;
&lt;li&gt;Developers can rapidly iterate on their API without having to require platform team resources. Kusk Gateway will automatically (re)configure itself as the OpenAPI definition evolves.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developers don’t have to write boilerplate code that Kusk Gateway can provide out of the box based on the OpenAPI definition, for example:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Request-validation — Kusk Gateway can automatically validate incoming requests against an OpenAPI definition and provide API consumers with helpful error messages, providing a better user experience and eliminating the need for developers to write this logic themselves.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mocking — Kusk Gateway can automatically provide mocks and sandboxes for exposed APIs, helping API consumers simulate different scenarios while they are integrating with an API without burdening the underlying API with these requests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Under the hood, Kusk Gateway is powered by Envoy Proxy, a battle-tested, and production-ready proxy that routes traffic to services defined in your OpenAPI specification.&lt;/p&gt;

&lt;h1&gt;
  
  
  Wrapping Up
&lt;/h1&gt;

&lt;p&gt;If you’re adopting a design-first approach for your APIs (which you should be!) and are moving into Kubernetes, Kusk enables you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adopt an iterative OpenAPI-first development workflow for APIs under Kubernetes.&lt;/li&gt;
&lt;li&gt;Harness all the greatness of an OpenAPI definition in your API deployment.&lt;/li&gt;
&lt;li&gt;Integrate OpenAPI-first with both traditional and GitOps-based deployment workflows.&lt;/li&gt;
&lt;li&gt;Give Kusk or Kusk Gateway a try and let us know if it does (or doesn’t) help your developers and/or platform engineers improve their everyday API development workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the &lt;a href="https://github.com/kubeshop/kusk-gateway"&gt;GitHub repo&lt;/a&gt; and &lt;a href="https://kubeshop.github.io/kusk-gateway/"&gt;full documentation&lt;/a&gt; to learn more about Kusk and Kusk Gateway and download their latest releases. Leave a star on the repo to stay updated on new features and improvements, and join our &lt;a href="https://discord.gg/KhCcxq2Tsq"&gt;Discord community&lt;/a&gt; to connect with others and get in touch with the Kusk team on any issues or suggestions you might have. We’re looking forward to it!&lt;/p&gt;

&lt;p&gt;The New Stack is a wholly owned subsidiary of Insight Partners, an investor in the following companies mentioned in this article: Ambassador Labs.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>An OpenAPI-first Ingress Controller for Kubernetes - Kusk Gateway</title>
      <dc:creator>Kubeshop</dc:creator>
      <pubDate>Thu, 14 Apr 2022 17:44:26 +0000</pubDate>
      <link>https://dev.to/kubeshop/an-openapi-first-ingress-controller-for-kubernetes-kusk-gateway-2a49</link>
      <guid>https://dev.to/kubeshop/an-openapi-first-ingress-controller-for-kubernetes-kusk-gateway-2a49</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;The OpenAPI specification has become ubiquitous in the modern world of developing APIs. It is a great way to describe and document your API. &lt;/p&gt;

&lt;p&gt;A major benefit of OpenAPI is that it is machine-readable; i.e. software can be written that can “do stuff” based on the content of your OpenAPI definition. &lt;/p&gt;

&lt;p&gt;Take, for example, SwaggerUI which provides a nice user-interface where developers can test and become familiar with your API, or openapi-generator that can generate clients and servers from your OpenAPI definition.&lt;/p&gt;

&lt;p&gt;What if we took advantage of the machine readability of OpenAPI and had a machine configure your Kubernetes cluster for your API, based on the contents of its OpenAPI definition?&lt;/p&gt;

&lt;h1&gt;
  
  
  Current state of the world
&lt;/h1&gt;

&lt;p&gt;Currently, to expose your API in Kubernetes, you need to write Ingress resources. Ingress is made up of routing rules that define how and where traffic is forwarded to your services, or a contract, if you will. In addition to your Ingress resources, you need an ingress controller to update the state of the cluster to allow traffic to reach your applications based on your ingress configuration&lt;/p&gt;

&lt;p&gt;The problem with traditional ingress controllers is that they can be hard to learn and manage. Each has their own feature-set and uses their own resource formats that need to be learned. This is a difficult hurdle for those just starting out with Kubernetes.&lt;/p&gt;

&lt;p&gt;Another issue that we contend with is getting a full picture of our application configuration. Ingress configurations, like it or not, are part of it. Some Ingress controllers may have parts of their configuration spread across multiple resources, meaning that all of them have to be fetched. This issue is made worse when you factor in quality of service configuration, such as timeouts and retries which could also be their own resources.&lt;/p&gt;

&lt;p&gt;What about in a microservice architecture? A single OpenAPI specification describes an API that could be made of multiple microservices. However the ingress configuration requires dedicated Kubernetes resources.&lt;/p&gt;

&lt;p&gt;Instead a better way would be to have a ‘single pane of glass’ view of the app’s configuration.&lt;/p&gt;

&lt;p&gt;The OpenAPI specification itself is the perfect way to achieve this. OpenAPI already contains most of the information that you must specify in an Ingress configuration. OpenAPI is extensibile via extension annotations and given the ubiquity of OpenAPI, we can be confident in saying that API developers are comfortable with this format.&lt;/p&gt;

&lt;p&gt;We at Kubeshop believe that OpenAPI should be enough to configure your application’s ingress. This prevents repeating yourself by redefining information already in your OpenAPI specification in Ingress resources. This also prevents needing to learn how to write Ingress resources&lt;/p&gt;

&lt;h1&gt;
  
  
  The Kusk solution - an Ingress Controller that understands OpenAPI.
&lt;/h1&gt;

&lt;p&gt;We decided to address these issues by creating an Ingress controller that understands OpenAPI - Kusk Gateway.&lt;/p&gt;

&lt;p&gt;All of the configuration you would keep in Ingress resources can now be kept in a single place (your OpenAPI definition), providing that single pane of glass configuration for your API thanks to our x-kusk extension.&lt;/p&gt;

&lt;p&gt;Under the hood, Kusk Gateway is powered by Envoy Proxy, a battle-tested, and production-ready proxy that routes traffic to services defined in your OpenAPI specification.&lt;/p&gt;

&lt;p&gt;This approach provides a number of benefits;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You don’t have to learn new configuration format(s) and create corresponding configurations for deploying your API under Kubernetes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your OpenAPI definition becomes the source-of-truth for both functional and QoS/deployment aspects of your API - instead of this information being spread out over multiple files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can rapidly iterate on your API without having to require DevOps resources - Kusk gateway will automatically (re)configure itself as the OpenAPI definition evolves with each iteration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You don’t have to write boilerplate code that Kusk Gateway can provide out-of-the-box based on the OpenAPI definition: request-validation, mocking, metrics/analytics, security, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And something that benefits you that we would love to hear about.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kusk Gateway Alpha is now available on GitHub. Despite being in alpha, has quite a lot of things going for it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatically configure routing to your APIs using your OpenAPI definition&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By embedding your OpenAPI spec in a Kusk Gateway API Custom Resource, applying it just like any other Kubernetes resource is all that’s required to fully configure routing to your API.&lt;/p&gt;

&lt;p&gt;For more information, read our official API resource documentation &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure Quality of Service and CORS settings from within OpenAPI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using our supported annotation you can configure quality of service settings such as retries and timeouts as well as configuring CORS within your OpenAPI specification.&lt;/p&gt;

&lt;p&gt;For more information, read our official CORS documentation&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Support for routing to static resources such as CSS and Javascript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To facilitate the serving of static content with your APIs we have a custom resource for routing to these also.&lt;/p&gt;

&lt;p&gt;For more information, read our official static resource documentation&lt;/p&gt;

&lt;h1&gt;
  
  
  Closing Remarks
&lt;/h1&gt;

&lt;p&gt;We dare to say that the alpha release of Kusk Gateway is mature and stable enough for local development and evaluation. As we close gaps and add more features over the coming weeks (hopefully based on your feedback) we aim to release a production-ready version early next year.&lt;/p&gt;

&lt;p&gt;Configuring and enjoying the powerful benefits of Ingress in Kubernetes shouldn’t be as cumbersome as it can be. Let Kusk Gateway do the heavy lifting for you so you can focus on what matters: your application!&lt;/p&gt;

&lt;p&gt;If Kusk Gateway has piqued your interest, we would love to hear your feedback either in the form of an issue on Github (linked below) or a direct message on our Discord Server (also linked below) and if you would like to help us evolve Kusk Gateway,  we accept all contributions with open arms, whether that be documentation improvements, a bug fix, or even whole features.&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://github.com/kubeshop/kusk-gateway"&gt;Github repo&lt;/a&gt; and &lt;a href="https://kubeshop.github.io/kusk-gateway/"&gt;full documentation&lt;/a&gt; to learn more about Kusk Gateway and download the alpha.&lt;/p&gt;

&lt;p&gt;Leave a star on the repo to stay updated on new features and improvements.&lt;/p&gt;

&lt;p&gt;Join our &lt;a href="https://discord.gg/KhCcxq2Tsq"&gt;Discord community&lt;/a&gt; to connect with others and get support!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>programming</category>
      <category>devops</category>
      <category>github</category>
    </item>
  </channel>
</rss>
