Skip to main content

Introduction to Argo CD

This tutorial will walk you through implementing Argo CD with the Akuity Platform, to manage the deployment of the Helm charts in a declarative fashion.

Ultimately, you will have a Kubernetes cluster, with Applications deployed using an Argo CD control plane.

A video version of this tutorial is available with an introduction to Continous Delivery, GitOps, and Argo CD. πŸ‘‡

1. Prerequisites​

To follow this tutorial make sure you have minimal working knowledge of the following concepts:

The tutorial requires that you also have a GitHub Account. You will use this to:

  • host a public repo for the GitOps configuration.
  • utilize GitHub Codespaces for the workshop environment. Ensure that you have a quota available. The free tier includes 4 vCPU at 30 hours a month.
  • create an account on the Akuity Platform.

The tutorial was written and tested using the following tool and component versions:

  • Argo CD: v2.10.1
  • Docker Desktop: 4.13.1
  • Kubernertes: v1.29.1
  • kind: v0.22.0

2. Setting up Your Environment​

2.1. Create the Repository from a Template​

In this scenario, you manage the application Helm charts in version control. To represent this in the lab, you will create a repository from a template containing the application Helm charts.

  1. Click this link or click "Use this template" from the akuity/intro-argo-cd-tutorial-template repo main page.

  2. Ensure the desired "Owner" is selected (e.g., your account and not an organization).

  3. Enter intro-argo-cd-tutorial for the "Repository name".

important

It is crucial that you use the name intro-argo-cd-tutorial since the files in the repository come pre-populated with this value.

  1. Then click Create repository from template.

  2. Next, you'll start a new Codespace by clicking the green Code button on the repo page, selecting the Codespaces tab, and then selecting Create codespace on main.

warning

If you have other codespaces running, you may run into usage limits. You should shutdown codespaces that you are not using.

The Codespace will open in another browswer tab with information about setting up your codespace. Once it's done setting up, you should see a terminal in the browser with the repo open.

2.1.1. Verify Environment​

Part of the codespace setup was to install all necessary tools, which includes setting up kind and kubectl. You can verify that the environment is ready by going through the following:

  1. Verify that kind is installed and running a Kubernetes cluster.

    kind get clusters

    You should see the following output:

    dev
  2. Check that the cluster works by running kubectl get nodes.

    % kubectl get nodes
    NAME STATUS ROLES AGE VERSION
    dev-control-plane Ready control-plane 7m44s v1.29.2

    Fetching the nodes will demonstrate that kubectl can connect to the cluster and query the API server. The node should be in the "Ready" status.

2.2. Akuity Platform Sign Up​

This scenario demonstrates deploying applications to a cluster external to Argo CD.

Similar to how the GitHub repo is hosting the Helm charts, which describe what resources to deploy into Kubernetes, the Akuity Platform will host the Application manifests, which represent how to deploy the resources into the cluster. Along with Argo CD, which will implement the changes on the cluster.

tip

Sign up for a free 30-day trial of the Akuity Platform!

  1. Create an account on the Akuity Platform.

  2. To log in with GitHub SSO, click "Continue with GitHub".

note

You can also use Google SSO or an email and password combo.

  1. Click Authorize akuityio.
  1. Click the create or join link.

  2. Click + New organization in the upper right hand corner of the dashboard.

  3. Name your organization following the rules listed below the Organization Name field.

2.3. Create your Argo CD Instance​

You can create your Argo CD instance using the Akuity Platform Dashboard or CLI by choosing between the tabs below.

  1. Navigate to Argo CD.

  2. Click + Create in the upper right hand corner of the dashboard.

  3. Name your instance following the rules listed below the Instance Name field.

  4. (Optionally) Choose the Argo CD version you want to use.

  5. Click + Create.

At this point, your Argo CD instance will begin initializing. The start-up typically takes under 2 minutes.

2.3.1. Configure Your Instance​

While the instance is initializing, you can prepare it for the rest of the lab.

  1. In the dashboard for the Argo CD instance, click Settings.

  2. On the inner sidebar, under "Security & Access", click System Accounts.

  3. Enable the "Admin Account" by clicking the toggle and clicking Confirm on the prompt.

  4. Then, for the admin user, click Set Password.

  5. Click Regenerate Password, then click Copy.

  6. In the bottom right of the Set password prompt, hit Close.

  7. In the top, next to the Argo CD instance name and status, click the instance URL (e.g., <instance-id>.cd.akuity.cloud) to open the Argo CD login page in a new tab.

  8. Enter the username admin and the password copied previously.

You now have a fully-managed Argo CD instance πŸŽ‰

2.4. Deploy an Agent to the Cluster​

