<?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>Forem: MeteorOps</title>
    <description>The latest articles on Forem by MeteorOps (@meteorops).</description>
    <link>https://forem.com/meteorops</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%2Forganization%2Fprofile_image%2F7873%2Fad0d7cdb-d642-474a-9592-c8d08685ca13.png</url>
      <title>Forem: MeteorOps</title>
      <link>https://forem.com/meteorops</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/meteorops"/>
    <language>en</language>
    <item>
      <title>How to Handle Alert Fatigue</title>
      <dc:creator>Arthur Azrieli</dc:creator>
      <pubDate>Fri, 28 Mar 2025 13:42:51 +0000</pubDate>
      <link>https://forem.com/meteorops/how-to-handle-alert-fatigue-fao</link>
      <guid>https://forem.com/meteorops/how-to-handle-alert-fatigue-fao</guid>
      <description>&lt;p&gt;A very important aspect for many developers and DevOps is handling alerts. An even more important and often overlooked aspect is alert fatigue. Alert fatigue is caused by a high volume of alerts of which many are false positives, related alerts, or duplicates. Alert handlers become so used to alerts that they disregard and miss important ones. It takes only one or two missed alerts to bring a system to a halt. However, alert fatigue is nothing but a symptom of the underlying issues that need to be addressed.‍&lt;/p&gt;

&lt;h2&gt;
  
  
  What we'll cover and learn about alert fatigue and Alertmanager
&lt;/h2&gt;

&lt;p&gt;In this article we want to discuss factors that could lead to alert fatigue, how to identify them and how to handle them. In addition, we will introduce &lt;a href="https://www.meteorops.com/blog/how-to-handle-alert-fatigue" rel="noopener noreferrer"&gt;Prometheus Alertmanager&lt;/a&gt; and how to use it in order to handle the very same scenarios that lead to alert fatigue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before diving in, there are a few prerequisites if you want to follow along with the article:&lt;br&gt;
&lt;a href="https://artifacthub.io/packages/helm/prometheus-community/alertmanager" rel="noopener noreferrer"&gt;Prometheus installed&lt;/a&gt; - install by helm chart&lt;br&gt;
Alertmanager installed - alertmanager is installed by default when installing Prometheus helm chart&lt;br&gt;
Knowledge of yaml‍&lt;/p&gt;
&lt;h2&gt;
  
  
  Too Many Alerts
&lt;/h2&gt;

&lt;p&gt;Developers and DevOps are busy people. When a significant part of their time is spent on looking into or muting alerts that don't matter, we are looking at alert fatigue. To handle this situation we need to ask ourselves why there are so many alerts and why so many of them are false positives, duplicates, or simply of no value.&lt;/p&gt;
&lt;h3&gt;
  
  
  Easy Trigger Alert
&lt;/h3&gt;

&lt;p&gt;There's a tendency to sometimes overdo alert configuration, mainly as precaution. For example, we would like to know if a service is using a lot of memory or if its CPU is spiking so that we can react in time in case it develops into service disruption. In an attempt to have a preemptive encompassing view of the system, we sometimes configure too many alerts whose thresholds are unjustified. To justify an alert, we need to ask if the CPU or memory spike are really a concern. It's not uncommon for services to work a little harder at times. If the historical data shows spikes that resolve themselves and don't correspond to incidents, the alert should not be configured at all. Besides, If we are concerned with service disruption due to resource shortage we should consider automatic scaling, not setting more alerts.‍&lt;/p&gt;
&lt;h3&gt;
  
  
  Alert Configuration Cleanup
&lt;/h3&gt;

&lt;p&gt;Not setting more alerts is one part of prevention as the best medicine. Dealing with the ones that are already set is the other. Alerts that are already set should be examined through historical and operational lenses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have alerts been triggered many times before?&lt;/li&gt;
&lt;li&gt;Have they self-resolved?&lt;/li&gt;
&lt;li&gt;Have they really indicated some system or service disruption?&lt;/li&gt;
&lt;li&gt;Are they perhaps related to other more significant alerts?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions will help us discover alerts that can be removed to prevent alert fatigue.&lt;/p&gt;

&lt;p&gt;However, for mature and perhaps more complicated systems with many services and moving parts, going over hundreds of configured alerts and determining whether they are important or redundant can prove to be quite difficult and time consuming. There's always the question of ROI when coming to clean up alerts. If we spend a sprint on cleaning alerts it might benefit us down the line by reducing alert fatigue, but we just missed a sprint where we could deliver features and bug fixes. So the trade off is always there. We'd still argue that alert cleanup should take place, even if in small increments. While we are cleaning them up bit by bit, we can introduce an alert manager whose purpose is to provide additional protection against alert fatigue.‍&lt;/p&gt;
&lt;h2&gt;
  
  
  Alert Manager to Handle and Prevent Alert Fatigue
&lt;/h2&gt;

&lt;p&gt;An alert manager like Prometheus AlertManager provides a robust way to manage alerts. In the context of handling alert fatigue, the most significant aspect of an alert manager is its ability to group and inhibit alerts.‍&lt;/p&gt;
&lt;h3&gt;
  
  
  Correlating and grouping alerts
&lt;/h3&gt;

&lt;p&gt;Let's look at an example of correlating and grouping alerts. Imagine a scenario in which a datastore such as a database, search engine, or queue manager is reporting high CPU and memory consumption. Services that depend on this datastore might experience difficulties communicating with it. They too might trigger an alert indicating that they cannot communicate with the datastore. With Prometheus AlertManager, it is possible to configure that if there's an alert for the datastore resource consumption all other related alerts will be grouped together and sent to the same receiver. This way we can see the underlying cause and which services are affected.&lt;/p&gt;

&lt;p&gt;Given that alerts are properly labeled and configured to include the service name, team, cluster, region and any other attribute of significance, we can configure an alert as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alertmanager.yaml:
global: {}
receivers:
  - name: 'default-receiver'
    webhook_configs:
      - url: 'http://example.com/webhook'
  - name: 'data-dev-receiver'
    webhook_configs:
      - url: 'http://example.com/webhook-data-dev'
route:
  group_interval: 5m
  group_wait: 10s
  receiver: default-receiver
  repeat_interval: 3h

  routes:
  - matchers:
      - team="data-dev"
    group_by: ['cluster', 'database']
    receiver: 'data-dev-receiver'
    continue: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the routes directive, we are saying that any alert meant for the data-dev team should be grouped under the data-dev-receiver by cluster and database. To simulate, we can run these commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -H 'Content-Type: application/json' \
     -d '[{
           "labels": {
             "alertname": "DatabaseUnreachable",
             "team": "data-dev",
             "service": "aggregator",
             "database": "analytics",
             "cluster": "prod",
             "severity": "critical"
           }
         }]' \
     http://localhost:9093/api/v2/alerts

curl -H 'Content-Type: application/json' \
     -d '[{
           "labels": {
             "alertname": "DatabaseResourceConsumptionHigh",
             "team": "data-dev",
             "database": "analytics",
             "cluster": "prod",
             "severity": "critical"
           }
         }]' \
     http://localhost:9093/api/v2/alerts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is what it would look like in Alertmanager:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foy9m3yu9679jszlz0chk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foy9m3yu9679jszlz0chk.png" alt="Image description" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Inhibiting and Suppressing Alerts
&lt;/h3&gt;

&lt;p&gt;In other cases we want to suppress related alerts rather than group them with the underlying alert. For example, a database has the following alerts configured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consuming too much resources&lt;/li&gt;
&lt;li&gt;Unreachable&lt;/li&gt;
&lt;li&gt;Connections about to max out&lt;/li&gt;
&lt;li&gt;File descriptors limit is about to be reached&lt;/li&gt;
&lt;li&gt;Queries take too long to execute&lt;/li&gt;
&lt;li&gt;Many failed queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Any of these alerts can be followed by the others. If an alert triggers for resource consumption, then an unreachable alert might also trigger. If queries take too long to execute, an alert for resource consumption might trigger as well.&lt;/p&gt;

&lt;p&gt;So any alert might be followed by other alerts which will create a cascade of incoming alerts when all is needed is just the one. Instead of having them all triggered one after another, Prometheus Alertmanager can be configured to suppress a subset of alerts if a specific alert is active. To handle this situation, we can create the following inhibit rules:&lt;br&gt;
&lt;/p&gt;

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

  - source_matchers:
      - alertname="DatabaseResourceConsumptionHigh"
    target_matchers:
      - alertname="DatabaseUnreachable"
    equal: ['database']

  - source_matchers:
      - alertname="DatabaseResourceConsumptionHigh"
    target_matchers:
      - alertname="DatabaseSlowQueries"
    equal: ['database']

  - source_matchers:
      - alertname="DatabaseResourceConsumptionHigh"
    target_matchers:
      - alertname="DatabaseFailedQueries"
    equal: ['database']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We're saying that if there's an active alert for DatabaseResourceConsumptionHigh in the specific database, any DatabaseSlowQueries or DatabaseFailedQueries alert will be inhibited. Inhibited means that the alert will not trigger but will still be visible on demand. The idea here is if there's an alert on resource consumption, we already know that there's something going on with the database. We don't need to be paged for all other issues as they are probably related yet we still have them at hand for investigation.&lt;/p&gt;

&lt;p&gt;This is what it would look like in Alertmanager:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inhibited alerts don't appear when Inhibited is not selected&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsd0oi5qqi8aw2ejbe0fj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsd0oi5qqi8aw2ejbe0fj.png" alt="Image description" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inhibited alerts appear when Inhibited is selected&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F166cnvp6oogx7gijmlmi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F166cnvp6oogx7gijmlmi.png" alt="Image description" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Personally Contributing to Prevent Alert Fatigue
&lt;/h2&gt;

&lt;p&gt;The ability to suppress alerts using Prometheus Alertmanager can also be used by the individual contributor to help prevent alert fatigue.‍&lt;/p&gt;

&lt;h3&gt;
  
  
  Taking Ownership of Alerts
&lt;/h3&gt;

&lt;p&gt;An engineer who is making changes to the system and knows that alerts might trigger, should use the AlertManager ability to silence and inhibit alerts. It goes without saying how disturbing it is to get a high number of alerts in the middle of a workday, especially when these alerts are false positives and could have been silenced in advance.&lt;/p&gt;

&lt;p&gt;If the alerts cannot be silenced because they are required as indicators during operational changes, the engineer should assume the PD or DOD shift. It might sound trivial but from personal experience we can testify that this is a common problem.‍&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Alert Fatigue is a Continuous Process
&lt;/h2&gt;

&lt;p&gt;Using an AlertManager and personally assuming responsibility over alerts are the two determining factors in handling alert fatigue. These will greatly reduce the number of alerts and pagers to mitigate and prevent alert fatigue. However, these are but the tools and methods to achieve the goal. They will have to be constantly used and reimplemented.&lt;/p&gt;

&lt;p&gt;It's important to remember that the effort to manage alerts and avoid alert fatigue is an endless process. As systems evolve their monitoring stack evolves as well. Currently configured alert handling rules might have been set up with oversight and should now be revisited. Think of it as a kind of monitoring for your monitoring. We have alerts and alerting rules in place but we have to always ask ourselves whether they are properly set and whether conditions have changed that merit revision of alerting rules.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>alertmanager</category>
      <category>prometheus</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Why &amp; When to use GitOps: Use-Cases &amp; Principles</title>
      <dc:creator>Michael Zion</dc:creator>
      <pubDate>Tue, 11 Mar 2025 21:43:41 +0000</pubDate>
      <link>https://forem.com/meteorops/why-when-to-use-gitops-use-cases-principles-4e64</link>
      <guid>https://forem.com/meteorops/why-when-to-use-gitops-use-cases-principles-4e64</guid>
      <description>&lt;p&gt;&lt;strong&gt;Optimizing Kubernetes Management with GitOps and CD Tools.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We’ve come a long way from the days of deploying releases to individual machines, whether manually or by an automated process. &lt;/p&gt;

&lt;p&gt;The de-facto standard today is to deploy and manage the application stack using an orchestrator, usually &lt;a href="https://www.meteorops.com/glossary/kubernetes" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, &lt;a href="https://www.meteorops.com/blog/practical-tips-for-kubernetes-upgrades-for-startups" rel="noopener noreferrer"&gt;Kubernetes carries its own challenges&lt;/a&gt;. Although you can manage your stack in one centralized place, you still have to manage deployments, updates, rollbacks, and the overall infra.&lt;/p&gt;

&lt;p&gt;When Kubernetes was in its early years, services were deployed either manually or through CI/CD using &lt;code&gt;kubectl&lt;/code&gt; or Helm.&lt;/p&gt;

&lt;p&gt;There was nothing to describe the desired state and no easy way to keep track of changes or revert them. To solve these issues, &lt;a href="https://www.meteorops.com/glossary/gitops" rel="noopener noreferrer"&gt;GitOps&lt;/a&gt; was added to the mix.&lt;/p&gt;




&lt;h2&gt;
  
  
  Single Source of Truth with Increased Visibility and Operability
&lt;/h2&gt;

&lt;p&gt;The idea behind GitOps is a git repo that describes the desired state of the infrastructure and the application stack that runs on it. &lt;/p&gt;

&lt;p&gt;Combined with CI/CD, GitOps allows for fast and efficient infra provisioning and application lifecycle management. &lt;/p&gt;

&lt;p&gt;In the context of GitOps and Kubernetes, any change to the source code triggers a change in the cluster or application stack. &lt;/p&gt;

&lt;p&gt;Changes are tracked and releases are tagged with a version and can be rolled back as fast as they can be deployed. &lt;/p&gt;

&lt;p&gt;Best of all, no one is running manual commands which can be very error prone. In essence, GitOps centralises all operations related to deployments and infra management while allowing various teams to both collaborate and work independently. &lt;/p&gt;




&lt;h2&gt;
  
  
  Continuous Delivery Tools to Enhance GitOps
&lt;/h2&gt;

&lt;p&gt;However, GitOps and CI/CD for Kubernetes still lack something in terms of really being able to manage the infra and application stack.&lt;/p&gt;

&lt;p&gt;Managing deployments and infra becomes easier with GitOps thanks to declarative continuous delivery tools for Kubernetes such as &lt;strong&gt;&lt;a href="https://www.meteorops.com/glossary/argo-cd" rel="noopener noreferrer"&gt;Argo CD&lt;/a&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;a href="https://www.meteorops.com/glossary/flux-cd" rel="noopener noreferrer"&gt;Flux CD&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These tools act as a wrapper around your codebase which translates everything declarative into actual state. Your codebase holds all of your Kubernetes manifests, Helm charts, and configuration files. &lt;strong&gt;Argo CD&lt;/strong&gt; then takes it, evaluates it, and applies it to the cluster.&lt;/p&gt;

&lt;p&gt;Such tools also offer intuitive and convenient UI to visualize and manage everything that is going on in the cluster.&lt;/p&gt;

&lt;p&gt;It’s good to be able to revert a deployment or fix a configuration issue through the UI and on the spot rather than going through the process of committing code and waiting for it to sync. This is especially true in case of an emergency or when developing and debugging.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Benefits of Combining GitOps and CD Tools
&lt;/h2&gt;

&lt;p&gt;When put into the context of everyday work of developers and &lt;a href="https://www.meteorops.com/glossary/devops" rel="noopener noreferrer"&gt;DevOps&lt;/a&gt;, the real benefits of GitOps and CD tools  come into light. What GitOps and CD tools offer is a nice package of intuitive and secure easy-to-use framework for management and collaboration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ease of Use and Visibility into the State of the Application and Cluster
&lt;/h3&gt;

&lt;p&gt;The truth is that although not too difficult, setting up a GitOps codebase with CD tools can be a complex task. However, once in place, they grant ease of use with increased security.&lt;/p&gt;

&lt;p&gt;Reading Kubernetes manifests to understand the complex relationship of services and components is not easy. It’s even harder to debug and troubleshoot issues with no centralized control dashboard.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s easier with CD tools because they visualize everything that the code represents.&lt;/li&gt;
&lt;li&gt;It’s easier to discern the components of a service or the various CRDs that have been added to the cluster when they appear in front of you with all their dependencies and associations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CD tools have robust control, logging, and debugging  features which allow developers and DevOps to quickly assess the status of the cluster and respond accordingly. There’s no need to run &lt;code&gt;kubectl&lt;/code&gt; commands or tail pod logs. Everything is intuitively visualized in the CD tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Secure Operations
&lt;/h3&gt;

&lt;p&gt;Having everything visualised and controllable from outside the cluster, does away with the need to access the cluster itself. &lt;/p&gt;

&lt;p&gt;‍&lt;a href="https://www.meteorops.com/blog/from-gatekeepers-to-service-providers-reimagining-devops-relationship-with-developers#the-relationship-between-devops-and-developers" rel="noopener noreferrer"&gt;Developers and DevOps&lt;/a&gt; can be given roles through RBAC to determine which resources they have access to and what they can do in the CD tool itself rather than in the cluster. &lt;/p&gt;

&lt;p&gt;Although access is ultimately given to components of the cluster and application, it’s still better than having to manage service accounts and having dozens of developers running exec into pods. &lt;/p&gt;

&lt;p&gt;For additional security, CD tools sit inside the cluster and communicate with native API so their function takes place inside the cluster and not outside. There’s no need to open the cluster to external CI/CD pipelines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Recovery, Consistency, and Guardrails
&lt;/h3&gt;

&lt;p&gt;Recovery is built into CD Tools. CD tools continuously monitor the state of the cluster and compare with what the code says. &lt;/p&gt;

&lt;p&gt;In case of a mismatch, the CD tool attempts to reconcile between the two. If it fails, it will retry several times before sending an alert and even pausing sync. &lt;/p&gt;

&lt;p&gt;Retries are especially important in complex systems with vast networks of dependencies between services and components. &lt;/p&gt;

&lt;p&gt;Even if the code dictates service dependencies and the order of deployment, dependencies could still fail. &lt;/p&gt;

&lt;p&gt;By retry, CD tools give all components of the system more time and more chances to go online before failing the deployment and pausing progress. &lt;/p&gt;

&lt;p&gt;Since there are no imperative commands running without a state, GitOps prevents the occurrence of hanging resources. If you remove a manifest file or parts of it, the CD tools will sync immediately, without any CI/CD pipeline, and remove the corresponding resources and components.&lt;/p&gt;

&lt;h3&gt;
  
  
  Management of Multiple Environments and Applications
&lt;/h3&gt;

&lt;p&gt;With inherent security, ease of use, and built-in recovery, GitOps and CD tools are easily expanded to support the configuration and management of multi-env, multi-app stacks. It becomes much easier to separate environments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.meteorops.com/blog/one-click-environment-the-ultimate-devops-goal#why-it-improves-the-system%E2%80%99s-recoverability" rel="noopener noreferrer"&gt;Different environments for development and production&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Regional stacks for compliance or disaster recovery.&lt;/li&gt;
&lt;li&gt;Separate applications for business units in the organization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since the initial setup is most of what it takes to get GitOps and CD tools going, it’s incredibly easy to set up multiple stacks and manage both separately, as they are different stacks, and side-by-side in one place, as they are centrally managed. &lt;/p&gt;




&lt;h2&gt;
  
  
  The Application Needs GitOps and CD Tools
&lt;/h2&gt;

