# Best Practices for Deploying INFINI Console in Kubernetes Environments Using Helm Charts

> Deploy INFINI Console in Kubernetes with Helm. Follow best practices: add Helm repo, use production StorageClass, enable agent metrics for full observability.

- Repository: [INFINI Labs/console](https://github.com/infinilabs/console)
- Tags: best-practices
- Published: 2026-03-04

---

**Deploy INFINI Console in Kubernetes by adding the official Helm repository at `https://helm.infinilabs.com`, installing into a dedicated namespace with a production-grade StorageClass, and enabling agent-based metrics via `metricsWithAgent: true` for complete observability.**

INFINI Console provides a Helm chart to streamline Kubernetes deployments, but production-grade installations require careful configuration of storage, security, and observability parameters. This guide covers essential practices for deploying the `infinilabs/console` repository in Kubernetes clusters using Helm, based on the official documentation and chart implementation.

## Repository Setup and Namespace Isolation

### Adding the Official Helm Repository

Before installation, register the INFINI Helm repository and update the local index. This ensures access to the latest chart versions and dependencies.

```bash
helm repo add infinilabs https://helm.infinilabs.com
helm repo update

```

According to the documentation in [`docs/content.en/docs/getting-started/helm.md`](https://github.com/infinilabs/console/blob/main/docs/content.en/docs/getting-started/helm.md), this step is required once per cluster to maintain version synchronization during future upgrades.

### Deploying to a Dedicated Namespace

Isolate Console resources by deploying into a specific namespace. This separation simplifies RBAC management, network policies, and resource quotas.

```bash
kubectl create namespace infinilabs
helm install console infinilabs/console -n infinilabs --create-namespace

```

The `--create-namespace` flag ensures idempotent installations, creating the namespace only if it does not exist.

## Storage Configuration for Production Workloads

### Overriding the Default StorageClass

The chart defaults to the `local-path` provisioner, which is unsuitable for production environments requiring high availability and data durability. Override this with a cloud-native or enterprise StorageClass.

Create a [`values.yaml`](https://github.com/infinilabs/console/blob/main/values.yaml) file:

```yaml
storageClassName: gp2  # Example: AWS EBS gp2; replace with your production class

persistence:
  enabled: true
  size: 20Gi

```

Install with the custom configuration:

```bash
helm install console infinilabs/console -n infinilabs -f values.yaml

```

As documented in [`docs/content.en/docs/getting-started/helm.md`](https://github.com/infinilabs/console/blob/main/docs/content.en/docs/getting-started/helm.md), the `storageClassName` parameter maps directly to the PersistentVolumeClaim specifications in the chart templates.

## Enabling Agent-Based Observability

### Configuring metricsWithAgent and metricsConfigServer

For comprehensive monitoring of internal metrics, enable the Agent sidecar which pushes telemetry directly to the Console service. This configuration is essential for utilizing features like the alerting rule metrics charts found in [`web/src/pages/Alerting/Rule/components/RuleMetricChart.jsx`](https://github.com/infinilabs/console/blob/main/web/src/pages/Alerting/Rule/components/RuleMetricChart.jsx).

Update [`values.yaml`](https://github.com/infinilabs/console/blob/main/values.yaml):

```yaml
metricsWithAgent: true
metricsConfigServer: "http://console:9000"

```

These values are processed by the chart's configuration templates, mapping to environment variables defined in `config/system_config.tpl` and the root [`console.yml`](https://github.com/infinilabs/console/blob/main/console.yml) file.

Deploy with the observability stack:

```bash
helm install console infinilabs/console -n infinilabs -f values.yaml

```

## Securing Easysearch with TLS and cert-manager

When deploying INFINI Console alongside Easysearch, TLS encryption is mandatory for secure node-to-node and client-to-cluster communication.

### Installing cert-manager

First, install cert-manager to automate certificate provisioning:

```bash
helm repo add jetstack https://charts.jetstack.io --force-update
helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.17.2 \
  --set crds.enabled=true \
  --set prometheus.enabled=false \
  --set webhook.timeoutSeconds=10

```

This installation procedure is detailed in [`docs/content.en/docs/getting-started/k8s-easysearch.md`](https://github.com/infinilabs/console/blob/main/docs/content.en/docs/getting-started/k8s-easysearch.md).

### Creating Certificates and Secrets

After cert-manager installation, apply a self-signed ClusterIssuer and Certificate resource to generate the Easysearch TLS secrets. Then create the Easysearch credentials secret:

```bash
kubectl create secret generic easysearch-secrets \
  --namespace infinilabs \
  --from-literal=ezs_password='YOUR_SECURE_PASSWORD'

```

Deploy Easysearch with TLS enabled:

```bash
helm install easysearch infinilabs/easysearch -n infinilabs \
  --set metricsWithAgent=true \
  --set metricsConfigServer="http://console:9000"

```

## Deployment Automation and Version Management

### Pinning Chart Versions

For reproducible deployments across development, staging, and production environments, always pin the chart version:

```bash
helm install console infinilabs/console \
  --version 1.5.2 \
  -n infinilabs \
  -f values.yaml

```

Version pinning prevents unexpected breaking changes during `helm upgrade` operations and ensures consistent infrastructure-as-code practices.

### Performing Rolling Upgrades

When modifying configuration parameters such as enabling `metricsWithAgent` or changing resource limits, use `helm upgrade` to apply changes without service interruption:

```bash
helm upgrade console infinilabs/console -n infinilabs -f values.yaml

```

The chart's StatefulSet configuration ensures rolling updates preserve data stored in persistent volume claims, as documented in the upgrade workflows within [`docs/content.en/docs/getting-started/helm.md`](https://github.com/infinilabs/console/blob/main/docs/content.en/docs/getting-started/helm.md).

## Cleanup and Maintenance Procedures

### Uninstalling and PVC Management

Helm preserves persistent volume claims by default to prevent accidental data loss. When decommissioning a test environment, manually remove the associated PVCs:

```bash
helm uninstall console -n infinilabs
kubectl delete pvc console-data-console-0 console-config-console-0 -n infinilabs

```

If you deployed the Easysearch dependency, delete its PVCs separately as shown in [`docs/content.en/docs/getting-started/k8s-easysearch.md`](https://github.com/infinilabs/console/blob/main/docs/content.en/docs/getting-started/k8s-easysearch.md).

## Summary

- **Add the official repository** at `https://helm.infinilabs.com` and update the local index before installation.
- **Isolate deployments** using dedicated namespaces and configure a production-grade **StorageClass** instead of the default `local-path` provisioner.
- **Enable agent-based metrics** by setting `metricsWithAgent: true` and `metricsConfigServer` for comprehensive observability.
- **Secure Easysearch** deployments with **cert-manager** and TLS certificates, storing credentials in Kubernetes secrets.
- **Pin chart versions** for reproducible infrastructure and use `helm upgrade` for zero-downtime configuration changes.
- **Manage PVC lifecycle** manually when uninstalling to control data retention or cleanup.

## Frequently Asked Questions

### What is the default storage class used by the INFINI Console Helm chart?

The chart defaults to the **`local-path`** provisioner, which is suitable for single-node testing but inadequate for production workloads. Override this by specifying a cloud-native StorageClass such as AWS EBS `gp2` or `gp3`, Azure Disk, or a Ceph-backed class in your custom [`values.yaml`](https://github.com/infinilabs/console/blob/main/values.yaml) file under the `storageClassName` key.

### How do I enable metric collection when deploying INFINI Console in Kubernetes?

Set **`metricsWithAgent: true`** and **`metricsConfigServer: "http://console:9000"`** in your [`values.yaml`](https://github.com/infinilabs/console/blob/main/values.yaml) configuration. These parameters deploy an Agent sidecar that pushes internal metrics directly to the Console service, enabling features like the alerting rule metrics charts. This configuration maps to environment variables defined in `config/system_config.tpl` and the root [`console.yml`](https://github.com/infinilabs/console/blob/main/console.yml) file.

### Can I deploy INFINI Console and Easysearch together using Helm?

Yes, deploy Console first with agent metrics enabled, then install the Easysearch chart with matching `metricsWithAgent` and `metricsConfigServer` values. For secure communication, install **cert-manager** first and create TLS certificates for Easysearch nodes. Store the Easysearch admin password in a Kubernetes secret named `easysearch-secrets` before deploying the Easysearch chart.

### How do I upgrade my INFINI Console Helm deployment without data loss?

Use **`helm upgrade`** with your updated [`values.yaml`](https://github.com/infinilabs/console/blob/main/values.yaml) file to apply configuration changes. The chart uses a StatefulSet with persistent volume claims that survive pod restarts and rolling updates. Always pin the chart version using `--version` to ensure reproducible upgrades, and verify that your StorageClass supports volume expansion if you need to increase disk size later.