Kubernetes deployment
Important: If you're using or considering the enterprise version of Opik or Comet, reach out to Sales@comet.com to access the enterprise deployment documentation.
For production deployments, we recommend using our Kubernetes Helm chart. This chart is designed to be highly configurable and has been battle-tested in Comet's managed cloud offering.
Prerequisites
Section titled “Prerequisites”In order to install Opik on a Kubernetes cluster, you will need to have the following tools installed:
Installation
Section titled “Installation”You can install Opik using the helm chart maintained by the Opik team by running the following commands:
Add Opik Helm repo
helm repo add opik https://comet-ml.github.io/opik/
helm repo updateYou can set VERSION to the specific Opik version or leave it as 'latest'
VERSION=latest
helm upgrade --install opik -n opik --create-namespace opik/opik \
--set component.backend.image.tag=$VERSION \
--set component.python-backend.image.tag=$VERSION \
--set component.python-backend.env.PYTHON_CODE_EXECUTOR_IMAGE_TAG="$VERSION" \
--set component.frontend.image.tag=$VERSIONYou can port-forward any service you need to your local machine:
kubectl port-forward -n opik svc/opik-frontend 5173Opik will be available at http://localhost:5173.
Configuration
Section titled “Configuration”You can find a full list of the configuration options in the helm chart documentation.
Advanced deployment options
Section titled “Advanced deployment options”Configure external access
Section titled “Configure external access”Configure ingress for opik-frontend
Section titled “Configure ingress for opik-frontend”component:
frontend:
ingress:
enabled: true
ingressClassName: <your ingress class>
annotations:
<your annotations>
hosts:
- host: opik.example.com
paths:
- path: /
port: 5173
pathType: Prefix
# For TLS configuration (optional)
tls:
enabled: true
hosts: # Optional - defaults to hosts from rules if not specified
- opik.example.com
secretName: <your-tls-secret> # Optional - omit if using cert-manager or similarConfigure LoadBalancer service for clickhouse
Section titled “Configure LoadBalancer service for clickhouse”clickhouse:
service:
serviceTemplate: clickhouse-cluster-svc-lb-template
annotations: <your clickhouse LB service annotations>Configure Clickhouse backup
Section titled “Configure Clickhouse backup”Configure replication for Clickhouse
Section titled “Configure replication for Clickhouse”clickhouse:
replicasCount: 2Configure additional ClickHouse users and profiles
Section titled “Configure additional ClickHouse users and profiles”You can create read-only ClickHouse users with custom settings profiles.
Using inline passwords
Section titled “Using inline passwords”clickhouse:
additionalProfiles:
# Keep this `default` entry. Helm replaces lists rather than merging them, so a values file
# that declares its own `additionalProfiles` drops the chart's default one — taking the
# Distributed insert-queue settings with it, silently.
- name: default
settings:
distributed_background_insert_batch: 1
distributed_background_insert_split_batch_on_failure: 1
prefer_localhost_replica: 0
- name: readonly_profile
settings:
readonly: 1
max_execution_time: 60
max_memory_usage: 10000000000
max_rows_to_read: 20000000
max_concurrent_queries_for_user: 2
additionalUsers:
- username: myuser
password: my_secure_password
profile: readonly_profileUsing Kubernetes secrets
Section titled “Using Kubernetes secrets”When adminUser.useSecret.enabled: true, user passwords are read from a Kubernetes secret. By default, it uses the admin secret (adminUser.secretname) with the key <username>_pass:
clickhouse:
adminUser:
useSecret:
enabled: true
secretname: clickhouse-admin-pass
additionalProfiles:
# Keep this `default` entry. Helm replaces lists rather than merging them, so a values file
# that declares its own `additionalProfiles` drops the chart's default one — taking the
# Distributed insert-queue settings with it, silently.
- name: default
settings:
distributed_background_insert_batch: 1
distributed_background_insert_split_batch_on_failure: 1
prefer_localhost_replica: 0
- name: readonly_profile
settings:
readonly: 1
max_execution_time: 60
max_memory_usage: 10000000000
max_rows_to_read: 20000000
max_concurrent_queries_for_user: 2
additionalUsers:
- username: myuser
profile: readonly_profile
# password read from secret "clickhouse-admin-pass", key "myuser_pass"
- username: anotheruser
profile: readonly_profile
secretname: my-custom-secret # override secret name
password_key: custom_key # override key nameUse S3 bucket for Opik
Section titled “Use S3 bucket for Opik”Using AWS key and secret keys
Section titled “Using AWS key and secret keys”component:
backend:
env:
S3_BUCKET: <your_bucket_name>
S3_REGION: <aws_region>
AWS_ACCESS_KEY_ID: <your AWS Key>
AWS_SECRET_ACCESS_KEY: <your AWS Secret>Use IAM Role
Section titled “Use IAM Role”If your IAM role is configured for the k8s nodes, the only things you will need is to set for opik-backend:
component:
backend:
env:
S3_BUCKET: <your_bucket_name>
S3_REGION: <aws_region> If your role should be used by opik-backend serviceAccount, in addition you need to set:
component:
backend:
serviceAccount:
enabled: true
annotations:
eks.amazonaws.com/role-arn: <your IAM Role arn>Use external Clickhouse installation
Section titled “Use external Clickhouse installation”Supported from Opik chart version 1.4.2
Configuration snippet for using external Clickhouse:
component:
backend:
...
waitForClickhouse:
clickhouse:
host: <YOUR CLICKHOUSE HOST>
port: 8123
protocol: http
env:
ANALYTICS_DB_MIGRATIONS_URL: "jdbc:clickhouse://<YOUR CLICKHOUSE HOST>:8123"
ANALYTICS_DB_HOST: "<YOUR CLICKHOUSE HOST>"
ANALYTICS_DB_DATABASE_NAME: "opik"
ANALYTICS_DB_MIGRATIONS_USER: "opik"
ANALYTICS_DB_USERNAME: "opik"
ANALYTICS_DB_MIGRATIONS_PASS: "xxx"
ANALYTICS_DB_PASS: "xxx"
...
clickhouse:
enabled: falseThe passwords can be handled in the secret, and then you should configure it as following
component:
backend:
...
envFrom:
- configMapRef:
name: opik-backend
- secretRef:
name: <your secret name>
env:
ANALYTICS_DB_MIGRATIONS_URL: "jdbc:clickhouse://<YOUR CLICKHOUSE HOST>:8123"
ANALYTICS_DB_HOST: "<YOUR CLICKHOUSE HOST>"
ANALYTICS_DB_DATABASE_NAME: "opik"
ANALYTICS_DB_MIGRATIONS_USER: "opik"
ANALYTICS_DB_USERNAME: "opik"
...
clickhouse:
enabled: falseDelete your installation
Section titled “Delete your installation”Before deleting opik installation with helm, make sure to remove finalizer on the clickhouse resource:
kubectl patch -n opik chi opik-clickhouse --type json --patch='[ { "op": "remove", "path": "/metadata/finalizers" } ]'Then, uninstall the opik:
helm uninstall opik -n opikVersion Compatibility
Section titled “Version Compatibility”It's important to ensure that your Python SDK version matches your Kubernetes deployment version to avoid compatibility issues.
Check your current versions
Section titled “Check your current versions”Check Opik UI version
Section titled “Check Opik UI version”You can check your current Opik deployment version in the UI by clicking on the user menu in the top right corner.
Check Python SDK version
Section titled “Check Python SDK version”You can check your installed Python SDK version by running:
pip show opikEnsure version compatibility
Section titled “Ensure version compatibility”Make sure both versions match. If they don't match:
- To update your Python SDK: Run
pip install --upgrade opik==<VERSION>where<VERSION>matches your Kubernetes deployment - To update your Kubernetes deployment: Update the VERSION variable in the helm installation command to match your Python SDK version
Troubleshooting
Section titled “Troubleshooting”If you get an error similar to the following when running helm (the ClickHouse version in the message depends on your installation):
ERROR: Exception Primary Reason: Code: 225. DB::Exception: Can't create replicated table without ZooKeeper. (NO_ZOOKEEPER) (version 24.3.5.47.altinitystable (altinity build))Please make sure you use the latest Opik helm chart version that runs zookeeper by default