Reference
Important Files
| File | Purpose |
|---|---|
build/scripts/bootstrap.sh | Bootstrap cluster with ArgoCD and system apps |
build/scripts/deploy.sh | Deploy apps using Git tags |
build/scripts/prepare-release.sh | Create release with Git tag |
charts/system-apps/templates/*.yaml | System app ArgoCD templates |
charts/applications/templates/*.yaml | User app ArgoCD templates |
cluster/*/config.yaml | Environment-specific settings |
charts/argocd-project/values.yaml | Project 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
clusterEnvvariable to reference correct values file - Wrap wildcards (
*) in quotes - Templates must check
apps.<appName>.enabledbefore 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