Manage Workspaces
This guide covers creating workspaces, configuring access control, and setting resource quotas for multi-tenant deployments.
Prerequisites
Section titled “Prerequisites”- Omnia operator deployed with Workspace controller enabled
kubectlaccess to the cluster- (For production) Identity provider configured for OIDC
Create a Workspace
Section titled “Create a Workspace”A workspace provides an isolated environment for a team with its own namespace, RBAC, and resource quotas.
Basic Workspace
Section titled “Basic Workspace”Create a minimal workspace:
apiVersion: omnia.altairalabs.ai/v1alpha1kind: Workspacemetadata: name: my-teamspec: displayName: "My Team" namespace: name: omnia-my-team create: trueApply it:
kubectl apply -f workspace.yamlThe controller will:
- Create the namespace
omnia-my-team - Create ServiceAccounts for each role (owner, editor, viewer)
- Set up RBAC bindings
Verify Workspace Status
Section titled “Verify Workspace Status”kubectl get workspace my-team -o yamlCheck the status section:
status: phase: Ready namespace: name: omnia-my-team created: true serviceAccounts: owner: my-team-owner editor: my-team-editor viewer: my-team-viewerConfigure Access Control
Section titled “Configure Access Control”Role Bindings with IdP Groups
Section titled “Role Bindings with IdP Groups”Map identity provider groups to workspace roles:
apiVersion: omnia.altairalabs.ai/v1alpha1kind: Workspacemetadata: name: customer-supportspec: displayName: "Customer Support Team" namespace: name: omnia-customer-support create: true
roleBindings: # Team leads get full control - groups: - "cs-admins@acme.com" role: owner
# Engineers can create and modify resources - groups: - "cs-engineers@acme.com" - "support-team" role: editor
# Contractors get read-only access - groups: - "cs-contractors@acme.com" role: viewerWhen users authenticate via OIDC, their group claims are matched against these bindings.
ServiceAccount Access for CI/CD
Section titled “ServiceAccount Access for CI/CD”Grant access to ServiceAccounts for automated pipelines:
spec: roleBindings: # ArgoCD can deploy agents - serviceAccounts: - name: argocd-application-controller namespace: argocd role: editor
# GitHub Actions can deploy - serviceAccounts: - name: github-actions namespace: ci-system role: editorDirect User Grants
Section titled “Direct User Grants”For exceptions (use sparingly):
spec: directGrants: # Temporary admin access for incident response - user: oncall@acme.com role: owner expires: "2026-02-01T00:00:00Z"Anonymous Access
Section titled “Anonymous Access”For development environments without authentication:
spec: anonymousAccess: enabled: true role: viewer # Read-only for anonymous usersConfigure Resource Quotas
Section titled “Configure Resource Quotas”Compute Quotas
Section titled “Compute Quotas”Limit CPU and memory usage:
spec: quotas: compute: requests.cpu: "50" requests.memory: "100Gi" limits.cpu: "100" limits.memory: "200Gi"Object Quotas
Section titled “Object Quotas”Limit the number of Kubernetes objects:
spec: quotas: objects: configmaps: 100 secrets: 50 persistentvolumeclaims: 20Agent Quotas
Section titled “Agent Quotas”Control AgentRuntime deployments:
spec: quotas: agents: maxAgentRuntimes: 20 maxReplicasPerAgent: 10Arena Quotas
Section titled “Arena Quotas”Limit Arena evaluation jobs:
spec: quotas: arena: maxConcurrentJobs: 10 maxJobsPerDay: 100 maxWorkersPerJob: 50Set Environment and Tags
Section titled “Set Environment and Tags”Environment Tier
Section titled “Environment Tier”Classify workspaces by environment:
spec: environment: production # development | staging | productionThis enables environment-based policies and promotion workflows.
Cost Attribution Tags
Section titled “Cost Attribution Tags”Add tags for cost tracking:
spec: defaultTags: team: "customer-support" cost-center: "CC-1234" business-unit: "support-ops"These tags are applied to all resources created in the workspace.
Configure Network Isolation
Section titled “Configure Network Isolation”Network isolation restricts traffic to and from your workspace namespace using Kubernetes NetworkPolicies. This provides defense-in-depth for multi-tenant environments.
Enable Basic Isolation
Section titled “Enable Basic Isolation”Add network isolation to restrict traffic:
spec: networkPolicy: isolate: trueThis automatically creates a NetworkPolicy that:
- Allows DNS queries to
kube-system - Allows all traffic within the workspace namespace
- Allows traffic to/from namespaces labeled
omnia.altairalabs.ai/shared: true - Allows egress to external IPs (for LLM APIs) but blocks other private IP ranges
Verify NetworkPolicy
Section titled “Verify NetworkPolicy”Check that the NetworkPolicy was created:
kubectl get networkpolicy -n omnia-customer-supportYou should see:
NAME POD-SELECTOR AGEworkspace-customer-support-isolation <none> 1mAllow Ingress from Load Balancer
Section titled “Allow Ingress from Load Balancer”If agents need to receive traffic from an ingress controller:
spec: networkPolicy: isolate: true allowFrom: - peers: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: ingress-nginxAllow Egress to Internal Services
Section titled “Allow Egress to Internal Services”To allow agents to connect to internal databases or services:
spec: networkPolicy: isolate: true allowTo: - peers: - ipBlock: cidr: 10.0.0.0/8 # Internal network ports: - protocol: TCP port: 5432 # PostgreSQL - protocol: TCP port: 6379 # RedisRestrict External API Access
Section titled “Restrict External API Access”For high-security environments, disable external API access:
spec: networkPolicy: isolate: true allowExternalAPIs: false allowTo: # Only allow specific external endpoints - peers: - ipBlock: cidr: 104.18.0.0/16 # Example: specific API provider ports: - protocol: TCP port: 443Allow Private Networks (Local Development)
Section titled “Allow Private Networks (Local Development)”For local development or when agents need to access services on private networks (e.g., a local Ollama instance):
spec: networkPolicy: isolate: true allowPrivateNetworks: trueThis removes the RFC 1918 private IP exclusions (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), allowing agents to reach services on your local network.
Disable Isolation
Section titled “Disable Isolation”To remove network restrictions, either delete the networkPolicy section or set isolate: false:
spec: networkPolicy: isolate: falseThe controller will automatically delete the NetworkPolicy.
Deploy Resources to a Workspace
Section titled “Deploy Resources to a Workspace”Once your workspace is ready, deploy agents to its namespace:
apiVersion: omnia.altairalabs.ai/v1alpha1kind: AgentRuntimemetadata: name: support-bot namespace: omnia-customer-support # Workspace namespacespec: promptPackRef: name: support-prompts providerRef: name: claude-providerThe dashboard automatically scopes resources to the current workspace.
Use the Dashboard
Section titled “Use the Dashboard”Switch Workspaces
Section titled “Switch Workspaces”The dashboard shows a workspace selector in the header. Users only see workspaces they have access to.
View Workspace Resources
Section titled “View Workspace Resources”When you select a workspace, the dashboard shows:
- Agents deployed in that workspace
- PromptPacks in the workspace namespace
- Events and logs scoped to that workspace
Access Control in Dashboard
Section titled “Access Control in Dashboard”The dashboard enforces role-based access:
| Role | Can View | Can Create/Edit | Can Delete | Can Manage Members |
|---|---|---|---|---|
| viewer | Yes | No | No | No |
| editor | Yes | Yes | Yes | No |
| owner | Yes | Yes | Yes | Yes |
Complete Example
Section titled “Complete Example”A production-ready workspace with all features:
apiVersion: omnia.altairalabs.ai/v1alpha1kind: Workspacemetadata: name: customer-supportspec: displayName: "Customer Support Team" description: "Team responsible for customer support AI agents" environment: production
defaultTags: team: "customer-support" cost-center: "CC-1234"
namespace: name: omnia-customer-support create: true labels: environment: production team: customer-support
roleBindings: - groups: - "cs-admins@acme.com" role: owner
- groups: - "cs-engineers@acme.com" role: editor
- groups: - "cs-contractors@acme.com" role: viewer
- serviceAccounts: - name: argocd-application-controller namespace: argocd role: editor
quotas: compute: requests.cpu: "50" requests.memory: "100Gi" limits.cpu: "100" limits.memory: "200Gi"
objects: configmaps: 100 secrets: 50 persistentvolumeclaims: 20
agents: maxAgentRuntimes: 20 maxReplicasPerAgent: 10
arena: maxConcurrentJobs: 10 maxJobsPerDay: 100
networkPolicy: isolate: true allowFrom: - peers: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: ingress-nginx allowTo: - peers: - ipBlock: cidr: 10.0.0.0/8 ports: - protocol: TCP port: 5432Troubleshooting
Section titled “Troubleshooting”Workspace Stuck in Pending
Section titled “Workspace Stuck in Pending”Symptom: Workspace phase remains Pending
Check:
- Verify namespace doesn’t already exist with conflicting labels
- Check operator logs:
kubectl logs -n omnia-system deploy/omnia-controller-manager - Ensure
spec.namespace.create: trueif namespace should be auto-created
Access Denied to Workspace
Section titled “Access Denied to Workspace”Symptom: User can’t access workspace in dashboard
Check:
- Verify user’s groups in JWT token (decode at jwt.io)
- Confirm group names match exactly in
roleBindings - Check if anonymous access is enabled (for development)
ServiceAccount Token Issues
Section titled “ServiceAccount Token Issues”Symptom: API calls fail with authentication errors
Check:
- Verify ServiceAccounts exist:
kubectl get sa -n omnia-customer-support - Check RoleBindings:
kubectl get rolebindings -n omnia-customer-support - Ensure workspace phase is
Ready
Quota Exceeded
Section titled “Quota Exceeded”Symptom: Cannot create new resources
Check:
- View current usage:
kubectl describe resourcequota -n omnia-customer-support - Review workspace quota settings
- Clean up unused resources or increase quotas
Network Connectivity Issues
Section titled “Network Connectivity Issues”Symptom: Agents can’t reach external APIs or internal services
Check:
- Verify NetworkPolicy exists:
kubectl get networkpolicy -n omnia-customer-support - Check if
allowExternalAPIs: falseis blocking external traffic - Inspect the NetworkPolicy rules:
kubectl describe networkpolicy workspace-customer-support-isolation -n omnia-customer-support - Add custom
allowTorules for required services
Debug with a test pod:
kubectl run -n omnia-customer-support debug --rm -it --image=busybox -- sh# Inside the pod:nslookup api.anthropic.com # Test DNSwget -qO- https://api.anthropic.com # Test external accessAgents Not Receiving Traffic
Section titled “Agents Not Receiving Traffic”Symptom: Ingress traffic doesn’t reach agents
Check:
- Ensure ingress controller namespace is allowed in
allowFrom:allowFrom:- peers:- namespaceSelector:matchLabels:kubernetes.io/metadata.name: ingress-nginx - Verify the ingress controller namespace has the correct labels
- Check that the NetworkPolicy allows the required ports
Next Steps
Section titled “Next Steps”- Multi-Tenancy Architecture - Understand workspace isolation
- Configure Dashboard Authentication - Set up OIDC
- Workspace CRD Reference - Complete field reference