From a1cff1dfb98d6ff0a536f552032e1800a3b616bf Mon Sep 17 00:00:00 2001 From: duynguyen Date: Wed, 29 Jul 2026 23:49:59 +0700 Subject: [PATCH] feat: add vault, external-secrets, monitoring, harbor, jenkins, sonarqube, headlamp Two-source ArgoCD Applications (upstream chart + values from this repo), same pattern as cluster-bootstrap. Each service paired with a *-config Application for HTTPRoute/RBAC/ClusterSecretStore that must exist after the main install (separate sync wave). Chart targetRevision pins and HTTPRoute backendRef service names are best-effort - marked TODO/verify in-file since no live helm repo access this session to confirm current versions or actual rendered svc names. --- README.md | 122 +++++++++++++++++- .../clustersecretstore.yaml | 17 +++ .../serviceaccount.yaml | 5 + manifests/external-secrets/values.yaml | 1 + manifests/harbor-config/httproute.yaml | 20 +++ manifests/harbor/values.yaml | 30 +++++ manifests/headlamp-config/rbac.yaml | 18 +++ manifests/headlamp/values.yaml | 2 + manifests/jenkins-config/httproute.yaml | 20 +++ manifests/jenkins/values.yaml | 14 ++ .../httproute.yaml | 20 +++ manifests/kube-prometheus-stack/values.yaml | 26 ++++ manifests/sonarqube-config/httproute.yaml | 20 +++ manifests/sonarqube/values.yaml | 17 +++ manifests/vault/values.yaml | 15 +++ platform/apps/external-secrets-config.yaml | 22 ++++ platform/apps/external-secrets.yaml | 29 +++++ platform/apps/harbor-config.yaml | 22 ++++ platform/apps/harbor.yaml | 28 ++++ platform/apps/headlamp-config.yaml | 22 ++++ platform/apps/headlamp.yaml | 28 ++++ platform/apps/jenkins-config.yaml | 22 ++++ platform/apps/jenkins.yaml | 28 ++++ .../apps/kube-prometheus-stack-config.yaml | 22 ++++ platform/apps/kube-prometheus-stack.yaml | 29 +++++ platform/apps/sonarqube-config.yaml | 22 ++++ platform/apps/sonarqube.yaml | 28 ++++ platform/apps/vault.yaml | 28 ++++ 28 files changed, 674 insertions(+), 3 deletions(-) create mode 100644 manifests/external-secrets-config/clustersecretstore.yaml create mode 100644 manifests/external-secrets-config/serviceaccount.yaml create mode 100644 manifests/external-secrets/values.yaml create mode 100644 manifests/harbor-config/httproute.yaml create mode 100644 manifests/harbor/values.yaml create mode 100644 manifests/headlamp-config/rbac.yaml create mode 100644 manifests/headlamp/values.yaml create mode 100644 manifests/jenkins-config/httproute.yaml create mode 100644 manifests/jenkins/values.yaml create mode 100644 manifests/kube-prometheus-stack-config/httproute.yaml create mode 100644 manifests/kube-prometheus-stack/values.yaml create mode 100644 manifests/sonarqube-config/httproute.yaml create mode 100644 manifests/sonarqube/values.yaml create mode 100644 manifests/vault/values.yaml create mode 100644 platform/apps/external-secrets-config.yaml create mode 100644 platform/apps/external-secrets.yaml create mode 100644 platform/apps/harbor-config.yaml create mode 100644 platform/apps/harbor.yaml create mode 100644 platform/apps/headlamp-config.yaml create mode 100644 platform/apps/headlamp.yaml create mode 100644 platform/apps/jenkins-config.yaml create mode 100644 platform/apps/jenkins.yaml create mode 100644 platform/apps/kube-prometheus-stack-config.yaml create mode 100644 platform/apps/kube-prometheus-stack.yaml create mode 100644 platform/apps/sonarqube-config.yaml create mode 100644 platform/apps/sonarqube.yaml create mode 100644 platform/apps/vault.yaml diff --git a/README.md b/README.md index bbb6e77..7d46450 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # K8s Cluster Platform — Services -Bootstraps platform/application services (vault, external-secrets, harbor, jenkins, -sonarqube, etc.) onto the cluster using ArgoCD app-of-apps pattern. +Bootstraps platform/application services (vault, kube-prometheus-stack, harbor, +jenkins, sonarqube, headlamp) onto the cluster using ArgoCD app-of-apps pattern. Run this after `cluster-bootstrap` finishes (ArgoCD, MetalLB, Envoy Gateway, NFS storage must already be up). @@ -14,9 +14,34 @@ Git repo (cluster-platform) platform-app.yaml ← root Application, applied once by hand (kubectl apply) platform/apps/ ← ArgoCD watches this path; one Application CRD per service -manifests/ ← Helm values referenced by those Applications +manifests/ ← Helm values + raw manifests referenced by those Applications ``` +Sync waves (no hard interdependencies between services yet — grouped for +readability / staggered rollout): + +| Wave | Service | Purpose | +|------|---------|---------| +| 0 | vault | Secrets engine (standalone, manual init/unseal) | +| 0 | headlamp | K8s dashboard | +| 1 | headlamp-config | ClusterRoleBinding for login token | +| 1 | external-secrets | Vault → K8s Secret operator | +| 1 | kube-prometheus-stack | Prometheus + Grafana + Alertmanager | +| 1 | harbor | Image registry | +| 2 | external-secrets-config | ClusterSecretStore wired to Vault (k8s auth) | +| 2 | kube-prometheus-stack-config | Grafana HTTPRoute | +| 2 | harbor-config | Harbor HTTPRoute | +| 2 | jenkins | CI | +| 2 | sonarqube | Code quality (embedded H2, no external Postgres) | +| 3 | jenkins-config | Jenkins HTTPRoute | +| 3 | sonarqube-config | SonarQube HTTPRoute | + +⚠️ Chart `targetRevision` pins in `platform/apps/*.yaml` are best-effort and +marked `TODO: verify latest` — this session had no live access to the Helm +repos to confirm current versions. Run `helm repo add && helm +search repo / --versions` before or after first sync and bump +if a pin doesn't resolve. + ## Bootstrap Sequence **Apply the root platform Application** @@ -26,3 +51,94 @@ kubectl apply -f platform-app.yaml ``` Everything else is reached by ArgoCD syncing `platform/apps/` from here. + +### Post-sync manual steps + +**Vault — initialize + unseal** (standalone mode, not auto-unseal): + +```bash +kubectl exec -n vault vault-0 -- vault operator init -key-shares=1 -key-threshold=1 +# save the unseal key + root token shown, then: +kubectl exec -n vault vault-0 -- vault operator unseal +``` + +**Wire Vault up for external-secrets** (kv-v2 mount + kubernetes auth method — +this is Vault-internal config, not a k8s resource, so it can't go through +ArgoCD; do it once after unseal): + +```bash +kubectl exec -it -n vault vault-0 -- sh +export VAULT_TOKEN= + +vault secrets enable -path=kv kv-v2 +vault auth enable kubernetes +vault write auth/kubernetes/config \ + kubernetes_host="https://kubernetes.default.svc" + +vault policy write external-secrets - <