
If you're setting up GitOps for Kubernetes, this walks you through both ArgoCD and Flux CD implementations with actual manifests and repo structures. It covers the app-of-apps pattern, progressive delivery strategies like canary and blue-green, and secret management with External Secrets Operator and Sealed Secrets. The safety guidance is practical: no auto-sync to prod without approvals, keep secrets out of Git. What I appreciate is the troubleshooting section and the clear repo layout examples. It won't help with one-off deployments or non-Kubernetes targets, but for teams adopting declarative, Git-based CD following OpenGitOps principles, it gives you the scaffolding to get started properly.
$ npx -y skills add sickn33/antigravity-awesome-skills --skill gitops-workflow --agent claude-codeInstalls into .claude/skills of the current project.
Complete guide to implementing GitOps workflows with ArgoCD and Flux for automated Kubernetes deployments.
Implement declarative, Git-based continuous delivery for Kubernetes using ArgoCD or Flux CD, following OpenGitOps principles.
# Create namespace
kubectl create namespace argocd
# Install ArgoCD
# Obtain the selected release manifest, review its complete content, then apply
# the reviewed local file to the authorized context:
kubectl apply -n argocd -f ./reviewed-argocd-install.yaml
# Get admin password
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
Reference: See references/argocd-setup.md for detailed setup
gitops-repo/
├── apps/
│ ├── production/
│ │ ├── app1/
│ │ │ ├── kustomization.yaml
│ │ │ └── deployment.yaml
│ │ └── app2/
│ └── staging/
├── infrastructure/
│ ├── ingress-nginx/
│ ├── cert-manager/
│ └── monitoring/
└── argocd/
├── applications/
└── projects/
The following auto-sync/prune configuration is for an authorized non-production example. For production, omit automated sync until approval and promotion controls are established.
# argocd/applications/my-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/org/gitops-repo
targetRevision: main
path: apps/production/my-app
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: applications
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/org/gitops-repo
targetRevision: main
path: argocd/applications
destination:
server: https://kubernetes.default.svc
namespace: argocd
syncPolicy:
automated: {}
# Install Flux CLI
brew install fluxcd/tap/flux
# Alternative: download the official installer, inspect it, then execute it
tmpdir="$(mktemp -d)"
trap 'rm -rf "$tmpdir"' EXIT
curl -fsSLo "$tmpdir/flux-install.sh" https://fluxcd.io/install.sh
cat "$tmpdir/flux-install.sh" # review the full installer before sudo
sudo bash "$tmpdir/flux-install.sh"
# Bootstrap Flux
flux bootstrap github \
--owner=org \
--repository=gitops-repo \
--branch=main \
--path=clusters/production \
--personal
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: my-app
namespace: flux-system
spec:
interval: 1m
url: https://github.com/org/my-app
ref:
branch: main
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: my-app
namespace: flux-system
spec:
interval: 5m
path: ./deploy
prune: true
sourceRef:
kind: GitRepository
name: my-app
ArgoCD:
syncPolicy:
automated:
prune: true # Delete resources not in Git
selfHeal: true # Reconcile manual changes
allowEmpty: false
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
Flux:
spec:
interval: 1m
prune: true
wait: true
timeout: 5m
Reference: See references/sync-policies.md
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: my-app
spec:
replicas: 5
strategy:
canary:
steps:
- setWeight: 20
- pause: {duration: 1m}
- setWeight: 50
- pause: {duration: 2m}
- setWeight: 100
strategy:
blueGreen:
activeService: my-app
previewService: my-app-preview
autoPromotionEnabled: false
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db-credentials
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-secrets-manager
kind: SecretStore
target:
name: db-credentials
data:
- secretKey: password
remoteRef:
key: prod/db/password
# Encrypt secret
kubeseal --format yaml < secret.yaml > sealed-secret.yaml
# Commit sealed-secret.yaml to Git
Sync failures:
argocd app get my-app
# Inspect diff/health first; pruning is a separately authorized deletion action.
Out of sync status:
argocd app diff my-app
# Force/replacement sync is not a routine fix; inspect the cause and disruption first.
k8s-manifest-generator - For creating manifestshelm-chart-scaffolding - For packaging applicationsSponsors