Skip to content

Talos ArgoCD Proxmox

A production-grade, self-healing Kubernetes cluster you can rebuild from zero with one git push.
KubernetesTalos OSArgoCDCiliumLonghornNVIDIA GPU1PasswordOpenTelemetryVolSyncllama-cpp
7Sync Waves
60+Applications
0Manual Steps
10GNetworking

Pick a question. Follow the steps. Each one teaches you a piece of the architecture.


  1. Create a folder

    Terminal window
    mkdir -p my-apps/development/my-app
  2. Add a kustomization.yaml — this is what ArgoCD reads

    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    resources:
    - deployment.yaml
    - service.yaml
  3. Add your deployment

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: my-app
    spec:
    replicas: 1
    strategy:
    type: Recreate # Always use Recreate with RWO PVCs
    selector:
    matchLabels:
    app: my-app
    template:
    metadata:
    labels:
    app: my-app
    spec:
    containers:
    - name: my-app
    image: nginx:latest
    ports:
    - containerPort: 80
    name: http # Named ports required for Gateway API
  4. Push to Git — ArgoCD discovers it within 60 seconds

    Terminal window
    git add my-apps/development/my-app/
    git commit -m "add my-app"
    git push

Use for: App data that needs backup, replication, and snapshots.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-app-data
labels:
backup: "hourly" # Triggers entire backup pipeline!
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 10Gi
storageClassName: longhorn

This cluster uses Gateway API (not Ingress).

  1. Ensure your Service has named ports — Gateway API matches on port name, not number

    apiVersion: v1
    kind: Service
    metadata:
    name: my-app
    spec:
    selector:
    app: my-app
    ports:
    - port: 80
    targetPort: 80
    name: http # Required! Without this, routing silently fails
  2. Create an HTTPRoute

    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
    name: my-app
    spec:
    parentRefs:
    - name: internal # or "external" for internet access
    namespace: gateway
    hostnames:
    - "my-app.vanillax.me"
    rules:
    - matches:
    - path:
    type: PathPrefix
    value: /
    backendRefs:
    - name: my-app
    port: 80
  3. Push to Git — that’s it, traffic flows automatically


Never commit secrets to Git. Store them in 1Password, reference via ExternalSecret:

  1. Add the secret to 1Password — create an item in the homelab-prod vault

  2. Create an ExternalSecret resource

    apiVersion: external-secrets.io/v1
    kind: ExternalSecret
    metadata:
    name: my-app-secrets
    spec:
    refreshInterval: 1h
    secretStoreRef:
    kind: ClusterSecretStore
    name: 1password
    target:
    name: my-app-secrets
    creationPolicy: Owner
    data:
    - secretKey: API_KEY
    remoteRef:
    key: my-app # Item name in 1Password
    property: api_key # Field name in that item
  3. Reference in your Deployment — as env var or volume mount

    env:
    - name: API_KEY
    valueFrom:
    secretKeyRef:
    name: my-app-secrets
    key: API_KEY

Everything starts from one script:

Terminal window
./scripts/bootstrap-argocd.sh

This installs ArgoCD and applies the root application. ArgoCD then discovers everything in Git and starts deploying wave by wave.


ArgoCD & GitOps

App-of-apps, sync waves, server-side diff, health checks, performance tuning. Read more →

Backup & Restore

One label, automatic Kopia backups via Kyverno + VolSync + PVC Plumber. Read more →

CNPG Disaster Recovery

Postgres recovery, ArgoCD race handling, serverName bumps. Read more →

Network Security

Cilium policies, LAN isolation, threat modeling, lateral movement prevention. Read more →

Network Topology

10G infrastructure, NFS tuning, IP layout. Read more →

VPA Optimization

Vertical Pod Autoscaler + Kyverno — right-size everything. Read more →