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=120sAccess 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: adminCreate 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-healVia 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=trueApply:
kubectl apply -f laminar-app.yamlApp 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: trueChild 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: falseManual Sync
syncPolicy: {} # No automated syncTrigger sync manually:
argocd app sync laminarSync Options
syncPolicy:
syncOptions:
- CreateNamespace=true
- PrunePropagationPolicy=foreground
- PruneLast=true
- ApplyOutOfSyncOnly=trueManaging 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: passwordSealed 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.yamlHealth 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/replicasRollback
Via CLI
# View history
argocd app history laminar
# Rollback to previous
argocd app rollback laminar
# Rollback to specific revision
argocd app rollback laminar 3Via UI
- Navigate to application
- Click "History and Rollback"
- Select revision
- 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 listCreate application targeting specific cluster:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: laminar-prod
spec:
destination:
server: https://prod-cluster.example.com
namespace: laminarUseful 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 laminarNext Steps
- High Availability - HA configuration
- Multi-tenancy - Multi-tenant deployments