Kubernetes installation
This guide covers installing Deephaven in a Kubernetes environment using Helm. Commands are shown for running in a Unix-like environment. The installation can be customized by setting the Helm values described in the Kubernetes configuration settings page.
If you are trying out Deephaven in a minimal capacity for testing purposes and do not plan on ingesting a lot of data, see the Quickstart guide. Before continuing further, make sure you have read the planning guide to help determine how much memory and storage to configure for the system.
Prerequisites
You must meet the following prerequisites to deploy Deephaven with Kubernetes:
- A Kubernetes cluster on a supported provider and version — Deephaven currently supports GKE (Google Kubernetes Engine), EKS (Amazon Elastic Kubernetes Service), and AKS (Azure Kubernetes Service). For supported Kubernetes versions, see the version support matrix. A dedicated namespace must be created for the Deephaven installation.
kubectl,docker, andhelmcommand line tools. Verify that yourkubectlclient version is close to your cluster's server version — a large skew can cause unexpected failures. Runkubectl versionto compare.- A username and password for the
repo.deephaven.ioimage repository URL in order to create an image pull secret.- As an alternative, Deephaven can provide images as a tar file and you can push them to your own internal repo.
- A TLS webserver certificate and the private key that corresponds to it. The webserver and certificate must meet Deephaven's requirements. The Deephaven installation includes a LoadBalancer service (Envoy) that is the entry point for the application. A DNS entry for the hostname associated with this certificate must be created after the installation.
- A Deephaven distributable package containing a Helm chart, support scripts, and Dockerfiles, e.g.,
deephaven-helm-2026.01.055.tar.gz. This package includes the bundleddeephaven-etcdanddeephaven-nfsHelm charts used to deploy etcd and shared storage. - Access to the
deephaven_etcdimage atrepo.deephaven.io/deephaven_etcd. Your cluster pulls it using an image pull secret you create from credentials provided by your Deephaven associate (see Install the etcd Helm chart), or you may mirror the image into your own repository.
If using Deephaven pre-built images:
- A Deephaven distributable package containing pre-built Docker images, e.g.,
deephaven-containers-2026.01.055.tar.gz.
If building your own images:
- A distributable containing Deephaven Enterprise, e.g.,
deephaven-enterprise-2026.01.055.tar.gz. - A distributable containing Deephaven Core+ worker, e.g.,
deephaven-coreplus-42.4-2026.01.055.tgz.
Note
You can either use pre-built container images from Deephaven or build your own images. Building your own images allows for customizing them to make your JARs available to workers or to add plugins.
Kubernetes resource requirements
Before deploying Deephaven, ensure your Kubernetes cluster has sufficient resources to support the deployment. The requirements below are for a deployment with default configuration settings.
Minimum cluster resources
A minimal cluster requires:
| Resource Type | Minimum Requirement |
|---|---|
| Network resources | |
| Cluster IPs | 20 (plus one for each additional worker) |
| External IPs | 1 (for Envoy LoadBalancer) |
| Compute resources | |
| Memory | 60GB total across all pods |
| CPU | 10 cores total across all pods |
Note
These are baseline requirements for a minimal deployment. Production deployments should provision significantly more resources based on expected workload, number of concurrent users, and data processing requirements. See the Kubernetes-specific considerations section of the installation planning guide for guidance on sizing for production use.
Pod and service IP CIDR ranges must also be sized to accommodate all cluster workloads. A /20 range (4096 addresses) can be exhausted quickly as Deephaven worker pods are created and destroyed. A /16 range (65536 addresses) is strongly recommended.
Resource breakdown by component
The default Helm chart configuration allocates resources across multiple pods:
- etcd cluster: 3 pods with memory and CPU requests.
- Deephaven infrastructure services: Web API, Configuration Server, Authentication Server, etc.
- Persistent Query Controller: Manages query execution.
- Envoy proxy: Handles ingress traffic (requires one External IP).
- Worker pods: For Code Studio sessions and Persistent Queries (scale based on usage).
Storage requirements
Deephaven data and configuration storage falls into three categories, each with different requirements:
| Storage type | Purpose | Access mode | NFS compatible |
|---|---|---|---|
| Configuration | Shared configuration files across pods | RWX (read-write-many) | Yes |
| Intraday | DIS and in-worker DIS data ingestion | RWO (read-write-once) | No |
| Historical | Merged historical data | RWX (read-write-many) | Yes |
Caution
Intraday storage cannot use NFS. The Data Import Server (DIS) requires local or block storage with low-latency I/O for data ingestion. Using NFS for intraday storage will cause performance issues and potential data corruption.
Your cluster must also provide:
- Persistent volumes for etcd: the
deephaven-etcdchart provisions one RWO data volume per etcd pod (8Giby default), and etcd backups are written to a shared RWX volume (provided by thedeephaven-nfschart or your own storage). - A storage class appropriate for your Kubernetes provider (e.g.,
premium-rwofor GKE,gp2for EKS,managed-csifor AKS).
Define deployment variables
Define these shell variables once before starting. They are referenced throughout this guide — replace the example values with names appropriate for your environment.
Set the namespace for your Kubernetes context
Start by creating your Kubernetes namespace and setting it to the default for your kubectl context if you have not already done so.
Note
If you do not wish to set a default namespace for your kubectl context, you can create aliases to use the namespace without explicitly typing it, and use k and h in place of the kubectl and helm commands in this guide.
Unzip the Deephaven Helm chart
Unpack the deephaven-helm package:
Deephaven images
Create image pull secret
Deephaven publishes the application container images to its image repository at repo.deephaven.io. By default your
cluster pulls them directly from there, so there is no separate load-and-push step. Create an image pull secret in your
namespace using the username and password provided by your Deephaven associate - the same secret is also used for the
deephaven_etcd image:
The Deephaven Helm chart references these images through image.repositoryUrl (set to repo.deephaven.io) and the pull
secret through imagePullSecrets; both are configured in Install the Deephaven Helm chart.
Managing your own images
If you are not pulling the Deephaven images from repo.deephaven.io, you will need to load and push them yourself - see
this section below.
Push the Deephaven images to your own repository
If you prefer to host the Deephaven images in your own artifact repository - for example, because you want to build
customized images yourself, or your cluster cannot reach repo.deephaven.io - you can load and push them yourself.
Deephaven provides pre-built images as a tar file (deephaven-containers-2026.01.055.tar.gz), or you
can build your own with the dockerfiles provided in the deephaven-helm-2026.01.055.tgz distribution.
If you are using Deephaven's pre-built images, load them into your local Docker repository.
To build images from Deephaven Docker files, first change the directory to the docker subdirectory within the unzipped
Helm distribution and copy the Enterprise and Core+ distributions to the deephaven_base and db_query_worker_coreplus
directories, respectively.
- To build custom JARs into your images and make them available in Persistent Queries and Code Studios, create
a zipped tar file containing your JARs, copy it to the
deephaven_customerdirectory, and add a--customer-coreplus-jarflag to thebuildAllForK8s.shcommand. - For Legacy workers, use the
--customer-jarflag. - To build plugin JARs into your images and make them available to non-worker processes, create
zipped tar files containing your plugins, copy them to the
deephaven_customerdirectory, and add up to 10--customer-pluginflags to thebuildAllForK8s.shcommand.
Note
The deephaven_etcd image is separate from the application images and is not handled by pushAll.sh. If your
cluster cannot reach repo.deephaven.io, mirror deephaven_etcd:VAR:DH_ETCD_IMAGE_VERSION into your own repository and point
--repository at it in Install the etcd Helm chart.
Change directory
The rest of the commands in this guide must be run from the helm subdirectory of the unpackaged Helm distribution.
Configure shared storage
The Deephaven deployment requires read-write-many (RWX) Persistent Volumes for data that must be shared across pods. This storage is used for historical table data (/db/Systems and /db/Users) and etcd backups.
Note
Intraday data requires local (non-shared) storage on each node and is configured separately in the Helm chart values. See Storage requirements for details on the different storage types.
The table below summarizes the distinct PVs and PVCs in a Deephaven Kubernetes deployment:
| Volume | Purpose | Created by |
|---|---|---|
| NFS server backing storage | Disk that backs the in-cluster NFS server pod (Option 1 only) | deephaven-nfs Helm chart (PVC dh-nfs-pvc) |
| Deephaven shared NFS volumes | Shared directories (db/Systems, db/Users, etc.) accessed by all Deephaven pods | Deephaven Helm chart (named using nfs.pvPrefix) |
| etcd data volumes (3x) | Per-node storage for etcd cluster state | deephaven-etcd Helm chart |
| etcd backup snapshot volume | Stores periodic etcd backup snapshots | setup-deephaven-etcd.sh via etcd-backup-vol.yaml (named using --pv-prefix) |
| DIS intraday/user volumes | Storage for intraday data and user-created partitions | Deephaven Helm chart |
Note
The nfs.pvPrefix in the Deephaven Helm chart and the --pv-prefix in setup-deephaven-etcd.sh are independent. They can have the same value but do not need to.
You have two options for providing this shared storage:
- Create a new NFS deployment — Install the provided deephaven-nfs helm chart to deploy an NFS server within your Kubernetes cluster.
- Use pre-existing PVCs — Configure Deephaven to use existing RWX persistent volume claims that you have already created in your environment.
Choose one of the following approaches:
If you have an existing ReadWriteMany (RWX) storage solution available in your Kubernetes environment, you can create Persistent Volume Claims (PVCs) for the required paths. Ensure your chosen storage class supports RWX access.
Each PVC requires specific directory structures and ownership. The required directories and their ownership are:
/db/Systems- owned bydbmerge:dbmergegrp(UID/GID 9001:9003)/db/Users- owned bydbmerge:dbmergegrp(UID/GID 9001:9003)/etcd-backup- owned by the UID/GID that the etcd backup process runs as (default1001:1001)
Note
Setting directory ownership requires root access. If your PVCs are backed by NFS exports with root_squash enabled,
you will need to configure ownership from the NFS server or disable root_squash.
When installing the Deephaven Helm chart, configure the following values in your override YAML file to use your pre-existing PVCs:
The Helm distribution includes the deephaven-nfs chart, which deploys a containerized NFS server backed by a
PersistentVolumeClaim. On first startup it creates and permissions the directory hierarchy Deephaven expects and sets permissions —
db/Systems, db/Users, and an etcd-backup directory (used later for etcd backups) — so no manual setup step
is required.
The only required value is a storage class for the backing PVC. Choose one appropriate for your environment
(e.g., premium-rwo for GKE, gp2 for EKS, managed-csi for AKS). The default PVC size is 100Gi; override
it with --set pvc.storageSize=<size> if needed.
It may take a minute for the NFS pod to become ready — check with kubectl get pods. The chart also creates a
ClusterIP service named deephaven-nfs. Note its cluster IP (used for the Deephaven chart's nfs.server
value below):
Note
When using pre-existing PVCs for shared volumes, you can omit nfs.server and nfs.root, but you must still set a non-empty nfs.pvPrefix value (the chart requires it for naming and template rendering).
Install the etcd Helm chart
The setup-deephaven-etcd.sh script in the setupTools directory of the deephaven-helm package installs the
deephaven-etcd Helm chart. The command below creates a 3-node etcd deployment (--replica-count defaults to 3;
it must be odd). Note the etcd installation name (--etcd-name), as it will be needed when configuring the
Deephaven Helm chart.
By default the script also creates a backup PVC/PV for etcd on the Deephaven NFS server (using its etcd-backup
export) and enables periodic snapshots. It therefore assumes the deephaven-nfs service from the
Configure shared storage step is running; the script locates it automatically or you can
pass --nfs-ip. To use your own RWX volume for backups instead, pass --existing-pvc-name <pvc>; to skip backups
entirely (non-production only), pass --no-backup.
The --pv-prefix value is prepended to the names of the etcd backup snapshot PV and PVC (e.g.
dh-dev1-etcd-backup-snapshot-pv), making them unique across installations since PV names are cluster-scoped. It
does not affect the etcd data volumes, which are created and named by the deephaven-etcd StatefulSet. It can be
any short arbitrary string such as dh-dev1, dhqa, etc. To see all options, run
setupTools/setup-deephaven-etcd.sh --help.
The deephaven_etcd:VAR:DH_ETCD_IMAGE_VERSION image (overridable with --etcd-image-tag) is pulled from
repo.deephaven.io/deephaven_etcd using the repo-deephaven-io-imgpull pull secret created in
Deephaven images. Install etcd, passing the image repository and that pull secret. (If you
mirrored the image into your own repository, use that location for --repository instead.) If you are providing
your own ReadWriteMany (RWX) pvc for backups, pass --existing-pvc-name <my-pvc-name>.
Note
setup-deephaven-etcd.sh generates two YAML files: etcd-backup-vol.yaml (a Persistent Volume and Persistent
Volume Claim manifest for storing etcd snapshot backups) and etcd-override-values.yaml (the deephaven-etcd
chart override values used for the helm install). To see the generated files without installing anything, add
the --dry-run flag.
It will take a minute for the etcd pods to start up and become ready. You can check the status of the pods with this
command, and should eventually see all pods with a 1/1 container ready status (note that the exact pod names will depend
on the helm installation name):
Note
After the StatefulSet pods are Running, a post-install Job (<etcd-name>-auth-setup) enables etcd RBAC and sets
the root password. The password is stored in the Kubernetes Secret named after the etcd release (e.g. dh-etcd),
key etcd-root-password, and is preserved across helm uninstall/upgrade. Provide your own with
--root-password, or let the chart auto-generate one.
Verify etcd cluster health
Once all pods show 1/1 Running and the auth Job has completed, verify the cluster is healthy before proceeding.
A healthy etcd cluster is required for the Deephaven installation to succeed.
A healthy cluster reports each endpoint as true under the HEALTH column.
Important
If the health check fails, do not proceed with the Deephaven installation — it will time out waiting for a healthy etcd cluster. A common symptom is a member unable to find its peers in the etcd pod logs, which typically indicates a storage or networking misconfiguration.
To add more detail to etcd logging, set --set logLevel=debug (or add logLevel: debug to
etcd-override-values.yaml) before reinstalling.
Reinstalling a broken etcd cluster
If you need to reinstall etcd from scratch, uninstall the Helm release and remove its PVCs and PVs first. The
setupTools/delete-deephaven-etcd.sh script automates this; the equivalent manual steps are:
For a full etcd backup and restore procedure, see the Kubernetes etcd backup and recovery guide.
Note
Legacy Bitnami etcd: Deployments created before the deephaven-etcd chart used a Bitnami etcd chart
installed via setup-etcd.sh. Those deployments remain supported; see the
etcd backup and recovery guide if you need to migrate to the deephaven-etcd
chart.
Install cert-manager (optional)
If you wish to run Deephaven services using TLS within the cluster for intra-cluster communication, you need to install cert-manager. This is optional but recommended for production environments.
Check if cert-manager is already installed
To see if cert-manager is installed on your cluster already, run:
If you see a message saying error: the server doesn't have a resource type "clusterissuer", then cert-manager is not installed.
Install cert-manager
There are several ways to install cert-manager. Full instructions are provided at the cert-manager installation page. The most straightforward way is to do the default static install listed there. The cert-manager project also provides a Helm chart that may be used to install cert-manager.
Configure the issuer
The setupTools/ca-bootstrap-issuer.yaml file in your Helm distribution will create:
- A
ClusterIssuerfor the entire Kubernetes cluster that creates a self-signed root CA certificate. - An
Issuerin your target Kubernetes namespace that will issue certificates with the root CA in the certificate chain.
You may create a new YAML file defining an Issuer configuration that is not self-signed if there is infrastructure to support it in your organization. For example, you may define an issuer that is configured to use HashiCorp Vault or an external provider. Details for these configurations may be found in the cert-manager issuer configuration docs.
Using an existing ClusterIssuer
If a ClusterIssuer is already present in your cluster, you can copy the second and third sections from ca-bootstrap-issuer.yaml (Certificate and Issuer definitions) to a new file, and update them for the names of your ClusterIssuer and namespace. Then apply the new file using kubectl apply -f.
Creating the default self-signed cluster issuer
To create the default self-signed cluster issuer:
- Edit
setupTools/ca-bootstrap-issuer.yamland replace occurrences of<your-namespace>with your target Kubernetes namespace. - Apply the configuration:
Important
When using cert-manager, you must set certmgr.enabled to true in your values YAML file (see the Install the Deephaven Helm chart section below). The namespace issuer and related objects must be deployed for the dispatcher to be able to obtain certificates for the workers.
If you are not using cert-manager, several self-signed certificates (without a common root CA) for Deephaven services will be generated and kept in a keystore for use by the system.
Create a Kubernetes secret for the TLS certificate
With the TLS certificate and private key stored as files named tls.crt and tls.key, respectively, run this command
to create a deephaven-tls secret from them:
Create Roles and RoleBindings
Deephaven relies on Kubernetes role-based access control (RBAC) to grant certain pods the ability to add new objects to the Kubernetes cluster. This is used for two purposes:
- The Helm install hook adds Kubernetes Secrets and ConfigMaps that are used by various components of the Deephaven platform.
- The query dispatcher pod adds additional pods, services, and other Kubernetes objects to allow new persistent queries and code studios to start.
Verify that the user running the Helm installation is able to create Kubernetes Roles, RoleBindings, and ServiceAccounts. You can check this with the kubectl auth can-i command:
The output should be "yes" three times:
If the output is "yes" for all three permissions, then you may proceed with the installation. If not, please see Configuring roles, role bindings, and service accounts for details on how an administrator can manually create these objects before performing the installation with Helm as described below.
Permissions required to install, upgrade, and administer the chart
Installing, upgrading, and administering Deephaven — through helm, kubectl, and the bundled admin scripts (dh_helm, setupTools/scaleAll.sh, restartAll.sh) — creates and manages a broad set of Kubernetes objects. These operations run with the credentials of whoever runs the command, not the chart's ServiceAccounts.
Tip
The simplest approach is to perform these operations as an identity with cluster-administrator rights (or, at minimum, administrator rights in the install namespace plus a small amount of cluster-scoped access). If your installing identity already has that, no further setup is needed, and you can skip the rest of this section.
If you must run as a least-privilege identity (for example, an automated CI/CD or GitOps service account), you have two options:
- Have a cluster administrator create a
ServiceAccount, grant it the permissions listed below, and run the installation and administration as thatServiceAccount. See Configuring roles, role bindings, and service accounts. - Grant the permissions listed below directly to your installing identity.
Detailed permissions for a least-privilege installer
The RBAC Roles created above grant the running Deephaven pods the access they need at runtime — for example, the dispatcher creating worker pods. They do not grant the permissions needed to install, upgrade, or administer the deployment. That installing identity is an interactive user in many environments, but a ServiceAccount (for example, an automated CI/CD or GitOps service account) in others.
Helm applies (and, on helm uninstall, removes) every object the chart renders using this identity. Therefore, it requires full management of the following resource types:
- the pre-install/upgrade hook
Job - the chart's own
ServiceAccounts,Roles, andRoleBindings - cluster-scoped
PersistentVolumes
The earlier kubectl auth can-i check for roles, role bindings, and service accounts only covers part of this list.
Namespaced resources (in the install namespace) — These need get, list, watch, create, update, patch, and delete:
| API group | Resources | Created / used by |
|---|---|---|
apps | deployments | Helm creates the infra Deployments (dis, las, envoy, webapi, etc.); scaleAll.sh scales them |
apps | statefulsets, statefulsets/scale | Helm creates the core-service StatefulSets (aclwriter, authserver, configuration-server, controller); scaleAll.sh scales them via kubectl scale |
"" | services | Helm creates all service objects |
"" | configmaps | Helm creates config maps (cluster config, envoy, worker templates, etc.) |
"" | secrets | Helm creates chart secrets; the manual TLS-secret step also creates one |
"" | persistentvolumeclaims | Helm creates PVCs; dh_helm gets/patches/deletes them |
"" | serviceaccounts | Helm creates the chart's service accounts |
"" | pods, pods/exec, pods/log | restartAll.sh deletes pods to recycle them; dh_helm waits on, execs into, and copies files to pods (also the NFS setup step) |
rbac.authorization.k8s.io | roles, rolebindings | Helm creates the chart's RBAC objects (runtime and hook) |
batch | jobs | Helm creates the pre-install/pre-upgrade hook Job |
cert-manager.io | certificates | Only when the cert-manager integration (certmgr.enabled) is used |
Cluster-scoped resources — These are not namespaced, so they require a ClusterRole:
| API group | Resources | Needed for |
|---|---|---|
"" | persistentvolumes | The chart creates PersistentVolumes for shared/system storage and the hook PVC (get, list, watch, create, update, patch, delete) |
"" | namespaces | Creating the install namespace, if the installer does it (create, get) |
In most clusters, this identity is a human administrator with broad (often cluster-admin) rights, so no extra setup is needed. For a least-privilege or ServiceAccount-based installer, the simplest complete grant is to bind the built-in admin ClusterRole within the namespace (a namespaced RoleBinding to admin covers every namespaced resource above), plus a small ClusterRole for the cluster-scoped persistentvolumes (and namespaces, if the installer creates it).
You can confirm the identity has what it needs with kubectl auth can-i. Each command should print "yes":
This full set belongs to the installing/administering identity. The chart's runtime ServiceAccount intentionally holds only a small, fixed slice of it (for example, a limited statefulsets/statefulsets/scale grant reserved for potential in-cluster use). We do not recommend extending the runtime ServiceAccount with the broader create/delete permissions above to work around an under-privileged installer.
Install the Deephaven Helm chart
You can now configure deployment settings in the Deephaven Helm chart. An example configuration YAML file is shown here, with comments providing more details. You can save this as something like deephaven-override-values.yaml, and its values will override the defaults defined in the chart.
Note
The Deephaven installation includes a
LoadBalancer service (Envoy)
that is the entry point for the application. The Envoy load balancer might be assigned an external IP address by default,
and our Helm chart allows for setting cloud provider-specific annotations that can change IP address assignment to conform
to your environment. See the envoy.serviceAnnotations configurations in the override values YAML example below.
Override values YAML example
You can now install the Deephaven Helm chart using your override YAML file:
Note
Properties for a Helm chart are typically stored in one or more YAML files. If more than one is provided to the Helm command,
priority is given to the last (right-most) file specified with -f. Properties can also be provided with --set flags, and
those will take precedence over YAML settings.
The installation takes a couple of minutes. You can see progress by tailing the install job's log output with the command kubectl logs -f job/${DH_NAME}-pre-release-hook.
Create a DNS entry for the application
You need a DNS entry for the hostname referenced by the TLS certificate, using the external IP address of the Envoy service. How this is done varies with your Kubernetes provider and/or infrastructure. This example uses a Google Cloud Platform environment.
Set a password for the admin user
Run this command to use the Deephaven deployment’s management shell pod to run a command that sets up the user dh_admin with a password. In this example, the password is adminpw1, though you are encouraged to provide your own.
Set up resource monitoring and notifications
Each enterprise has a different way of setting up Kubernetes monitoring, metrics, and notifications using tools like Prometheus/Grafana, Datadog, or your cloud provider's offering, such as Cloud Monitoring in GKE. In a production Deephaven system, it is very important to set up notifications around persistent volume utilization so that action can be taken (e.g., expand storage, remove data) before a volume fills up, potentially stopping services and/or preventing data ingestion.
Caution
It is recommended that a warning-level alert is configured at 75% utilization of persistent volumes, and a critical-level alert is set for 90% utilization.
Log in
You can now access the application at a URL similar to https://yourhost.domain.com:8000/iriside, using the hostname that matches your webserver TLS certificate.
Autoscaling disruptions
Autoscaling solutions like Karpenter and Cluster Autoscaler add and remove nodes based on demand, and will also move pods between nodes to consolidate resources and drain a node so it can be removed. Since Deephaven pods are typically used continuously throughout their lifetimes, it is undesirable to allow an autoscaler to disrupt them to drain a node. Deephaven pods can be annotated to exempt them from autoscaler disruption. Check the details of your particular autoscaler for the required annotations, if it is not one of the options below.
Add the relevant annotation section to your values.yaml to mark Deephaven pods as protected from autoscaler disruption.
- Karpenter on Amazon EKS:
- Cluster Autoscaler on Azure AKS, or Google GKE Autopilot:
EKS specific information
Amazon Load Balancers
The default Amazon EKS setup uses the in-tree Kubernetes load balancer controller, which provisions Classic Load Balancers. The default Classic Load Balancer settings terminate connections after 60 seconds of inactivity. This results in Deephaven workers being killed when their controlling connection is closed. It is possible to manually configure the timeout, but Deephaven recommends installing the AWS Load Balancer Controller add-on, which uses a Network Load Balancer. Additionally, the AWS Load Balancer Controller supports annotations for configuring the service. The complete set of annotations that are suitable for your network is beyond the scope of this document (e.g., subnet and IP allocation), but the section below provides some recommendations for common configurations.
AWS NLB without Karpenter
The following annotations (specified in your Deephaven values.yaml file) instruct the controller to create a suitable Network Load Balancer:
AWS NLB with Karpenter
Karpenter provides autoscaling features for Kubernetes, deploying additional nodes when needed for new pod resources, and consolidating and removing nodes that are no longer needed. Karpenter interacts with the AWS NLB because the default instance target type routes NLB traffic through the ENIs (Elastic Network Interfaces) of cluster nodes. Karpenter is unaware of the NLB's use of the nodes, so it is possible that Karpenter will remove a node while the NLB is using it for a client session. There are two configuration options to address this:
- Use
iptarget type. This configures the load balancer to connect directly to target IPs, rather than routing through node ENIs.
- If
iptargets are not usable -- for example, if Cilium is in use, which is largely incompatible withiptargets -- then it will be necessary to configure the NLB to use labelled nodes that are known to be persistent in the cluster and not subject to sudden removal by Karpenter.
Manually configuring a Classic Load Balancer Timeout
When using a Classic Load Balancer, a manual workaround is to identify the AWS load balancer that the Kubernetes system allocated and increase the connection timeout using the AWS command-line tool.
To identify the load balancer, first run kubectl to find the external name of the load balancer:
In this example, the load balancer is identified by a89229d6c7c3a43fbba5728fb8216c64. The load balancer attributes can be queried with:
To adjust the connection idle setting to 900 seconds, run:
Minimal memory changes needed for EKS and AKS
When deploying to AKS (Azure) or EKS (Amazon Web Services), the default memory requests and limits for some services need to be modified. The settings are detailed in the troubleshooting guide.
Verifying Kubernetes API access
The Kubernetes HTTPS API must be accessible from within Pods of the Deephaven cluster. This is typically enabled by default, but could be blocked or disabled by DNS misconfiguration, network policies, or CNI configuration.
Access to the API can be checked by running this command from within any Pod that has curl available:
The result should be similar to this:
If the command times out or fails, Deephaven will not be able to run in this environment. Deephaven uses the Kubernetes API to set up the cluster during installation and upgrade, and also to create and manage Pods and PVCs for Deephaven Workers.