Skip to main content

Reference

Important Files

FilePurpose
build/scripts/bootstrap.shBootstrap cluster with ArgoCD and system apps
build/scripts/deploy.shDeploy apps using Git tags
build/scripts/prepare-release.shCreate release with Git tag
charts/system-apps/templates/*.yamlSystem app ArgoCD templates
charts/applications/templates/*.yamlUser app ArgoCD templates
cluster/*/config.yamlEnvironment-specific settings
charts/argocd-project/values.yamlProject definitions

Make Targets

# Bootstrap cluster
make bootstrap

# List environments
make list-envs

# List apps
make list-apps

# Render values
make render-values ENV=dev

# Deploy specific app
make deploy-app ENV=dev APP=namespace-manager

# Deploy all apps to environment
make deploy-env ENV=dev

# Create release
make prepare-release REPO_ARGS="--repo owner/repo --message 'Release v1.0.0'"

# Deploy latest to environment
make deploy ENV=dev

# Dry run
make deploy-dry-run ENV=dev

Deploy Script Options

# Deploy latest tag
./build/scripts/deploy.sh -e dev

# Deploy specific version
./build/scripts/deploy.sh -e dev -v v1.0.0

# Dry run
./build/scripts/deploy.sh -e dev -d

# Force deploy
./build/scripts/deploy.sh -e dev -f

Helm Template Conventions

  • Use clusterEnv variable to reference correct values file
  • Wrap wildcards (*) in quotes
  • Templates must check apps.<appName>.enabled before rendering
  • Always quote namespace/server values with | quote

Adding a New Environment

Create cluster/<env>/config.yaml:

clusterEnv: <env>
clusterPath: cluster/<env>

repoURL: https://github.com/<org>/k8s-playground-cluster
targetRevision: main

apps:
namespace-manager:
enabled: true

Adding AppProject

Edit charts/argocd-project/values.yaml:

projects:
- name: new-project
enabled: true
description: New project
sourceRepos:
- https://github.com/<org>/k8s-playground-cluster.git
destinations:
- namespace: '*'
server: https://kubernetes.default.svc
clusterResourceWhitelist:
- group: '*'
kind: '*'

External-DNS

Configuration file: config/<env>/application/external-dns.yaml

provider: cloudflare
cloudflare:
proxied: true
domainFilters:
- your-domain.com
txtOwnerName: external-dns
policy: sync
sources:
- service
- ingress
env:
- name: CF_API_TOKEN
valueFrom:
secretKeyRef:
name: cloudflare-api-token
key: api-token

Create Cloudflare secret:

kubectl create secret generic cloudflare-api-token \
-n external-dns \
--from-literal=api-token=YOUR_CF_API_TOKEN