<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Beyond The Terminal By Anoop K A]]></title><description><![CDATA[Beyond The Terminal By Anoop K A]]></description><link>https://beyondterminal.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6aec882d520975999b9d7274/2f332347-b5cf-4790-8321-f89dd5f2b2b3.png</url><title>Beyond The Terminal By Anoop K A</title><link>https://beyondterminal.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 15 Nov 2026 22:28:38 GMT</lastBuildDate><atom:link href="https://beyondterminal.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Argo CD Deep Dive (Part 1): Architecture, Core Components, and GitOps Workflow]]></title><description><![CDATA[Learn Argo CD architecture, core components, ApplicationSets, and the step-by-step GitOps reconciliation workflow on Kubernetes.]]></description><link>https://beyondterminal.hashnode.dev/argocd-architecture-components-gitops-workflow</link><guid isPermaLink="true">https://beyondterminal.hashnode.dev/argocd-architecture-components-gitops-workflow</guid><category><![CDATA[ArgoCD]]></category><category><![CDATA[gitops]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Devops]]></category><category><![CDATA[argocd deploy applicationn]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[architecture]]></category><category><![CDATA[workflow]]></category><category><![CDATA[Deep Dive]]></category><category><![CDATA[deployment]]></category><category><![CDATA[continuous deployment]]></category><dc:creator><![CDATA[Anoop Aiyappan]]></dc:creator><pubDate>Thu, 12 Nov 2026 07:35:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aec882d520975999b9d7274/86a049cd-86eb-44d1-8561-b21d2d3807f6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Managing Kubernetes deployments with manual <code>kubectl apply</code> commands or fragile CI push scripts works fine for a single cluster—until configuration drift, missed rollbacks, and multi-environment sprawl take over.</p>
<p><strong>Argo CD</strong> solves this by treating Git as the single source of truth for your cluster state. In <strong>Part 1 of this series</strong>, we’ll focus on the fundamentals: how Argo CD works under the hood, its core control-plane components, how <code>ApplicationSet</code> eliminates multi-cluster YAML repetition, and the reconciliation loop that keeps workloads in sync. <em>(In upcoming parts, we’ll move from theory into hands-on installation, deploying your first application, and tackling real-world GitOps patterns.)</em></p>
<blockquote>
<p><strong>What is Argo CD?</strong><br />Argo CD is a <strong>declarative GitOps continuous delivery tool</strong> for Kubernetes. It compares the desired state stored in a Git repository with the live state in a cluster, then reports or applies differences according to the application's sync configuration.</p>
</blockquote>
<hr />
<img src="https://cdn.hashnode.com/uploads/covers/6aec882d520975999b9d7274/48caf7d5-af48-4506-b664-82cb568caa9b.gif" alt="" style="display:block;margin:0 auto" />

<p><em>Argo CD Application resource tree view</em></p>
<h2>Why Argo CD is called a declarative GitOps tool?</h2>
<p>This is because Argo CD follows a declarative approach. With a declarative approach, you describe the state you want rather than listing the steps to create it. Instead of applying changes directly with imperative commands such as <code>kubectl apply</code> or <code>helm install</code>, you commit Kubernetes manifests, Helm charts, or Kustomize configuration to a Git repository. Argo CD uses that configuration as the desired state for the application.</p>
<p>Argo CD is called a GitOps tool because it follows 4 pillars of GitOps principles. Lets look at it below:</p>
<h3>GitOps principles</h3>
<ul>
<li><strong>Git as the source of truth:</strong> Git stores the desired configuration for the resources managed by Argo CD. Changes can be reviewed and tracked through the repository's normal workflows.</li>
<li><strong>Pull-based delivery:</strong> Argo CD runs in the Kubernetes cluster or in a dedicated management cluster. It polls Git or responds to webhooks, then pulls configuration inward. This avoids requiring an external CI runner to push manifests directly to the cluster.</li>
<li><strong>Drift detection and reconciliation:</strong> Argo CD compares the live cluster state with the desired state from Git. Differences are reported as <code>OutOfSync</code>; automatic correction depends on the application's sync settings.</li>
<li><strong>Versioned and auditable changes:</strong> Git commits record configuration changes and can be linked to authors and reviewed pull requests. To roll back a change, revert the relevant commit and let Argo CD reconcile to the reverted state.</li>
</ul>
<blockquote>
<p>Think of Argo CD as a controller that keeps checking whether the cluster matches the configuration in Git. It can report drift, and—when automatic sync is configured—work to bring managed resources back in line.</p>
</blockquote>
<hr />
<h2>Argo CD architecture and core components</h2>
<img src="https://cdn.hashnode.com/uploads/covers/6aec882d520975999b9d7274/1fec58cf-78de-44fc-9839-a43e3eddd927.png" alt="" style="display:block;margin:0 auto" />