&lt;p&gt;Keeping the application stack and cluster in order and in the desired state is the main function of GitOps and CD tools. There's no guessing how the cluster should be or what should be in and who or what put it there. Everything is conveniently visualized with a vast array of actions that can be performed right from within the UI. GitOps and CD tools give developers and DevOps the ability to work independently in a secure and safe way. Secure in terms of access that is restricted to the CD tools itself. Safe in terms of the ability to quickly revert changes and the self-healing properties of CD tools. It’s not the easiest task to set up GitOps with CD tools, but the agility, convenience, productivity and security that they offer allow for well-managed operations. Well-managed operations then allow for faster and safer development pipelines to further advance your application and product.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>gitops</category>
      <category>argocd</category>
    </item>
    <item>
      <title>From gatekeepers to service providers: reimagining DevOps relationship with developers</title>
      <dc:creator>Arthur Azrieli</dc:creator>
      <pubDate>Fri, 28 Feb 2025 19:27:44 +0000</pubDate>
      <link>https://forem.com/meteorops/from-gatekeepers-to-service-providers-reimagining-devops-relationship-with-developers-2k51</link>
      <guid>https://forem.com/meteorops/from-gatekeepers-to-service-providers-reimagining-devops-relationship-with-developers-2k51</guid>
      <description>&lt;p&gt;Most of us, if not all of us, are service providers. It doesn’t matter what position we are in. Each person in an organisation renders service onto the organisation, even the CEO and board of directors. Perhaps the only ones who are not service providers are the investors but perhaps they too render their service onto someone or something else. We begin with the notion of service providers because it is a crucial factor in the relationship between DevOps and developers. &lt;/p&gt;




&lt;h2&gt;
  
  
  The Relationship between DevOps and Developers
&lt;/h2&gt;

&lt;p&gt;The relationship between &lt;a href="https://www.meteorops.com/glossary/devops" rel="noopener noreferrer"&gt;DevOps&lt;/a&gt; and developers is as delicate and complicated as it is crucial for the whole organisation. Delicate because any friction causes setbacks in development. Complicated because it spans across many domains of knowledge and various requirements. And crucial for the whole organisation because if it’s not optimal, developers don’t deliver quality releases on time.&lt;/p&gt;

&lt;p&gt;Luckily, the core of the relationship between DevOps and developers is technological, so handling challenges and adaptations is technological in nature. There are ways, purely technological ones, to reduce the pressure DevOps face on the one hand, and on the other hand remove obstacles from the developers’ way and let them become independent in their work.&lt;/p&gt;




&lt;h2&gt;
  
  
  DevOps Are Service Providers but on a Different Scale
&lt;/h2&gt;

&lt;p&gt;DevOps is developer operations abbreviated, and it’s easy to see from this terminology that DevOps are the exclusive service providers for developers and should gear themselves accordingly. However, it appears that acting as service providers doesn’t come easy to DevOps due to the scale and complexity of what’s required from them as service providers. As a result, a lot of friction and dissonance exist between DevOps and developers in many organisations. To solve the friction and dissonance, we need to understand what type of service providers DevOps are, what’s the scale of their work, and how they can improve communication and operations to make their work, and the developers’ work, faster, easier, and more efficient.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding the Role of DevOps as Service Providers
&lt;/h2&gt;

&lt;p&gt;Most service providers usually provide their services within well-defined scopes. Developers develop, analysts analyze, QA verify, and so on. It’s true that these can also have their own internal customers like team members that require assistance. However, in such cases, the service or assistance is still within the scope and on a relatively small scale.&lt;/p&gt;

&lt;p&gt;DevOps is a different story. Not only do DevOps have their own work cut out for them, they also support a lot of internal customers, and do so on a much larger scale and within a wider scope. DevOps assist RND people (and others such as analysts and sales engineers) in a wide variety of contexts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assisting in setting up local environments.&lt;/li&gt;
&lt;li&gt;Granting roles and permissions to internal and external systems.&lt;/li&gt;
&lt;li&gt;Troubleshooting issues with databases, microservices, and deployments.&lt;/li&gt;
&lt;li&gt;Provisioning resources on demand.&lt;/li&gt;
&lt;li&gt;Consulting on scale and security.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem here is that DevOps are a lot of times unprepared and unequipped for it. Neither in terms of understanding who the customer is, what they need, and how to give it to them with resources and restrictions in mind, nor in terms of how to do it at scale.&lt;/p&gt;

&lt;p&gt;DevOps usually come into the job with a different mindset. A DevOps engineer probably sees themselves responsible for the development and maintenance of mainly the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infra - &lt;a href="https://www.meteorops.com/glossary/cloud" rel="noopener noreferrer"&gt;Cloud&lt;/a&gt;, different environments.&lt;/li&gt;
&lt;li&gt;Monitoring, logging, and alerting systems.&lt;/li&gt;
&lt;li&gt;CI/CD infra.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most DevOps will agree that it’s okay to add to this list ongoing support for developers and other stakeholders over a wide variety of contexts, systems, frameworks, and platforms.&lt;/p&gt;

&lt;p&gt;However, it’s this very same wide variety of domains that DevOps support that prevents them from providing good service. When DevOps are unable to provide this service, it creates a lot of friction and dissonance between DevOps and developers.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Dissonance Between DevOps and Developers
&lt;/h2&gt;

&lt;p&gt;There’s no shortage of dissonance and conflict between DevOps and developers. Let’s look at some real-life examples.&lt;/p&gt;

&lt;p&gt;What DevOps might say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers don’t do the bare minimum to solve issues themselves before turning to DevOps.&lt;/li&gt;
&lt;li&gt;Developers' requirements from DevOps are always the path of least resistance.&lt;/li&gt;
&lt;li&gt;Developers don’t develop with security and scale in mind.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the other hand, developers may want to counter-argue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DevOps are not responsive enough, neither in terms of time to resolution nor deliverables.&lt;/li&gt;
&lt;li&gt;DevOps impede development and velocity through requirements and bureaucracy.&lt;/li&gt;
&lt;li&gt;DevOps don’t develop with developers in mind to assist them and facilitate their work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s easy to see the dissonance when these complaints are put side by side and one after another. Putting this conflict into structure reveals the disconnect and distance between what one side needs and what the other side is capable of providing. &lt;/p&gt;

&lt;p&gt;Since DevOps have their own duties to fulfill, adding to that extensive support adds pressure. This pressure could make DevOps compromise on the service they give because they are short on time and resources. So they expect developers to be self-sufficient and efficient when asking for support. What DevOps see as inefficiency in developers stems from the fact the developers are the most pressured entity in the organisation because they develop the product. When developers come across issues that prevent them from working they too are short on time and resources and need someone to assist them in a timely manner.&lt;/p&gt;

&lt;p&gt;This is reality nowadays in many organisations. Both developers and DevOps are short on time and resources, and when the former approaches the latter, the latter needs to halt their work and assist, or development will suffer setbacks. The goal is to change this reality and realign DevOps and developers towards better collaboration.&lt;/p&gt;




&lt;h2&gt;
  
  
  Realigning DevOps with Developers
&lt;/h2&gt;

&lt;p&gt;To realign DevOps with developers is not an easy task. The dissonance is not found in disagreement and differences. The dissonance is found in the fact that it’s not easy to change this reality and realign DevOps and developers towards better collaboration. It’s not enough to just tell DevOps that they are service providers and should do what they can to support developers in their day-to-day operations. It’s not enough to tell developers to approach DevOps like a customer requiring a service. &lt;/p&gt;

&lt;p&gt;What’s lacking here is not verbal agreement but a well-defined, well-implemented framework of methodologies to help the two sides communicate and collaborate clearly and efficiently. &lt;/p&gt;

&lt;p&gt;Moreover, the DevOps mindset must incorporate the idea that to provide services on a large scale, you need tools and you need to know what the customer needs, how and when. For DevOps, to provide services is to alleviate the pressure coming from developer needs and improve delivery. Let’s explore some ideas for improvement. &lt;/p&gt;




&lt;h2&gt;
  
  
  Communication Tools
&lt;/h2&gt;

&lt;p&gt;Most companies use some form of ChatOps such as Slack or Teams. A dedicated channel for requests from developers is the first step. However, if there’s no structured way to submit requests for support or resources, it can become unmanageable and unwieldy really quickly. Many requests can come in at once and each of them might be related to something different. &lt;br&gt;
To tackle this issue, it’s possible to install a request bot or request form in the dedicated channel. The request bot or form allows developers to submit requests in an orderly manner. It also allows DevOps to manage requests by queue and with more info and context to begin with. The form or bot should gather the following from the requester:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The nature of the problem - is it a request for support, a general question, or a request for resources?&lt;/li&gt;
&lt;li&gt;What’s the environment in question - is it local, dev, or production?&lt;/li&gt;
&lt;li&gt;The request itself - does the developer need to set up a new service, are they having issues with a service, do they need more permissions for internal and external systems?&lt;/li&gt;
&lt;li&gt;If it’s a service - what is the name of the service and its dependencies (storage, docker repos, git repos, databases)?&lt;/li&gt;
&lt;li&gt;If it’s a request for resources - quantitative measures such as CPU and memory and justification for adding resources.&lt;/li&gt;
&lt;li&gt;If it’s more permissions - justification for permissions.&lt;/li&gt;
&lt;li&gt;What steps were taken to try and troubleshoot - where applicable.&lt;/li&gt;
&lt;li&gt;Any additional information that might be relevant - logs, metrics, documentation.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;With the above in mind, now it’s time to see what can be automated or made self-serve to facilitate developer work by way of delegating and enabling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Facilitating Developer Work
&lt;/h2&gt;

&lt;p&gt;Most customers would prefer to do things themselves. Especially developers who always work in fast-paced environments and within time constraints. We’ve started with communication tools and now want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gather info and analyze.&lt;/li&gt;
&lt;li&gt;Discover areas that are constant pain points for developers.&lt;/li&gt;
&lt;li&gt;Automate or delegate where possible.&lt;/li&gt;
&lt;li&gt;Rinse and repeat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This way DevOps can automate repetitive tasks such as granting permissions or provisioning resources. DevOps must also think about protecting their own customers and not be too permissive. Clear boundaries need to be defined when permissions or resources are asked because, like we said, DevOps are usually adamant when it comes to security and scale.&lt;/p&gt;

&lt;p&gt;Beyond turning repetitive tasks to self-serve, DevOps should also strive towards making developers’ work as easy as possible. For a developer, an easier way to work could include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work - do everything on their own without needing anyone’s help.&lt;/li&gt;
&lt;li&gt;Develop - disposable dev environments that are quick to set up.&lt;/li&gt;
&lt;li&gt;CI/CD - easy to configure, easy to deploy, easy to revert.&lt;/li&gt;
&lt;li&gt;Panic time - clean, well-scoped, logs and metrics that are easy to search.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point we are almost three quarters of the way in. Now all that’s left is to make sure that customers are well-aware of what’s at their disposal. DevOps can and should plan for building a body of knowledge to assist and educate developers on how to make the best of what’s offered to them by DevOps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summarize, Refine, Document, Educate
&lt;/h2&gt;

&lt;p&gt;Once proper communication and procedures are in place to facilitate developer work, the body of knowledge should be assembled. Everything that doesn’t fall under automated requests and better troubleshooting and debugging tools should go into the body of knowledge. &lt;/p&gt;

&lt;p&gt;The body of knowledge consists of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;How-Tos&lt;/li&gt;
&lt;li&gt;FAQs&lt;/li&gt;
&lt;li&gt;Workshops&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Composing and maintaining a body of knowledge is probably one of the most challenging things DevOps can do. It’s easy for DevOps to configure automations but most don’t know how to write in a clear concise manner. In addition, most customers don’t really bother to read the docs and if they do they just skim through. Even if developers do make use of documentation and workshops, knowledge is changing fast and there’s a need to adjust and update the body of knowledge accordingly. To tackle this challenge DevOps can encourage developers to take an active part in maintaining the body knowledge. An engaged customer is most likely a self-sufficient one. Perhaps the most important aspect of imparting knowledge is workshops. Not only is it easier to learn and understand by doing rather than reading, it also brings DevOps and developers closer together and strengthens their relationship. &lt;/p&gt;




&lt;h2&gt;
  
  
  DevOps as a Service: Maintaining Relationships at Scale
&lt;/h2&gt;

&lt;p&gt;The first step towards improving the collaboration between DevOps and developers is understanding its scale. The scale is massive enough to put strain on the relationship, and like most scale issues, systems and procedures can be put in place and iteratively revised and improved to handle it.&lt;/p&gt;

&lt;p&gt;DevOps must acknowledge that they are service providers at scale. Being service providers at scale, they must understand their resources, capabilities, and limitations in assisting developers, and put a system or procedure in place to handle it for them. DevOps must empower developers and delegate more responsibilities to them, therefore relieving pressure off of themselves while giving developers more agency.&lt;/p&gt;

&lt;p&gt;Only when DevOps follow this set of principles will they be able to finally emerge as they have always meant to be: service providers at scale.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>automation</category>
      <category>developer</category>
      <category>operations</category>
    </item>
    <item>
      <title>Proper mindset for handling data and databases: between scaling and failing</title>
      <dc:creator>Arthur Azrieli</dc:creator>
      <pubDate>Fri, 28 Feb 2025 17:19:11 +0000</pubDate>
      <link>https://forem.com/meteorops/proper-mindset-for-handling-data-and-databases-between-scaling-and-failing-che</link>
      <guid>https://forem.com/meteorops/proper-mindset-for-handling-data-and-databases-between-scaling-and-failing-che</guid>
      <description>&lt;p&gt;Startups and software companies put a lot of effort into what languages to use, what tech stacks to employ, and what cloud to deploy the app to but fail to put the same focus on their data and databases&lt;/p&gt;

&lt;p&gt;Data is the core of the app and product from which everything is derived and upon which everything depends. Startups and software houses should put more thought into how they plan to gather, store, analyse, and use their data. Doing so could mark the difference between success and failure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Avoid Common Data Architecture Regrets
&lt;/h2&gt;

&lt;p&gt;Data is the raw material from which you mold your application. Anything else is just tools. If you treat your raw ingredients with proper care, the final recipe is bound to succeed.&lt;/p&gt;

&lt;p&gt;The tried and true methods of optimizing data are abundant. It’s well known that databases can be tweaked to better perform through various means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Indexing&lt;/strong&gt; - speed up searches that rely on primary keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normalization&lt;/strong&gt; - keep data atomic and separate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query optimization&lt;/strong&gt; - select only what you need, when you need it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partitioning&lt;/strong&gt; - divide large tables into smaller ones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if it’s all tried and true and has been established, why do we highlight it as an overlooked part of many applications? That’s because there’s a long way to go from theory to practice. The list above only represents what can be done to optimize performance, not how and when to do so. Moreover, in a fast-paced environment of software development and especially in startups, proper planning for data is sometimes pushed aside in favor of rapid growth.&lt;/p&gt;




&lt;h2&gt;
  
  
  Plan Ahead for Your Data
&lt;/h2&gt;

&lt;p&gt;We’ve mentioned several ways to optimize database performance, but what we should really focus on is planning for the data. Questions like what sort of data it will be, what will be the format, and what sort of manipulations it will undergo. Perhaps even more rudimentary than the type and usage of data is the database itself and how it fits your application. &lt;/p&gt;




&lt;h3&gt;
  
  
  Get to Know the Database
&lt;/h3&gt;

&lt;p&gt;There are two main types of databases these days: relational (SQL) and document-based (NoSQL). &lt;/p&gt;

&lt;h4&gt;
  
  
  NoSQL:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;If your application needs to handle single yet flexible documents.&lt;/li&gt;
&lt;li&gt;If you predict large amounts of data that might be distributed and sharded.&lt;/li&gt;
&lt;li&gt;If you expect a lot of unstructured data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  SQL:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;If your application requires rigid, well-defined schemas and relations.&lt;/li&gt;
&lt;li&gt;If your application requires consistency throughout the datascape. &lt;/li&gt;
&lt;li&gt;If you intend to digest columnar data using big data tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you’ve chosen the database to work with, ask yourself again what your use case is. Inform yourself as to what others experienced working with MySQL, MariaDB, PostgreSQL, MongoDB, to name a few. Find the setbacks that others faced and see if at any point in the future you might face something similar.&lt;/p&gt;




&lt;h3&gt;
  
  
  Get to Know the Data and its Characteristics
&lt;/h3&gt;

&lt;p&gt;The way you design your data now will impact you in the future. It’s a hard task, but force yourself to think of what other functionality you have in store and plan to implement. See if the current data scheme and models allow easy integration of such functionality.&lt;/p&gt;

&lt;p&gt;Functionality implies data moving around and being updated constantly. Consider the behavior of your data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you do a lot of writes but fewer reads, opt for throughput.&lt;/li&gt;
&lt;li&gt;If you do many reads but fewer writes,  opt for io and use caching.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Load and Stress the Data
&lt;/h2&gt;

&lt;p&gt;Data-related performance issues mostly hit you when you least expect them. The smooth functionality that you are used to is not attributed to the choice of database or data scheme. It’s mostly attributed to lack of load and stress on the database. This load and stress is what you should strive for.&lt;/p&gt;

&lt;p&gt;Again a hard task ahead that requires you to accept that tens of thousands of requests per minute can easily become millions. It’s easy to list and discuss ways to optimize data manipulation and retrieval, but no one gains experience and knowledge without trying.&lt;/p&gt;

&lt;p&gt;If you want to know if your data is well-structured and well-retrieved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Try to write and read more than you imagine would be possible.&lt;/li&gt;
&lt;li&gt;Only when it stops working do we look under the hood to find and fix the problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Like we said earlier, anything else is just tools. The data is the heart and core of the application and should be created like one: consistent, resilient, scalable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Protect Your Data
&lt;/h2&gt;

&lt;p&gt;With the efforts of choosing a database, data models, and optimizing their usage behind you, you should think about protecting your data. &lt;/p&gt;

&lt;p&gt;Protecting your data from bad actors goes without saying. It’s the internal actors that you need to shield the data from. Internal actors can be services and humans, and since humans make mistakes, so do services.&lt;/p&gt;

&lt;p&gt;Consider the following means of mitigating accidental service disruption or, worse yet, data loss or corruption:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Back up the data and plan for deploying from a snapshot.&lt;/li&gt;
&lt;li&gt;Limit access from the get-go.&lt;/li&gt;
&lt;li&gt;Reads from replicas, no human ever writes directly to the data.&lt;/li&gt;
&lt;li&gt;If a service is the owner or main user of a table or database, other services request data through internal APIs.&lt;/li&gt;
&lt;li&gt;Monitor the database CPU and memory and plan ahead in case you need to scale.&lt;/li&gt;
&lt;li&gt;Look for, kill, and find the source of long-running queries to detect misbehaving services.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Keep The Data Clean
&lt;/h2&gt;

&lt;p&gt;It’s not enough to protect your data. You also have to keep it nice and tidy. A lot of data accumulates through the product lifecycle and more often than not becomes stale. &lt;/p&gt;

&lt;p&gt;Modern hard drives are fast, reliable, and reach terabytes in volume, but that doesn’t mean you should fill them with data.&lt;/p&gt;

&lt;p&gt;Too much data puts strain on the disk and memory, not to mention that more data means longer queries, even with indexing.&lt;/p&gt;

&lt;p&gt;Consider the following as ways to keep your data clean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t do soft deletes.&lt;/li&gt;
&lt;li&gt;Scan and find least retrieved data and archive it.&lt;/li&gt;
&lt;li&gt;If you’re using PostgreSQL, use &lt;code&gt;vacuum&lt;/code&gt;. If you use MySQL, use &lt;code&gt;optimize&lt;/code&gt;. Do the same for any other database you use.&lt;/li&gt;
&lt;li&gt;Be wary of making changes – don’t add tables that duplicate data.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Keep Your Data in Mind
&lt;/h2&gt;

&lt;p&gt;Out of all the aspects and methods we discussed, there’s one conclusion to be drawn:&lt;br&gt;&lt;br&gt;
Data is the most important, most overlooked aspect of software development.&lt;/p&gt;

