Skip to main content

Overview

This guide covers Azure-specific integration for CrewAI Platform deployments on Azure Kubernetes Service (AKS). It focuses on how CrewAI uses Azure services and the platform-specific configuration required, rather than general Azure setup.
This guide assumes you have:
  • An AKS cluster running Kubernetes 1.27+ with at least 3 nodes (4 vCPU / 8 GB RAM minimum per node)
  • Azure CLI installed and authenticated (az login)
  • Helm 3.10+ and kubectl configured for your cluster
  • Basic familiarity with Azure services (Azure Database for PostgreSQL, Azure Blob Storage, ACR)

Prerequisites

Before configuring CrewAI Platform, ensure these Azure components are in place: CrewAI Platform supports AMD64 (x86_64) Kubernetes worker nodes. ARM64 (aarch64) worker nodes are not currently supported. For full platform requirements, see the Requirements Guide.

Required Azure Infrastructure

Do not proceed with CrewAI installation until these prerequisites are met. The Helm chart will fail to deploy without them.

Azure Database for PostgreSQL Flexible Server

CrewAI Platform requires PostgreSQL 16 for production deployments. This section covers Azure Database for PostgreSQL Flexible Server requirements.

Instance Sizing

Minimum recommended specifications based on CrewAI workload characteristics:
Memory-optimized SKUs (Standard_E family) provide better performance for CrewAI’s connection-heavy Rails architecture. For production workloads, enable high availability with a standby replica.

Create the PostgreSQL Instance

Network Connectivity

CrewAI pods must reach your PostgreSQL instance. Two options: Option 1: Private Access via VNet Integration (Recommended)
  • Deploy the Flexible Server into the same VNet as your AKS cluster using a delegated subnet
  • No public internet exposure
  • PostgreSQL (5432) is reachable only from within the VNet
Option 2: Public Access with Firewall Rules
  • Enable public access and restrict by AKS outbound IP ranges
  • Requires SSL/TLS enforcement

Database Setup

CrewAI requires four databases — primary, cable, OAuth, and Wharf for OTLP trace storage:
Create all four databases before running helm install. The Wharf migration will fail at install time if the wharf database does not exist. The Helm chart does not automatically create databases when postgres.enabled: false.

Helm Configuration

Azure Blob Storage for Object Storage

CrewAI Platform uses Azure Blob Storage for storing crew artifacts, tool outputs, and user uploads when STORAGE_SERVICE is set to "microsoft".

Create Storage Account and Container

The name you choose for the container (e.g., crewai-storage) becomes the value for AZURE_CONTAINER_NAME in your Helm values. Both AZURE_STORAGE_ACCOUNT_NAME (the storage account name) and AZURE_CONTAINER_NAME (the container name within the account) are required. Omitting AZURE_CONTAINER_NAME causes runtime storage failures with no clear error at install time.

Storage Authentication Options

CrewAI supports two authentication methods for Azure Blob Storage. Choose based on your security requirements: Best for: Production AKS deployments, highest security. No long-lived credentials stored in Kubernetes secrets. Azure Workload Identity binds an AKS pod’s service account to an Azure Managed Identity (or App Registration) via federated credential trust — no static keys required. Setup Steps:
  1. Enable the AKS OIDC Issuer and Workload Identity:
  1. Create a User-Assigned Managed Identity:
  1. Grant Storage Blob Data Contributor role to the Managed Identity:
  1. Create Federated Credential for AKS:
The federated credential links the AKS service account to the managed identity. The crewai-sa service account name is the chart default when rbac.create: true.
The --subject value must exactly match the Kubernetes namespace and ServiceAccount name. With rbac.create: true (the default), the chart creates crewai-sa in the Helm release namespace. Adjust both crewai parts if you deploy to a different namespace or use a custom ServiceAccount name.
Helm Configuration:
When rbac.create: true (the default), the chart automatically creates a ServiceAccount named crewai-sa and annotates it with the label azure.workload.identity/use: "true". The federated credential must reference this exact name and namespace.
AZURE_CONTAINER_NAME is the name of the blob container within the storage account — not the storage account name itself. It must match the container you created with az storage container create --name crewai-storage. If omitted, Azure Blob Storage operations fail at runtime with a missing container error.

