Skip to main content

Custom Dashboards on Self-Managed Enterprise Edition

Prerequisites

info

To proceed with a custom dashboard, you may need a Looker license key. Reach out to Harness support for assistance

Dashboards application uses Looker, a third-party tool that needs its own domain name to work properly.

To set it up:

  1. Create a DNS CNAME entry for Looker.
  2. Use looker.your-domain.tld as the domain name.
  3. Point the Looker CNAME to the existing A record for your installation.

Configuration

To enable dashboards the following is the minimum configuration required.

Looker is required for custom dashboards but is not enabled by default. To enable this feature, you can find lookerPubDomain in your DNS settings and the Looker license key from Harness support team

  global:
# required if SMP is installed in airgapped mode
airgap: true
ngcustomdashboard:
enabled: true
ng-custom-dashboards:
config:
lookerPubDomain: 'looker.domain.tld'
looker:
secrets:
lookerLicenseKey: XXXXXXXXXXXXXXXXXXXX
# required if SMP is installed in airgapped mode
lookerLicenseFile: |
XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX

For Non-Air Gap Packages

Harness will provide an access token to pull the Looker image from Docker Hub, along with a Looker license key and Docker Hub credentials to update your override.yaml file. You must replace your Looker license after deployment.

Create a new secret and replace [YOUR-SECRET-NAME] in the YAML:

  looker:
# -- replace looker license at runtime (after deployment)
image:
imagePullSecrets: [YOUR-SECRET-NAME]

For more details, refer to documentation on pulling images from a private registry.

For Air Gap Packages

Harness no longer includes the Looker image in air gap bundles. You can still request onboarding for custom dashboards. Upon request, Harness will generate an access token for pulling the Looker image from Docker Hub. Following this, Harness will provide you with the Looker license key and Docker Hub credentials.

Harness has updated the harness-airgap-images.sh script in the Helm chart repository to support pushing the Looker image to a private registry. The script will prompt:

  • Whether you want to install custom dashboards (ng-dashboard).
  • Your Docker Hub credentials and image details.

To get DOCKERHUB_USERNAME and DOCKERHUB_PASSWORD, contact Harness Support. When asked for RELEASE_VERSION, enter the desired Helm chart version (e.g., 0.17.0). The script will then push the Looker image to your private repository.

Looker Ingress/Istio Configuration

Looker requires a dedicated domain name, which makes its Ingress/Istio configuration slightly different from other Harness charts.

Key considerations:

  • The examples provided include only the additional configuration required for this chart. Ensure to merge them with existing values.yaml overrides.
  • Pay close attention when merging the global sections to prevent conflicts.
  • All examples assume TLS is enabled. To ensure looker.domain.tld functions correctly, update TLS certificates to include this domain.
  • Alternatively, try to generate a separate certificate and reference it in the configuration.

Ingress

global:
ngcustomdashboard:
enabled: true

ng-custom-dashboards:
config:
lookerPubDomain: 'looker.domain.tld'

looker:
ingress:
hosts:
- 'looker.domain.tld'
tls:
secretName: 'looker-tls'

secrets:
lookerLicenseKey: XXXXXXXXXXXXXXXXXXXX

Istio Configuration Options

There are three ways to configure Istio for Looker:

  1. The Istio gateway is created and managed by you.
  2. The Istio gateway is automatically created by Harness at a global level.
  3. The Istio gateway is created specifically for this chart.

Using a Customer-Managed Istio Gateway

If you are managing your own Istio gateway, you will need to update your gateway configuration to route traffic for looker.domain.tld.

global:
istio:
virtualService:
gateways:
- istio-namespace/gateway-name
looker:
istio:
gateway:
create: false
virtualService:
enabled: true
hosts:
- looker.domain.tld

Istio - Gateway Created by Harness

If you are using the Istio gateway managed by Harness, you only need to add the Looker domain to the list of hosts in your existing global.istio configuration.

Example Configuration:

global:
istio:
gateway:
create: true
hosts:
- looker.domain.tld
looker:
istio:
gateway:
create: false
virtualService:
enabled: true
hosts:
- looker.domain.tld

Istio - Gateway Created by This Chart

If you prefer to configure the Istio gateway within this chart, you can define the settings in your values.yaml override.

Example Configuration:

looker:
istio:
gateway:
create: true
port: 443
protocol: HTTPS
hosts:
- looker.domain.tld
tls:
mode: SIMPLE
credentialName: 'looker-tls'
virtualService:
enabled: true
hosts:
- looker.domain.tld

By selecting the appropriate method, you can ensure seamless integration of Looker with your existing Istio setup.

Global Configuration

KeyTypeDefaultDescription
global.airgapstring"false"Indicates if the deployment is in an air-gapped environment with no internet access.

Looker Configuration

KeyTypeDefaultDescription
looker.secrets.lookerLicenseKeystring""Required. Defines looker license key.
looker.secrets.lookerLicenseFilestring""Defines looker license file (Required if harness is installed in air-gapped environment)
looker.affinityobject{}Defines node/pod affinity rules for scheduling.
looker.clickhouseSecrets.password.keystring"admin-password"Secret key used to retrieve the ClickHouse admin password.
looker.clickhouseSecrets.password.namestring"clickhouse"Name of the Kubernetes secret storing the ClickHouse password.
looker.config.clickhouseConnectionNamestring"smp-clickhouse"Connection name for ClickHouse used by Looker.
looker.config.clickhouseDatabasestring"ccm"Name of the ClickHouse database used for CCM.
looker.config.clickhouseHoststring"clickhouse"Hostname of the ClickHouse database instance.
looker.config.clickhousePortstring"8123"HTTP port for ClickHouse queries.
looker.config.clickhouseUserstring"default"Username for authenticating with ClickHouse.
looker.config.emailstring"harnessSupport@harness.io"Required. Email address for Looker admin user.
looker.config.firstNamestring"Harness"First name for the initial Looker admin user.
looker.config.lastNamestring"Support"Last name for the initial Looker admin user.
looker.config.projectNamestring"Harness"Name of the Looker project being created.
looker.config.timescaleDatabasestring"harness"Name of the TimescaleDB database used by Looker.
looker.ingress.hostslist[]Required if ingress is enabled. Specifies the DNS domain for Looker.
looker.persistentVolume.storage.databasestring"20Gi"Disk size allocated for Looker's internal database storage.
looker.persistentVolume.storage.modelsstring"2Gi"Disk size allocated for Looker model files.

NG Custom Dashboard Configuration

KeyTypeDefaultDescription
ng-custom-dashboards.config.lookerApiVersionstring"4.0"Looker API version for compatibility with SDK.
ng-custom-dashboards.config.lookerHoststring"hrns-looker-api"Internal hostname for Looker API.
ng-custom-dashboards.config.lookerPortstring"19999"Port number used by Looker API.
ng-custom-dashboards.config.lookerPubDomainstring""Required. Public domain where Looker is accessible.
ng-custom-dashboards.config.lookerTimeoutstring"120"Timeout (in seconds) for Looker API requests.
ng-custom-dashboards.config.redisHoststring"harness-redis-master"Redis instance hostname.
ng-custom-dashboards.config.redisPortstring"6379"Redis service port.
ng-custom-dashboards.config.redisSentinelstring"true"Indicates if Redis Sentinel mode is enabled.
ng-custom-dashboards.config.redisSentinelMasterNamestring"harness-redis"Name of the master node in Redis Sentinel mode.