# ArgoCD Application Consolidation Plan ## Executive Summary **Current:** 39 Applications **Proposed:** 32 Applications (Conservative: 35) **Benefits:** Easier management, fewer Application resources, cleaner structure ## Phase 1: Safe & Easy Merges (Conservative - Start Here) These are Applications that already share the same directory and have clear parent-child relationships. ### 1.1 Merge: wildcard-cert + homelab-ingress → "ingress-config" **Current State:** ``` wildcard-cert (wave 1) → k8s/bootstrap/ingress/riotpiao-com-cert.yaml homelab-ingress (wave 2) → k8s/bootstrap/ingress/ingress.yaml ``` **New State:** ``` ingress-config (wave 1) → k8s/bootstrap/ingress/ (kustomization) ``` **Rationale:** Both in same directory, ingress depends on cert existing **Implementation:** - Update `k8s/bootstrap/ingress/kustomization.yaml` to include both - Create single Application pointing to k8s/bootstrap/ingress/ - Delete wildcard-cert and homelab-ingress Applications - Result: 2 → 1 Applications ### 1.2 Merge: homarr + homarr-patches → "homarr" **Current State:** ``` homarr (wave 8) → Helm chart (homarr-labs.github.io) homarr-patches (wave 9) → k8s/applications/homarr/fix-probes-job.yaml ``` **New State:** ``` homarr (multi-source): - Source 1: Helm chart - Source 2: k8s/applications/homarr/ (patches as PostSync hook) ``` **Rationale:** homarr-patches is literally a patch for homarr **Implementation:** - Modify homarr Application to use multi-source - Convert fix-probes-job.yaml to PostSync hook - Delete homarr-patches Application - Result: 2 → 1 Applications ### 1.3 Merge: temporal-db-secret-sync → temporal (as PreSync hook) **Current State:** ``` temporal-db-secret-sync (wave 7) → k8s/applications/temporal/db-secret-sync/ temporal (wave 8) → Helm chart ``` **New State:** ``` temporal (multi-source): - Source 1: k8s/applications/temporal/db-secret-sync/ (PreSync hook) - Source 2: Helm chart - Source 3: k8s/applications/temporal/ (values) ``` **Rationale:** db-secret-sync is a bootstrap job for temporal **Implementation:** - Modify temporal Application to use multi-source - Ensure db-secret-sync Job has PreSync hook annotation - Delete temporal-db-secret-sync Application - Result: 2 → 1 Applications ### 1.4 Merge: cert-manager-issuers → cert-manager (as multi-source) **Current State:** ``` cert-manager (wave 0) → Helm chart cert-manager-issuers (wave 1) → k8s/bootstrap/cert-manager/ (issuers) ``` **New State:** ``` cert-manager (multi-source): - Source 1: Helm chart - Source 2: k8s/bootstrap/cert-manager/ (values + issuers) ``` **Rationale:** Issuers are part of cert-manager configuration **Implementation:** - Modify cert-manager Application to use multi-source - Keep as wave 0 (issuers can wait for CRDs to be ready) - Delete cert-manager-issuers Application - Result: 2 → 1 Applications **Phase 1 Result: 39 → 35 Applications (-4)** --- ## Phase 2: Logical Consolidations (Moderate Risk) ### 2.1 Merge: SQS Applications → "sqs-platform" **Current State:** ``` strimzi-operator (wave 5) → Helm chart (operator) kmsvc-redis (wave 5) → Helm chart (Redis) kafka-cluster (wave 6) → k8s/applications/sqs/charts/kafka-cluster/ queue-crd (wave 6) → k8s/applications/sqs/charts/queue-crd/ management-service (wave 7) → k8s/applications/sqs/charts/management-service/ ``` **New State:** ``` strimzi-operator (wave 5) → Keep separate (operator) sqs-platform (wave 6) → k8s/applications/sqs/ (all services + CRDs) ``` **Rationale:** These 4 apps work together as the SQS platform **Implementation:** - Create kustomization.yaml in k8s/applications/sqs/ - Create single multi-source Application - Keep strimzi-operator separate (it's infrastructure) - Result: 5 → 2 Applications ### 2.2 Merge: authentik + iam-jobs → "authentik" **Current State:** ``` authentik (wave 3) → Helm chart iam-jobs (wave 3) → k8s/security/iam/ (authentik helper jobs) ``` **New State:** ``` authentik (multi-source): - Source 1: Helm chart - Source 2: k8s/security/iam/ (helper jobs) ``` **Rationale:** iam-jobs appears to be authentik-specific **Implementation:** - Verify iam-jobs are authentik-specific - Merge into single multi-source Application - Result: 2 → 1 Applications ### 2.3 Remove Duplicate: ingress-nginx Application **Current State:** ``` ingress-nginx-bootstrap (wave 0, bootstrap) → Helm chart ingress-nginx (wave 0, ArgoCD) → Helm chart (DUPLICATE!) ``` **New State:** ``` ingress-nginx-bootstrap (wave 0, bootstrap) → Keep only this one ``` **Rationale:** These are the same thing, bootstrap one is already working **Implementation:** - Delete ingress-nginx Application (redundant) - Result: 2 → 1 Applications **Phase 2 Result: 35 → 31 Applications (-4)** --- ## Phase 3: Advanced Consolidations (Consider Carefully) ### 3.1 Consider: Monitoring Stack **Current State:** ``` prometheus-crds (wave 0) → k8s/platform/monitoring/crds/ prometheus (wave 1) → Helm chart blackbox-exporter (wave 1) → Helm chart ``` **Option A:** Keep separate (CRDs must be wave 0) **Option B:** Create "monitoring-stack" with prometheus + blackbox-exporter only **Recommendation:** Keep separate for now (CRDs are special) ### 3.2 Consider: Logging Stack **Current State:** ``` loki (wave 2) → Helm chart promtail (wave 2) → Helm chart grafana (wave 2) → Helm chart ``` **Option A:** Create "logging-stack" with all three **Option B:** Keep separate (grafana used by multiple systems) **Recommendation:** Keep separate for now (grafana has multiple consumers) --- ## Implementation Order ### Sprint 1: Phase 1 (Low Risk) 1. ✅ ingress-config (wildcard-cert + homelab-ingress) 2. ✅ homarr (merge homarr-patches) 3. ✅ temporal (merge db-secret-sync) 4. ✅ cert-manager (merge issuers) ### Sprint 2: Phase 2 (Moderate Risk) 5. ✅ Remove duplicate ingress-nginx 6. ✅ sqs-platform consolidation 7. ✅ authentik + iam-jobs ### Sprint 3: Phase 3 (Optional) 8. ⚠️ Evaluate monitoring stack consolidation 9. ⚠️ Evaluate logging stack consolidation --- ## File Changes Required ### For each consolidation: 1. **Update Application YAML** in `k8s/argocd/apps/*.yaml` - Convert single-source to multi-source - Update sync waves appropriately - Add hook annotations where needed 2. **Update kustomization.yaml** in target directories - Ensure all resources are listed - Verify namespace declarations 3. **Test locally:** ```bash kubectl kustomize k8s/bootstrap/ingress/ helm template -f values.yaml ``` 4. **Delete old Applications:** ```bash kubectl delete application -n argocd ``` --- ## Rollback Plan Each consolidation is independent. If issues arise: 1. **Revert git commit** with the Application change 2. **Restore old Applications** from git history 3. **Force ArgoCD refresh:** ```bash kubectl delete application -n argocd kubectl apply -f k8s/argocd/apps/.yaml ``` --- ## Success Metrics **Before:** 39 Applications **After (Conservative):** 35 Applications **After (Full):** 31-32 Applications **Benefits:** - ✅ Easier to understand (related apps grouped) - ✅ Fewer Application CRs to manage - ✅ Cleaner ArgoCD UI - ✅ Logical grouping by function - ✅ Reduced sync complexity **Risks:** - ⚠️ Multi-source Applications are slightly more complex - ⚠️ Sync wave ordering must be preserved - ⚠️ Hook timing must be correct (PreSync/PostSync) --- ## Decision: Which Phase? **Recommendation:** Start with **Phase 1 (Conservative)** → 35 Applications This gives us: - 4 fewer Applications to manage - Low risk (same directories) - Easy to understand merges - Can evaluate Phase 2 later based on results **Do you want to proceed with Phase 1 implementation?**