&lt;p&gt;To keep your data in mind means to consider all the pros and cons of choosing a database.&lt;br&gt;&lt;br&gt;
To keep your data in mind means you always check how data retrieval affects performance.&lt;br&gt;&lt;br&gt;
To keep your data in mind is to follow these principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose the right database for the workload.&lt;/li&gt;
&lt;li&gt;Create indices and optimize queries.&lt;/li&gt;
&lt;li&gt;Optimize I/O through hardware adjustments and caching.&lt;/li&gt;
&lt;li&gt;Get rid of unnecessary data – no soft deletes.&lt;/li&gt;
&lt;li&gt;Check and check again that high volume doesn’t create bottlenecks.&lt;/li&gt;
&lt;li&gt;Back up your data and limit access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Strive to apply the principles listed above because no matter what you do with your app or product, it’s almost always related to data.  &lt;/p&gt;

&lt;p&gt;Always keep in mind that Data is the foundation. When it’s well-maintained, the whole system benefits.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>architecture</category>
      <category>productivity</category>
      <category>database</category>
    </item>
    <item>
      <title>Practical Tips for Kubernetes Upgrades for Startups</title>
      <dc:creator>Arthur Azrieli</dc:creator>
      <pubDate>Mon, 10 Feb 2025 18:58:35 +0000</pubDate>
      <link>https://forem.com/meteorops/practical-tips-for-kubernetes-upgrades-for-startups-22df</link>
      <guid>https://forem.com/meteorops/practical-tips-for-kubernetes-upgrades-for-startups-22df</guid>
      <description>&lt;p&gt;&lt;em&gt;Upgrade Kubernetes with confidence: A step-by-step guide to ensure seamless updates, maintain stability, and avoid breaking changes.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The all-too-popular Kubernetes upgrade-storm
&lt;/h1&gt;

&lt;p&gt;There comes a day when you get a notification that the current Kubernetes version that you are running is reaching its end of life. Best case scenario you open a ticket knowing full well that this ticket will either be pushed down the list of priorities or be forgotten completely. After all, you have other priorities such as releases and bug fixing. You are a fast-running startup that needs to bring in new business in order to grow. Upgrading Kubernetes is the least of your concerns right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  You will have to upgrade eventually
&lt;/h2&gt;

&lt;p&gt;But the day finally comes when you need to upgrade and one of the following could be the trigger:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your Kubernetes version actually finally reached its end of life.&lt;/li&gt;
&lt;li&gt;RND management finally decided it was time to upgrade.&lt;/li&gt;
&lt;li&gt;You need to upgrade regardless of end of life because some critical components in your cluster need upgrading for a bug fix or a feature that you need.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You look up the helm chart or operator that is running in your cluster and realize that you cannot upgrade to the newer versions because they are incompatible with your current Kubernetes version. So you need to upgrade the cluster in order to upgrade the helm charts. And to top it all off, it has been decided to upgrade Kubernetes all the way to the latest versions and you find yourself needing to upgrade 4 versions forward.&lt;/p&gt;

&lt;p&gt;Every Kubernetes upgrade has the potential to introduce breaking changes. In most cases it’s deprecated APIs or APIs that moved from one API group to another. This will affect anything in your cluster that relies on these Kubernetes APIs. Now take this and do it four times. You need to carefully plan how to approach and execute the upgrade:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scope and price the process in terms of effort and time to completion.&lt;/li&gt;
&lt;li&gt;Create an upgrade plan and iterate over it by testing on lower environments.&lt;/li&gt;
&lt;li&gt;Set a maintenance window.&lt;/li&gt;
&lt;li&gt;Declare code freeze.&lt;/li&gt;
&lt;li&gt;Upgrade and verify.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a challenging process that will exhaust you. It is labor intensive and very error prone. If you upgrade a library in some microservice you can test it locally, the scope is almost always isolated to this specific micro service and in any case the blast radius is relatively small. But when you upgrade a Kubernetes cluster you are upgrading the entire system and anything going wrong could have serious consequences.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to approach the upgrade
&lt;/h2&gt;

&lt;p&gt;Before discussing ways to approach an upcoming upgrade we need to address the elephant in the room. Once you need to upgrade, you’re probably short on time, short on resources, and need to upgrade several versions forward while making sure that the app stack itself and everything else that runs on your Kubernetes cluster remains functional. That is not the way to go.&lt;/p&gt;

&lt;p&gt;What we derive from this situation is the first principle of how to approach the upgrade - upgrade small, upgrade continuous. Once we realize and implement this principle we can move on to what you need to do in order to successfully upgrade your Kubernetes cluster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Upgrade small, upgrade continuous.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Once we realize and implement this principle, we can move on to what you need to do in order to successfully upgrade your Kubernetes cluster.&lt;/p&gt;




&lt;h2&gt;
  
  
  Upgrade small upgrade continuous
&lt;/h2&gt;

&lt;p&gt;Remember the day when you got the notification that your Kubernetes cluster versions reached its end of life? Well this is the day where you waste no time and put this task in the sprint.&lt;/p&gt;

&lt;p&gt;Opponents of this approach might say that a startup cannot afford to jump on every upgrade because there’s more pressing business to conduct. But a startup also cannot afford system instability. The longer the wait the more unstable the system might become and the upgrade will be harder and harder, especially if more than one upgrade is in question. So upgrade small, upgrade continuous. This goes for components in the cluster as much as the cluster itself.&lt;/p&gt;

&lt;p&gt;Keeping your helm charts, operators and controllers up to date will almost always guarantee that you will not have to upgrade them when upgrading your Kubernetes cluster. There is no doubt that a startup should think first how to bring in money. If the Kubernetes cluster upgrade competes with a feature that will bring in new business, the feature will almost always win.&lt;/p&gt;

&lt;p&gt;However, by insisting on upgrading small and keeping up to date, you provide yourself with breathing room for when a feature or a bug fix are really critical. You can allow yourself to skip the upgrade and focus on business because the end of life of your Kubernetes cluster version is farther down the road.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test and verify on lower environments
&lt;/h2&gt;

&lt;p&gt;Another principle worth discussing is testing and verifying the upgrade on lower environments. The term lower environments obviously means dev and stg but in many cases dev and stg environment represent the app stack and less so the infrastructure.&lt;/p&gt;

&lt;p&gt;This means that when testing on lower environments they have to be identical to the production cluster that you are about to upgrade. As identical non-critical environments, you can allow yourself to make mistakes which are the best way to learn.&lt;/p&gt;

&lt;p&gt;Upgrading Kubernetes is a difficult task. Having the ability to try it out without fear of service disruption is liberating and will allow you to experiment more therefore better preparing yourself for the upgrade day. &lt;/p&gt;

&lt;p&gt;When you eventually test on lower environments, don’t just upgrade and settle for a working cluster. Remeber that lower environments are meant to represent the architecture and app stack of higher environments. Consider the following when upgrading consider the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitor the environments through metrics and logs to check for anything suspicious or out of the ordinary:

&lt;ul&gt;
&lt;li&gt;A critical component fails to be scheduled - pods in crash CrashLoopBackOff, pods failing to satisfy liveness and readiness probe, nodes don’t scale when the cluster is loaded, etc.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kube-proxy&lt;/code&gt; is not alive and well and services cannot talk to each other.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kube-dns&lt;/code&gt; is not alive and well and services fail to resolve host names.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Run e2e tests on your app stack. Verifying that your app stack functions as it should in an upgraded environments will give extra confidence that the upgrade is going well:

&lt;ul&gt;
&lt;li&gt;Run e2e tests.&lt;/li&gt;
&lt;li&gt;Run integration tests.&lt;/li&gt;
&lt;li&gt;Run load tests to verify that deployments scale accordingly.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;There’s a caveat though in this approach that we need to address. You have to provision and maintain these environments which means more resources allocated to the upgrade process even if it’s not in the pipeline. But there’s no better approach. It’s a “measure twice cut once” and “invest money not time” rolled into one.&lt;/p&gt;

&lt;p&gt;Try out the upgrade first and then execute and do it on preallocated environments. The stability you will achieve will contribute to the overall health of the system and the organization itself. No amount of money can compensate for dev teams overworked by system instability. It could also prove a source of churn where instability drives away clients and even prospects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Now it’s time to upgrade
&lt;/h2&gt;

&lt;p&gt;Let’s assume that we are in an ideal world where you have your lower environments ready and well-maintained and you have allocated time and resources for continuous upgrades. How do you prepare for an upgrade? There are several things you need to do.&lt;/p&gt;

&lt;p&gt;First of all, you have to thoroughly read the release notes. And it doesn’t mean scrolling through them but reading them line by line. It’s a time consuming task but it follows the principle of “measure twice cut once”. A lot of what you will read won’t be relevant. A lot of what you will read will be invaluable. Dedicate time and patience to this task. Tutorials and guides are obviously welcome but try to remember that not all environments are alike. &lt;/p&gt;

&lt;p&gt;Now that you have a sense of what’s heading your way in terms of the effort put into research, you could use an automated process to give you a head start. You can find exactly that in &lt;a href="https://github.com/kubepug/kubepug" rel="noopener noreferrer"&gt;kubepug which is an open-source Kubernetes pre-upgrade checker&lt;/a&gt;. What you can and should do with kubepug:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run kubepug against your current Kubernetes cluster version to get the following:

&lt;ul&gt;
&lt;li&gt;A list of deprecated APIs.&lt;/li&gt;
&lt;li&gt;Any objects affected by API changes.&lt;/li&gt;
&lt;li&gt;What APIs should be used instead of deprecated ones.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;If all goes well and we wish you that it will, run kubepug once more because it is also capable of verifying current versions.&lt;/li&gt;

&lt;li&gt;If all goes well and we wish you that it will, run kubepug once more because it is also capable of verifying current versions.&lt;/li&gt;

&lt;li&gt;Trust kubepug but verify that everything that it drew you attention to was indeed upgraded or replaced and that it’s consistent with the release notes.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Once you gather the information and mode of operation from release notes and guides, go look at your Kubernetes cluster and find everything that both exists in your cluster and is referenced in the information you gathered. The match between the two is the basis for your upgrade plan.&lt;/p&gt;




&lt;h2&gt;
  
  
  Automate and summarize
&lt;/h2&gt;

&lt;p&gt;We’ve mentioned a few times that the upgrade process, especially everything that precedes it, is very arduous and time consuming. This is where you automate the discovery and summary process.&lt;/p&gt;

&lt;p&gt;Use LLMs to summarize and highlight information that you gathered and other tools to scan, analyze and inform you on changes between versions. Another aspect of the upgrade process is to compile, document and implement the upgrade process itself. Laying down the foundations of upgrading small and continuously is perhaps the most important aspect even more than the upgrade itself.&lt;/p&gt;

&lt;p&gt;It’s true that the goal is the eventual Kubernetes cluster upgrade, but how it’s carried out will determine the measure of peace of mind that you will have when approaching this important task.&lt;/p&gt;




&lt;h2&gt;
  
  
  Yours is a startup and should start well
&lt;/h2&gt;

&lt;p&gt;Kubernetes is one of the best things to have happened to the tech industry. By using it, your startup avoids the pain of having to provision your own orchestrator. Take into account that the time you save for using Kubernetes rather than maintaining your own solution, is time to invest in paying respects back to Kubernetes.&lt;/p&gt;

&lt;p&gt;And to do that you need to consider that for Kubernetes to continue serving you it needs to be up to date and well-maintained. Then and only then will it guarantee the highest level of stability. And a stable infra for a startup is priceless as it allows you to grow and rarely holds you back. &lt;/p&gt;

&lt;p&gt;So for all your successful upgrades to come, adopt the mindset that we are trying to convey. &lt;/p&gt;

&lt;p&gt;Give the Kubernetes upgrade its place in the development pipeline. Like we highlighted, an upgraded, well-maintained cluster is an invaluable resource. Small to medium effort every now and then is better than an out-of-the-blue urgent upgrade.&lt;/p&gt;

&lt;p&gt;Be ahead of the upgrade. Don’t wait for it to come to you. Seek it proactively and open a ticket with a due date. Add yourself a calendar reminder. Allow yourself time to educate and prepare yourself. Yes there are automated tools like kubepug that we mentioned but we need to know how to use these tools and rely on them to the extent that they don’t have the final say.&lt;/p&gt;

&lt;p&gt;Test on lower environments and verify and validate by looking at metrics and logs. Validate further by making sure that the app stack functions as it should.&lt;/p&gt;

&lt;p&gt;These principles don't guarantee smooth upgrades as the unexpected is almost always bound to happen. However, they do guarantee successful upgrades that will instill in you greater confidence for the current upgrade as well as future upgrade. You’re a startup and adopting these principles and mindset will prove itself not only when upgrading your cluster, but in anything that you set out your startup to become and achieve.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>cloudcomputing</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Deploy a Kubernetes App &amp; AWS Resources using Crossplane on Kubernetes: Part 2</title>
      <dc:creator>Arthur Azrieli</dc:creator>
      <pubDate>Thu, 31 Oct 2024 12:19:56 +0000</pubDate>
      <link>https://forem.com/meteorops/deploy-a-kubernetes-app-aws-resources-using-crossplane-on-kubernetes-part-2-2m51</link>
      <guid>https://forem.com/meteorops/deploy-a-kubernetes-app-aws-resources-using-crossplane-on-kubernetes-part-2-2m51</guid>
      <description>&lt;h2&gt;
  
  
  To properly enjoy this article
&lt;/h2&gt;

&lt;p&gt;This tutorial assumes you already followed the steps in part 1: &lt;a href="https://www.meteorops.com/blog/deploy-aws-resources-using-crossplane-on-kubernetes" rel="noopener noreferrer"&gt;&lt;em&gt;Deploy AWS Resources using Crossplane on Kubernetes&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also, this is the Github Repository we’ll be using:&lt;br&gt;
&lt;a href="https://github.com/MeteorOps/crossplane-aws-provider-bootstrap" rel="noopener noreferrer"&gt;https://github.com/MeteorOps/crossplane-aws-provider-bootstrap&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What’s this article about?
&lt;/h2&gt;

&lt;p&gt;In this article, we’ll cover a use-case that can benefit from Crossplane: full environment deployment.&lt;/p&gt;

&lt;p&gt;This is a step-by-step guide with an example and a Git repository, so by the end of it, you should be able to deploy a sample env.&lt;/p&gt;

&lt;p&gt;You can technically walkthrough the entire thing by "copy-paste" and everything should work. But, diving into the explanations with an extra 5–10 minutes will leave you with longer-term value.&lt;/p&gt;

&lt;p&gt;Hope you enjoy!&lt;/p&gt;


&lt;h2&gt;
  
  
  What to expect from this article?
&lt;/h2&gt;

&lt;p&gt;By the end of it, you’ll understand:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How Crossplane can be used for full environment deployment&lt;/li&gt;
&lt;li&gt;How to deploy a sample app with AWS resources&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  What not to expect?
&lt;/h3&gt;

&lt;p&gt;This article guides you through a simple application deployment, and not a full set of apps.&lt;/p&gt;

&lt;p&gt;It also doesn’t go into using Crossplane in conjunction with Helm, but does cover important principles regarding it.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Crossplane for the Full Environment Use-Case?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  When you want to deploy a full environment, it usually involves 3 layers:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure&lt;/strong&gt;: Resources the application needs to run well&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application&lt;/strong&gt;: The programs built by the company to serve users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data&lt;/strong&gt;: The data the application uses&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But you already know that.&lt;/p&gt;
&lt;h3&gt;
  
  
  The thing is a tradition developed, and Crossplane sort of broke this tradition.
&lt;/h3&gt;

&lt;p&gt;The tradition was this process: &lt;em&gt;Build infrastructure, Deploy application on top.&lt;/em&gt;&lt;br&gt;
How did Crossplane break this tradition?&lt;br&gt;
The application deployment can now provision infrastructure required by the application.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pull-Request Environments are also easier
&lt;/h3&gt;

&lt;p&gt;By creating a namespace with all of the apps and the AWS resources required with Crossplane, the use-case of &lt;a href="https://www.meteorops.com/blog/the-cto-devops-handbook-simple-principles-and-examples#bonus-an-example-setup-for-a-cto-approaching-production" rel="noopener noreferrer"&gt;creating a full environment per Pull-Request&lt;/a&gt; as part of the CI becomes much easier.&lt;/p&gt;

&lt;p&gt;That's a nice benefit of such setup for companies utilizing the feature-branch or Gitflow approaches.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Traditional Full Env Example
&lt;/h2&gt;

&lt;p&gt;To provision and &lt;a href="https://www.meteorops.com/blog/one-click-environment-the-ultimate-devops-goal" rel="noopener noreferrer"&gt;deploy a full environment&lt;/a&gt; in the past, the process would generally look something like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Provision VPC+EKS+... using Terraform&lt;/li&gt;
&lt;li&gt;Use Terraform to bootstrap the cluster with a CD tool (e.g., ArgoCD)&lt;/li&gt;
&lt;li&gt;ArgoCD looks at a repo that deploys all apps from there&lt;/li&gt;
&lt;li&gt;An application needs a new S3 Bucket, so the developer writes Terraform code for it&lt;/li&gt;
&lt;li&gt;The application gets removed after a while (but the bucket stays)&lt;/li&gt;
&lt;li&gt;Someone needs to remember that bucket was owned by that app and remove it from Terraform&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  A Crossplane Full Env Example
&lt;/h2&gt;

&lt;p&gt;To provision and deploy a full environment with Crossplane the process is similar (we still need a Kubernetes Cluster to start with for the initial environment):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Provision VPC+EKS+... using Terraform&lt;/li&gt;
&lt;li&gt;Deploy Crossplane’s prerequisites to the cluster with Terraform&lt;/li&gt;
&lt;li&gt;Add Crossplane resources to application Helm Charts (so they get their required infra upon deployment)&lt;/li&gt;
&lt;li&gt;Create a Crossplane manifest to deploy the Helm Charts + Some shared infra required by all apps&lt;/li&gt;
&lt;li&gt;When an application is removed, its AWS resources are gone with it&lt;/li&gt;
&lt;li&gt;When an entire environment is terminated, its AWS resources are gone with it&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Crossplane in Helm vs. Helm in Crossplane
&lt;/h2&gt;

&lt;p&gt;When using Crossplane alongside Helm, the question arises:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Should Helm apply the Crossplane code? Or, should Crossplane apply the Helm Charts?&lt;br&gt;
I'm glad you asked it - the answer is both, depends when.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Reasons for Crossplane in Helm:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create or modify app-specific resources when that app is deployed&lt;/li&gt;
&lt;li&gt;Delete app-specific resources when that app is deleted&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Reasons for Helm in Crossplane:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Manage dependencies between resources and applications using Crossplane&lt;/li&gt;
&lt;li&gt;Create shared resources that are not owned by a single application&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  The Step-by-Step Guide
&lt;/h2&gt;

&lt;p&gt;Deploy the simple application alongside a S3 bucket using a Crossplane Composite Application.&lt;/p&gt;
&lt;h3&gt;
  
  
  Before proceeding
&lt;/h3&gt;

&lt;p&gt;Make sure you follow the steps in the 1st article (takes 3-minutes to just copy-paste the code snippets into your terminal and run the entire thing).&lt;/p&gt;


&lt;h3&gt;
  
  
  Deploy the Crossplane Kubernetes Provider
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Prepare the AWS Credentials for the Application to be able to use AWS&lt;/strong&gt;&lt;br&gt;
Run the following oneliner to create the Secret containing the AWS credentials in the right format as required by the Application (the application will simply run &lt;code&gt;aws s3 ls&lt;/code&gt; to show the bucket):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create secret generic aws-creds &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;aws_access_key_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; aws_access_key_id creds | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;&lt;span class="s1"&gt;' = '&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;aws_secret_access_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; aws_secret_access_key creds | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;&lt;span class="s1"&gt;' = '&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure it was created as expected by fetching the secret:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hxj0r5ipwxqsvxpbotb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hxj0r5ipwxqsvxpbotb.png" alt="Image description" width="742" height="55"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploy the Crossplane Kubernetes Provider resources using the k8s-provider-bootstrap.yaml file&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; k8s-provider-bootstrap.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure the provider was created and is ready before proceeding to the next steps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get providers provider-kubernetes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkwy376ar5myo1tqaxmz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkwy376ar5myo1tqaxmz.png" alt="Image description" width="800" height="51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deploy the Crossplane Kubernetes Provider Configuration using the &lt;code&gt;k8s-provider-conf.yaml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; k8s-provider-conf.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is done separately as it needs to happen after the Provider resources were created.&lt;/p&gt;

