This repository defines Kubernetes cluster state for VATUSA workloads managed through ArgoCD.
It uses a mixed approach:
- ArgoCD as the GitOps controller
- Kustomize for most application manifests
- Helm for shared infrastructure installed by ArgoCD
Application image build and publish workflows live in other repositories. This repo is the desired-state layer that ArgoCD syncs into the cluster.
ArgoCD is used to sync this repository into the cluster.
apps/bootstrap/Application.yamldefines an app-of-apps bootstrap applicationprojects/contains ArgoCDAppProjectdefinitions
Most workload manifests are plain Kubernetes YAML grouped with kustomization.yaml files.
Examples:
kustomization.yamlpoints atbase/base/kustomization.yamlassembles the legacy/base appscurrent/kustomization.yamlassembles the current production appsoverlays/dev/kustomization.yamldefines a dev overlay with image overridescobalt/kustomization.yamldefines a standalone app namespace and resources
Kustomize is also used to pin container image tags via the images: section in some app groupings.
Helm is used for shared cluster infrastructure under apps/.
Current infra charts include:
apps/ingress-nginx/apps/cert-manager/apps/postgresql/apps/rabbitmq/
These are local wrapper charts that depend on upstream Helm charts and are deployed by ArgoCD Applications rendered from apps/bootstrap/.
Cluster-wide infrastructure and ArgoCD bootstrap resources.
bootstrap/: ArgoCD app-of-apps chart that creates childApplicationresourcesingress-nginx/: Helm chart wrapper for the ingress controllercert-manager/: Helm chart wrapper for certificate managementpostgresql/: Helm chart wrapper for PostgreSQLrabbitmq/: Helm chart wrapper for RabbitMQconfigs/: cluster config manifests managed with Kustomize
Base or older app manifests managed with Kustomize. Typical app shape here is:
deployment.yamlservice.yamlingress.yamlcertificate.yaml
Current production application namespace and manifests. This is the clearest reference for how new workloads are modeled in this repo.
Examples:
current/www/current/api/current/forums/current/discord-bot-v3/
A standalone Kustomize-managed application with its own namespace and service account resources.
ArgoCD AppProject definitions and some namespace-specific policies such as quotas and network policies.
Kustomize overlays. Currently overlays/dev/ provides a dev environment rooted in base/.
External HTTP traffic is routed through ingress-nginx.
Application ingresses generally use:
spec.ingressClassName: nginx
Examples:
current/www/ingress.yamlcurrent/api/ingress.yamlbase/frontend/ingress.yaml
TLS certificates are managed by cert-manager.
apps/configs/base/cert-manager-ClusterIssuer.yamldefines a cluster-wideletsencryptissuer- App directories typically include a
certificate.yamlthat creates the TLS secret used by theirIngress
The issuer uses a Cloudflare DNS-01 solver for ACME validation.
This repository does not appear to manage public DNS records directly.
What it does manage:
- ingress resources for HTTP routing
- cert-manager certificate resources
- a
ClusterIssuerthat uses Cloudflare for ACME DNS validation
What is not present:
external-dns- a DNS controller for creating or updating records automatically
That means DNS records are likely managed separately from this repo. The Cloudflare integration here is for certificate validation, not for syncing ingress hostnames into DNS.
At a high level:
- An application repository builds and publishes a container image through its own CI workflow.
- This repo is updated to reference the desired image tag, usually in a Kustomize
images:block or directly in a manifest. - ArgoCD detects the Git change and syncs the manifests into the cluster.
- Kubernetes rolls out the updated workload.
For a typical public web application, the usual pattern in this repo is:
- Create a
Deploymentfor the pod(s) - Create a
Servicetargeting the deployment labels - Create an
Ingressfor the hostname/path routing - Create a
Certificatefor the ingress hostname(s) - Add
ConfigMapand/orSecretreferences if the app needs config - Add a
PersistentVolumeClaimonly if the app needs persistent storage - Add the new manifests to the appropriate
kustomization.yaml - Add or update image tag pinning if that app grouping uses
images: - Create the DNS record outside this repo unless DNS is already covered by an existing wildcard
Typical public app resources:
deployment.yamlservice.yamlingress.yamlcertificate.yaml
Typical optional resources:
configmap.yamlpvc.yaml- additional worker or queue deployments
- service account and RBAC resources
Simple web app:
current/www/deployment.yamlcurrent/www/service.yamlcurrent/www/ingress.yamlcurrent/www/certificate.yaml
Web app with background workers:
current/api/deployment.yamlcurrent/api/service.yamlcurrent/api/ingress.yamlcurrent/api/certificate.yamlcurrent/api/worker.yamlcurrent/api/deployment-queue.yaml
App with persistent storage:
current/forums/pvc.yaml
Standalone app with service account wiring:
cobalt/base/service-account.yamlcobalt/base/service-account-bindings.yaml
- Namespaces are sometimes managed explicitly in-app, for example
current/namespace.yamlandcobalt/namespace.yaml - Some
projects/*/allow-db.yamlfiles contain network policy rules, including explicit DNS egress allowances tokube-dns - Secrets referenced by workloads are not defined in this repository and are expected to exist in-cluster by some separate process
If you are new to this repo, start with:
apps/bootstrap/Application.yamlapps/bootstrap/templates/apps/configs/kustomization.yamlcurrent/kustomization.yamlbase/kustomization.yamlprojects/current/Project.yaml