Deployment on Kubernetes
Step-by-step guide for deploying the Milestone data collection agent on a customer-managed Kubernetes cluster.
1. Prerequisites
1.1 Kubernetes Cluster and Namespace
- Kubernetes cluster version ≥ 1.24
- Helm 3.10+ on the workstation running the install
- A dedicated namespace — suggested:
milestone-dca - Namespace-admin access for whoever runs
helm install
1.2 KEDA — Strongly Recommended
KEDA lets workers scale to zero when idle and burst during collection. Install cluster-wide:
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda -n keda-system --create-namespace
Verify:
kubectl get pods -n keda-system
kubectl get crd scaledobjects.keda.sh
1.3 Pre-Engagement: Send Us Your Cluster Details
Run these and send output to Milestone before the install:
kubectl get sc
kubectl get crd scaledobjects.keda.sh
kubectl get crd servicemonitors.monitoring.coreos.com
kubectl get priorityclass
kubectl version --short
1.4 StorageClasses
Two StorageClasses required:
- ReadWriteOnce (RWO) — for coordinator local state. E.g.
gp3(AWS),pd-standard(GCP). Set viapersistence.storageClass. - ReadWriteMany (RWX) — for shared worker storage. E.g.
efs-sc(AWS),filestore-csi(GCP). Set viadistributed.sharedStorage.storageClass.
1.5 Container Image
Option A (recommended): Mirror evno/milestone-data-collection-agent:<tag> to your internal registry and create an imagePullSecret.
Option B: Whitelist registry-1.docker.io for DockerHub egress.
1.6 Egress Allowlist
DCA pods need outbound HTTPS (port 443) to:
- Container image registry
upload.mstone.ai(default upload destination)- Your Git provider APIs
*.atlassian.net(if using Jira)- GenAI tool endpoints:
cursor.com,api.anthropic.com,api.github.com/copilot,api.openai.com
1.7 Node Capacity
At peak: ~34 CPU / 70 GiB memory:
- 4— git-heavy workers — 32 CPU / 64 GiB req / 128 GiB limit
- Baseline — ~2 CPU / 6 GiB req / 12 GiB limit
- +30% rolling update headroom
1.8 Credentials and Configuration
Create the secret before install:
kubectl create secret generic milestone-dca-tokens \
--namespace milestone-dca \
--from-literal=github-token='ghp_...' \
--from-literal=presign-api-key='...'
1.9 Optional: Prometheus Integration
If you run Prometheus Operator, ServiceMonitor is registered automatically. If not, disable it:
serviceMonitor:
enabled: false