Common questions about the Platform in a Box, organized by topic.
Platform in a Box is a batteries-included, GitOps-driven foundation for operating a Kubernetes platform using the Argo CD App-of-Apps pattern. It provides a complete set of Helm charts that compose the core traffic, security, observability, data, and enablement layers so teams can onboard applications quickly with consistent guardrails.
Kubernetes v1.27+ is required, primarily for Gateway API support (v1.27+ includes stable Gateway API CRDs). Some components may work with earlier versions, but v1.27+ is recommended.
Yes, you can deploy everything to a single cluster. However, the architecture is designed for multi-cluster scenarios. For single cluster, you can:
The platform is cloud-agnostic and works with any Kubernetes distribution. However, some components have cloud-specific integrations:
cp charts/app-of-apps/values.ops-01.yaml charts/app-of-apps/values.new-cluster.yaml
Edit and update cluster name, server endpoint, and component enablement.
cp argocd-bootstrap-apps/ops-01.yaml argocd-bootstrap-apps/new-cluster.yaml
Update application name, cluster server, and values file reference.
argocd cluster add <cluster-context> --name <cluster-name>
kubectl apply -f argocd-bootstrap-apps/new-cluster.yaml
See Getting Started Guide for detailed steps.
Update the source.targetRevision in the component’s block in your values file:
monitoring:
enable: true
source:
targetRevision: v1.2.3 # or branch name, commit SHA
Or update the chart dependency version in the component’s Chart.yaml if using a Helm dependency.
Edit the environment values file (e.g., charts/app-of-apps/values.ops-01.yaml):
# Enable a component
monitoring:
enable: true
# Disable a component
redis:
enable: false
After committing and pushing, Argo CD will automatically sync the changes.
Each component has its own values file structure. Override settings in the environment-specific values file:
monitoring:
enable: true
helm:
values: |
prometheus:
replicaCount: 3
thanos:
enabled: true
Or create a separate values file and reference it:
monitoring:
enable: true
helm:
valueFiles:
- values.monitoring-custom.yaml
targetRevision: HEAD, staging, and stable?HEAD (or master/dev): Latest commits on the branch - use for development clustersstaging: Staging branch - use for pre-production testingstable: Immutable tag - use for production clustersThis follows the Branching & Promotion Model.
The App-of-Apps pattern uses a root Argo CD Application that manages other Applications. In this platform:
ops-01-bootstrap-apps) points to the app-of-apps chartapp-of-apps chart renders multiple Argo CD Application CRs (one per enabled component)# Sync a specific application
argocd app sync <app-name>
# Sync all applications
argocd app sync --all
# Force refresh (clears cache)
argocd app get <app-name> --hard-refresh
Sync waves control the order in which Argo CD syncs applications. Lower numbers sync first. This ensures dependencies are ready before dependents:
sealedSecrets:
enable: true
annotations:
argocd.argoproj.io/sync-wave: "-1" # Syncs first
certManager:
enable: true
annotations:
argocd.argoproj.io/sync-wave: "0" # Syncs after sealed-secrets
envoyGateway:
enable: true
annotations:
argocd.argoproj.io/sync-wave: "1" # Syncs after cert-manager
See Traffic Management Guide for recommended sync waves.
Since everything is Git-driven, rollback by reverting the Git commit or moving the tag:
# Revert commit
git revert <commit-sha>
git push
# Or move stable tag to previous commit
git tag -f stable <previous-commit-sha>
git push -f origin stable
Argo CD will automatically detect the change and sync to the previous state.
Yes, update the source.repoURL in:
argocd-bootstrap-apps/*.yamlcharts/app-of-apps/values.*.yamlEnsure Argo CD has access to the repository (SSH key or HTTPS credentials).
openssl req -x509 -days 3650 -nodes -newkey rsa:4096 \
-keyout new-sealing.key \
-out new-sealing.crt \
-subj "/CN=sealed-secret/O=sealed-secret"
kubectl -n sealed-secrets create secret tls new-sealing-key \
--cert=new-sealing.crt --key=new-sealing.key
kubectl -n sealed-secrets label secret new-sealing-key \
sealedsecrets.bitnami.com/sealed-secrets-key=active
kubectl -n sealed-secrets label secret old-sealing-key \
sealedsecrets.bitnami.com/sealed-secrets-key-
kubeseal --cert=new-sealing.crt < secret.yaml > sealed-secret.yaml
See Sealed Secrets README for details.
Create DNS zone (in your DNS provider)
issuers:
newDomain: "enable"
Create ClusterIssuer template (if needed) in charts/cert-manager/templates/certificates/
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: newdomain-com
spec:
dnsNames:
- "*.newdomain.com"
- "newdomain.com"
issuerRef:
kind: ClusterIssuer
name: newdomain-com-issuer
secretName: newdomain-com-tls
See Traffic Management Guide for details.
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: my-service
spec:
parentRefs:
- name: envoy-public
namespace: envoy-gateway-system
hostnames:
- my-service.example.com
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: my-service
port: 80
Ensure Gateway exists (created by envoy-gateway chart)
Ensure certificate exists for the hostname
metadata:
annotations:
external-dns.alpha.kubernetes.io/hostname: my-service.example.com
See Envoy Gateway README for details.
Always start with Audit mode, measure violations, remediate, then enable Enforce mode. See Compliance Guide.
Create policy file in charts/kyverno/templates/policies/ops/ or security/
apiVersion: kyverno.io/v1
kind: ClusterPolicy
...
opsPolicies:
newPolicy:
enabled: true
mode: Audit # Start with Audit
See Kyverno README for details.
Create or edit rule file in charts/monitoring/configs/alert-rules/
Update Alert Catalog with the new alert
Test the rule:
promtool check rules configs/alert-rules/my-alerts.yaml
HEAD or dev branch)staging branch)stable tag)Follow the Promotion Flow: dev → staging → stable.
Everything is in Git, so your Git repository is the backup. Additionally:
Update replica counts in component values:
monitoring:
enable: true
helm:
values: |
prometheus:
replicaCount: 3 # Scale Prometheus
Or scale directly (not recommended, will be overridden by GitOps):
kubectl scale deployment <deployment> -n <namespace> --replicas=3
# Check all Argo CD applications
kubectl get applications -n argocd
# Check component pods
kubectl get pods -A | grep -E "monitoring|logging|envoy|kyverno"
# Check via Argo CD UI
# Navigate to Argo CD and review application health status
charts/app-of-apps/values.qa-01.yamlargocd-bootstrap-apps/qa-01.yamlkubectl apply -f argocd-bootstrap-apps/qa-01.yamlFollow the same pattern as existing environments.
helm list -A
helm get values <release> -n <namespace> > values.yaml
Create equivalent values files in this repository structure
Disable old Helm releases (don’t delete yet)
Bootstrap Argo CD and let it take over
See Getting Started Guide for the GitOps setup process.
Common causes:
See Troubleshooting Guide for detailed diagnosis.
Common causes:
See Troubleshooting Guide for diagnosis steps.
Common causes:
See Troubleshooting Guide for solutions.
Common causes:
See Troubleshooting Guide for diagnosis.
Common causes:
See Troubleshooting Guide for solutions.
# Check application status
kubectl describe application <app-name> -n argocd
# Check controller logs
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-application-controller
# Force refresh
argocd app get <app-name> --hard-refresh
See Troubleshooting Guide for comprehensive debugging steps.
This platform uses Sealed Secrets because:
External Secrets Operator is an alternative if you prefer cloud-native secret management (AWS Secrets Manager, HashiCorp Vault, etc.).
Use Gateway API (Envoy Gateway) for:
Use Ingress (NGINX) only for:
The platform includes both, but Gateway API is preferred.
Recommended structure:
k8s/
├── charts/ # Helm charts
│ ├── app-of-apps/
│ ├── monitoring/
│ └── ...
├── argocd-bootstrap-apps/ # Bootstrap applications
├── docs/ # Documentation
└── README.md
Keep environment-specific values in charts/<chart>/values.<env>.yaml.
Use tags (stable) for production because:
Branches can move, making it harder to track what’s deployed. Tags provide deterministic deployments.
Options:
Recommendation: Use cluster-specific keys for better isolation and security.
No. Enable components based on cluster role:
See What Runs Where for the component matrix.
Cert-manager handles automatic renewal. However:
kubectl annotate certificate <name> cert-manager.io/issue-temporary-certificate=trueCertificates are automatically renewed 30 days before expiration.
See Argo CD Best Practices for HA configuration.
The monitoring stack monitors itself:
Set up alerts for:
charts/<component>/README.mddocs/If you’re stuck or need further help, feel free to reach out directly.