&lt;p&gt;This is where we tell the Crossplane Kubernetes Provider in which Kubernetes cluster it should operate when it’s creating resources.&lt;/p&gt;




&lt;h3&gt;
  
  
  Create a deployable unit of an App &amp;amp; AWS Resources using Crossplane
&lt;/h3&gt;

&lt;p&gt;Here we do 3 things with 3 files:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The &lt;code&gt;composite-app-xrd&lt;/code&gt; file:&lt;/strong&gt;&lt;br&gt;
Contains the CompositeResourceDefinition (XRD) for the K8sApplication by using the Composition of a K8s Deployment and S3 Bucket (described below)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The &lt;code&gt;composite-app-composition&lt;/code&gt; file:&lt;/strong&gt;&lt;br&gt;
Contains the Composition definition which creates both the Kubernetes Deployment and the S3 Bucket&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The &lt;code&gt;composite-app-example&lt;/code&gt; file:&lt;/strong&gt;&lt;br&gt;
Calls the CompositeResource defined by &lt;code&gt;composite-app-xrd&lt;/code&gt; file&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Crossplane Resources Files Breakdown &amp;amp; Creation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;composite-app-xrd.yaml&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;~ K8sApplication CompositeResourceDefinition&lt;/strong&gt;&lt;br&gt;
This defines a composite resource for a Kubernetes application, with &lt;code&gt;bucketName&lt;/code&gt; and &lt;code&gt;bucketRegion&lt;/code&gt; fields in the spec. Users can claim this resource as K8sApplication.&lt;br&gt;&lt;br&gt;
The K8sApplication CompositeResource (XRD) accepts the &lt;code&gt;bucketName&lt;/code&gt; &amp;amp; &lt;code&gt;bucketRegion&lt;/code&gt; fields and uses them to create an S3 Bucket, and to create a K8s Deployment of a mock “service” that simply runs &lt;code&gt;aws s3 ls&lt;/code&gt; to see the bucket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;~ Deploy the CompositeResourceDefinition (XRD)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; composite-app-xrd.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;composite-app-composition.yaml&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Defines a Composition of resources that can be created by a CompositeResource.&lt;/p&gt;

&lt;p&gt;This is where we define the Composition that creates a combo of a Kubernetes Deployment with the mock “service” that runs &lt;code&gt;aws s3 ls&lt;/code&gt; as well as the S3 bucket — The CompositeResource simply calls this resource.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;~ Deploy the Composition&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; composite-app-composition.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;composite-app-example.yaml&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Deploys the actual K8sApplication CompositeResource, and passes the details of the region in which the bucket should be created, and the name of the bucket (both are also passed to the Kubernetes Deployment as environment variables that helps it access the same bucket).&lt;/p&gt;

&lt;p&gt;As mentioned above, the CompositeResource calls the Composition which creates the resources using the Crossplane providers.&lt;/p&gt;

&lt;p&gt;Deploy the app by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; composite-app-example.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Look at your pretty Application
&lt;/h3&gt;

&lt;p&gt;Fetch the K8sApplication resource you’ve just created by running the below command obsessively until it’s marked as &lt;code&gt;Healthy&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get K8sApplication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fazrulo1bvz0xoss2uezx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fazrulo1bvz0xoss2uezx.png" alt="Image description" width="687" height="98"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Print the logs of the application and see it fetching the AWS S3 Bucket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl logs &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;awscli
&lt;span class="c"&gt;# 2024-10-17 16:00:31 my-app-bucket-nqzhx-xzjcq&lt;/span&gt;
&lt;span class="c"&gt;# 2024-10-17 16:00:50 my-app-bucket-nqzhx-xzjcq&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Cleanup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl delete &lt;span class="nt"&gt;-f&lt;/span&gt; composite-app-example.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Recap
&lt;/h3&gt;

&lt;p&gt;To briefly recap what you did here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prepared Crossplane for deploying a mix of Kubernetes and AWS resources&lt;/li&gt;
&lt;li&gt;Defined the manifests required to deploy an app built of a Deployment and a S3 Bucket&lt;/li&gt;
&lt;li&gt;Sharpened your grasp on some Crossplane concepts&lt;/li&gt;
&lt;li&gt;Discussed some use-cases for which it’s useful&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hope you enjoyed this article, and if you are interested in another article about something related (or unrelated), please convince Michael it’s a good idea at &lt;a href="mailto:michael@meteorops.com"&gt;michael@meteorops.com&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; In actual environments or production, it’s essential to fine-tune the permissions in the different manifests. Instead of using access keys and secret keys directly, consider implementing IAM Roles for Service Accounts (IRSA) to manage permissions more securely.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>kubernetes</category>
      <category>devops</category>
      <category>crossplane</category>
    </item>
    <item>
      <title>How to build a DevOps team</title>
      <dc:creator>Michael Zion</dc:creator>
      <pubDate>Tue, 01 Oct 2024 22:27:55 +0000</pubDate>
      <link>https://forem.com/meteorops/how-to-build-a-devops-team-99</link>
      <guid>https://forem.com/meteorops/how-to-build-a-devops-team-99</guid>
      <description>&lt;p&gt;If you're considering how to build a DevOps team the best way possible, this one's for you.&lt;br&gt;&lt;br&gt;
This blog post is the result of my advice for people building DevOps teams: CTOs, VPs of R&amp;amp;D, Team Leaders, and more.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
I'll give you the bottom line. &lt;br&gt;
These are the steps for building your DevOps team:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Polish your DevOps Philosophy&lt;/li&gt;
&lt;li&gt;Understand the DevOps Lead responsibilities: Product, Project, People, Service, Architecture&lt;/li&gt;
&lt;li&gt;Define your Team's Mission Statement&lt;/li&gt;
&lt;li&gt;Set useful DevOps Goals &amp;amp; Practices&lt;/li&gt;
&lt;li&gt;Set Guiding DevOps Principles&lt;/li&gt;
&lt;li&gt;Define the DevOps team's roadmap &amp;amp; strategy&lt;/li&gt;
&lt;li&gt;Set a definition of done&lt;/li&gt;
&lt;li&gt;Common DevOps teams pitfalls&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meteorops.com/blog/calculating-your-companys-required-devops-capacity" rel="noopener noreferrer"&gt;Calculate your team's required capacity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hire the right DevOps Engineers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can also apply these to existing DevOps teams and level-up your organization. &lt;br&gt;
Let's get started!&lt;/p&gt;




&lt;h2&gt;
  
  
  Polish your DevOps Philosophy
&lt;/h2&gt;

&lt;p&gt;You must first understand why organizations need DevOps, and how it can work in practice.  &lt;/p&gt;

&lt;p&gt;DevOps is an enabler role. &lt;/p&gt;

&lt;p&gt;It's meant to &lt;strong&gt;enable the developers to build, improve, and take ownership over the system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's break it down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build&lt;/strong&gt; = Create something new. Could be a new microservice, a new database, or a new monitoring dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improve&lt;/strong&gt; = Introduce a change into something that exists. Could be fixing a bug, changing a database schema, or changing an alert threshold.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Take ownership&lt;/strong&gt; = Take charge of problems that arise with what you built and improved. This means when something needs improvement, the owner is the one who does it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The above are what the developers should do.&lt;/p&gt;

&lt;p&gt;Now, &lt;strong&gt;DevOps should enable it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Note, to enable &lt;strong&gt;is not&lt;/strong&gt; to give full permissions and let them have fun.&lt;/p&gt;

&lt;p&gt;To enable is to give developers what they need to build, improve, and own the system.&lt;/p&gt;

&lt;p&gt;But, do it in a way that focuses the developers' energy in the right direction, and in a safe way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understand the DevOps Lead Responsibilities
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F96xldgwk618fcimt5vy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F96xldgwk618fcimt5vy3.png" alt="Image description" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You have 5 hats as a DevOps Lead:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Product (Platform)&lt;/strong&gt;&lt;br&gt;
Your clients are your company's developers.&lt;br&gt;
Provide them with tools, knowledge, and automations.&lt;br&gt;
&lt;strong&gt;Tools&lt;/strong&gt; = Polished automations.&lt;br&gt;
&lt;strong&gt;Automations&lt;/strong&gt; = Automated knowledge.&lt;br&gt;
&lt;strong&gt;Knowledge&lt;/strong&gt; = Hard-earned information &amp;amp; insights.&lt;br&gt;
Understand their requirements, and use Tools, Automations, and Knowledge to fulfill them.&lt;br&gt;
Understand why they want what they want: Is it because of an underlying issue with the system? If yes, solve it before building anything.&lt;br&gt;
If a tool or automation will save time, consider building or implementing it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Service&lt;/strong&gt;&lt;br&gt;
Don't let your developers wait until you do something "the right way".&lt;br&gt;
Sometimes they need immediate help to complete something.&lt;br&gt;
Help them first, and invest time later in automation and tooling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Project&lt;/strong&gt;&lt;br&gt;
Managing your DevOps team requires managing the work it does.&lt;br&gt;
Turn the team's philosophy into a mission.&lt;br&gt;
Turn the team's mission into goals.&lt;br&gt;
Turn the team's goals into a roadmap.&lt;br&gt;
Turn the team's roadmap into tasks.&lt;br&gt;
Prioritize the tasks.&lt;br&gt;
Set simple roles and responsibilities.&lt;br&gt;
Hold your team members accountable to progression.&lt;br&gt;
Make it easy to inform relevant team members on updates.&lt;br&gt;
Make it easy to consult with a teammate on a subject of their expertise.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;People&lt;/strong&gt;&lt;br&gt;
Each DevOps team member has type of work and tasks they enjoy more.&lt;br&gt;
One enjoys sharing knowledge, another enjoys being of service, and some enjoy building tools.&lt;br&gt;
Different teammates are also interested in different subjects: Monitoring, Infrastructure, CI/CD, etc.&lt;br&gt;
A team member that's working on what they enjoy is more fulfilled and productive.&lt;br&gt;
Strive to overlap each teammate's goals with the company's goals.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;br&gt;
You have 2 architectures to worry about.&lt;br&gt;
1) The company's product architecture (built by the developers).&lt;br&gt;
2) The DevOps platform's architecture (built by the DevOps team).&lt;br&gt;
Help the developers understand and control the application's effect on the infrastructure.&lt;br&gt;
Enable the developers to make informed decisions by providing context.&lt;br&gt;
Finally, build the platform to support the developers requirements.&lt;br&gt;
At every step, only limit decisions that damage the company.&lt;br&gt;
Examples: High cost, Stability impairment, Restricts observability, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Define Your DevOps Team's Mission Statement
&lt;/h2&gt;

&lt;p&gt;Here's one for you:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Enable the developers to build, improve, and own the system".&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's pretty minimal, so it's going to help your team stay focused.&lt;/p&gt;

&lt;p&gt;A healthy sign it catches on: When the team debates a decision regarding a task, they ask &lt;em&gt;"Does it help us enable the developers to build, improve, or own the system?"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That's when you win.&lt;/p&gt;




&lt;h2&gt;
  
  
  Set Useful DevOps Goals &amp;amp; Practices
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgkeqv0n8ruw33on4ubi6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgkeqv0n8ruw33on4ubi6.png" alt="Image description" width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your company's success will be determined by its speed and its product's quality.&lt;/p&gt;

&lt;p&gt;To make it happen, you should know programming is science, not maths - I'll explain.&lt;/p&gt;

&lt;p&gt;People used to think programming will be a mathematical discipline.&lt;br&gt;
They thought programmers will write functions and mathematically prove them.&lt;/p&gt;

&lt;p&gt;Not what happened - Programming is a scientific discipline.&lt;/p&gt;

&lt;p&gt;You write code, your test it, and you assume it's good - until one test fails.&lt;/p&gt;

&lt;p&gt;In essence, you're experimenting.&lt;/p&gt;

&lt;p&gt;You might ask: &lt;em&gt;"wtf? how's this related to setting useful goals?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The answer is that the first thing you want to enable is running experiments easily.&lt;/p&gt;

&lt;h3&gt;
  
  
  So here are some useful goals:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Developers can easily test their code in a consistent manner&lt;/li&gt;
&lt;li&gt;Production and testing environments are identical (Production will benefit from the quality of the tests)&lt;/li&gt;
&lt;li&gt;Developers can easily collaborate&lt;/li&gt;
&lt;li&gt;Developers can understand the state of the system and the impact of changes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Let's translate those goals into smaller goals or practices that will achieve the goals:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Developers can &lt;a href="https://www.meteorops.com/blog/one-click-environment-the-ultimate-devops-goal" rel="noopener noreferrer"&gt;create a testing/production environment with "One-Click"&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;There's a continuous integration process that enables the developers to collaborate by agreeing on the current up-to-date version of the system&lt;/li&gt;
&lt;li&gt;Auto-create dashboards and alerts for new services&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Set Guiding DevOps Principles
&lt;/h2&gt;

&lt;p&gt;Some useful DevOps principles that help save your team time, improve the speed of delivery, and keep the system healthy:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;PoC before doing things "the right way"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make it work, then make it better&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The entire system should be fully recoverable from Git&lt;/li&gt;
&lt;li&gt;Use tools with a big community and well-documented interface&lt;/li&gt;
&lt;li&gt;Equip key-developers with DevOps knowledge to be the first point-of-contact for their team members (super users)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Define the DevOps Team's Roadmap &amp;amp; Strategy
&lt;/h2&gt;

&lt;p&gt;Roadmap = Goals * Strategy.&lt;br&gt;&lt;br&gt;
Once you set the goals (as mentioned above), you can start prioritizing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;♯1 - The DevOps Categories&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enabling developers requires a DevOps Engineer to handle and enable the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Provision infrastructure&lt;/li&gt;
&lt;li&gt;Deploy workloads&lt;/li&gt;
&lt;li&gt;Monitor the system&lt;/li&gt;
&lt;li&gt;Recover from issues&lt;/li&gt;
&lt;li&gt;Scale up and down&lt;/li&gt;
&lt;li&gt;Track &amp;amp; test changes (Codebase Management)&lt;/li&gt;
&lt;li&gt;Secure the system&lt;/li&gt;
&lt;li&gt;Store &amp;amp; retrieve data&lt;/li&gt;
&lt;li&gt;Configure the system&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;♯2 - Examine each goal through each category&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every DevOps goal you set should be examined through the lens of each category.&lt;/p&gt;

&lt;p&gt;The reason is that together the categories cover each aspect of the building, improving, and owning of a software operation.&lt;/p&gt;

&lt;p&gt;Let's do an example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Goal: Create a "One-Click Environment Automation"&lt;/li&gt;
&lt;li&gt;Categories to address:

&lt;ul&gt;
&lt;li&gt;How should its infrastructure be provisioned?&lt;/li&gt;
&lt;li&gt;How should its workloads be deployed?&lt;/li&gt;
&lt;li&gt;How should its metrics and logs be sent, stored, and queried?&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;♯3 - Strategic Principles&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reach at least 50% capacity of working on the DevOps goals as soon as you responsibly can -
Support the developers and teach them how to self-support to achieve that&lt;/li&gt;
&lt;li&gt;Easy to modify &amp;gt; Perfect -
When you do something that isn't perfect due to a lack of time, do it in such a way that modifying it later on to improve it is easy&lt;/li&gt;
&lt;li&gt;Prerequisites first:
Codebase Management -&amp;gt; Infrastructure -&amp;gt; Deployment -&amp;gt; Configuration -&amp;gt; Data Management.&lt;/li&gt;
&lt;li&gt;At least moderate foundations quickly, reinforce later, but never weak foundations:
If you don't use any boilerplates, or if you are not proficient in something early on, and it's a foundation (like infrastructure), then don't give up and build weak foundations, but also don't over-invest and build strong ones if it's too time consuming.
Instead, moderately invest in the foundation, and revisit it later.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Set a Definition of Done
&lt;/h2&gt;

&lt;p&gt;Also known as a Definition of done.&lt;/p&gt;

&lt;p&gt;Ask the following questions for every single component in your system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;&lt;/em&gt;: Are there metrics, logs, traces, and alerts setup in an actionable way?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Availability&lt;/strong&gt;&lt;/em&gt;: Is there a mechanism to keep it alive during incidents?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Resiliency&lt;/strong&gt;&lt;/em&gt;: Can it recover from an error quickly?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Recovery&lt;/strong&gt;&lt;/em&gt;: Can it be fully restored to a previous state?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Testability&lt;/strong&gt;&lt;/em&gt;: Is it possible to test changes to it?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Deliverability&lt;/strong&gt;&lt;/em&gt;: Is there a process to release changes to it?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Persistency&lt;/strong&gt;&lt;/em&gt;: Will its data persist if the system is hindered?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Integrable&lt;/strong&gt;&lt;/em&gt;: Does it have a consistent and predictable interface allowing integration with it?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/em&gt;: Is it accessible only by the parts of the system that absolutely need it?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Dependencies&lt;/strong&gt;&lt;/em&gt;: Are its dependencies fully tracked and managed?&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Common DevOps Team Pitfalls
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Pitfall&lt;/strong&gt;&lt;/em&gt;: DevOps work blocks developers work&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Indicator&lt;/strong&gt;&lt;/em&gt;: Developers need to wait for DevOps team changes to complete before continuing work&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Cause&lt;/strong&gt;&lt;/em&gt;: The DevOps team doesn't utilize its own practices (AKA shoemaker's son always goes barefoot)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Pitfall&lt;/strong&gt;&lt;/em&gt;: Only support developers and maintain the system&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Indicator&lt;/strong&gt;&lt;/em&gt;: No progress on any DevOps goal or task&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Cause&lt;/strong&gt;&lt;/em&gt;: Either there are no clear DevOps goals or repeating developers requests haven't been automated&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Pitfall&lt;/strong&gt;&lt;/em&gt;: Adopting 'Best' practices instead of 'Suitable' practices&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Indicator&lt;/strong&gt;&lt;/em&gt;: Introducing methodologies and adhering to principles that go against the company's goals&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Cause&lt;/strong&gt;&lt;/em&gt;: Prioritizing methodology over company goals, usually because of a disconnect from the company goals or due to lack of DevOps experience&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Calculate Your DevOps Team's Required Capacity
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1tsndj0izl6nvyzlsre.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1tsndj0izl6nvyzlsre.png" alt="Image description" width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Required DevOps Capacity = &lt;a href="https://www.meteorops.com/blog/calculating-your-companys-required-devops-capacity" rel="noopener noreferrer"&gt;(Scale * Complexity) / Leverage&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leverage = Level of DevOps Engineers * Company Resources * Team Focus&lt;/li&gt;
&lt;li&gt;Scale = Number of instances of each component * Number of people in the organization&lt;/li&gt;
&lt;li&gt;Complexity = Number of components * Number of teams&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Hire the Right DevOps Engineers
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsk1skmru0gl08c1sy7a6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsk1skmru0gl08c1sy7a6.png" alt="devops engineers feedback" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The types of DevOps Engineers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Barrels vs. Ammo&lt;/strong&gt;&lt;br&gt;
~ Ammo = People who can complete tasks but won't initiate them.&lt;br&gt;
~ Barrel = People who understand what tasks are needed next but won't complete them.&lt;br&gt;
Interviewer Tip: During the technical interview with a candidate ask about past DevOps accomplishments, and ask how the tasks were created and who did them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Aspiration-Oriented vs. Prevention-Oriented&lt;/strong&gt;&lt;br&gt;
~ Aspiration-Oriented = Has goals, positive feedback encourages and focuses them while negative feedback discourages them and kicks them off track.&lt;br&gt;
~ Prevention-Oriented = Avoids problems, positive feedback makes them lay back and reduce capacity while negative feedback focuses them and keeps them on track.&lt;br&gt;
Interviewer tip: See if there's a common theme for projects the candidate did in the past. People focused on security tasks and deep attention to specific details are more likely to be prevention-oriented, while people who initiated many projects spanning multiple (DevOps) categories are more likely to be aspiration-oriented.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://www.meteorops.com/blog/devops-agency-vs-devops-consultancy-vs-devops-services-company" rel="noopener noreferrer"&gt;Working with service providers&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set clear desired results&lt;/strong&gt;&lt;br&gt;
And let the DevOps service provider assist in exploring the goal and provide perspective from other companies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expect transparency on progress&lt;/strong&gt;&lt;br&gt;
And judge it against the latest plan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expect clear planning&lt;/strong&gt;&lt;br&gt;
And make sure it has clear goals, takes into consideration the risks, and has a strategy that adheres to your DevOps principles.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Lots of stuff covered over this one-pager, and still much was left outside.&lt;/p&gt;

