GitOps with ArgoCD and Kubernetes
π― Problem Statement Traditional deployment approaches often suffer from: Manual deployments leading to human errors Configuration drift between environments Lack of audit trail for changes Slow rollback processes during incidents No single source of truth for cluster state π‘ Solution Overview I implemented a GitOps-based continuous deployment pipeline using ArgoCD that treats Git as the single source of truth for declarative infrastructure and application definitions. ποΈ Architecture β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β G ( - - - β β β β A S R β β i C β β β β p o e β β t I B T P β β β β p u p β β H u e u β β β β l r o β β u P i s s β β β β i c s β β b i l t h β β β β βΌ β c e i β β β βΌ β p d β β β β β β β β β β β a t β β A e I β β β β β β t C o β β c l m β β β β β β i o r β β t i a β β β β β β β β β β o d y β β i n g β β β N β β β β β n e β β o e e β β β a β β β β β β β n ) β β β m β β β β β β β s β β β D e β β β β β β β β β β e s β β β β β β β β β β β β β β β β β β v p β β β β β β β β β a β β β β β β β β β c β β β β β β β β K β e β β β β β β β β u β β β β β β β βΊ βΊ β β b β β D β β β β β β β β β β β βΌ β β β e β β β β β β e β β β β β β β r β N β β β v β β β β β β β n β S a β β β e β β β β ( - - β - β β e β t m β β β l β β C ( β β C β β β t β a e β β β o β β o K β β D S H β R β β e β g s β β β p β β n 8 β β A y e β o β β s β i p β β β e β β f s β β r P n a β l β β β n a β β β r β β i β β g l c l β l β β C β g c β β β β β g Y β β β βΌ β o a t β b β β βΌ β l β e β β β W β β A β β C t h β a β β u β β β β β β o β β R M β β D f β c β β s β β r β β e L β β o C β k β β t β β β β β β k β β p ) β β r h β β β e β N β β β f β β o β β m e β β β r β a β β β l β β β β ) c β β β β P m β β β o β β β β k β β β β r e β β β w β β β β β β β β o s β β β β β β β β β β β β β β βΌ β β β β d p β β β β β β β a β β β β β β β c β β β β β β β e β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β C R ( β β β β β β β β β β β o e A β β β β β β β β n g C β β β β β t i R β β β β β a s / β β β β β β β β β β i t G β β² β β β β β n r C β β β β e y R β β β β r ) β β β β β β β β β β β β β β β β β β β β β β β β β β β β β π οΈ Technologies Used Category Technology GitOps Platform ArgoCD 2.8+ CI Platform GitHub Actions Container Registry Azure Container Registry Kubernetes AKS / GKE Secrets Management Sealed Secrets / External Secrets Notifications Slack, Microsoft Teams Metrics Prometheus + ArgoCD Metrics π Repository Structure # a β β β β β β # g β β β β β β β β β β β β β β β β β β p β β β β i β β β A p β β β β G t β β β p - i o p r s D . β R t p a β β β β β β a β β β β β i β β β l e r o g β E O s p β β r β β n β β β i p c c i β A p - p β β g β β f β β β c o k t D s r s o r a e h w β M e / b β β β β β β β c a β β β p β a c i m t r u o β E C p a β β β β v β β β d p β β β r β s e n o i f b r β . o o s β β β β e β β β / p β β β o β t r g n o i / k m n / e r l j r t r i n l f c d f / d s i k l d s p i a a a e m u - e t e l i i e e n u a e t r c p p p c y c m s o R o . g p r g s y v a o a p p p t - t a s r e w y u l v r t s g d t - - - s p u n - i p s a r o i e o i / i d s p / r r a n n o / m a y c s m n o e t r o e g g g s l t m e s i g n v a o j / e i / i i e . . z / s . g d e r n t o n y y a y i . c / x o n t a a t a n y t / r . m m i m g a . y R y l l o l . m y e a n y l a p m . a m o l y m l s a l i m t l o r y π GitOps Workflow CI Pipeline (GitHub Actions) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 name: CI Pipeline on: push: branches: [main] pull_request: branches: [main] jobs: build-and-push: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - name: Build and test run: | docker build -t app:${{ github.sha }} . docker run app:${{ github.sha }} npm test - name: Push to ACR uses: azure/docker-login@v1 with: login-server: ${{ secrets.ACR_LOGIN_SERVER }} username: ${{ secrets.ACR_USERNAME }} password: ${{ secrets.ACR_PASSWORD }} - run: | docker tag app:${{ github.sha }} ${{ secrets.ACR_LOGIN_SERVER }}/app:${{ github.sha }} docker push ${{ secrets.ACR_LOGIN_SERVER }}/app:${{ github.sha }} update-manifests: needs: build-and-push runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 with: repository: org/gitops-repo token: ${{ secrets.GH_PAT }} - name: Update image tag run: | cd apps/overlays/dev kustomize edit set image app=${{ secrets.ACR_LOGIN_SERVER }}/app:${{ github.sha }} - name: Commit and push run: | git config user.name "github-actions" git config user.email "github-actions@github.com" git add . git commit -m "Update dev image to ${{ github.sha }}" git push ArgoCD Application Definition 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app-dev namespace: argocd finalizers: - resources-finalizer.argocd.argoproj.io spec: project: default source: repoURL: https://github.com/org/gitops-repo.git targetRevision: HEAD path: apps/overlays/dev destination: server: https://kubernetes.default.svc namespace: dev syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespace=true retry: limit: 5 backoff: duration: 5s maxDuration: 3m0s factor: 2 π Security Implementation RBAC - Role-based access control for ArgoCD users SSO Integration - Azure AD / GitHub OAuth Sealed Secrets - Encrypted secrets in Git Network Policies - ArgoCD namespace isolation Audit Logging - Complete audit trail of all changes π Results & Metrics Metric Before After Deployment Frequency Weekly Multiple per day Lead Time for Changes 2-3 days < 1 hour Mean Time to Recovery 4 hours < 15 minutes Change Failure Rate 15% < 2% π Key Learnings Separation of Concerns - Keeping app code and configuration in separate repos provides clear boundaries Progressive Delivery - Promoting changes through environments (dev β staging β prod) catches issues early Self-Healing - ArgoCDβs self-heal feature ensures the cluster always matches the desired state Observability - ArgoCDβs built-in dashboard provides excellent visibility into deployment status π Resources GitHub Repository: github.com/yourusername/gitops-argocd Related Blog Post: Getting Started with GitOps Interested in implementing GitOps? Letβs discuss! ...