<p><em>High-level Argo CD architecture</em></p>
<p>Argo CD separates the user-facing API, manifest generation, and cluster reconciliation into distinct components:</p>
<ul>
<li><strong>API Server (</strong><code>argocd-server</code><strong>):</strong> Exposes the gRPC and REST APIs used by the web UI and CLI. It handles user operations such as syncs and rollbacks, and applies configured access controls.</li>
<li><strong>Repository Server (</strong><code>argocd-repo-server</code><strong>):</strong> Fetches repository content and renders manifests from Helm, Kustomize, Jsonnet, or plain YAML sources.</li>
<li><strong>Application Controller (</strong><code>argocd-application-controller</code><strong>):</strong> Reconciles <code>Application</code> resources by comparing desired manifests with live cluster state. It reports sync and health status and performs sync operations when requested or configured.</li>
<li><strong>ApplicationSet Controller:</strong> Generates Argo CD <code>Application</code> resources from templates and generators. This helps manage many applications across environments, repositories, or clusters.</li>
<li><strong>Redis:</strong> Provides in-memory caching used by Argo CD to reduce repeated work, including caching rendered manifests and cluster API data.</li>
<li><strong>Dex:</strong> An optional OpenID Connect (OIDC) identity broker that can connect Argo CD to external identity providers such as GitHub, Okta, GitLab, or Google.</li>
</ul>
<hr />
<h2>ApplicationSets: managing multiple environments</h2>
<p>An <code>ApplicationSet</code> can generate multiple Argo CD <code>Application</code> resources from one template and a set of inputs. The examples below show the difference between maintaining a separate manifest for each environment and using one <code>ApplicationSet</code> definition.</p>
<h3>The hard way: one Application per environment</h3>
<p>Without an <code>ApplicationSet</code>, each environment has its own Application manifest. For a service named <code>my-app</code>, the three files might look like this:</p>
<h4>dev-app.yaml</h4>
<pre><code class="language-yaml">apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-dev
spec:
  source:
    repoURL: 'https://github.com/my-org/my-app.git'
    path: envs/dev
  destination:
    server: 'https://dev-cluster.example.com'
</code></pre>
<h4>staging-app.yaml</h4>
<pre><code class="language-yaml">apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-staging
spec:
  source:
    repoURL: 'https://github.com/my-org/my-app.git'
    path: envs/staging
  destination:
    server: 'https://staging-cluster.example.com'
</code></pre>
<h4>prod-app.yaml</h4>
<pre><code class="language-yaml">apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-prod
spec:
  source:
    repoURL: 'https://github.com/my-org/my-app.git'
    path: envs/prod
  destination:
    server: 'https://prod-cluster.example.com'
</code></pre>
<p>This approach is straightforward for a small number of targets, but the repeated configuration grows quickly. For example, 20 services across five clusters could require 100 separate Application manifests to maintain.</p>
<hr />
<h3>The smart way: one ApplicationSet with generators</h3>
<p>An <code>ApplicationSet</code> defines the input data and the application template separately:</p>
<ol>
<li><strong>Generators (the data):</strong> Define which environments, clusters, or repositories to target.</li>
<li><strong>Template (the blueprint):</strong> Define the Application structure and use parameters such as <code>{{environment}}</code> and <code>{{cluster_url}}</code>.</li>
</ol>
<pre><code class="language-yaml">apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-app-fleet
spec:
  # 1. THE DATA
  generators:
    - list:
        elements:
          - environment: dev
            cluster_url: https://dev-cluster.example.com
          - environment: staging
            cluster_url: https://staging-cluster.example.com
          - environment: prod
            cluster_url: https://prod-cluster.example.com

  # 2. THE BLUEPRINT
  template:
    metadata:
      name: 'my-app-{{environment}}'
    spec:
      source:
        repoURL: 'https://github.com/my-org/my-app.git'
        path: 'envs/{{environment}}'
      destination:
        server: '{{cluster_url}}'
</code></pre>
<p>The ApplicationSet Controller processes the generator entries and creates a separate Argo CD Application for each one: <code>my-app-dev</code>, <code>my-app-staging</code>, and <code>my-app-prod</code>. To add another target, add an entry to the generator list; the controller then generates the corresponding application from the same template.</p>
<blockquote>
<p>The key benefit is less duplicated application configuration: environment-specific values live in the generator data, while the common structure stays in one template.</p>
</blockquote>
<hr />
<h2>Step-by-step workflow: how Argo CD works</h2>
<ol>
<li><strong>Declare Desired State:</strong> Commit Kubernetes manifests, Helm charts, or Kustomize configuration to Git. Configure an Argo CD Application to watch the relevant repository path and target cluster.</li>
<li><strong>Fetch &amp; Render:</strong> The Repository Server fetches the source and renders it into Kubernetes manifests. Argo CD can cache rendered output and related data to avoid repeating work unnecessarily.</li>
<li><strong>Diffing / Reconciliation:</strong> The Application Controller compares the rendered desired state with the live cluster state. If they differ, the application is reported as <code>OutOfSync</code>; detection occurs as Argo CD performs its reconciliation checks.</li>
<li><strong>Syncing &amp; Pruning:</strong> An engineer can start a sync manually, or Argo CD can sync automatically if that behavior is configured. During a sync, Argo CD applies the desired manifests. If pruning is enabled, resources removed from Git can also be deleted from the cluster.</li>
<li><strong>Health Monitoring:</strong> Argo CD continues to assess application and resource health using its health checks. The UI reports conditions such as whether workloads are healthy or need attention; specific checks depend on the resource and any custom health configuration.</li>
</ol>
<p>By separating manifest rendering (<code>argocd-repo-server</code>), cluster state reconciliation (<code>argocd-application-controller</code>), and multi-environment templating (<code>ApplicationSet</code>), Argo CD turns Kubernetes delivery into a predictable, auditable workflow. Instead of chasing down manual <code>kubectl</code> drift across clusters, your team can manage every environment straight from Git pull requests.</p>
<p>Now that the architecture and core concepts are clear, <strong>Part 2</strong> will get hands-on—covering installation, initial setup, and walking through a real deployment workflow.</p>
<p>How are you structuring your Argo CD repositories today, or what specific topics would you like to see covered next in the series? Let me know in the comments!</p>
]]></content:encoded></item></channel></rss>