Overview
TheProject custom resource represents a container for related resources within an organization. Projects provide isolation, quota management, and logical grouping for networks, workloads, and other infrastructure resources.
Project resources are part of the Milo resource manager API group (
resourcemanager.miloapis.com/v1alpha1).Resource Definition
API Group
resourcemanager.miloapis.com/v1alpha1ProjectMetadata
The name of the project. Must be unique within the platform.Naming requirements:
- Minimum length: 6 characters
- Maximum length: 30 characters
- Cannot contain “datum” (reserved word)
- Must follow Kubernetes naming conventions
personal-project-<hash> (automatically generated)Annotations for project metadata.Standard annotations:
kubernetes.io/display-name: Display name for UIskubernetes.io/description: Project description
Labels for project organization.Common labels:
environment: Environment type (dev, staging, prod)team: Team namecost-center: Cost allocation
Spec Fields
Reference to the parent organization.
The parent is typically set automatically via UserInfo Extra fields during project creation.
Status Fields
The Project status reflects the current state:The current phase of the project.Values:
Active: Project is active and readyPending: Project is being set upDeleting: Project is being deleted
The namespace created for this project:
project-<name>All project-scoped resources (networks, workloads, gateways) are created in this namespace.Detailed conditions about the project state.Each condition includes:
type: Condition type (e.g., “Ready”, “QuotaExceeded”)status: True, False, or Unknownreason: Machine-readable reason codemessage: Human-readable messagelastTransitionTime: When the condition last changed
Quota Management
Projects claim quota from their parent organization:Project Creation Quota
- Each project claims 1 unit from the parent organization’s project quota
- Personal organizations have lower project limits
- Standard organizations can request quota increases
Validation Policies
Project Name Validation
Project names are validated on creation:Automatic Creation
Personal projects are automatically created by the PersonalOrganizationController:Controller Creates Project
PersonalOrganizationController creates a personal project using user impersonation.
Impersonation Context
When creating projects, the controller includes parent context:Examples
Standard Project
Personal Project (Auto-created)
Development Project
kubectl Commands
List Projects
Get Project Details
Create Project
List Resources in Project
Delete Project
Project Namespace
Each project gets a dedicated namespace:project-<project-name>
Resources created in project namespace:
- Networks
- Workloads
- Gateways
- Services
- ConfigMaps and Secrets
- PolicyBindings
Access Control
Projects use PolicyBindings for access control. When a project is created, a PolicyBinding is automatically created granting the creator ownership.Example PolicyBinding
Related Resources
- Organization - Projects belong to organizations
- Network - Create networks within projects
- Workload - Deploy workloads within projects
- Gateway - Expose services within projects
- PersonalOrganizationController - Creates personal projects
Troubleshooting
Cannot create project
Cannot create project
Check:
- Verify project name meets requirements (6-30 characters, no “datum”)
- Check organization project quota:
kubectl get resourcequota -n organization-<org-name> - Ensure you have permission to create projects
- Verify parent organization exists and is active
Personal project not created
Personal project not created
Check:
- Verify user registration approval:
kubectl get user <name> -o jsonpath='{.status.registrationApproval}' - Must be in
Approvedstate - Check PersonalOrganizationController logs:
kubectl logs -n datum-system deployment/datum-controller-manager - Verify personal organization exists first
Project name validation failed
Project name validation failed
Common errors:
- “Too short” → Name must be at least 6 characters
- “Too long” → Name must not exceed 30 characters
- “Contains ‘datum’” → Choose a name without the reserved word “datum”
Cannot access project resources
Cannot access project resources
Check:
- Verify you have a PolicyBinding in the project:
kubectl get policybindings -n project-<name> - Check your organization membership:
kubectl get organizationmemberships -n organization-<org-name> - Ensure the project is in
Activephase - Verify the project namespace exists:
kubectl get namespace project-<name>
Project stuck in Pending
Project stuck in Pending
Check:
- View project status:
kubectl describe project <name> - Check for error conditions in status.conditions
- Verify quota is available in parent organization
- Check project controller logs
Source Reference
Source:internal/controller/resourcemanager/personal_organization_controller.go:140-193