Work in Progress: This page is under development. Use the feedback button on the bottom right to help us improve it.

ArgoCD GitOps

Deploy and manage Laminar using GitOps with ArgoCD.

Prerequisites

  • Kubernetes cluster running
  • ArgoCD installed
  • kubectl configured
  • Git repository for configurations

Install ArgoCD

# Create namespace
kubectl create namespace argocd
 
# Install ArgoCD
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
 
# Wait for pods
kubectl wait --for=condition=ready pod -l app.kubernetes.io/name=argocd-server -n argocd --timeout=120s

Access ArgoCD UI

# Port forward
kubectl port-forward svc/argocd-server -n argocd 8080:443
 
# Get admin password
kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d
 
# Open https://localhost:8080
# Username: admin

Create Application

Via CLI

# Login to ArgoCD
argocd login localhost:8080
 
# Add Helm repository
argocd repo add https://charts.laminar.dev --type helm --name laminar
 
# Create application
argocd app create laminar \
  --repo https://charts.laminar.dev \
  --helm-chart laminar \
  --revision 1.0.0 \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace laminar \
  --sync-policy automated \
  --auto-prune \
  --self-heal

Via Manifest

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: laminar
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://charts.laminar.dev
    chart: laminar
    targetRevision: "1.0.0"
    helm:
      values: |
        api:
          replicas: 2
        controller:
          replicas: 2
        postgresql:
          enabled: true
          auth:
            postgresPassword: "your-secure-password"
  destination:
    server: https://kubernetes.default.svc
    namespace: laminar
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Apply:

kubectl apply -f laminar-app.yaml

App of Apps Pattern

For managing multiple environments or tenants:

Parent Application

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: laminar-apps
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/your-org/laminar-config.git
    targetRevision: main
    path: argocd/applications
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Child Applications

argocd/applications/
├── staging.yaml
├── production.yaml
└── monitoring.yaml

Each child application points to environment-specific configurations.


Sync Policies

Automated Sync

syncPolicy:
  automated:
    prune: true      # Delete removed resources
    selfHeal: true   # Revert manual changes
    allowEmpty: false

Manual Sync

syncPolicy: {}  # No automated sync

Trigger sync manually:

argocd app sync laminar

Sync Options

syncPolicy:
  syncOptions:
    - CreateNamespace=true
    - PrunePropagationPolicy=foreground
    - PruneLast=true
    - ApplyOutOfSyncOnly=true

Managing Secrets

External Secrets Operator

apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: laminar-db-credentials
  namespace: laminar
spec:
  refreshInterval: 1h
  secretStoreRef:
    kind: ClusterSecretStore
    name: aws-secrets-manager
  target:
    name: laminar-db-credentials
  data:
    - secretKey: password
      remoteRef:
        key: laminar/database
        property: password

Sealed Secrets

# Install sealed-secrets
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm install sealed-secrets sealed-secrets/sealed-secrets -n kube-system
 
# Create sealed secret
kubectl create secret generic laminar-db-credentials \
  --from-literal=password=your-password \
  --dry-run=client -o yaml | \
  kubeseal --format yaml > sealed-secret.yaml

Health Checks

ArgoCD automatically tracks health. Custom health checks:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: laminar
spec:
  # ...
  ignoreDifferences:
    - group: apps
      kind: Deployment
      jsonPointers:
        - /spec/replicas

Rollback

Via CLI

# View history
argocd app history laminar
 
# Rollback to previous
argocd app rollback laminar
 
# Rollback to specific revision
argocd app rollback laminar 3

Via UI

  1. Navigate to application
  2. Click "History and Rollback"
  3. Select revision
  4. Click "Rollback"

Notifications

Configure notifications for sync events:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
  namespace: argocd
data:
  service.slack: |
    token: $slack-token
  template.app-deployed: |
    message: |
      Application {{.app.metadata.name}} is now {{.app.status.sync.status}}.
  trigger.on-deployed: |
    - description: Application deployed
      send:
        - app-deployed
      when: app.status.operationState.phase in ['Succeeded']

Multi-Cluster

Deploy to multiple clusters:

# Add cluster
argocd cluster add my-cluster-context
 
# List clusters
argocd cluster list

Create application targeting specific cluster:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: laminar-prod
spec:
  destination:
    server: https://prod-cluster.example.com
    namespace: laminar

Useful Commands

# List applications
argocd app list
 
# Get application details
argocd app get laminar
 
# Sync application
argocd app sync laminar
 
# Force sync
argocd app sync laminar --force
 
# Delete application
argocd app delete laminar
 
# View diff
argocd app diff laminar

Next Steps