You must connect the cluster to Argo CD to deploy the application resources. The Akuity Platform uses an agent-based architecture for connecting external clusters. So, you will provision an agent and deploy it to the cluster.

  1. Back on the Akuity Platform, in the top left of the dashboard for the Argo CD instance, click Clusters.

  2. In the top right, click Connect a cluster.

  3. Enter the dev name as the "Cluster Name".

  4. In the bottom right, click Connect Cluster.

  5. To get the agent install command, click Copy to Clipboard. Then, in the bottom right, Done.

  6. Open your terminal and check that your target is the correct cluster by running kubectl config current-context.

    If you are following along using kind, you should see the following:

    % kubectl config current-context
    k3d-dev
  7. Paste and run the command against the cluster. The command will create the akuity namespace and deploy the resources for the Akuity Agent.

  8. Check the pods in the akuity namespace. Wait for the Running status on all pods (approx. 1 minute).

    % kubectl get pods -n akuity
    NAME READY STATUS RESTARTS AGE
    akuity-agent-<replicaset-id>-<pod-id> 1/1 Running 0 65s
    akuity-agent-<replicaset-id>-<pod-id> 1/1 Running 0 65s
    argocd-application-controller-<replicaset-id>-<pod-id> 2/2 Running 0 65s
    argocd-notifications-controller-<replicaset-id>-<pod-id> 1/1 Running 0 65s
    argocd-redis-<replicaset-id>-<pod-id> 1/1 Running 0 65s
    argocd-repo-server-<replicaset-id>-<pod-id> 1/1 Running 0 64s
    argocd-repo-server-<replicaset-id>-<pod-id> 1/1 Running 0 64s

    Re-run the kubectl get pods -n akuity command to check for updates on the pod statuses.

  9. Back on the Clusters dashboard, confirm that the cluster shows a green heart before the name, indicating a healthy status.

3. Using Argo CD to Deploy Helm Charts​

3.1. Create an Application in Argo CD​

Now, using an Application, you will declaratively tell Argo CD how to deploy the Helm charts.

Start by creating an Application to deploy the guestbook Helm Chart from the repo.

  1. Navigate to the Argo CD UI, and click NEW APP.

  2. In the top right, click EDIT AS YAML.

  3. Paste the contents of apps/guestbook.yaml from your repo.

info

This manifest describes an Application.

  • The name of the Application is guestbook.
  • The source is your repo with the Helm charts.
  • The destination is the cluster connected by the agent.
  • The sync policy will automatically create the namespace.
  1. Click SAVE. At this point, the UI has translated the Application manifest into the corresponding fields in the wizard.

  2. In the top left, click CREATE. The new app pane will close and show the card for the Application you created. The status on the card will show "Missing" and "OutOfSync".

  3. Click on the Application card titled argocd/guestbook.

info

In this state, the Application resource tree shows the manifests generated from the source repo URL and path defined. You can click DIFF to see what manifests the Application rendered. Since auto-sync is disabled, the resources do not exist in the destination yet.

  1. In the top bar, click SYNC then SYNCHRONIZE to instruct Argo CD to create the resources defined by the Application.

The resource tree will expand as the Deployment creates a ReplicaSet that makes a pod, and the Service creates an Endpoint and EndpointSlice. The Application will remain in the "Progressing" state until the pod for the deployment is running.

Afterwards, all the top-level resources (i.e., those rendered from the Application source) in the tree will show a green checkmark, indicating that they are synced (i.e., present in the cluster).

3.2. Syncing Changes Manually​

An Application now manages the deployment of the guestbook Helm chart. So what happens when you want to deploy a new image tag?

Instead of running helm upgrade guestbook ./guestbook, you will trigger a sync of the Application.

  1. Navigate to your repo on Github, and open the file guestbook/values.yaml.

    https://github.com/<username>/intro-argo-cd-tutorial/blob/main/guestbook/values.yaml
  2. In the top right of the file, click the pencil icon to edit.

  3. Update the image.tag to 0.2.0.

  4. Click Commit changes....

  5. Add a commit message. For example chore(guestbook): bump tag to 0.2.0.

  6. Click Commit changes.

  7. Switch to the Argo CD UI and go to the argocd/guestbook Application.

  8. In the top right, click the REFRESH button to trigger Argo CD to check for any changes to the Application source and resources.

note

The default sync interval is 3 minutes. Any changes made in Git may not apply for up to 3 minutes.

  1. In the top bar, click SYNC then SYNCHRONIZE to instruct Argo CD to deploy the changes.

Due to the change in the repo, Argo CD will detect that the Application is out-of-sync. It will template the Helm chart (i.e., helm template) and patch the guestbook deployment with the new image tag, triggering a rolling update.

3.3. Enable Auto-sync and Self-heal for the Guestbook Application​