Option 2: Storage Access Key

Best for: Development environments or deployments outside AKS where managed identity is not available.
Not recommended for production. Use Workload Identity instead to avoid storing long-lived credentials in Kubernetes secrets.
AZURE_CONTAINER_NAME is the name of the blob container within the storage account (e.g., crewai-storage), not the storage account name itself. It must match the container you created in Azure — omitting it causes runtime storage failures.

Azure Container Registry (ACR) for Crew Images

CrewAI Platform requires a writable container registry to build and push crew automation container images. When users create and deploy crews, CrewAI builds container images and pushes them to ACR.

ACR Repository Requirements

Critical Requirements:
  • The repository path set in CREW_IMAGE_REGISTRY_OVERRIDE must be a writable ACR registry prefix
  • The platform automatically appends /crewai-enterprise to the value — ensure the resulting repository exists and allows push/pull
  • ACR webhook retention and tag mutability: CrewAI overwrites image tags for crew versions, so immutable tags must not be enforced on the target repository
  • Chart installation fails if CREW_IMAGE_REGISTRY_OVERRIDE is not set

Create ACR and Repository

Valid CREW_IMAGE_REGISTRY_OVERRIDE values:
  • crewairegistry.azurecr.io — appends /crewai-enterprise automatically
  • crewairegistry.azurecr.io/production — appends /crewai-enterprise automatically
  • crewairegistry.azurecr.io/my-org — appends /crewai-enterprise automatically
Do NOT set global.imageRegistry to your ACR host. This redirects ALL platform component image pulls (Redis, Wharf, BuildKit, busybox, the main application) away from images.crewai.com, causing ImagePullBackOff on every platform pod. Only CREW_IMAGE_REGISTRY_OVERRIDE is needed for crew image builds. Only use global.imageRegistry if you have mirrored every platform image to ACR per the private-registry guide.

ACR Authentication with Workload Identity

CrewAI pods require ACR push and pull permissions for building and deploying crew images. Grant AcrPush to the Managed Identity (uses the same identity created for Blob Storage):
For crew pods running in the crewai-crews namespace (build pods that push images), you also need a federated credential for that namespace’s default service account. Create this after the first helm install, which automatically creates the crewai-crews namespace:
The kubectl annotate command must run after the first helm install because the Helm chart creates the crewai-crews namespace. If you need to annotate before installing, create the namespace manually first: kubectl create namespace crewai-crews.
ArgoCD users: This step requires a two-Application pattern because the crewai-crews namespace does not exist until after the first sync completes. See the ArgoCD Deployment Guide.

ACR Authentication with Static Credentials

For environments where managed identity is not available, you can use an ACR service principal with static credentials:
ACR service principal tokens and passwords are long-lived credentials. Rotate them regularly and store them in Azure Key Vault rather than directly in Kubernetes secrets. Use Workload Identity for production deployments.

Helm Configuration for ACR

Combined Workload Identity Setup (Storage + ACR)

When using Workload Identity for both Blob Storage and ACR (recommended), a single managed identity covers both:

Verifying ACR Access

Test ACR authentication from CrewAI pods:

NGINX Ingress

CrewAI Platform supports NGINX Ingress Controller for AKS deployments. Azure Application Gateway Ingress Controller (AGIC) is also supported via the custom annotations mechanism.

Install NGINX Ingress Controller

Get the External IP

TLS with Kubernetes Secrets

Helm Configuration:

Internal vs External Load Balancer

By default, the NGINX controller creates an Azure public load balancer. For internal-only access:

Microsoft Entra ID Authentication