&lt;p&gt;If you take away 1 thing from it, let it be this: A simple DevOps team mission statement is the most significant thing you need.&lt;/p&gt;

&lt;p&gt;It sounds over-simplistic and abstract, but without it there is not guiding principle for how DevOps in the organization should look like.&lt;/p&gt;

&lt;p&gt;Hope you enjoyed, and send me an email at &lt;a href="mailto:michael@meteorops.com"&gt;michael@meteorops.com&lt;/a&gt; if there's anything else you'd like to see in here.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>teamwork</category>
      <category>infrastructureascode</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Deploy AWS Resources using Crossplane on Kubernetes</title>
      <dc:creator>Arthur Azrieli</dc:creator>
      <pubDate>Wed, 18 Sep 2024 23:50:11 +0000</pubDate>
      <link>https://forem.com/meteorops/deploy-aws-resources-using-crossplane-on-kubernetes-39i1</link>
      <guid>https://forem.com/meteorops/deploy-aws-resources-using-crossplane-on-kubernetes-39i1</guid>
      <description>&lt;p&gt;In this article we will be talking about Crossplane as an Infrastructure as Code (IaC) tool that is running on Kubernetes, why should we use it and how you configure AWS provider to start creating resources, we will be going through a full step by step example for you to be able to create your first resource with Crossplane&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is this article for?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DevOps engineers interested in learning another IaC tool&lt;/li&gt;
&lt;li&gt;Developers that want to take more Ops responsibility and provision their own infrastructure&lt;/li&gt;
&lt;li&gt;Engineering managers that are looking to implement an IaC tool in their company/startup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why am I writing this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I had some discussions with engineers that had some trouble to get started with Crossplane, it may be a little less straightforward than a well established tool like Terraform, some documentation isn’t precise for different use cases and providers and even ChatGPT’s code doesn’t seem to work at times. And here I am saving the day to make your life easier by giving you a step by step guide where you install and configure everything and deploy your first AWS resource using Crossplane.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why should you even use Crossplane then?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are certain use cases where Crossplane provides very powerful capabilities being able to create both applications and cloud resources, those can be used for ephemeral environments for example or for having a SaaS company provide full environments that could be self created by a tenant. Those environments could be created by just applying a Kubernetes manifest which is much simpler than starting to run traditional IaC plan and apply commands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How this article works&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We prepared a &lt;a href="https://github.com/MeteorOps/crossplane-aws-provider-bootstrap" rel="noopener noreferrer"&gt;repository with resources to deploy everything&lt;/a&gt; needed.&lt;/li&gt;
&lt;li&gt;We explain on each resource what it does.&lt;/li&gt;
&lt;li&gt;We walk you through how to deploy Crossplane.&lt;/li&gt;
&lt;li&gt;We deploy a S3 Bucket to make sure everything works.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Clone the repository and step into it&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/MeteorOps/crossplane-aws-provider-bootstrap.git cd crossplane-aws-provider-bootstrap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2. Make sure you have the required CLIs:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" rel="noopener noreferrer"&gt;Install the AWS CLI &amp;amp; Authenticate it with your AWS Account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pwittrock.github.io/docs/tasks/tools/install-kubectl/" rel="noopener noreferrer"&gt;Install the Kubectl CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://helm.sh/docs/intro/install/" rel="noopener noreferrer"&gt;Install the Helm CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;An existing Kubernetes cluster (&lt;a href="https://kind.sigs.k8s.io/docs/user/quick-start/" rel="noopener noreferrer"&gt;we’ll be using &lt;em&gt;kind&lt;/em&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Optional: Start a local kind cluster&lt;/strong&gt;&lt;/p&gt;

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

kind create cluster

open /Applications/Docker.app

kubectl cluster-info --context kind-kind
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Repository Overview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Link to the Github Repository: &lt;a href="https://github.com/MeteorOps/crossplane-aws-provider-bootstrap.git" rel="noopener noreferrer"&gt;https://github.com/MeteorOps/crossplane-aws-provider-bootstrap.git&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;creds&lt;/code&gt; file‍
AWS credentials - should be filled with your own AWS credentials&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;crossplane-provider-conf&lt;/code&gt; file
‍Uses the creds file to create a Crossplane ProviderConfig (separated into a different file because it takes time for this resource to be ready)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;crossplane-provider-bootstrap&lt;/code&gt; file
‍Creates the Crossplane AWS Provider, which enables creating AWS resources using Crossplane (and its dependencies):ServiceAccount, DeploymentRuntimeConfig, Provider, ClusterRole &amp;amp; ClusterRoleBindings&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bucket-definitions&lt;/code&gt; &amp;amp; &lt;code&gt;bucket-crd&lt;/code&gt; files
‍The Kubernetes Crossplane manifests that create a CompositeResourceDefinition and a Composition resource, which together define how to create a S3 Bucket (like a Terraform Module would).
Note: The ‘Composition’ resource relies on the ‘CompositeResourceDefinition’.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bucket-example&lt;/code&gt; file
‍The Kubernetes Crossplane manifest we’ll apply at the end to create a S3 bucket using Crossplane&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Deploy Crossplane
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Fill the creds file with your AWS access keys&lt;/strong&gt;&lt;br&gt;
Get your AWS IAM User (not an SSO user as it requires a token to work) access keys and fill them in the credentials file&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NOTE&lt;/strong&gt;: for production usage, please create a Crossplane IAM user and use its access keys, or preferably use something like IRSA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Deploy the Crossplane Helm Chart&lt;/strong&gt;&lt;br&gt;
Add the Helm repository from which the Crossplane Helm Charts will be fetched&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm repo add crossplane-stable https://charts.crossplane.io/stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Deploy Crossplane on your Kubernetes cluster in a new namespace named &lt;code&gt;crossplane-system&lt;/code&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm install crossplane crossplane-stable/crossplane --namespace crossplane-system --create-namespace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3. Examine your Crossplane Deployment&lt;/strong&gt;&lt;br&gt;
‍&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run the following command to get Crossplane's pods:&lt;/p&gt;

&lt;p&gt;kubectl get pods -n crossplane-system&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, you should see 2 pods: crossplane &amp;amp; crossplane-rbac-manager&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faxqutjua7awsf5f05pe5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faxqutjua7awsf5f05pe5.png" alt="Image description" width="512" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Provide Crossplane AWS access by creating a Kubernetes Secret&lt;/strong&gt;&lt;br&gt;
Insert your AWS credentials to the creds file and run the following from the same folder:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create secret generic aws-credentials -n crossplane-system --from-file=creds=./creds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Make sure the secret was created as expected:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run the following command:&lt;/p&gt;

&lt;p&gt;kubectl get secret aws-credentials -n crossplane-system&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should see the aws-credentials secret:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg0fmmxtlfwbfnuhbedw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg0fmmxtlfwbfnuhbedw1.png" alt="Image description" width="284" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Deploy the Crossplane AWS Provider&lt;/strong&gt;&lt;br&gt;
‍Creating a Crossplane AWS Provider requires creating a bunch of resources: ServiceAccount, DeploymentRuntimeConfig, Provider, ClusterRole &amp;amp; ClusterRoleBindings, and ProviderConfig&lt;br&gt;
We divided the resources creation into 2 phases:&lt;/p&gt;

&lt;p&gt;1 - &lt;code&gt;crossplane-provider-bootstrap.yaml&lt;/code&gt;:&lt;br&gt;
ServiceAccount, DeploymentRuntimeConfig, Provider, ClusterRole &amp;amp; ClusterRoleBindings&lt;/p&gt;

&lt;p&gt;2- &lt;code&gt;crossplane-provider-conf.yaml&lt;/code&gt;:&lt;br&gt;
ProviderConfig&lt;/p&gt;

&lt;p&gt;The reason for dividing it into 2 phases is that the creation of the ProviderConfig fails if we attempt to create it before the first set of Provider resources and dependencies is ready&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create the Provider Kubernetes resources using the bootstrap YAML file:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run the following command:&lt;/p&gt;

&lt;p&gt;kubectl apply -f crossplane-provider-bootstrap.yaml&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Validate the creation readiness of the Provider &amp;amp; wait for it to be ready:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run the following command to see the AWS Provider resource:&lt;/p&gt;

&lt;p&gt;kubectl get provider&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should see something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0bkbbbz0lj0fdz3rp84.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0bkbbbz0lj0fdz3rp84.png" alt="Image description" width="284" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It might take 1-2 minutes to become Healthy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create the ProviderConfig resource &amp;amp; Validate its creation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run the following command:&lt;/p&gt;

&lt;p&gt;kubectl apply -f crossplane-provider-conf.yaml &amp;amp;&amp;amp; kubectl get providerconfig&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0f7xtqpzju4148lkpk93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0f7xtqpzju4148lkpk93.png" alt="Image description" width="135" height="38"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a S3 Bucket using Crossplane
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Create the CompositeResourceDefinition to define a S3 Bucket:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run the following command:&lt;/p&gt;

&lt;p&gt;kubectl apply -f bucket-definitions.yaml&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fve1toh0l0zuhuodmh73q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fve1toh0l0zuhuodmh73q.png" alt="Image description" width="800" height="63"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create the Composition to define a S3 Bucket:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run the following command:&lt;/p&gt;

&lt;p&gt;kubectl apply -f bucket-crd.yaml&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5yzsqfsbk6uutpziqte4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5yzsqfsbk6uutpziqte4.png" alt="Image description" width="800" height="80"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create the S3 Bucket Crossplane resource in Kubernetes:&lt;/strong&gt; &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f bucket-example.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;When we installed the AWS Provider, it was installed with some Crossplane CRDs of the AWS Provider.&lt;br&gt;
One of those CRDs is ‘bucket’.&lt;/p&gt;

&lt;p&gt;Now we can check if the bucket was created by running &lt;code&gt;kubectl get bucket&lt;/code&gt; against our Kubernetes cluster&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmyltq64j5y2gy8pmhp33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmyltq64j5y2gy8pmhp33.png" alt="Image description" width="346" height="37"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check if the S3 Bucket was created in AWS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;‍List you AWS S3 buckets and search for the newly created one:&lt;/p&gt;

&lt;p&gt;aws s3 ls&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5beu0dr209l46wnopggm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5beu0dr209l46wnopggm.png" alt="Image description" width="315" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Teardown &amp;amp; Cleanup
&lt;/h2&gt;

&lt;p&gt;We’ll start by deleting the S3 Bucket Crossplane resource in Kubernetes, which will end up deleting the resource in AWS.&lt;br&gt;
Eventually, if we used &lt;code&gt;kind&lt;/code&gt; to spin up a local Kubernetes cluster, we’ll terminate the cluster to keep our workstation nice and clean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delete the S3 Bucket resource:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl delete -f bucket-example.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If used kind delete the cluster:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kind delete cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Useful Debugging Commands
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get provider


kubectl logs -n crossplane-system deploy/crossplane -c crossplane


kubectl logs -n crossplane-system -l pkg.crossplane.io/provider=provider-aws
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>crossplane</category>
      <category>aws</category>
      <category>kubernetes</category>
      <category>devops</category>
    </item>
    <item>
      <title>Deploy Apache Airflow on AWS Elastic Kubernetes Service (EKS)</title>
      <dc:creator>Saksham Awasthi</dc:creator>
      <pubDate>Fri, 23 Aug 2024 11:44:55 +0000</pubDate>
      <link>https://forem.com/meteorops/deploy-apache-airflow-on-aws-elastic-kubernetes-service-eks-5406</link>
      <guid>https://forem.com/meteorops/deploy-apache-airflow-on-aws-elastic-kubernetes-service-eks-5406</guid>
      <description>&lt;p&gt;It’s not trivial to run your data pipelines smoothly.&lt;/p&gt;

&lt;p&gt;Apache Airflow is an excellent option as it has many features and integrations, but it could be better. It requires a lot of heavy lifting to make its infrastructure scalable.&lt;/p&gt;

&lt;p&gt;That’s where deploying Apache Airflow on Kubernetes comes in. It enables you to orchestrate multiple DAGs in parallel on multiple types of machines, leverage Kubernetes to autoscale nodes, monitor the pipelines, and distribute the processing. &lt;/p&gt;

&lt;p&gt;This guide will help you prepare your EKS environment, deploy Airflow, and integrate it with essential add-ons. You will also learn about a few suggestions for making your Airflow production grade. &lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you deploy Apache Airflow, ensure you have all the prerequisites: eksctl, kubectl, helm, and an EKS Cluster.&lt;/p&gt;

&lt;p&gt;We’ll be using eksctl to create the EKS Cluster, but feel free to skip it if you already have one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup the AWS &amp;amp; EKSCTL CLIs
&lt;/h3&gt;

&lt;p&gt;1.Install the AWS CLI: (skip to step 2 if you already have the CLI installed)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please refer to the &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" rel="noopener noreferrer"&gt;full AWS installation guide&lt;/a&gt; for other operating systems and architectures.&lt;/p&gt;

&lt;p&gt;Once Installed, we have to configure the AWS cli on the local machine. Refer to this &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-quickstart.html" rel="noopener noreferrer"&gt;AWS guide about configuring the CLI locally.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Install the eksctl CLI:  (skip to step 3 if you already have eksctl installed)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl --location "https://github.com/weaveworks/eksctl/releases/download/0.104.0/eksctl_Linux_amd64.tar.gz" | tar xz -C /tmp sudo mv /tmp/eksctl /usr/local/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also refer to the &lt;a href="https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/emr-eks.html" rel="noopener noreferrer"&gt;eksctl installation guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create the AWS EKS (Elastic Kubernetes Service) Cluster
&lt;/h3&gt;

&lt;p&gt;Create an EKS Cluster: (skip to the next section if you already have a cluster)&lt;br&gt;
You can create an EKS Cluster directly from the AWS management console or &lt;br&gt;
using the eksctl cluster command.&lt;/p&gt;

&lt;p&gt;Run the below command to create an EKS cluster in a public subnet in the Oregon region.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eksctl create cluster --name airflow-cluster --region us-west-2 --nodegroup-name standard-workers --node-type t3.medium --nodes 3 --nodes-min 1 --nodes-max 4 --managed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can find a detailed blog on &lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html" rel="noopener noreferrer"&gt;setting up an EKS Cluster&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connect to the EKS Cluster from your local machine
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Install kubectl in your local machine using
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Refer to the &lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html" rel="noopener noreferrer"&gt;AWS kubectl &amp;amp; eksctl configuration guide&lt;/a&gt; for other operating systems and architectures.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After setting up your cluster, you must access it from your local machine. The below command will update the “kubeconfig” file.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws eks --region us-west-2 update-kubeconfig --name airflow-cluster

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setup Helm Locally
&lt;/h3&gt;

&lt;p&gt;Run the below command to install Helm on your local machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Refer to the &lt;a href="https://helm.sh/docs/intro/install/" rel="noopener noreferrer"&gt;Helm installation guide&lt;/a&gt; for other operating systems and architectures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Support Dynamic Volume Provisioning for Persistent Storage using EBS
&lt;/h3&gt;

&lt;p&gt;For an elastic scalable service, dynamic volume provisioning is preferred. Persistent storage must be configured and registered. &lt;/p&gt;

&lt;p&gt;Follow this guide to set up &lt;a href="https://medium.com/@ivan.katliarchuk/k8s-dynamic-provisioning-of-persistent-volumes-on-aws-449902f9c69e" rel="noopener noreferrer"&gt;Amazon EBS CSI Driver Add-On and Dynamic Volume&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Airflow?
&lt;/h3&gt;

&lt;p&gt;Apache Airflow is an open-source system for scheduling and enhanced data pipeline orchestration or workflows. In simple terms, Apache Airflow is an ETL/ELT tool. &lt;/p&gt;

&lt;p&gt;You can &lt;strong&gt;create, schedule, and monitor&lt;/strong&gt; complex workflows in Apache Airflow. &lt;/p&gt;

&lt;p&gt;You can connect multiple data sources with Airflow and send pipeline success or failure alerts in Slack or Email. In Airflow, you must define Python workflows, represented by &lt;strong&gt;Directed Acyclic Graph (DAG)&lt;/strong&gt;. Airflow can be deployed anywhere, and after deploying, you can access Airflow UI and set up workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use cases of Airflow:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data ETL Automation&lt;/strong&gt;: Streamline the extraction, transformation, and loading of data from various sources into storage systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Processing&lt;/strong&gt;: Schedule and oversee tasks like data cleansing, aggregation, and enrichment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Migration&lt;/strong&gt;: Manage data transfer between different systems or cloud platforms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Training&lt;/strong&gt;: Automate the training of machine learning models on large datasets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reporting&lt;/strong&gt;: Generate and distribute reports and analytics dashboards automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow Automation&lt;/strong&gt;: Coordinate complex processes with multiple dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IoT Data&lt;/strong&gt;: Analyze and process data from IoT devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow Monitoring&lt;/strong&gt;: Track workflow progress and receive alerts for issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Benefits of using Airflow in Kubernetes
&lt;/h3&gt;

&lt;p&gt;Deploying Apache Airflow on a Kubernetes cluster offers several advantages over deploying it on a virtual machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Kubernetes allows you to scale your Airflow deployment horizontally by adding more pods to handle increased workloads automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolation&lt;/strong&gt;: Enables running different tasks of the same pipeline on various cluster nodes by deploying each task as an isolated pod.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation&lt;/strong&gt;: Kubernetes native capabilities, like auto-scaling, self-healing, and rolling updates, reduce manual intervention, improving operational efficiency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portability&lt;/strong&gt;: Deploying on Kubernetes makes your Airflow setup more portable across different environments, whether on-premise or cloud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration&lt;/strong&gt;: Kubernetes integrates seamlessly with various tools for monitoring, logging, and security, enhancing the overall management of your Airflow deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Airflow Architecture Diagram
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fszvletxbttveuut5lz39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fszvletxbttveuut5lz39.png" alt="Image description" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The airflow components are the Executor, Scheduler, Web Server, and Airflow database. The Airflow worker and Triggerer are also involved.&lt;/li&gt;
&lt;li&gt;As you can see in the above diagram, the Data Engineer writes Airflow DAGs. Airflow DAGs are collections of tasks that specify the dependencies between them and the order in which they are executed. A DAG is a file that contains your Python code. &lt;/li&gt;
&lt;li&gt;The Scheduler picks up these DAGs and has the config to run the tasks specified in the DAGs.&lt;/li&gt;
&lt;li&gt;In the above diagram, the Scheduler runs tasks using Kubernetes Executor and creates a separate pod for every task, which provides isolation. &lt;/li&gt;
&lt;li&gt;Airflow also stores pipeline metadata in an external database. The main configuration file used by the Web server, Scheduler, and workers is airflow.cfg. &lt;/li&gt;
&lt;li&gt;The Data Engineer can view the entire flow through the Airflow UI. Users can also check the logs, monitor the pipelines, and set alerts.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Airflow Deployment Options
&lt;/h2&gt;

