3.7 KiB
3.7 KiB
GitOps Repository Patterns (2024-2025)
Monorepo vs Polyrepo
Monorepo Pattern
Structure:
gitops-repo/
├── apps/
│ ├── frontend/
│ ├── backend/
│ └── database/
├── infrastructure/
│ ├── ingress/
│ ├── monitoring/
│ └── secrets/
└── clusters/
├── dev/
├── staging/
└── production/
Pros:
- Single source of truth
- Atomic changes across apps
- Easier to start with
- Simpler CI/CD
Cons:
- Scaling issues (>100 apps)
- RBAC complexity
- Large repo size
- Blast radius concerns
Best for: Startups, small teams (< 20 apps), single team ownership
Polyrepo Pattern
Structure:
infrastructure-repo/ (Platform team)
app-team-1-repo/ (Team 1)
app-team-2-repo/ (Team 2)
cluster-config-repo/ (Platform team)
Pros:
- Clear ownership boundaries
- Better RBAC (repo-level)
- Scales to 100s of apps
- Team autonomy
Cons:
- More complex setup
- Cross-repo dependencies
- Multiple CI/CD pipelines
Best for: Large orgs, multiple teams, clear separation of concerns
Common Patterns
1. Repo Per Team
- Each team has own repo
- Platform team manages infra repo
- Hub cluster manages all
2. Repo Per App
- Each app in separate repo
- Good for microservices
- Maximum autonomy
3. Hybrid (Recommended)
- Infrastructure monorepo (platform team)
- Application polyrepo (dev teams)
- Best of both worlds
App-of-Apps Pattern (ArgoCD)
Root Application:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: root
spec:
source:
repoURL: https://github.com/org/gitops
path: apps/
destination:
server: https://kubernetes.default.svc
Apps Directory:
apps/
├── app1.yaml (Application manifest)
├── app2.yaml
└── app3.yaml
Benefits: Centralized management, single sync point
Environment Structure
Option 1: Directory Per Environment
apps/
├── base/
│ └── kustomization.yaml
└── overlays/
├── dev/
├── staging/
└── production/
Option 2: Branch Per Environment
main branch → production
staging branch → staging
dev branch → development
Don't Repeat YAML: Use Kustomize bases + overlays
Flux Repository Organization
Recommended Structure:
flux-repo/
├── clusters/
│ ├── production/
│ │ ├── flux-system/
│ │ ├── apps.yaml
│ │ └── infrastructure.yaml
│ └── staging/
├── apps/
│ └── podinfo/
│ ├── kustomization.yaml
│ └── release.yaml
└── infrastructure/
└── sources/
├── gitrepositories.yaml
└── ocirepositories.yaml
Kustomize vs Helm in GitOps
Kustomize (recommended for GitOps):
- Native Kubernetes
- Declarative patches
- No templating language
Helm (when necessary):
- Third-party charts
- Complex applications
- Need parameterization
Best Practice: Kustomize for your apps, Helm for third-party
Promotion Strategies
1. Manual PR-based
dev/ → (PR) → staging/ → (PR) → production/
2. Automated with CI
dev/ → (auto-promote on tests pass) → staging/ → (manual approval) → production/
3. Progressive with Canary
production/stable/ → canary deployment → production/all/
2024-2025 Recommendations
- Start with monorepo, migrate to polyrepo when needed
- Use Kustomize bases + overlays (don't repeat YAML)
- Separate infrastructure from applications
- Implement promotion workflows (dev → staging → prod)
- Never commit directly to production (always PR)