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.

You can find lookerPubDomain in your DNS settings and the Looker license key from Harness support team

    global:
ngcustomdashboard:
enabled: true
ng-custom-dashboards:
config:
lookerPubDomain: 'looker.domain.tld'
looker:
secrets:
lookerLicenseKey: XXXXXXXXXXXXXXXXXXXX

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
ngcustomdashboard:
enabled: true

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

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

secrets:
lookerLicenseKey: XXXXXXXXXXXXXXXXXXXX

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
ngcustomdashboard:
enabled: true
ng-custom-dashboards:
config:
lookerPubDomain: 'looker.domain.tld'
looker:
istio:
gateway:
create: false
virtualService:
enabled: true
hosts:
- looker.domain.tld
secrets:
lookerLicenseKey: XXXXXXXXXXXXXXXXXXXX

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:

global:
ngcustomdashboard:
enabled: true
ng-custom-dashboards:
config:
lookerPubDomain: 'looker.domain.tld'
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
secrets:
lookerLicenseKey: XXXXXXXXXXXXXXXXXXXX

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.
global.haboolfalseEnables High Availability mode for distributed deployments.
global.imagePullSecretslist[]List of Kubernetes secrets used to pull images from private registries.
global.ingress.classNamestring""Specifies the Ingress class to use (e.g., nginx).
global.ingress.enabledboolfalseEnables ingress for external access.
global.ingress.hostslist[]List of hostnames for the ingress configuration.
global.ingress.tls.enabledboolfalseEnables TLS termination at the ingress level.
global.ingress.tls.secretNamestring""Kubernetes secret name containing the TLS certificate.
global.istio.enabledboolfalseEnables Istio service mesh integration.
global.istio.gateway.createboolfalseCreates an Istio Gateway for external access.
global.istio.virtualService.gatewaysstringnilSpecifies Istio Gateway resources to attach to the VirtualService.
global.istio.virtualService.hostsstringnilDefines the hostnames for the Istio VirtualService.
global.loadbalancerURLstring""URL of the external Load Balancer, if applicable.

Looker Configuration

KeyTypeDefaultDescription
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.