&lt;p&gt;When deploying Apache Airflow, there are multiple approaches to consider, each with unique advantages and challenges. Let us see the different deployment examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon Managed Workflows for Apache Airflow (MWAA)&lt;/strong&gt;&lt;br&gt;
You should configure the service through the AWS Management Console. There, you can define your environment, set up necessary permissions, and integrate with other AWS services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Google Cloud Composer&lt;/strong&gt;:&lt;br&gt;
Create an environment using the Google Cloud Console and integrate with Google Cloud services like BigQuery and Google Cloud Storage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Azure Data Factory with Airflow Integration&lt;/strong&gt;:&lt;br&gt;
Try to Configure Airflow through the Azure Portal. Integrate with other Azure services for efficient workflow automation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Self-hosted on AWS EC2&lt;/strong&gt;:&lt;br&gt;
We can launch and configure EC2 instances. We must install Airflow, set up the environment, configure databases, and set up the scheduler.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Running on Kubernetes (e.g., AWS EKS)&lt;/strong&gt;:&lt;br&gt;
We can create Kubernetes clusters, deploy Airflow using Helm charts or custom YAML files, and manage container orchestration and scaling.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the different options or ways to deploy Airflow, but we are focusing on Amazon Web Service EKS to deploy Airflow, so let us see this in the below section.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy Airflow on AWS EKS
&lt;/h2&gt;

&lt;p&gt;Let us install Apache Airflow in the EKS cluster using the helm chart.&lt;/p&gt;

&lt;p&gt;1.Create a new namespace.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create namespace airflow 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmj1r6z2ny1kgw01mmjge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmj1r6z2ny1kgw01mmjge.png" alt="Image description" width="800" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Add the Helm chart repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm repo add apache-airflow https://airflow.apache.org 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.Update your Helm repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm repo update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4.Deploy Airflow using the remote Helm Chart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm install airflow apache-airflow/airflow --namespace airflow   --debug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will get the Airflow webserver and default Postgres connection credentials in the output. Copy them and save them somewhere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal8mx385waj0x59bsifv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal8mx385waj0x59bsifv.png" alt="Image description" width="800" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Examine the deployments by getting the Pods&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Kubectl get pods -n airflow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp4dnjgow0cray5hvuwsh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp4dnjgow0cray5hvuwsh.png" alt="Image description" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Airflow instance is set up in EKS. All the airflow pods should be running.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let’s prepare Airflow to run our first DAG
&lt;/h3&gt;

&lt;p&gt;At this point, Airflow is deployed using the default configuration. Let's see how we can get the default values from the helm chart on our local machine, modify it, and update a new release.&lt;/p&gt;

&lt;p&gt;1.Save the configuration values from the helm chart by running the below command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm show values apache-airflow/airflow &amp;gt; values.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhblxu90opcjplkhonim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhblxu90opcjplkhonim.png" alt="Image description" width="800" height="89"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This command generates a file named &lt;code&gt;values.yaml&lt;/code&gt; in your current directory, which you can modify and save as needed.&lt;/p&gt;

&lt;p&gt;2.Check the release version of the helm chart by running the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm ls -n airflow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu53r6dyskahz4bsz36y5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu53r6dyskahz4bsz36y5.png" alt="Image description" width="800" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Let us add the ingress configuration to access the airflow instance over the internet. &lt;/p&gt;

&lt;p&gt;We need to deploy an ingress controller in the EKS cluster first. The commands below will install the NGINX ingress controller from the helm repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install nginx-ingress ingress-nginx/ingress-nginx --namespace airflow-ingress --create-namespace --set controller.replicaCount=2
kubectl get pods -n airflow-ingress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fags2uy91fsd3gkm5jher.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fags2uy91fsd3gkm5jher.png" alt="Image description" width="800" height="79"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note - All the pods should be running.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get service nginx-ingress-controller --namespace airflow-ingress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for the external IP in the output of the get service command.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9ehvyw889ztv1puh7vo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9ehvyw889ztv1puh7vo.png" alt="Image description" width="800" height="33"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After installing the ingress controller, add the required configuration in the values.yaml file and save the file. There is a section dedicated to the ingress configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Ingress configuration
ingress:
  enabled: true
  web:
    enabled: true
    annotations: {}
    path: "/"
    pathType: "ImplementationSpecific"
    host: &amp;lt;your domain URL&amp;gt;
    ingressClassName: "nginx"

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

&lt;/div&gt;



&lt;p&gt;After the changes to the values in the values.yaml file, we run the helm upgrade command to deploy the changes and create a new release version.&lt;/p&gt;

&lt;p&gt;By default, the Helm Chart deploys its own Postgres instance, but using a managed Postgres instance is recommended instead.&lt;/p&gt;

&lt;p&gt;You can modify the Helm Chart’s &lt;code&gt;values.yaml&lt;/code&gt; file to add  configuration of the managed database and volumes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;metadataConnection:
             user: postgres
             pass: postgres
             protocol: postgresql
             host: &amp;lt;YOUR_POSTGRES_HOST&amp;gt;
             port: 5432
             db: postgres
             sslmode: disable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the helm upgrade command to implement the changes done above.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm upgrade --install airflow apache-airflow/airflow -n airflow -f values.yaml --debug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ful1wb8nlf1t8c3g3475n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ful1wb8nlf1t8c3g3475n.png" alt="Image description" width="800" height="73"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check the release version after the above command is run successfully. You should observe that the revision has changed to 2.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7imf5dmeyv37a8g7hg9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7imf5dmeyv37a8g7hg9.png" alt="Image description" width="800" height="53"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessing Airflow UI
&lt;/h2&gt;

&lt;p&gt;We will use port-forwarding to access the Airflow UI in this tutorial. Run the below command and access “localhost:8080” on the browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl port-forward svc/airflow-webserver 8080:8080 -n airflow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc17rbs3haoarv7sywtkr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc17rbs3haoarv7sywtkr.png" alt="Image description" width="800" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use the default webserver credentials saved in the above section, “Installing Airflow Helm chart.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzkrcabwek6dyvhdrn28w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzkrcabwek6dyvhdrn28w.png" alt="Image description" width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, Airflow is set up and is accessible. Hurray 😀&lt;/p&gt;

&lt;p&gt;You can also access the UI over your domain, which is added in the ingress configuration in the above section.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create your first Airflow DAG (in Git)
&lt;/h2&gt;

&lt;p&gt;No DAGs have been added to our Airflow deployment yet. Let us see how we can add them.&lt;/p&gt;

&lt;p&gt;To Set up a private GitHub repository for DAG, you can create a new one using the &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;Github website's UI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7d53i6bapja07at6tzf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7d53i6bapja07at6tzf.png" alt="Image description" width="800" height="841"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also install the git command line interface on your local machine and run commands to initialize an empty git repo.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adding DAG configs to the git repo
&lt;/h3&gt;

&lt;p&gt;Once the git repo is initialized, create a DAG file like “sample_dag.py” and push it to the remote branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
git commit -m 'Adding first DAG'
git remote add origin
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Integrate Airflow with a private Git repo
&lt;/h3&gt;

&lt;p&gt;To integrate Airflow with a private Git repository, you will need credentials, i.e. username /password or an SSH key.&lt;/p&gt;

&lt;p&gt;We will use the SSH key to connect to the git repo. Skip the first step below if the SSH Key already exists in your Github account.&lt;/p&gt;

&lt;p&gt;1.[Skip if it already exists] Generate an SSH key in your local machine and add it to the GitHub account (If not already present).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-keygen -t ed25519 -C "&amp;lt;mailaddress&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.Create a generic secret in the namespace where airflow is deployed. This secret contains your SSH key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create secret generic airflow-ssh-git-secret --from-file=gitSshKey=&amp;lt;path to SSH private key&amp;gt; -n airflow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.Update the Git configuration in values.yaml file and run helm update command like in the above section.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gitSync:
    enabled: true
    repo: &amp;lt;your private Git repository URL&amp;gt;
    branch: &amp;lt;Branch-name&amp;gt;
    rev: HEAD
    depth: 1
    maxFailures: 0
    subPath: ""
sshKeySecret: airflow-ssh-git-secret

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

&lt;/div&gt;



&lt;p&gt;Below is a “sample_dag.py” that demonstrates a simple workflow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2024, 8, 8),
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
}
dag = DAG('hello_world', default_args=default_args, schedule_interval=timedelta(days=1))
t1 = BashOperator(
    task_id='say_hello',
    bash_command='echo "Hello World from Airflow!"',
    dag=dag,
)

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

&lt;/div&gt;



&lt;p&gt;Upon completion, you can see the DAGs in the UI interface. Airflow automatically detects new DAGs, but you can manually refresh the DAGs list in the Airflow UI by clicking the "Refresh" button on the DAGs page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwheq6dzexduwsjx43ux.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwheq6dzexduwsjx43ux.png" alt="Image description" width="800" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9t7c75qgudzbf795rg1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9t7c75qgudzbf795rg1r.png" alt="Image description" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcaemitmzej1jybx3ziin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcaemitmzej1jybx3ziin.png" alt="Image description" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The UI has many options/settings to experiment with, such as code, graphs, audit logs, etc.&lt;/p&gt;

&lt;p&gt;You can also check the EKS cluster’s activity and DAG dashboard from the Activity tab.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lbw1vsrz0mec24u64sa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lbw1vsrz0mec24u64sa.png" alt="Image description" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57k4l1523ep39kgbkdcn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57k4l1523ep39kgbkdcn.png" alt="Image description" width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Run the Airflow job
&lt;/h3&gt;

&lt;p&gt;DAGs can be scheduled to run or triggered manually from the UI interface. There is a run button on the rightmost side of the DAG table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvs7ariyi88a173iqmafb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvs7ariyi88a173iqmafb.png" alt="Image description" width="800" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, it can be triggered from within the DAG.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88nhvmb4krkbsw1nz89t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88nhvmb4krkbsw1nz89t.png" alt="Image description" width="800" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Make your Airflow on Kubernetes Production-Grade
&lt;/h2&gt;

&lt;p&gt;Apache Airflow is a powerful tool for orchestrating workflows, but making it production-ready requires careful attention to several key areas. &lt;/p&gt;

&lt;p&gt;Below, we explore strategies to enhance security, performance, monitoring, and ensure high availability in your Airflow deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improved Security
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Role-Based Access Control (RBAC)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Enable RBAC in Airflow to ensure only authorized users can access specific features and data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits&lt;/strong&gt;: Limits access to critical areas and reduces the risk of unauthorized changes or data breaches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to the &lt;a href="https://airflow.apache.org/docs/apache-airflow-providers-fab/stable/auth-manager/access-control.html" rel="noopener noreferrer"&gt;Access Control guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  b. Secrets Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Integrate with external secret management tools like AWS Secrets Manager, HashiCorp Vault, or Kubernetes secrets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits&lt;/strong&gt;: Securely store sensitive information like API keys and database passwords, keeping them out of your codebase.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to this AWS documentation about &lt;a href="https://docs.aws.amazon.com/secretsmanager/latest/userguide/integrating_csi_driver.html" rel="noopener noreferrer"&gt;Secrets management in EKS&lt;/a&gt;, as well as this guide to use &lt;a href="https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/stable/_modules/tests/system/providers/cncf/kubernetes/example_kubernetes.html" rel="noopener noreferrer"&gt;Kubernetes secrets in Airflow DAG&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  c. Network Security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Use network policies and security groups to restrict Airflow's web interface and API access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits&lt;/strong&gt;: Minimizes exposure to potential attacks by limiting network access to trusted sources only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to this guide to implement &lt;a href="https://aws.github.io/aws-eks-best-practices/security/docs/network/" rel="noopener noreferrer"&gt;Network Security in EKS&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improved Performance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Optimized Resource Allocation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Right-size your Kubernetes pods and nodes based on the workload demand. Use Kubernetes Horizontal Pod Autoscaler (HPA) to scale Airflow resources dynamically and cluster autoscaler to scale nodes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits&lt;/strong&gt;: Ensures efficient use of resources, reduces costs, and prevents bottlenecks during peak loads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Airflow uses &lt;a href="https://www.restack.io/docs/airflow-kubernetes-executor" rel="noopener noreferrer"&gt;Executors for Autoscaling pods&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Refer to this generic guide on &lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/horizontal-pod-autoscaler.html" rel="noopener noreferrer"&gt;Implementing HPA &lt;/a&gt;and &lt;a href="https://aws.github.io/aws-eks-best-practices/cluster-autoscaling/" rel="noopener noreferrer"&gt;Cluster Autoscaler in EKS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;HPA will autoscale the different Airflow components, while the Cluster Autoscaler will make sure there are nodes to satisfy those requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  b. Task Parallelism
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Configure Airflow to handle parallel task execution by optimizing the number of worker pods and setting appropriate concurrency limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits&lt;/strong&gt;: Accelerates workflow execution by running multiple tasks simultaneously, improving overall performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out this guide for &lt;a href="https://www.astronomer.io/docs/learn/airflow-scaling-workers#:~:text=Airflow%20has%20many%20parameters%20that,wide%20variety%20of%20use%20cases." rel="noopener noreferrer"&gt;Implementing parallelism in Airflow&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  c. Use of ARM Instances
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Consider running workloads on ARM-based instances like AWS Graviton for cost efficiency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits&lt;/strong&gt;: ARM instances often provide a better cost-to-performance ratio, especially for compute-intensive tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick guide to Creating &lt;a href="https://eksctl.io/usage/arm-support/" rel="noopener noreferrer"&gt;an EKS cluster with ARM instances&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  d. Use of HTTPS for ingress host
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Consider having HTTPS for the Airflow URL using TLS/SSL certificates with the Ingress controller in Kubernetes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits&lt;/strong&gt;: HTTPS encrypts data to enhance the security of information being transferred. This is especially crucial when handling sensitive data, as encryption helps protect it from unauthorized access during transmission.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to this guide to &lt;a href="https://cert-manager.io/docs/tutorials/acme/nginx-ingress/" rel="noopener noreferrer"&gt;Install NGINX ingress and configure TLS&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitoring
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Metrics Collection and Alerting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Integrate Airflow with Prometheus to collect metrics on task performance, resource usage, and system health. Tools like Grafana or Prometheus Alertmanagercan can set up alerts based on critical metrics and log events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits&lt;/strong&gt;: It provides visibility into Airflow’s performance, allowing you to identify and address issues proactively and enabling quick response to potential problems, reducing downtime and maintaining workflow reliability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to the “&lt;a href="https://www.redhat.com/en/blog/monitoring-apache-airflow-using-prometheus#:~:text=The%20statsd_exporter%20aggregates%20the%20metrics,viewed%20in%20the%20Grafana%20dashboard." rel="noopener noreferrer"&gt;How to set up Prometheus and Grafana with Airflow&lt;/a&gt;” guide.&lt;/p&gt;

&lt;h3&gt;
  
  
  b. Logs Collection
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Set up centralized logging with tools like Elasticsearch, Logstash, Kibana (ELK stack or EFK stack), or Grafana Loki.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits&lt;/strong&gt;: Simplifies troubleshooting by consolidating logs from all Airflow components into a single, searchable interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to the guide on how to &lt;a href="https://medium.com/@keyshelltechs/setup-efk-stack-on-amazon-eks-cluster-80049bfd74d1" rel="noopener noreferrer"&gt;Setup Elastic, Fluentd, and Kibana on EKS&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  High Availability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Redundant Components
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Deploy multiple replicas of Airflow’s web server, scheduler, and worker nodes to ensure redundancy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits&lt;/strong&gt;: Increases resilience by preventing single points of failure, ensuring that workflows continue even if one component goes down.
To deploy multiple pods in Apache Airflow using a Helm chart, follow these steps:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;1.Set Replicas for the Scheduler:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In your values.yaml file set the scheduler.replicas to the desired number of replicas. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scheduler:
  replicas: 2

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2.Set Replicas for the Web Server:&lt;/strong&gt;&lt;br&gt;
Similarly, set the web.replicas to deploy multiple web server pods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web:
  replicas: 2

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3.Deploy the Helm Chart:&lt;/strong&gt;&lt;br&gt;
Apply the Helm chart with the updated values.yaml file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm upgrade --install airflow apache-airflow/airflow -f values.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This configuration ensures that multiple scheduler and web server pods are deployed, contributing to the high availability of your Airflow setup.&lt;br&gt;
&lt;a href="https://github.com/apache/airflow/blob/main/chart/values.yaml" rel="noopener noreferrer"&gt;Airflow helm chart’s value.yaml file&lt;/a&gt; can be found here.&lt;/p&gt;

&lt;h3&gt;
  
  
  b. Database High Availability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Use a highly available database solution like Amazon RDS with Multi-AZ deployment for Airflow’s metadata database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits&lt;/strong&gt;: Ensures continuous operation and data integrity even during a database failure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to &lt;a href="https://aws.amazon.com/blogs/aws/amazon-rds-multi-az-db-cluster/" rel="noopener noreferrer"&gt;Amazon RDS with the Multi-AZ deployment guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  c. Backup and Disaster Recovery
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Regularly backup Airflow’s database and configuration files. Implement a disaster recovery plan that includes rapid failover procedures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits&lt;/strong&gt;: Protects against data loss and enables quick recovery in case of catastrophic failures.
Read this document to set up &lt;a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ManagingAutomatedBackups.html" rel="noopener noreferrer"&gt;automated backups in Amazon RDS&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to this AWS page to learn about “&lt;a href="https://aws.amazon.com/blogs/containers/backup-and-restore-your-amazon-eks-cluster-resources-using-velero/" rel="noopener noreferrer"&gt;Backup and Restore of EKS&lt;/a&gt;.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Setting up Apache Airflow on Amazon EKS is a powerful way to manage your workflows at scale, but it requires careful planning and configuration to ensure it’s production-ready. Following this guide, you've deployed Airflow on EKS, created a simple DAG, connected Airflow with a private Git repository, and learned about different ways to implement security, performance, high availability, monitoring, and logging. With these optimizations, your Airflow deployment is now more efficient, cost-effective, and ready to handle the demands of real-world data orchestration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. What is Apache Airflow?&lt;/strong&gt;&lt;br&gt;
Apache Airflow is an open-source tool that helps in orchestrating and managing workflows through Directed Acyclic Graphs (DAGs). It automates complex processes like ETL (Extract, Transform, Load) jobs, machine learning pipelines, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.Why deploy Airflow on Amazon EKS?&lt;/strong&gt;&lt;br&gt;
Deploying Airflow on Amazon EKS offers scalability, flexibility, and robust workflow management. EKS simplifies &lt;a href="https://www.meteorops.com/technologies/kubernetes" rel="noopener noreferrer"&gt;Kubernetes management&lt;/a&gt;, allowing you to focus on scaling and securing your Airflow environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. What are the prerequisites for deploying Airflow on EKS?&lt;/strong&gt;&lt;br&gt;
You need an AWS account, an EKS cluster, kubectl configured on your local environment, a dynamic storage class using EBS volumes, and Helm for package management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. How do I monitor Airflow on EKS?&lt;/strong&gt;&lt;br&gt;
You can integrate Prometheus and Grafana for monitoring. Using Loki for log aggregation can also help in centralized log management and troubleshooting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. What Kubernetes add-ons are recommended for a production-grade Airflow setup?&lt;/strong&gt;&lt;br&gt;
Essential add-ons include External Secret Operator for secure secrets management, Prometheus and Grafana for monitoring, and possibly Loki for logging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Can Airflow be integrated with external databases like RDS?&lt;/strong&gt;&lt;br&gt;
Yes, it’s common to configure Airflow to use an external PostgreSQL database hosted on Amazon RDS for production environments, providing reliability and scalability for your metadata storage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. How can I access the Airflow UI on EKS?&lt;/strong&gt;&lt;br&gt;
You can access the Airflow UI by setting up a LoadBalancer service or using an Ingress Controller with a DNS pointing to your load balancer for easy access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. How do I manage DAGs in a production environment?&lt;/strong&gt;&lt;br&gt;
For production, it’s advisable to store your DAGs in a private Git repository and integrate Airflow with this repo using GitSync to pull the latest DAG configurations automatically.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Terraform Starter Boilerplate for GCP using Terragrunt</title>
      <dc:creator>Arthur Azrieli</dc:creator>
      <pubDate>Fri, 26 Apr 2024 11:16:24 +0000</pubDate>
      <link>https://forem.com/meteorops/terraform-starter-boilerplate-for-gcp-using-terragrunt-5efg</link>
      <guid>https://forem.com/meteorops/terraform-starter-boilerplate-for-gcp-using-terragrunt-5efg</guid>
      <description>&lt;h2&gt;
  
  
  The Boilerplate Github Repositories (stars are welcome ⭐)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What you deploy: &lt;a href="https://github.com/MeteorOps/terragrunt-gcp-projects"&gt;https://github.com/MeteorOps/terragrunt-gcp-projects&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Modules you can use: &lt;a href="https://github.com/MeteorOps/terraform-gcp-modules"&gt;https://github.com/MeteorOps/terraform-gcp-modules&lt;/a&gt;