Now that you are using an Application to describe how to deploy the Helm chart into the cluster, you can configure the sync policy to automatically apply changesβ€”removing the need for developers to manually trigger a deployment for changes that already made it through the approval processes.

  1. In the top menu, click DETAILS.

  2. Under the SYNC POLICY section, click ENABLE AUTO-SYNC and on the prompt, click OK.

  3. Below that, on the right of "SELF HEAL", click ENABLE.

  4. In the top right of the DETAILS pane, click the X to close it.

If the Application was out-of-sync, this would immediately trigger a sync. In this case, your Application is already in sync, so Argo CD made no changes.

3.4. Demonstrate Application Auto-sync via Git​

With auto-sync enabled on the guestbook Application, changes made to the main branch in the repo will be applied automatically to the cluster. You will demonstrate this by updating the number of replicas for the guestbook deployment.

  1. Navigate to your repo on Github, and open the file guestbook/values.yaml.

    https://github.com/<username>/intro-argo-cd-tutorial/blob/main/guestbook/values.yaml
  2. In the top right of the file, click the pencil icon to edit.

  3. Update the replicaCount to the 2 list.

  4. In the top right, click Commit changes....

  5. Add a commit message. For example chore(guestbook): scale to 2 replicas.

  6. In the bottom left, click Commit changes.

  7. Switch to the Argo CD UI and go to the argocd/guestbook Application.

  8. In the top right, click the REFRESH button to trigger Argo CD to check for any changes to the Application source and resources.

You can view the details of the sync operation by, in the top menu, clicking SYNC STATUS. Here it will display, what "REVISION" it was for, what triggered it (i.e., "INITIATED BY: automated sync policy"), and the result of the sync (i.e., what resources changed).

3.5. Demonstrate Application Self-heal Functionality​

In your organization, everyone has direct and privileged access to the cluster. Users may apply changes to the cluster outside of the repo due to the over-provisioned access. For example, applying a Helm chart change to the cluster without getting pushed to the repo first.

With self-heal enabled, Argo CD will reconcile any changes to the Application resources that deviate from the repo.

To demonstrate this:

  1. From the guestbook Application page in the Argo CD UI:

  2. Locate the guestbook deploy (i.e., Deployment) resource and click the three vertical dots on the right side of the card.

  3. Then click Delete.

  4. Enter the deployment name guestbook and click OK.

Almost as quickly as you delete it, Argo CD will detect that the deploy resource is missing from the Application. It will briefly display the yellow circle with a white arrow to indicate that the resource is out-of-sync. Then automatically recreate it, bringing the Application back to a healthy status.

4. Managing Argo CD Applications Declaratively​

4.1. Create an App of Apps​

One of the benefits of using Argo CD is that you are now codifying the deployment process for the Helm charts in the Application spec.

Earlier in the lab, you created the guestbook Application imperatively, using the UI. But what if you want to manage the Application manifests declaratively too? This is where the App of Apps pattern comes in.

  1. Navigate to the Applications dashboard in the Argo CD UI, and click NEW APP.

  2. In the top right, click EDIT AS YAML.

  3. Paste the contents of app-of-apps.yaml (in the repo's root).

    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
    name: bootstrap
    namespace: argocd
    spec:
    destination:
    name: in-cluster
    project: default
    source:
    path: apps
    repoURL: https://github.com/<username>/intro-argo-cd-tutorial # Update to your repo URL.
    targetRevision: HEAD

    This Application will watch the apps/ directory in your repo which contains Application manifests for the guestbook and portal Helm charts.

  4. Click SAVE.

  5. Then, in the top left, click CREATE.

  6. Click on the Application card titled argocd/bootstrap.

    At this point, the Application will be out-of-sync. The diff will show the addition of the argocd.argoproj.io/tracking-id label to the existing guestbook Application, which indicates that the "App of Apps now manages it".

      kind: Application
    metadata:
    ++ annotations:
    ++ argocd.argoproj.io/tracking-id: 'bootstrap:argoproj.io/Application:argocd/guestbook'
    generation: 44
    labels:
    ...
    path: guestbook
    repoURL: 'https://github.com/<username>/intro-argo-cd-tutorial'
    syncPolicy:
    automated: {}

    Along with a new Application for the portal Helm chart.

  7. To apply the changes, in the top bar, click SYNC then SYNCHRONIZE.

From this Application, you can see all of the other Applications managed by it in the resource tree. Each child Application resource has a link to its view on the resource card.

5. Review​

You have reached the end of the tutorial. You have an Argo CD instance deploying Helm charts from your repo into your cluster.

You no longer manually deploy Helm chart changes. The Application spec describes the process for deploying the Helm charts declaratively. There's no longer a need for direct access to the cluster, removing the primary source of configuration drift.