This repository defines cluster lifecycle, GitOps bootstrap, and platform apps for multiple Kubernetes environments.
Control flow:
- Omni cluster definitions in
staging/create Talos clusters and apply inline bootstrap manifests. - Bootstrap manifests install Flux resources that reconcile this repository.
- Flux installs Argo CD from
apps/operators/gitops/argocd/. - Argo CD Applications in
clusters/<cluster>/config/deploy cluster bundles, features, and external project repos.
Required CLI tools:
omnictlkustomizekubectlsopsgpgejson
Optional but useful:
argocdflux
- Talos + Omni for machine lifecycle: cluster specs are in
staging/*.yamlwith patches instaging/patches/. - Flux as bootstrap reconciler: first-layer
GitRepository+Kustomizationobjects come fromstaging/bootstraps/*.yaml. - Argo CD as app orchestrator: app-of-apps definitions live in
clusters/*/config/. - Kustomize overlays per environment: cluster-specific composition is in
clusters/*/kustomization.yaml. - Encrypted secrets in Git: SOPS-encrypted Kubernetes secrets and EJSON payloads are rendered by a custom Argo CD CMP plugin.
Current bundles/manifests include:
- Cilium
- cert-manager
- ingress-nginx
- metrics-server
- kube-prometheus-stack
- Teleport kube-agent
- CSI Proxmox + Proxmox storage classes
- CSI NFS + NFS storage classes
- Velero
- Crossplane
- CloudNativePG (CNPG)
- Argo CD + Flux CD
.
├── apps/ # Reusable platform apps and bundles
│ ├── addons/ # Supporting resources (issuers, storageclasses, credentials, etc.)
│ ├── bundles/ # Grouped app sets (core-r1, vcluster-r1, package bundles)
│ ├── features/ # Higher-level feature stacks (crossplane, vault, cnpg, etc.)
│ └── operators/ # ArgoCD Application definitions and operator manifests
├── clusters/ # Cluster-specific composition, patches, overlays, and config apps
├── common/ # Shared patches (for example ArgoCD Application sync policy)
├── source/assets/ # Branding assets
├── staging/ # Omni cluster definitions, bootstrap inline manifests, Talos patches
└── tools/ # Utility scripts and helpers
Sync a cluster template to Omni:
omnictl cluster template sync -f staging/<cluster>.yamlExample:
omnictl cluster template sync -f staging/home-mck.yamlFor each cluster, bootstrap definitions in staging/bootstraps/*.yaml create Flux resources like:
GitRepositorynamedplatformpointing to this repoKustomizationnamedargocd(path./apps/operators/gitops/argocd/)Kustomizationnamedplatform(cluster config path./clusters/<cluster>/config/)
Depending on cluster/environment, additional GitRepository and Kustomization resources (for example external secrets repos) can also be included in bootstrap manifests.
After Flux applies Argo CD, cluster config apps in clusters/<cluster>/config/ take over:
bootstrapApplication points Argo CD toclusters/<cluster>/projectsApplication points Argo CD to externalkubelize/projects
Typical flow for a cluster:
- Edit
clusters/<cluster>/kustomization.yamlto choose bundles/features and local patches. - Put cluster app roots in
clusters/<cluster>/config/(bootstrap.yaml,projects.yaml,secrets/). - Add environment values in
subst.yamland optional overlay files. - Commit and push; Flux and Argo CD reconcile automatically.
Required:
- SideroLabs Omni (cluster lifecycle and Talos orchestration)
- Proxmox (storage and infrastructure integrations)
Optional / feature-dependent:
- Teleport (secure cluster/application access)
- S3-compatible object storage (Velero backups)
- SOPS rules are in
.sops.yaml. - Public key is in
publickey.asc. - Encrypted Kubernetes secrets live in paths like
clusters/*/config/secrets/**/*.yaml. - Flux Kustomizations use
decryption.provider: sopswith secretsops-gpg. - Never commit plaintext secrets. Encrypt before commit.
- Argo CD repo-server runs custom CMP plugin
kubelize/subst-cmp. - Plugin config is
apps/operators/gitops/argocd/subst-cmp-configmap.yaml. - It discovers
subst.yamlfiles and renders templates with EJSON-backed values. - EJSON key material is delivered through
apps/addons/ejson/ejson-keys.yaml(SOPS-encrypted).
Renovate is configured in renovate.json5 to:
- scan YAML/YML manifests,
- group minor/patch updates,
- allow major Docker updates.
Useful helper scripts:
tools/setup-velero.sh: scaffold per-cluster Velero credentials/patches.tools/vclusters/export-for-argocd.sh: export vcluster kubeconfig into an Argo CD cluster secret.tools/sdtd-backup.sh: backup helper script.
- Create or update a cluster template in
staging/<cluster>.yaml. - Sync it to Omni with
omnictl cluster template sync -f staging/<cluster>.yaml. - Add or update bootstrap inline manifests in
staging/bootstraps/<cluster>.yaml. - Create
clusters/<cluster>/kustomization.yamland select bundles/features/patches. - Create
clusters/<cluster>/config/with at leastbootstrap.yamlandprojects.yaml. - Add
clusters/<cluster>/subst.yamland overlay-specific substitution files as needed. - Add encrypted secrets under
clusters/<cluster>/config/secrets/(SOPS and/or EJSON flow). - Validate manifests locally with
kustomize build --load-restrictor LoadRestrictionsNone. - Commit and push; verify Flux and Argo CD reconciliation.
Before pushing, you can sanity-check manifests locally: Run these from the repository root.
# Build a cluster composition
kustomize build --load-restrictor LoadRestrictionsNone clusters/<cluster>
# Build cluster bootstrap config app set
kustomize build --load-restrictor LoadRestrictionsNone clusters/<cluster>/config
# Build Argo CD operator resources
kustomize build --load-restrictor LoadRestrictionsNone apps/operators/gitops/argocd