‍&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Terraform mistakes that made me build this boilerplate
&lt;/h2&gt;

&lt;p&gt;I built this boilerplate for a reason.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I saw what companies regret with how they implemented Terraform:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing all of the Terraform code in one &lt;code&gt;main.tf&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Copy-pasting resources manually&lt;/li&gt;
&lt;li&gt;Copy-pasting configuration throughout the codebase&lt;/li&gt;
&lt;li&gt;No state separation and environment awareness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This is why they regretted the above:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One terraform apply could ruin an entire environment&lt;/li&gt;
&lt;li&gt;Resources modifications required changes in multiple locations&lt;/li&gt;
&lt;li&gt;Configuration modifications required changes in multiple locations&lt;/li&gt;
&lt;li&gt;Accidentally deploying the wrong resources to the wrong environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And so, I built this boilerplate for our clients (and you) to minimize regrets.&lt;/p&gt;

&lt;p&gt;The focus of this boilerplate is managing GCP resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is this boilerplate for you?
&lt;/h2&gt;

&lt;p&gt;If you're a CTO, a DevOps lead embarking on a new project on GCP, or simply in search of a template to organize your Terraform repositories, this project is for you. Finding a well-structured example for deploying GCP resources can be challenging. My own search for such a template was unfruitful, leading me to develop a solution that I've decided to share openly and discuss in this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should you expect from this guide?
&lt;/h2&gt;

&lt;p&gt;By the conclusion of this guide, you'll have a thorough understanding of how to establish Terraform repositories using a best-practice folder structure for provisioning GCP resources. You'll also be equipped to execute a straightforward demo, witnessing an end-to-end workflow in action.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shouldn't you expect from this guide?
&lt;/h2&gt;

&lt;p&gt;An exhaustive library of modules for every resource in GCP. We kept the boilerplate minimal, so that you can utilize it for your needs.&lt;br&gt;
You can fairly easily utilize existing modules you created or found using the boilerplate.&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;To begin, clone the essential repositories:‍&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Primary Repository&lt;/strong&gt;&lt;br&gt;
Clone the terragrunt-gcp-projects repository to get started.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone git@github.com:MeteorOps/terragrunt-gcp-projects.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Modules Repository (Optional)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the modules used, clone the terraform-gcp-modules repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone git@github.com:MeteorOps/terraform-gcp-modules.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Repository Structure Explained
&lt;/h2&gt;

&lt;p&gt;The code organization follows a logical hierarchy to facilitate multiple projects, regions or environments.This structure gives you a number of benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hierarchical configuration:&lt;/strong&gt; The configuration at each level cascades through the folders under it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State separation:&lt;/strong&gt; The terraform state is saved per folder in a different path in a bucket, limiting the impact radius of changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic-level of deployment:&lt;/strong&gt; The deeper into the folder you go, the more specific resources you affect with one deployment
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project
└ _global
└ region
   └ _global
   └ environment
      └ resource
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creating and using root (project) level variables
&lt;/h3&gt;

&lt;p&gt;When dealing with multiple GCP projects or regions, passing common variables to modules can become repetitive. To avoid duplicating variables across each terragrunt.hcl file, leverage root terragrunt.hcl inputs to inherit variables seamlessly across regions and environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy Using Terragrunt
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Install Terraform version 0.12.6 or newer and Terragrunt version v0.25.1 or newer.&lt;br&gt;
Fill in your GCP Project ID in &lt;code&gt;my-project/project.hcl&lt;/code&gt;.&lt;br&gt;
Make sure the gcloud CLI is installed and you are authenticated, otherwise run gcloud auth login.&lt;/p&gt;
&lt;h3&gt;
  
  
  Module Deployment
&lt;/h3&gt;

&lt;p&gt;To deploy a single module:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;cd&lt;/code&gt; into the module's folder (e.g. &lt;code&gt;cd my-project/us-central1/rnd-1/vpc&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;terragrunt plan&lt;/code&gt; to see the changes you are about to apply.&lt;/li&gt;
&lt;li&gt;If the plan looks good, run &lt;code&gt;terragrunt apply&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Environment Deployment
&lt;/h3&gt;

