Skip to main content
This guide walks through deploying Skyvern on Kubernetes for production environments. Use this when you need horizontal scaling, high availability, or integration with existing Kubernetes infrastructure.
Do not expose this deployment to the public internet without adding authentication at the ingress layer.

Prerequisites

  • A running Kubernetes cluster (1.19+)
  • kubectl configured to access your cluster
  • An ingress controller (the manifests use Traefik, but any controller works)
  • An LLM API key (OpenAI, Anthropic, Azure, etc.)

Architecture overview

The Kubernetes deployment creates three services:

Quick start

1. Clone the repository

2. Configure backend secrets

Edit backend/backend-secrets.yaml with your LLM provider credentials:
backend/backend-secrets.yaml
For other LLM providers, see LLM Configuration.

3. Configure frontend secrets

Edit frontend/frontend-secrets.yaml:
frontend/frontend-secrets.yaml
Replace skyvern.example.com with your actual domain.

4. Configure ingress

Edit ingress.yaml with your domain and TLS settings:
ingress.yaml

5. Deploy

Run the deployment script:
This applies manifests in order:
  1. Namespace
  2. PostgreSQL (secrets, storage, deployment, service)
  3. Backend (secrets, deployment, service)
  4. Frontend (secrets, deployment, service)
  5. Ingress

6. Verify deployment

Check that all pods are running:
Expected output:
The backend pod takes 1-2 minutes to become ready as it runs database migrations.

7. Get your API key

Wait for the backend pod to show 1/1 in the READY column of kubectl get pods -n skyvern before running this command. The API key file is generated during startup and won’t exist until the pod is ready.
Copy the cred value and update frontend/frontend-secrets.yaml:
Reapply the frontend secrets and restart:

8. Access the UI

Navigate to your configured domain (e.g., https://skyvern.example.com). You should see the Skyvern dashboard.

Manifest structure


Storage configuration

By default, the manifests use hostPath volumes. This works for single-node clusters but isn’t suitable for multi-node production deployments.

Using PersistentVolumeClaims

For production, replace hostPath with PVCs. Edit backend/backend-deployment.yaml:
Create the PVCs:
skyvern-storage.yaml

Using S3 or Azure Blob

For cloud storage, configure the backend environment variables instead of mounting volumes. See Storage Configuration.

Scaling

Horizontal scaling

To run multiple backend instances, increase the replica count:
backend/backend-deployment.yaml
Each pod runs its own browser instance. Tasks are distributed across pods.
When scaling horizontally, ensure your storage backend supports concurrent access (S3, Azure Blob, or ReadWriteMany PVCs). Local storage with ReadWriteOnce PVCs won’t work across multiple pods.

Resource limits

Add resource limits to prevent pods from consuming excessive resources:
Browser instances need significant memory. Start with 2GB minimum per pod.

TLS configuration

To enable HTTPS, uncomment the TLS section in ingress.yaml:
Create the TLS secret:
Or use cert-manager for automatic certificate management. Update frontend secrets to use https and wss:

Using an external database

For production, consider using a managed PostgreSQL service (RDS, Cloud SQL, Azure Database).
  1. Remove the postgres/ manifests from the deployment
  2. Update backend/backend-secrets.yaml:

Troubleshooting

Pods stuck in Pending

Check for resource constraints:
Common causes:
  • Insufficient node resources
  • PersistentVolume not available
  • Image pull errors

Backend crashes on startup

Check the logs:
Common causes:
  • Invalid LLM API key
  • Database connection failed
  • Missing environment variables

Frontend shows “Unauthorized”

The API key in frontend secrets doesn’t match the generated key. Re-copy it from the backend pod.

Ingress not routing correctly

Verify your ingress controller is running and the ingress resource is configured:

Cleanup

To remove the entire deployment:
This removes all resources in the skyvern namespace. To clean up host storage (if using hostPath):

Next steps

Storage Configuration

Configure S3 or Azure Blob for artifact storage

LLM Configuration

Configure additional LLM providers