Onboarding

The Golden Path to production

A paved road. Four steps. The developer never runs kubectl. Everything goes through Git.

1 · The Golden Path

A
Scaffold

Clone the Reference MVP (dotnet-rds-iam-mvp). Copy the _templates/ folder structure for your infrastructure needs (eks-service, postgresql-logical, redis, ssm-parameter).

B
Infrastructure · Blueprint

Create a feature branch. Copy templates to accounts/dev/us-east-1/services/eks/<namespace>/<your-service>/. Fill in placeholders. Open PR → auto-plan → merge → auto-apply.

C
Deployment · Ledger

Create clusters/dev/<namespace>/<your-service>.yaml Argo CD Application manifest. Push to main. Root App auto-discovers and deploys within 30 seconds.

D
Pipeline · Conveyor

Create azure-pipelines.yml in your app repo using the Conveyor CI template. A Classic Release pipeline handles promotion: Dev → QA → Prod. See Releases for the full architecture.

2 · Self-service templates

Infrastructure is DRY and self-service. Developers interact only with the top layer (_templates); _envcommon and modules are platform-managed.

TemplateCreates
eks-serviceIRSA role + K8s ServiceAccount + namespace
postgresql-logicalLogical database + IAM-auth user on shared RDS
redisDedicated ElastiCache Redis cluster
ssm-parameterBulk app config in SSM Parameter Store
secrets-managerSkeleton secrets in AWS Secrets Manager (single or bulk mode). ARNs auto-published to SSM as _SECRET_ARN params.
s3S3 bucket with encryption and tagging
ecrECR repository with scanning enabled
ec2EC2 instance with SSM, monitoring, logging

3 · Helm chart extension points

Platform charts (api-workload, grpc-workload, worker-workload) provide bounded flexibility:

ExtensionHow
Pod annotations / labelspodAnnotations: {}, podLabels: {}
Environment variablesadditionalEnvVars: [{name: X, value: Y}]
Init containersinitContainers: [{name: wait-for-db, ...}]
Extra volumes / mountsextraVolumes: [], extraVolumeMounts: []
SchedulingnodeSelector, topologySpreadConstraints
Network egressnetworkPolicy: {enabled: true, rds: true, redis: true}

Forbidden · platform-managed

4 · Troubleshooting · quick hits

ErrorCauseFix
ImagePullBackOffECR image doesn't exist or wrong tagCheck ECR repo exists, verify image.tag in Argo CD manifest
CrashLoopBackOffApp crashing at startupkubectl logs <pod> --previous
Kyverno rejectionPolicy violation (root, no limits, wrong registry)Read the error — it tells you exactly which policy and what to fix
ServiceAccount not foundBlueprint service infra not deployed in this environmentcd blueprint/accounts/<env>/us-east-1/services/<name> && terragrunt run-all apply — pod auto-recovers
Connection timeout to RDSNetworkPolicy blocking egress (QA/Prod only)Add networkPolicy.rds: true in values.yaml. In dev, set networkPolicy.enabled: false or a partial policy will block HTTPS.
Argo CD root-app UnknownSSH key for Ledger repo is empty / missingRecreate ledger-repo-ssh secret in argocd ns, label as repository, restart argocd-repo-server
App hangs after [Forge] .NET Env: ...Pod can't reach AWS APIs (SSM) on port 443Check NetworkPolicies. If a partial egress policy blocks 443, disable in dev or rely on Kyverno auto-baseline in QA/Prod.
All pods recreated after EKS redeployForgot to redeploy Blueprint service infraRun terragrunt run-all apply on every services/<name>/ in that account

5 · Environment deployment checklist

Every time you deploy a service to a new environment, both steps must be completed in order. The pod WILL fail if Step 1 is skipped.
#StepRepoWhat it does
1Deploy service infrastructureBlueprintLogical database, Redis cache, SSM config, IRSA role + K8s ServiceAccount
2Add Application YAMLLedgerArgo CD discovers and deploys the pods (uses the ServiceAccount from Step 1)