&lt;p&gt;To deploy all modules within an environment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;cd&lt;/code&gt; into the environment folder (e.g. &lt;code&gt;cd my-project/us-central1/rnd-1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;terragrunt run-all plan&lt;/code&gt; to see all the changes you are about to apply.&lt;/li&gt;
&lt;li&gt;If the plan looks good, run &lt;code&gt;terragrunt run-all apply&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Testing Deployed Infrastructure
&lt;/h3&gt;

&lt;p&gt;Post-deployment, modules will output relevant information. For instance the IP of a deployed application:&lt;br&gt;
&lt;/p&gt;

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

ip = "35.240.219.84"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A minute or two after the deployment finishes, you should be able to test the ip output in your browser or with curl:&lt;br&gt;
&lt;/p&gt;

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

# Output: Let MeteorOps know if this boilerplate needs any improvement!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Clean-Up Process
&lt;/h3&gt;

&lt;p&gt;To remove all deployed modules within an environment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;cd&lt;/code&gt; into the environment folder (e.g. &lt;code&gt;cd my-project/us-central1/rnd-1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;terragrunt run-all plan -destroy&lt;/code&gt; to see all the destroy changes you're about to apply.&lt;/li&gt;
&lt;li&gt;If the plan looks good, run &lt;code&gt;terragrunt run-all destroy&lt;/code&gt;.
‍&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This guide walks you through leveraging best practices for setting up and managing Terraform repositories for GCP with Terragrunt. These methodologies are designed to be straightforward, efficient, and easily adaptable to future projects or company needs.&lt;/p&gt;

&lt;h4&gt;
  
  
  P.S.
&lt;/h4&gt;

&lt;p&gt;Feel free to &lt;a href="https://meteorops.beehiiv.com/subscribe"&gt;subscribe to our Newsletter&lt;/a&gt; and learn about other insights and resources we release 👈🏼&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>devops</category>
      <category>googlecloud</category>
      <category>terragrunt</category>
    </item>
    <item>
      <title>Don't waste 6 months on hiring DevOps, take the 10 Hours DevOps Pill</title>
      <dc:creator>Michael Zion</dc:creator>
      <pubDate>Thu, 04 Jan 2024 14:55:06 +0000</pubDate>
      <link>https://forem.com/meteorops/dont-waste-6-months-on-hiring-devops-take-the-10-hours-devops-pill-40f9</link>
      <guid>https://forem.com/meteorops/dont-waste-6-months-on-hiring-devops-take-the-10-hours-devops-pill-40f9</guid>
      <description>&lt;p&gt;A practical playbook for founders and engineering managers to stop wasting time trying to get started with DevOps the right way&lt;/p&gt;




&lt;h2&gt;
  
  
  Is this article for you?
&lt;/h2&gt;

&lt;p&gt;Maybe you're a CTO.&lt;br&gt;
Maybe you're an engineering manager.&lt;br&gt;
If you think about hiring you first DevOps Engineer - this article is for you.&lt;br&gt;
It will save you 6 months of wasted mental capacity.&lt;/p&gt;

&lt;p&gt;How? By dedicating 10 hours to planning.&lt;br&gt;
I'll share with you here exactly what to do during those 10 hours.  &lt;/p&gt;

&lt;h2&gt;
  
  
  You might know this story TOO well
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ~ "I need to focus on the product"
&lt;/h3&gt;

&lt;p&gt;You are building your company’s product.&lt;br&gt;
You start thinking about the development process and building or improving production.&lt;br&gt;
Then, you read about DevOps somewhere and think to yourself: “This seems like what I need”.&lt;/p&gt;

&lt;h3&gt;
  
  
  ~ "DevOps is expensive"
&lt;/h3&gt;

&lt;p&gt;You start looking for a DevOps Engineer, but you find out the standard DevOps salary - “Oh, that’s pretty expensive for our budget”.&lt;br&gt;
So you decide to wait. “Hiring a developer is more important right now” you tell yourself.  &lt;/p&gt;

&lt;p&gt;A month goes by, and you and your team are grinding away, building a kickass product.&lt;br&gt;
But alas! The missing development automation hurts collaboration, the cloud infrastructure is a collection of manual changes - and you’re not sure if the system is built well.&lt;/p&gt;

&lt;p&gt;So, you make a decision, and you post your first “DevOps Position”, congrats!&lt;/p&gt;

&lt;h3&gt;
  
  
  ~ "I'll interview some candidates"
&lt;/h3&gt;

&lt;p&gt;Candidates start streaming in, and you start interviewing.&lt;br&gt;
After interviewing the 3rd candidate, you think to yourself “this is not it”.&lt;br&gt;
Every candidate is missing a different piece of the required knowledge.&lt;br&gt;
One doesn’t know AWS, the other isn’t familiar with "", and the last one only worked with on-prem before.&lt;/p&gt;

&lt;p&gt;And so, you re-evaluate.&lt;/p&gt;

&lt;h3&gt;
  
  
  ~ "I'll do it myself"
&lt;/h3&gt;

&lt;p&gt;The realization is this: You can’t hire on knowledge for this position, you have to hire on skill and character.&lt;br&gt;
BUT, you feel like the knowledge is crucial, at least at this point.&lt;br&gt;
So you make another decision - I’ll invest some more time in this “DevOps” thing - I’ll learn.&lt;br&gt;
You watch DevOps tutorials on Youtube.&lt;br&gt;
You even subscribe to various DevOps Newsletters, something you didn’t do before.&lt;br&gt;
Another month goes by.&lt;/p&gt;

&lt;h3&gt;
  
  
  ~ "What do other startups do?"
&lt;/h3&gt;

&lt;p&gt;After learning and implementing DevOps bits and pieces all over the place, it doesn’t feel right.&lt;br&gt;
“Am I re-inventing the wheel and complicating the future?” you might ask yourself.&lt;br&gt;
You take a step back, zoom-out, and ask other startup founders what they did at this stage.&lt;/p&gt;

&lt;p&gt;That’s when you find out you’re not alone - “Oh! So it’s tough for other founders as well!”&lt;br&gt;
But, each founder tells you something different.&lt;br&gt;
One founder tells you to hire a freelancer - but that seems like just another hiring model and doesn’t solve the problem.&lt;br&gt;
Another founder tells you to just hire a full-time DevOps Engineer - but your resources are limited, and you’d rather hire more developers to build the product.&lt;br&gt;
Until one founder tells you to hire an agency: “Instead of a freelancer, get a company that’s built to get your DevOps right”.&lt;/p&gt;

&lt;h3&gt;
  
  
  ~ "Maybe an agency?"
&lt;/h3&gt;

&lt;p&gt;You’re convinced, and you start looking for agencies.&lt;br&gt;
You get recommendations, you search online, and you start booking calls.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;1st call with a DevOps agency&lt;br&gt;
*&lt;/em&gt;“Hi there! Yes we’re the solution for you! Let’s get started!”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2nd call with a DevOps agency&lt;/strong&gt;&lt;br&gt;
“Yes! We’ll provide you with a strong DevOps Engineer! Let’s get started!”&lt;/p&gt;

&lt;h3&gt;
  
  
  ~ "I'll do it myself"
&lt;/h3&gt;

&lt;p&gt;You choose not to go on the 3rd call and you pause the process.&lt;/p&gt;

&lt;p&gt;Why? Because you realize: “These guys didn’t remove any uncertainty for me - how are they different from a freelancer?”&lt;br&gt;
So you make another decision.&lt;br&gt;
You’ll continue to do DevOps yourself, and maybe delegate some tasks to other team members.&lt;/p&gt;

&lt;p&gt;That’s when you find out it was a trap! You got yourself into a loop!&lt;br&gt;
‍&lt;/p&gt;

&lt;h3&gt;
  
  
  ~ "Oh no! it's a loop!"
&lt;/h3&gt;

&lt;p&gt;After just one month you realize it’s not sustainable, and you repeat the same process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open DevOps position&lt;/li&gt;
&lt;li&gt;Realize each candidate is missing something else&lt;/li&gt;
&lt;li&gt;Fear for the budget&lt;/li&gt;
&lt;li&gt;Stop the hiring&lt;/li&gt;
&lt;li&gt;Complete DevOps tasks yourself&lt;/li&gt;
&lt;li&gt;Consider a freelancer&lt;/li&gt;
&lt;li&gt;Drop the idea because it's similar hiring&lt;/li&gt;
&lt;li&gt;Consider an agency&lt;/li&gt;
&lt;li&gt;Interview a bunch of agencies&lt;/li&gt;
&lt;li&gt;No extra certainty or confidence from an agency&lt;/li&gt;
&lt;li&gt;Do DevOps work yourself&lt;/li&gt;
&lt;li&gt;Repeat&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This loop is sometimes 2 months long, and sometimes 12 months long.&lt;/p&gt;

&lt;p&gt;Either way, it slows down your company!&lt;br&gt;
It occupies your thoughts.&lt;br&gt;
It takes valuable time from you.&lt;br&gt;
It speeds up global warming.&lt;/p&gt;

&lt;p&gt;Maybe the global warming part was an exaggeration.&lt;/p&gt;

&lt;p&gt;It’s amazing how many founders went through this exact same process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Break the loop
&lt;/h2&gt;

&lt;p&gt;I’m here to tell you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;You can break the DevOps hiring loop&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You can promote DevOps efforts quickly AND accurately&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You can save 6-12 months of stumbling around&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  You need just 10 hours with a DevOps Expert
&lt;/h2&gt;

&lt;p&gt;You need just 10 hours with a DevOps expert.&lt;br&gt;
What you need most is perspective from an experienced individual.&lt;br&gt;
You don’t yet have the DevOps perspective or experience? No problem.&lt;br&gt;
Get a DevOps Expert to consult you on a hourly basis.&lt;br&gt;
I call it "The 10 Hours DevOps Pill" 💊&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements for the DevOps expert
&lt;/h2&gt;

&lt;p&gt;Not anyone will fit as your trusted DevOps expert.&lt;/p&gt;

&lt;p&gt;Use someone that answers these criteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Helped 10+ companies with DevOps -
Has a wide perspective&lt;/li&gt;
&lt;li&gt;Consulted CTOs and VPs of R&amp;amp;D before -
Understands the weight of culture in adopting DevOps&lt;/li&gt;
&lt;li&gt;Consulted DevOps Group and Team Leaders before -
Understands how to manage the work&lt;/li&gt;
&lt;li&gt;Did lots of DevOps hands-on work before -
Understands how to do the work&lt;/li&gt;
&lt;li&gt;You understand them -
They know where you stand and have simple explanations. (Run away from the buzzwords throwers)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Spoiler: The contents of the 10 hours
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;2h - Share everything about your startup&lt;/li&gt;
&lt;li&gt;2h - Ask what’s possible + What others did&lt;/li&gt;
&lt;li&gt;2h - Set DevOps goals&lt;/li&gt;
&lt;li&gt;2h - Choose a strategy&lt;/li&gt;
&lt;li&gt;2h - Create a DevOps roadmap
Let’s dive into the playbook for each meeting!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1st + 2nd Consultation Hours: Share, share, share
&lt;/h2&gt;

&lt;p&gt;Share the state of your company with the DevOps expert.&lt;br&gt;
Share your infrastructure, your code, your work process, everything!&lt;br&gt;
Don’t be shy, and don’t justify - simply explain your startup’s goals and your reasoning.&lt;br&gt;
(Sign an NDA first, of course)&lt;/p&gt;

&lt;h2&gt;
  
  
  3rd + 4th Consultation Hours: Understand what’s possible + Gain perspective
&lt;/h2&gt;

&lt;p&gt;Take notes or record this call!&lt;/p&gt;

&lt;p&gt;Ask the DevOps expert: &lt;strong&gt;What’s possible?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How fast can changes reach production?&lt;/li&gt;
&lt;li&gt;How fast can you create new environments?&lt;/li&gt;
&lt;li&gt;How easily can your developers collaborate?&lt;/li&gt;
&lt;li&gt;How confidently can you change the system?&lt;/li&gt;
&lt;li&gt;What uptime can the system have?&lt;/li&gt;
&lt;li&gt;How aware can your team be of the system’s state?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask the DevOps expert: &lt;strong&gt;What did other startups do at this stage?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What goals did they have?&lt;/li&gt;
&lt;li&gt;What DevOps efforts did they promote?&lt;/li&gt;
&lt;li&gt;Why did they decide those DevOps efforts?&lt;/li&gt;
&lt;li&gt;Which startups performed best? Why?&lt;/li&gt;
&lt;li&gt;Are there industry-unique considerations?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5th + 6th Consultation Hours: Set DevOps goals
&lt;/h2&gt;

&lt;p&gt;You now know what’s possible, and what other companies do.&lt;br&gt;
Time to set short-term, mid-term, and long term goals.&lt;br&gt;
If you want to dive deep into useful DevOps principles, check out &lt;a href="https://www.meteorops.com/blog/the-cto-devops-handbook-simple-principles-and-examples"&gt;the CTO DevOps Handbook here 👈🏼&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7th + 8th Consultation Hours: Strategize
&lt;/h2&gt;

&lt;p&gt;Based on your goals, strengths, and restrictions, choose a strategy.&lt;br&gt;
Discuss the following options with your DevOps expert.&lt;/p&gt;

&lt;h3&gt;
  
  
  Possible Strengths
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Developers with DevOps background&lt;/li&gt;
&lt;li&gt;High budget&lt;/li&gt;
&lt;li&gt;Available time to manage the DevOps efforts&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Possible Restrictions
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;No budget&lt;/li&gt;
&lt;li&gt;Low budget&lt;/li&gt;
&lt;li&gt;DevOps needs are temporary for now&lt;/li&gt;
&lt;li&gt;No time to manage the DevOps efforts&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;DevOps Engineer&lt;/th&gt;
&lt;th&gt;Freelancer&lt;/th&gt;
&lt;th&gt;Agency&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Budget&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Freelancer / Agency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Management Effort Required&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low-Medium&lt;/td&gt;
&lt;td&gt;Agency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hourly Flexibility&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Agency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ease of bridging knowledge gaps&lt;/td&gt;
&lt;td&gt;Low-Medium&lt;/td&gt;
&lt;td&gt;Low-Medium&lt;/td&gt;
&lt;td&gt;Medium-High&lt;/td&gt;
&lt;td&gt;Agency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ease of building trust&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium-High&lt;/td&gt;
&lt;td&gt;Low-Medium&lt;/td&gt;
&lt;td&gt;DevOps Engineer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The available strategies
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Hire a DevOps Engineer, Boost with the DevOps expert&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a DevOps roadmap with the DevOps Expert before hiring&lt;/li&gt;
&lt;li&gt;Get the DevOps expert to interview the candidates&lt;/li&gt;
&lt;li&gt;Get advice from the DevOps expert on what to examine during your interview with the candidates&lt;/li&gt;
&lt;li&gt;Prioritize the DevOps efforts with the DevOps Expert&lt;/li&gt;
&lt;li&gt;Plan the onboarding of the DevOps Engineer with the 6. DevOps expert&lt;/li&gt;
&lt;li&gt;Hire the DevOps Engineer&lt;/li&gt;
&lt;li&gt;Get advice on managing DevOps projects from the DevOps expert&lt;/li&gt;
&lt;li&gt;Discuss the DevOps tasks implementation with the DevOps Engineer and DevOps expert&lt;/li&gt;
&lt;li&gt;Occasionally or routinely consult with the DevOps expert on priorities, management, and engineering&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Hire a DevOps freelancer, Boost with the DevOps expert&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Exactly as the above strategy&lt;/li&gt;
&lt;li&gt;Take advantage of the hourly flexibility when needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Hire a DevOps agency, Boost with the DevOps expert&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a DevOps roadmap with the DevOps Expert before choosing an agency&lt;/li&gt;
&lt;li&gt;Share your requirements with the agency&lt;/li&gt;
&lt;li&gt;Filter out any agency that doesn’t provide you with a plan BEFORE work starts&lt;/li&gt;
&lt;li&gt;Get the plan reviewed by your DevOps expert: Does it make sense? Is the planned result desired?&lt;/li&gt;
&lt;li&gt;Make sure the DevOps agency’s ability to provide support after the work is done&lt;/li&gt;
&lt;li&gt;Asses the level of the DevOps agency’s DevOps Engineers with the help of the DevOps expert&lt;/li&gt;
&lt;li&gt;Make sure the DevOps agency is flexible with its hourly capacity&lt;/li&gt;
&lt;li&gt;Occasionally or routinely consult with the DevOps expert on priorities, management, and engineering&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Advantages and disadvantages of the strategies
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Good when&lt;/th&gt;
&lt;th&gt;Bad when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full-time + Expert&lt;/td&gt;
&lt;td&gt;- Your budget is high - You need flexible DevOps capacity - Your team has DevOps background&lt;/td&gt;
&lt;td&gt;- Your budget is low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freelancer + Expert&lt;/td&gt;
&lt;td&gt;- Your budget is low - You need flexible DevOps capacity - You can't risk losing DevOps capacity short-mid-term&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agency + Expert&lt;/td&gt;
&lt;td&gt;- Your budget is low - You need flexible DevOps capacity - You want an accurate plan before work starts - You frequently need to support new tools and technologies&lt;/td&gt;
&lt;td&gt;- The agency doesn’t have flexible plans - The agency’s team isn’t experienced - The agency doesn’t create clarity before work starts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  9th + 10th Consultation Hours: Create a DevOps roadmap + Execute your strategy
&lt;/h2&gt;

&lt;p&gt;You’re ready to create a DevOps roadmap and start executing your strategy!&lt;br&gt;
Creating a DevOps roadmap is the first step of each of the strategies described above.&lt;/p&gt;

&lt;h3&gt;
  
  
  You had to do a bunch of things first:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;You needed a DevOps expert to help you break the vicious DevOps loop - &lt;strong&gt;Done&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You needed to set DevOps goals rooted in a deep DevOps understanding and perspective - &lt;strong&gt;Done&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You needed to get familiar with different strategies and choose the best one for you - &lt;strong&gt;Done!&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  You’re left with 2 things to do:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1 - Create the DevOps roadmap based on the goals and strategy you’ve set&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2 - Start executing the strategy:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Share the DevOps goals with the team&lt;/li&gt;
&lt;li&gt;Schedule the interviews with the Engineers/Freelancers/Agencies&lt;/li&gt;
&lt;li&gt;Use the DevOps expert to stay on track&lt;/li&gt;
&lt;li&gt;Set the milestones for the DevOps goals&lt;/li&gt;
&lt;li&gt;Create the tasks&lt;/li&gt;
&lt;li&gt;Complete the tasks&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Prepare before starting the process
&lt;/h2&gt;

&lt;p&gt;You want to do two things before jumping into the 10 hours:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Before the first 2 hours&lt;/strong&gt;:
Perfect your &lt;a href="https://www.meteorops.com/blog/the-cto-devops-handbook-simple-principles-and-examples#devops-dictionary"&gt;DevOps terminology&lt;/a&gt; (will support rich discussions)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Before the last 2 hours&lt;/strong&gt;:
List existing efforts that might slow down the DevOps roadmap (will help prioritizing)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Ask me anything
&lt;/h2&gt;

&lt;p&gt;If you’re thinking about taking this “10-hours DevOps Pill”, feel free to &lt;a href="https://www.meteorops.com/10-hours-devops-pill"&gt;reach out here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do it yourself
&lt;/h2&gt;

&lt;p&gt;You now know the general process for breaking the DevOps loop.&lt;br&gt;
You don’t NEED a DevOps expert.&lt;br&gt;
Feel free to subscribe to my Newsletter and &lt;a href="https://meteorops.beehiiv.com/subscribe"&gt;learn how to do it yourself here 👈🏼&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cto</category>
      <category>webdev</category>
      <category>startup</category>
    </item>
    <item>
      <title>The CTO DevOps Handbook: Simple Principles and Examples</title>
      <dc:creator>Michael Zion</dc:creator>
      <pubDate>Mon, 25 Dec 2023 21:28:13 +0000</pubDate>
      <link>https://forem.com/meteorops/the-cto-devops-handbook-simple-principles-and-examples-2jcb</link>
      <guid>https://forem.com/meteorops/the-cto-devops-handbook-simple-principles-and-examples-2jcb</guid>
      <description>&lt;p&gt;Nail the DevOps part as your company's CTO&lt;/p&gt;




&lt;p&gt;The goal of this handbook is to give you clarity on DevOps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understand what’s DevOps (in simple words)&lt;/li&gt;
&lt;li&gt;Know what’s possible with DevOps (in simple goals)&lt;/li&gt;
&lt;li&gt;Get simple “when-to-do-what” DevOps guidelines
‍&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I added a bonus at the bottom of the article.&lt;br&gt;
It's a production-ready setup example you could take inspiration from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this article is for
&lt;/h2&gt;

&lt;p&gt;You might be a founder who wishes to get started with DevOps the right way.&lt;/p&gt;

&lt;p&gt;You might be a CTO of a 1,000 employees company who wishes to get simple principles.&lt;/p&gt;

&lt;p&gt;Or, maybe you’re a Software Engineer, and you want to understand if your company’s DevOps approach is good.&lt;/p&gt;

&lt;p&gt;If you’re looking for a simple DevOps playbook, this is it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understand the desired result
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Two things your company needs to be able to do
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Serve its product to customers&lt;/li&gt;
&lt;li&gt;Build and improve the product&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Abilities you need to build, improve, and serve software
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Run experiments and test changes&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  DevOps has a simple meaning
&lt;/h2&gt;

&lt;p&gt;Developers and Operators have shared responsibility for building and improving the system.&lt;/p&gt;

&lt;p&gt;In practice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Developers are responsible to “Operate”&lt;/li&gt;
&lt;li&gt;DevOps Engineers are responsible to enable to “Operate” AND do some of it themselves&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Operate&lt;/strong&gt; = provision, monitor, secure, configure, deploy, scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose a balance: Enabler, Doer, or Automator
&lt;/h2&gt;

&lt;p&gt;The DevOps role will end up as a balance between:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enabler: Provides the tools and knowledge to fulfill the DevOps goals&lt;/li&gt;
&lt;li&gt;Doer: Does the tasks that fulfill the DevOps goals&lt;/li&gt;
&lt;li&gt;Automator: Automates any repeating operation&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Know what things you should enable, do, or automate
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Provision infrastructure&lt;/li&gt;
&lt;li&gt;Secure the system&lt;/li&gt;
&lt;li&gt;Deploy workloads&lt;/li&gt;
&lt;li&gt;Monitor the system&lt;/li&gt;
&lt;li&gt;Recover from issues&lt;/li&gt;
&lt;li&gt;Scale up or down&lt;/li&gt;
&lt;li&gt;Track &amp;amp; test changes&lt;/li&gt;
&lt;li&gt;Automate processes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Choose the right tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Has state management = Saves time automating state-aware processes (e.g., Terraform)&lt;/li&gt;
&lt;li&gt;Has a big community &amp;amp; good docs = Saves time dealing with common issues (e.g., Kubernetes)&lt;/li&gt;
&lt;li&gt;Has multiple interface types: API, CLI, UI = Saves time integrating with the existing system (e.g., Vault)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also read about choosing tools &lt;a href="https://www.meteorops.com/blog/one-click-environment-the-ultimate-devops-goal#tools-choosing-principles"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set useful goals
&lt;/h2&gt;

&lt;p&gt;There are DevOps goals that adopting them will focus you on the right direction:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.meteorops.com/blog/one-click-environment-the-ultimate-devops-goal"&gt;One-Click Environments&lt;/a&gt;&lt;/strong&gt;: makes e2e tests easy and quick&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atomic Commits&lt;/strong&gt;: provides confidence that a tested change will work in production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate the Shared &amp;amp; Env-Specific Parts&lt;/strong&gt;: enables e2e tests as the company scales up&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want to learn about more useful DevOps goals, feel free to book a free consultation &lt;a href="https://www.meteorops.com/personal-devops-consultation"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enablers: Choose the Tools-to-Knowledge Balance
&lt;/h2&gt;

&lt;p&gt;Developers can either have the knowledge or the tools to do something.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More knowledge-reliance&lt;/strong&gt;: if you want the developers to contribute to the DevOps efforts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More tools-reliance&lt;/strong&gt;: if you want to abstract the operations from the developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the balance between the two is not intentional, it’s accidental.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doers: Have a good reason to do it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Is it a one-time task?&lt;/li&gt;
&lt;li&gt;Does it teach you how the developers work?&lt;/li&gt;
&lt;li&gt;Are you directly accountable for the results of the task?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you answered “no” to the above questions, enable or automate it instead.&lt;/p&gt;

&lt;p&gt;Doing more = Learning the system's use-cases&lt;/p&gt;

&lt;p&gt;Doing too much = Not scalable, too-much knowledge-reliance&lt;/p&gt;

&lt;h2&gt;
  
  
  Automators: Have a good reason to automate it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Did it happen before?&lt;/li&gt;
&lt;li&gt;Is it likely to happen again?&lt;/li&gt;
&lt;li&gt;Will automating it take less time than doing it?&lt;/li&gt;
&lt;li&gt;Will automating it teach you an important company process?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you answered “yes” to 2 out of the 4 questions - automate it!&lt;/p&gt;

&lt;p&gt;More automations = Less reliance on knowledge to operate the system.&lt;/p&gt;

&lt;p&gt;Too much automations = No system awareness.&lt;/p&gt;

&lt;p&gt;P.S. - you can also enable developers to automate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create available DevOps Capacity
&lt;/h2&gt;

&lt;p&gt;The DevOps needs of a company have spikes.&lt;/p&gt;

&lt;p&gt;One month you need 2 DevOps Engineers, and half of that the next month.&lt;/p&gt;

&lt;p&gt;Switchovers between big efforts and small tasks are common.&lt;/p&gt;

&lt;p&gt;This is true, especially for new companies.&lt;/p&gt;

&lt;p&gt;Break the assumption: “DevOps tasks must be done by a DevOps Engineer”.&lt;/p&gt;

&lt;h2&gt;
  
  
  There are 3 types of DevOps capacity
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Non-Flexible&lt;/strong&gt;: A full-time DevOps Engineer on the team&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semi-Flexible&lt;/strong&gt;: Key developers that can contribute to the DevOps goals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fully-Flexible&lt;/strong&gt;: A flexible DevOps Services company or freelancer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can read more about calculating the DevOps capacity your company needs &lt;a href="https://www.meteorops.com/blog/calculating-your-companys-required-devops-capacity"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to focus on what: Common Dilemmas
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;When&lt;/strong&gt;: You work alone, and the system is simple&lt;/p&gt;

&lt;p&gt;‍&lt;strong&gt;Focus&lt;/strong&gt;: On simplifying the development - Dockerize your apps, Create a post-commit pipeline that runs tests&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When&lt;/strong&gt;: You need to be able to create new environments quickly (for development, or for clients)&lt;/p&gt;

&lt;p&gt;‍ &lt;strong&gt;Focus&lt;/strong&gt;: On implementing “One-Click Environments”: Using IaC (e.g., Terraform) + Deployment tool (Depends on the platform).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When&lt;/strong&gt;: You want to e2e test every code modification, but there are many code modifications&lt;/p&gt;

&lt;p&gt;‍&amp;gt; &lt;strong&gt;Focus&lt;/strong&gt;: On splitting the “One-Click Env” into a “base” with shared resources, and “env” with env-specific resources&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When&lt;/strong&gt;: You want to unify &amp;amp; standardize how you deploy, monitor, scale, configure, and secure your workloads&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Focus&lt;/strong&gt;: On implementing an orchestrator such as Kubernetes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When&lt;/strong&gt;: You want you have many moving parts and wish to be certain a tested change will work&lt;/p&gt;

&lt;p&gt;‍ &lt;strong&gt;Focus&lt;/strong&gt;: On implementing GitOps and consider a Monorepo (the sooner the better)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When&lt;/strong&gt;: You want the DevOps efforts to be done by the dev team&lt;/p&gt;

&lt;p&gt;‍ &lt;strong&gt;Focus&lt;/strong&gt;: On using “actual” IaC tools (Pulumi Typescript/Python), Full “how to operate” (see above) documentation‍&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Never&lt;/strong&gt;: Invest lots of time in new tech without a strong reason&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Always&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have your code in Git&lt;/li&gt;
&lt;li&gt;Monitor the basic stuff: CPU, Memory, Disk, Network, App Logs, Cloud Costs&lt;/li&gt;
&lt;li&gt;Architect for high-availability&lt;/li&gt;
&lt;li&gt;Test before you deploy&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  BONUS: An example setup for a CTO approaching Production
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zw1wj7ub4thd1o0h717.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zw1wj7ub4thd1o0h717.jpg" alt="Image description" width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2 AWS Accounts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;One for development and staging&lt;/li&gt;
&lt;li&gt;Another for production&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Monorepo in Github
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Docker-Compose for local development&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2 Infrastructure-as-Code projects: 'base' &amp;amp; 'apps'
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;base = shared resources (e.g., VPC, RDS, ECS Cluster, EKS Cluster)&lt;/li&gt;
&lt;li&gt;apps = env-specific resources (e.g., Lambda Functions, ECS Services, Kubernetes Namespaces)&lt;/li&gt;
&lt;li&gt;config file per environment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Github Actions Workflow: Development workflow
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Checkout branch and locally develop + test changes&lt;/li&gt;
&lt;li&gt;Create a Pull Request: Deploys a Pull-Request ‘apps’ environment on the ‘development’ environment ‘base’&lt;/li&gt;
&lt;li&gt;On merge to main: Deploys from the ‘main’ branch an ‘apps’ environment onto the ‘development’ environment ‘base’&lt;/li&gt;
&lt;li&gt;Manual: Deploy from the ‘main’ branch onto the ‘staging’ / ‘production’ environment ‘base’&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setup Notes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Avoid mentioning an environmnent's name in the code for conditional resources deployment&lt;/li&gt;
&lt;li&gt;Use each environment’s config file to declare if a resource should be created&lt;/li&gt;
&lt;li&gt;Could be implemented using Terraform, Terragrunt, Pulumi, CDK, and other IaC tools&lt;/li&gt;
&lt;li&gt;Production should have 2-instances of every workload for high-availability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’d like to see this setup in your startup, &lt;a href="https://www.meteorops.com/devops-setup-for-production-free-consultation"&gt;click here to book a call 👈🏼&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S. - I'll be updating this page occasionally, so you might want to visit again&lt;/p&gt;




&lt;h2&gt;
  
  
  Another Bonus: DevOps Dictionary for Human Beings
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A working instance of the entire system&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CI (Continuous Integration)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enable developers to collaborate by agreeing on a single source-of-truth (master/main)&lt;/td&gt;
&lt;td&gt;Jenkins, Github Actions, GitlabCI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CD (Continuous Delivery)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Create an artifact that’s ready for production (tested, tagged)&lt;/td&gt;
&lt;td&gt;JFrog Artifactory, Nexus, AWS ECR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CD (Continuous Deployment)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every available deliverable (artifact) gets deployed automatically&lt;/td&gt;
&lt;td&gt;ArgoCD, Jenkins, AWS CodeDeploy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monitoring / Observability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Collect metrics/traces/logs from apps and infrastructure, analyze them, and display them, and setup alerts&lt;/td&gt;
&lt;td&gt;Prometheus, Jaeger, Elasticsearch, Fluentd, OpenTelemetry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The resources on which the workloads run, in which the data is stored, and through which the network flows&lt;/td&gt;
&lt;td&gt;Servers, Databases, Network Routers &amp;amp; Switches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud Infrastructure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same as the above, but specifically in the cloud&lt;/td&gt;
&lt;td&gt;AWS EC2, AWS RDS, GCP Compute Engine, Azure Virtual Machines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Computing &amp;amp; Data services served from remote locations for you to build your system&lt;/td&gt;
&lt;td&gt;AWS, Azure, GCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Containerization &amp;amp; Virtualization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Technologies utilizing Kernel &amp;amp; OS features to create virtual machines, or isolate process (AKA run containers)&lt;/td&gt;
&lt;td&gt;Docker, vSphere, KVM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Secrets Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Storing and retrieving sensitive configurations (e.g., tokens, passwords)&lt;/td&gt;
&lt;td&gt;Hashicorp Vault, AWS Secrets Manager, SealedSecrets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Configuration Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usually refers to preparing servers for workloads (e.g., creating directories &amp;amp; files, starting processes)&lt;/td&gt;
&lt;td&gt;Ansible, Chef, Puppet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Saving the code in a versioned way (Git)&lt;/td&gt;
&lt;td&gt;Github, Gitlab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitOps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Making the system is the same as it’s described in Git&lt;/td&gt;
&lt;td&gt;Flux, ArgoCD, Jenkins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monorepo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All of the company’s code is in one Git Repository&lt;/td&gt;
&lt;td&gt;NX, Turborepo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Polyrepo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multiple Git repositories for different components&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IaC (Infrastructure-as-Code)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Creating Cloud infrastructure with &lt;strong&gt;idempotent&lt;/strong&gt; code and state management&lt;/td&gt;
&lt;td&gt;Terraform, Pulumi, CDK, Crossplane&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Execute, serve, or install the artifacts&lt;/td&gt;
&lt;td&gt;ArgoCD, Jenkins, AWS CodeDeploy, Scripts (Bash, Python, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Orchestrator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dynamically allocating workloads to a pool of nodes&lt;/td&gt;
&lt;td&gt;Kubernetes, Nomad, AWS ECS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Authentication &amp;amp; Authorization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Making sure each person, workload, or resource, has access only to what’s necessary (other workloads and resources)&lt;/td&gt;
&lt;td&gt;AWS IAM, OpenID, OpenVPN, Twingate, Istio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Service Discovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exposing available workloads using DNS&lt;/td&gt;
&lt;td&gt;Consul, CoreDNS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Get more practical advice
&lt;/h2&gt;

&lt;p&gt;I post small nuggets of practical advice on the "MeteorOps Newsletter".&lt;br&gt;
You can &lt;a href="https://meteorops.beehiiv.com/subscribe"&gt;subscribe here 👈🏼&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cto</category>
      <category>softwareengineering</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
