Skip to main content
Opik Documentation

Search documentation

Type to search this documentation.

On this pageOverview

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.

In order to install Opik on a Kubernetes cluster, you will need to have the following tools installed:

You can install Opik using the helm chart maintained by the Opik team by running the following commands:

Add Opik Helm repo

Bash
helm repo add opik https://comet-ml.github.io/opik/
helm repo update

You can set VERSION to the specific Opik version or leave it as 'latest'

Bash
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=$VERSION

You can port-forward any service you need to your local machine:

Bash
kubectl port-forward -n opik svc/opik-frontend 5173

Opik will be available at http://localhost:5173.

You can find a full list of the configuration options in the helm chart documentation.

YAML
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 similar

Configure LoadBalancer service for clickhouse

Section titled “Configure LoadBalancer service for clickhouse”
YAML
clickhouse:
  service:
    serviceTemplate: clickhouse-cluster-svc-lb-template
    annotations: <your clickhouse LB service annotations>

Clickhouse Backup

YAML
clickhouse:
  replicasCount: 2

Configure additional ClickHouse users and profiles

Section titled “Configure additional ClickHouse users and profiles”

You can create read-only ClickHouse users with custom settings profiles.

YAML
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_profile

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:

YAML
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 name
YAML
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>

If your IAM role is configured for the k8s nodes, the only things you will need is to set for opik-backend:

YAML
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:

YAML
component:
  backend:
    serviceAccount:
      enabled: true
      annotations:
        eks.amazonaws.com/role-arn: <your IAM Role arn>

Supported from Opik chart version 1.4.2

Configuration snippet for using external Clickhouse:

YAML
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: false

The passwords can be handled in the secret, and then you should configure it as following

YAML
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: false

Before deleting opik installation with helm, make sure to remove finalizer on the clickhouse resource:

Bash
kubectl patch -n opik chi opik-clickhouse --type json --patch='[ { "op": "remove", "path": "/metadata/finalizers" } ]'

Then, uninstall the opik:

Bash
helm uninstall opik -n opik

It's important to ensure that your Python SDK version matches your Kubernetes deployment version to avoid compatibility issues.

You can check your current Opik deployment version in the UI by clicking on the user menu in the top right corner.

You can check your installed Python SDK version by running:

Bash
pip show opik

Make sure both versions match. If they don't match:

  1. To update your Python SDK: Run pip install --upgrade opik==<VERSION> where <VERSION> matches your Kubernetes deployment
  2. To update your Kubernetes deployment: Update the VERSION variable in the helm installation command to match your Python SDK version

If you get an error similar to the following when running helm (the ClickHouse version in the message depends on your installation):

Bash
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

Suggest an edit

Propose a replacement for this page. The site team reviews it before applying any changes.

Export
Documentation menu