Skip to main content

Installation

This guide covers installing Datum Cloud components. For most users, using the hosted Datum Cloud at cloud.datum.net is recommended. This guide is for self-hosted deployments or contributing to development.

Installation Options

Datum Cloud (Hosted)

Recommended for most usersNo installation needed. Sign up and start using Datum immediately.

Self-Hosted

For advanced usersInstall Datum components in your own Kubernetes cluster.

Prerequisites

Before installing Datum, ensure you have:
1

Kubernetes cluster

A running Kubernetes cluster (v1.28 or later recommended)See Kubernetes Setup Guide for details.
2

kubectl installed

kubectl version --client
Install from kubernetes.io/docs/tasks/tools.
3

Cluster admin access

kubectl auth can-i create namespaces --all-namespaces
Should return yes.

Installation Methods

Method 1: Using Pre-built Manifests

The easiest way to install Datum is using the consolidated YAML manifests.
1

Download installation manifest

curl -Lo datum-install.yaml https://github.com/datum-cloud/datum/releases/latest/download/install.yaml
2

Review the manifest

less datum-install.yaml
Check that resources match your requirements.
3

Apply the manifest

kubectl apply -f datum-install.yaml
4

Verify installation

kubectl get pods -n datum-system
Wait until all pods are Running.

Method 2: Using Kustomize

For more control over the installation, use Kustomize.
1

Clone the repository

git clone https://github.com/datum-cloud/datum.git
cd datum
2

Review configuration

cat config/default/kustomization.yaml
From config/default/kustomization.yaml:1:
namespace: datum-system
namePrefix: datum-

resources:
  - ../rbac
  - ../manager
  - metrics_service.yaml
3

Install CRDs

kubectl apply -k config/crd
4

Install Datum components

kubectl apply -k config/default
5

Verify installation

kubectl get deployments -n datum-system

Method 3: Using Helm (Coming Soon)

Helm chart support is planned for a future release. Track progress in the enhancements repo.

Installation Components

The installation includes:

Core Components

The main controller managing Datum-specific resources.Deployment: datum-controller-managerNamespace: datum-systemImage: ghcr.io/datum-cloud/datum:latestFrom config/manager/manager.yaml:108:
image: ghcr.io/datum-cloud/datum:latest

Optional Components

Enable Prometheus ServiceMonitor:
# Uncomment prometheus in config/default/kustomization.yaml
kubectl apply -k config/prometheus

Verify Installation

Check Pod Status

kubectl get pods -n datum-system
Expected output:
NAME                                         READY   STATUS    RESTARTS   AGE
datum-controller-manager-7d8c9b4f5d-x2k9p   1/1     Running   0          2m

Check Logs

kubectl logs -n datum-system -l control-plane=controller-manager
Healthy logs show:
INFO	Starting controller manager
INFO	Starting workers	controller	personal-organization
INFO	Started workers	controller	personal-organization

Verify CRDs

kubectl get crds | grep datumapis.com
Expected CRDs:
organizations.resourcemanager.datumapis.com
projects.resourcemanager.datumapis.com
organizationmemberships.resourcemanager.datumapis.com
networks.networking.datumapis.com
workloads.compute.datumapis.com
...

Test Resource Creation

# Create a test organization
cat <<EOF | kubectl apply -f -
apiVersion: resourcemanager.miloapis.com/v1alpha1
kind: Organization
metadata:
  name: test-org
  annotations:
    kubernetes.io/display-name: "Test Organization"
spec:
  type: Standard
EOF

# Verify it was created
kubectl get organizations test-org

# Clean up
kubectl delete organization test-org

Configuration

Datum uses environment variables for configuration. Default values are set in config/manager/manager.yaml:71:
env:
  - name: METRICS_BIND_ADDRESS
    value: "0"
  - name: HEALTH_PROBE_BIND_ADDRESS
    value: ":8081"
  - name: LEADER_ELECT
    value: "true"
  - name: LEADER_ELECTION_ID
    value: "81afa9db.datumapis.com"
  - name: LEADER_ELECTION_LEASE_DURATION
    value: "15s"
  - name: LEADER_ELECTION_RENEW_DEADLINE
    value: "10s"
  - name: LEADER_ELECTION_RETRY_PERIOD
    value: "2s"
  - name: ENABLE_HTTP2
    value: "false"
See Configuration Guide for customization options.

Upgrading

Upgrade to Latest Version

1

Download latest manifest

curl -Lo datum-install.yaml https://github.com/datum-cloud/datum/releases/latest/download/install.yaml
2

Review changes

kubectl diff -f datum-install.yaml
3

Apply upgrade

kubectl apply -f datum-install.yaml
4

Monitor rollout

kubectl rollout status deployment/datum-controller-manager -n datum-system

Upgrade from Source

cd datum
git pull origin main
kubectl apply -k config/default

Uninstalling

Uninstalling Datum will:
  • Delete all Datum CRDs
  • Delete all Organizations, Projects, and resources
  • Remove the datum-system namespace
  • Cannot be undone
Ensure you have backups before proceeding!

Uninstall using manifests

kubectl delete -f datum-install.yaml

Uninstall using Kustomize

kubectl delete -k config/default
kubectl delete -k config/crd

Building from Source

Prerequisites

  • Go 1.24 or later
  • Docker or Podman
  • make

Build Steps

1

Clone repository

git clone https://github.com/datum-cloud/datum.git
cd datum
2

Run tests

make test
3

Build binary

make build
Binary is created at bin/manager.
4

Build Docker image

make docker-build IMG=my-registry/datum:dev
5

Push image

make docker-push IMG=my-registry/datum:dev
6

Deploy

cd config/manager && kustomize edit set image controller=my-registry/datum:dev
kubectl apply -k config/default
Available Make targets from Makefile:22:
make help               # Show all targets
make build              # Build manager binary
make test               # Run tests
make docker-build       # Build Docker image
make docker-push        # Push Docker image
make deploy             # Deploy to cluster
make manifests          # Generate manifests
make install            # Install CRDs
make uninstall          # Uninstall CRDs

Troubleshooting

Installation fails

# Check Kubernetes version
kubectl version

# Check cluster access
kubectl auth can-i create namespaces

# Check for existing resources
kubectl get namespaces | grep datum

Pods not starting

# Check pod status
kubectl describe pod -n datum-system -l control-plane=controller-manager

# Check events
kubectl get events -n datum-system --sort-by='.lastTimestamp'

# Check image pull
kubectl get pods -n datum-system -o jsonpath='{.items[*].status.containerStatuses[*].image}'

CRDs not installed

# Manually install CRDs
kubectl apply -k config/crd

# Or from remote
kubectl apply -f https://github.com/datum-cloud/datum/releases/latest/download/crds.yaml

Next Steps

Kubernetes Setup

Prepare your Kubernetes cluster for Datum

Configuration

Customize Datum installation

Quickstart

Start using Datum Cloud

Operations

Learn operational procedures

Build docs developers (and LLMs) love