EKS Cluster: Part 15.20 – Argo Rollouts, Controller

Series of blog posts show progress of updating/adding to EKS Cluster, this post covers adding Argo Rollouts.

Argo Rollouts:

  • Then build progressive delivery
    • Install Argo Rollouts through Argo CD.
    • Convert the Gateway demo Deployment into a Rollout.
    • Demonstrate blue/green deployment.
    • Add canary releases.
    • Connect Rollouts to Gateway API.
    • Add Prometheus analysis.
    • Deploy an intentionally unhealthy version.
    • Demonstrate automated rollback.
terraform plan

Phase 1: Install the Argo Rollouts controller through Argo CD.

Context & Layout Reasoning:

  • We will install the Argo Rollouts controller through Argo CD. Think of the controller as the engine & the Helm repo installs the package for that particular engine.
  • Below is the dependency order
    • Install CRDs
    • Start the controller
    • Deploy a rollout
    • Controller immediately recognize & manages it
Main Argo Rollouts repositorybuilds and releases the software
Argo Helm repositorypackages that software for configurable Helm installation.
Your GitOps repositorystores your chosen configuration and tells Argo CD to install it.
ArgoCDMatches k8s manifests in cluster to match git
Argo Rollouts ControllerInterpret rollout strategy & safely move application from one version to another. W/no controller K8s could store the rollout custom resource after CRD is installed, BUT nothing would happen for the rollout.

Argo Rollouts controller watches the rollout resources & performs the actions.
– Git repo
– ArgoCD
– Rollout Manifest
– Argo Rollouts controller
– ReplicaSets, Pods, & Services

K8s Rollout vs K8s

  • K8s rollout is NOT handled by k8s cuz k8s does NOT know how to handle
    • Canary steps
    • Blue/green switching
    • Pauses and manual promotion
    • Analysis runs
    • Automated rollback
    • Stable versus canary ReplicaSets

Other Options:

  • We could use the main repo argo-rollouts/install.yaml…
  • However for my architecture layout already it makes sense to use argoproj/argo-helm cuz it configurable Helm packaging used to install Argo Rollouts.
    • Git-managed values.yaml
    • Controller resource requests and limits
    • Dashboard enable/disable settings
    • CRD installation settings
    • Replica configuration
    • Security-context configuration
    • RBAC configuration
    • Easier upgrades by changing targetRevision
    • The same multi-source Argo CD pattern already used for Karpenter, Kyverno, Prometheus and other tools

Sequel Later….

  • Later.. The demo workload &/or rollout strategy will arrive after…

apps/argo-rollouts/values.yaml

applications/lab/platform/argo-rollouts.yaml

  • Important to callout the annotation wave of “-1” cuz the controller is installed before Rollout workloads. Then also note the sources targetrevision utilized
=======================
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: argo-rollouts
namespace: argocd
annotations:
# Install the controller before Rollout workloads.
argocd.argoproj.io/sync-wave: "-1"
spec:
project: lab-platform
sources:
- repoURL: https://argoproj.github.io/argo-helm
chart: argo-rollouts
targetRevision: 2.43.11
helm:
releaseName: argo-rollouts
valueFiles:
- $values/apps/argo-rollouts/values.yaml
=======================

applications/lab/projects/lab-platform.yaml

  • Add to sourceRepos & destinations, the clusterResourceWhitelist & namespaceResourceWhitelist did NOT change.
=======================
sourceRepos:
- https://argoproj.github.io/argo-helm
=======================
destinations:
- namespace: argo-rollouts
server: https://kubernetes.default.svc
=======================

Validate Helm Chart & Install

=======================
helm repo add argo \
https://argoproj.github.io/argo-helm
=======================
helm repo update
=======================
helm lint argo/argo-rollouts \
--version 2.43.11 \
--values apps/argo-rollouts/values.yaml
=======================
helm template argo-rollouts \
argo/argo-rollouts \
--version 2.43.11 \
--namespace argo-rollouts \
--values apps/argo-rollouts/values.yaml \
> /tmp/argo-rollouts-rendered.yaml
=======================

GitOps validation workflow passes in GitHub Actions.

  • Hopefully it passed?

.github/workflows/gitops-validate.yaml

  • Add to the file only one entry to the existing helm-render matrix & then thru the command add the helm template.
  • You will know its successful by seeing the extra job for argo-rollouts for metric helm-render.
=======================
strategy:
fail-fast: false
matrix:
include:
- name: argo-rollouts
repository: https://argoproj.github.io/argo-helm
chart: argo-rollouts
version: 2.43.11
values: apps/argo-rollouts/values.yaml
namespace: argo-rollouts
=======================
helm template \
argo-rollouts \
argo-rollouts \
--repo https://argoproj.github.io/argo-helm \
--version 2.43.11 \
--values apps/argo-rollouts/values.yaml \
--namespace argo-rollouts \
--kube-version 1.31.0 \
--include-crds \
> /tmp/argo-rollouts-rendered.yaml
test -s /tmp/argo-rollouts-rendered.yaml &&
echo "Argo Rollouts rendered successfully"
=======================

Phase 2: Deploy a simple Rollout demonstration workload.

applications/lab/projects/lab-platform.yaml

terraform apply

Leave a Reply