CrewAI Platform uses Microsoft Entra ID (formerly Azure Active Directory) for enterprise SSO. Full setup instructions are in the Microsoft Entra ID Guide, but the key Helm values are:

Helm Configuration

The callback URL you register in Entra ID must match your application host and use the path /auth/entra_id/callback. For example: https://crewai.your-company.com/auth/entra_id/callback.

Azure Key Vault Integration

Azure Key Vault provides centralized secret management with audit logging for CrewAI Platform. The chart integrates with Key Vault via External Secrets Operator (ESO).

Which Secrets to Store

Store in Azure Key Vault (sensitive, need rotation):
  • DB_PASSWORD — Database credentials
  • SECRET_KEY_BASE — Rails secret key
  • ENTRA_ID_CLIENT_SECRET — Entra ID OAuth secret
  • AZURE_STORAGE_ACCESS_KEY — If using access key auth for storage
  • GITHUB_TOKEN — For private repository access
Keep in values.yaml (configuration, not secrets):
  • DB_HOST, DB_PORT, DB_USER, POSTGRES_DB, POSTGRES_CABLE_DB
  • AZURE_STORAGE_ACCOUNT_NAME, AZURE_CONTAINER_NAME
  • APPLICATION_HOST
  • AUTH_PROVIDER, ENTRA_ID_CLIENT_ID, ENTRA_ID_TENANT_ID

Create Key Vault

Grant Key Vault Secrets Officer to Managed Identity

Install External Secrets Operator

Helm Configuration for Key Vault

The chart’s secretStore block creates a SecretStore resource pointing to Azure Key Vault. Use Workload Identity authentication (recommended) or Service Principal. Using Workload Identity:
Using Service Principal (alternative):

Complete Azure Deployment Example

If using WorkOS authentication, place WORKOS_API_KEY under envVars: — NOT under secrets:. See the WorkOS SSO guide for the full explanation and the correct YAML placement. This is a known chart limitation.
Here is a complete production configuration for Azure using Workload Identity for all services:
Deploy:

Troubleshooting Azure-Specific Issues

Pods Fail to Pull Images from images.crewai.com

Symptoms: Platform pods show ImagePullBackOff or ErrImagePull on images from images.crewai.com First check — verify global.imageRegistry is not set to ACR: Setting global.imageRegistry to your ACR host redirects all platform image pulls away from images.crewai.com. Check your values file for this pattern and remove it:
Common causes:
  1. global.imageRegistry was set to the ACR hostname — this redirects all platform image pulls away from images.crewai.com
Resolution: Remove global.imageRegistry from your values. Only CREW_IMAGE_REGISTRY_OVERRIDE should reference ACR.

Workload Identity Not Working — Access Denied to Blob Storage

Symptoms: Logs show AuthorizationPermissionMismatch or 403 errors for Blob Storage operations Verify the OIDC issuer and federated credential:
Verify the ServiceAccount annotation:
Check pod labels (Workload Identity requires the azure.workload.identity/use: "true" label on pods):
Test from pod:

PostgreSQL Connection Timeout

Symptoms: Pods show could not connect to server: Connection timed out Check VNet connectivity:
Check firewall rules:
Verify private DNS zone (if using VNet integration):

ACR Push Fails — Unauthorized

Symptoms: BuildKit logs show unauthorized: authentication required when pushing crew images Verify the AcrPush role assignment:
Verify the crews namespace federated credential:
Check the default ServiceAccount annotation in the crews namespace:

Key Vault ExternalSecret Sync Errors

Symptoms: ExternalSecret shows SecretSyncedError
Verify Key Vault access policy:

ServiceAccount Mismatch with Workload Identity

Symptoms: Pods show AuthorizationFailed despite correct Azure role assignments Common causes:
  1. Wrong ServiceAccount name in federated credential — The --subject in the federated credential must exactly match the namespace and ServiceAccount name used by pods
  2. Missing azure.workload.identity/use: "true" label — Pods without this label do not receive federated tokens
Diagnosis: