Skip to main content

Overview

This guide provides solutions for common issues encountered when deploying and operating CrewAI Platform on Kubernetes. For additional support, generate a support bundle and contact your CrewAI representative.

Diagnostic Commands

Before troubleshooting specific issues, gather diagnostic information:
For detailed health check results and component-specific troubleshooting, see the Factory Health & Debug guide.

Common Issues

Pod CrashLoopBackOff

Symptoms:
Common Causes:
  1. Missing required secrets
  2. Database connection failure
  3. Resource limits too restrictive
  4. Invalid configuration
Diagnosis:

Pod Startup Failures

Diagnosis:
  1. Check pod logs for errors
  2. Verify resource limits are not too restrictive
  3. Check secret availability
  4. Verify image pull secrets are configured

Database Connection Issues

Symptoms: Logs show could not connect to server: Connection refused Diagnosis: If the application cannot connect to the database:
  1. Verify DB_HOST is set correctly for external databases
  2. Check database credentials in secrets
  3. Ensure database allows connections from Kubernetes cluster
  4. Verify database name and port configuration
  5. Check security groups/firewall rules
  6. If using Built-in Integrations (oauth.enabled: true) with an external database, ensure the OAuth database exists (default: oauth_db)
  7. With an external database, ensure the Wharf database exists (default: wharf; Wharf is enabled by default)

Storage/S3 Connection Issues

Diagnosis:
  1. Verify AWS credentials are correct
  2. Check bucket name and region
  3. Ensure IAM permissions allow bucket access
  4. For MinIO, verify endpoint URL is accessible

Image Pull Errors

Symptoms: ErrImagePull, ImagePullBackOff Solutions:
  1. Verify image name and tag exist
  2. Check pull secret configuration
  3. Verify registry credentials
  4. Check network connectivity to registry

Ingress Not Accessible

Symptoms: Cannot reach application via ingress hostname Diagnosis:
Solutions:
  1. Verify ingress controller is installed
  2. Check ingress className matches your controller
  3. Verify DNS points to ingress load balancer
  4. Check TLS certificate configuration

Out of Memory (OOMKilled)

Symptoms: Pods restarting with OOMKilled Solutions:
  1. Increase memory limits
  2. Tune WEB_CONCURRENCY and RAILS_MAX_THREADS
  3. Monitor actual memory usage
  4. Check for memory leaks

BuildKit Build Failures

Symptoms: Crew builds fail, BuildKit errors in logs Common Causes:
  1. Registry authentication issues
  2. Insufficient BuildKit resources
  3. Network connectivity problems
Solutions:

Third-Party OpenTelemetry Auto-Instrumentation Conflicts

Symptoms: Deployed crews crash on startup or get stuck in Init, with logs similar to:
Cause: A cluster-wide OpenTelemetry Operator is auto-injecting language instrumentation into crew pods. On EKS this is most often the Amazon CloudWatch Observability add-on (Application Signals), but any OpenTelemetry Operator with auto-instrumentation enabled behaves the same way. The operator’s admission webhook mounts an instrumentation volume (/otel-auto-instrumentation-python) and prepends it to PYTHONPATH. CrewAI crew images already ship their own OpenTelemetry SDK (bundled with CrewAI and its dependencies). When two different OpenTelemetry versions are spliced together on PYTHONPATH, the namespace package resolves to incompatible modules and the crew fails to import, producing the ImportError above. The AwsEksResourceDetector and getSamplingRules lines are the injected AWS agent failing to authenticate. They are warnings, but they confirm injection is active. The telltale sign is the path /otel-auto-instrumentation-python in the traceback. That directory is injected by the operator and is not part of the crew image (/crew/.venv). Solution: Exclude the CrewAI namespaces in the CloudWatch Observability add-on configuration. This is the only reliable fix on current versions of the add-on.
On the CloudWatch Observability add-on v5.0.0 and later, Application Signals “Auto Monitor” is enabled by default (monitorAllServices: true). Auto Monitor re-annotates every new pod at admission time, setting cloudwatch.aws.amazon.com/auto-annotate-*: true and forcing instrumentation.opentelemetry.io/inject-*: true back on. As a result, disabling injection with a namespace annotation or a per-Deployment patch does not work on these versions. Those annotations are silently overwritten. You must change the add-on configuration instead.
Apply an exclude block scoped to the CrewAI namespace, covering all languages (Auto Monitor injects Java, Python, Node.js, and .NET):
Alternatively, if you do not need CloudWatch APM auto-instrumentation anywhere, disable Auto Monitor entirely:
This is a cluster-scoped add-on setting, so it must be applied per cluster (once per environment) by whoever manages your EKS configuration. Validation: The add-on update reports IN_PROGRESS while it rolls. Confirm the change took effect:
Only pods created after the add-on returns to ACTIVE pick up the new configuration. A correctly excluded pod returns no auto-annotate-* or inject-* annotations in step 3, and its logs no longer show the ImportError.

Sending Crew Telemetry to CloudWatch or Other Backends

Disabling auto-injection does not mean losing observability. The conflict only affects application-level trace injection. The other telemetry paths are unaffected, and crew traces can still reach external backends through the supported configuration:
  • Container logs continue to flow to CloudWatch through your existing log agent (for example Fluent Bit). No instrumentation injection required.
  • Pod and container metrics continue to flow through Container Insights and the CloudWatch agent. No injection required.
  • Crew execution traces are emitted by each crew’s own OpenTelemetry SDK. Rather than letting a third-party operator inject a conflicting agent, configure an external collector under Settings → OpenTelemetry Collectors in the platform. The platform forwards crew traces (and logs) to any OTLP-compatible endpoint, including CloudWatch’s OTLP receiver, Datadog, Arize, or a generic OpenTelemetry collector. Provide the collector endpoint and any required headers; certificates are supported for TLS-secured endpoints.
This keeps the crew image’s bundled OpenTelemetry stack intact while still delivering traces to your observability backend, without the PYTHONPATH collision that auto-injection causes.

Persistent Volume Issues

Symptoms: Pods stuck in Pending state, PVC not binding Solutions:

Authentication Provider Issues

Symptoms: Unable to log in, OAuth errors Solutions:

Entra ID Issues

Okta Issues

Secret Management Issues

Symptoms: Pods fail to start, missing secret errors Solutions:

Expected Behavior: Pod Restarts After Secret Updates

Observation: Pods restart after running helm upgrade when secret values change This is expected behavior. When you update secret values in your Helm values file (e.g., rotating credentials), the chart automatically triggers a rolling restart of all affected pods to ensure they pick up the new credentials. This is by design and prevents stale credentials from being used. What to expect:
  • Pods restart in a rolling fashion (no downtime)
  • Each pod restarts once to load new secret values
  • The restart happens automatically - no manual pod deletion needed
To verify the restart was successful:

Configuration Warnings

RAILS_MASTER_KEY Warning

Warning Message:
Cause: You have manually configured RAILS_MASTER_KEY in either envVars or secrets in your values file. Solution: The chart automatically manages RAILS_MASTER_KEY and does not require manual configuration. Remove this setting from your values file:
Then upgrade your deployment:
Why This Matters: The chart uses a different Rails configuration approach that doesn’t require RAILS_MASTER_KEY. Setting it manually can cause configuration conflicts.

Performance Issues

Symptoms: Slow response times, high latency Diagnostic Steps:
Solutions:
  1. Scale web replicas:
  1. Increase resources:
  1. Tune concurrency:
  1. Add database read replicas (configure in external database)

Support and Resources

Documentation

Generate Support Bundle

The support bundle collects comprehensive diagnostics for troubleshooting:
Automatic Component Detection: The support bundle automatically detects and collects logs from enabled components:
  • OAuth Service: When oauth.enabled: true
  • Wharf Service: When wharf.enabled: true
  • Cube Analytics: When cube.enabled: true
  • BuildKit: When buildkit.enabled: true
  • Internal Registry: When internalRegistry.enabled: true
  • PostgreSQL: When postgres.enabled: true
  • MinIO: When minio.enabled: true
Multi-Namespace Crew Logs: When using multi-organization namespace isolation, configure supportBundle.crewLogNamespaces to collect crew logs from additional namespaces:
See Global Configuration for details. The support bundle will be saved as a .tar.gz file that can be shared with CrewAI support for analysis.
Share the generated support bundle file with CrewAI support for faster issue resolution.

Quick Diagnostic Commands

Contact Support

For assistance with CrewAI Platform:
  • Customer Portal: https://enterprise.crewai.com/crewai
  • Support Team: Contact your CrewAI representative
  • Emergency Issues: Generate and share support bundle with your support team
  • Release History: https://enterprise.crewai.com/crewai/release-history