Back to Kubeshark

Helm Chart of Kubeshark

helm-chart/README.md

72.3.8362.3 KB
Original Source

Helm Chart of Kubeshark

Official

Add the Helm repo for Kubeshark:

shell
helm repo add kubeshark https://helm.kubeshark.com

then install Kubeshark:

shell
helm install kubeshark kubeshark/kubeshark

Local

Clone the repo:

shell
git clone [email protected]:kubeshark/kubeshark.git --depth 1
cd kubeshark/helm-chart

In case you want to clone a specific tag of the repo (e.g. v52.3.59):

shell
git clone [email protected]:kubeshark/kubeshark.git --depth 1 --branch <tag>
cd kubeshark/helm-chart

See the list of available tags here: https://github.com/kubeshark/kubeshark/tags

Render the templates

shell
helm template .

Install Kubeshark:

shell
helm install kubeshark .

Uninstall Kubeshark:

shell
helm uninstall kubeshark

Port-forward

Do the port forwarding:

shell
kubectl port-forward service/kubeshark-front 8899:80

Visit localhost:8899

You can also use kubeshark proxy for a more stable port-forward connection.

Add a License Key

When it's necessary, you can use:

shell
--set license=YOUR_LICENSE_GOES_HERE

Get your license from Kubeshark's Admin Console.

Installing with Ingress (EKS) enabled

shell
helm install kubeshark kubeshark/kubeshark -f values.yaml

Set this value.yaml:

shell
tap:
  ingress:
    enabled: true
    className: "alb"
    host: ks.example.com
    tls: []
    annotations:
      alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-1:7..8:certificate/b...65c
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/scheme: internet-facing

Disabling IPV6

Not all have IPV6 enabled, hence this has to be disabled as follows:

shell
helm install kubeshark kubeshark/kubeshark \
  --set tap.ipv6=false

Prometheus Metrics

Please refer to metrics documentation for details.

Override Tag, Tags, Images

In addition to using a private registry, you can further override the images' tag, specific image tags and specific image names.

Example for overriding image names:

yaml
  docker:
    overrideImage:
      worker: docker.io/kubeshark/worker:v52.3.87
      front:  docker.io/kubeshark/front:v52.3.87
      hub:    docker.io/kubeshark/hub:v52.3.87

Configuration

ParameterDescriptionDefault
tap.docker.registryDocker registry to pull fromdocker.io/kubeshark
tap.docker.tagTag of the Docker imageslatest
tap.docker.tagLockedLock the Docker image tags to prevent automatic upgrades to the latest branch image version.true
tap.docker.tagLockedIf false - use latest minor tagtrue
tap.docker.imagePullPolicyKubernetes image pull policyAlways
tap.docker.imagePullSecretsKubernetes secrets to pull the images[]
tap.docker.overrideImageCan be used to directly override image names""
tap.docker.overrideTagCan be used to override image tags""
tap.proxy.hub.srvPortHub server port. Change if already occupied.8898
tap.proxy.worker.srvPortWorker server port. Change if already occupied.48999
tap.proxy.front.portFront service port. Change if already occupied.8899
tap.proxy.hostChange to 0.0.0.0 top open up to the world.127.0.0.1
tap.regexTarget (process traffic from) pods that match regex.*
tap.namespacesTarget pods in namespaces[]
tap.excludedNamespacesExclude pods in namespaces[]
tap.bpfOverrideWhen using AF_PACKET as a traffic capture backend, override any existing pod targeting rules and set explicit BPF expression (e.g. net 0.0.0.0/0).[]
tap.capture.dissection.enabledSet to true to have L7 protocol dissection start automatically. When set to false, dissection is disabled by default. This property can be dynamically controlled via the dashboard.true
tap.capture.dissection.stopAfterSet to a duration (e.g. 30s) to have L7 dissection stop after no activity.5m
tap.capture.raw.enabledEnable raw capture of packets and syscalls to disk for offline analysistrue
tap.capture.raw.storageSizeMaximum storage size for raw capture files (supports K8s quantity format: 1Gi, 500Mi, etc.)1Gi
tap.capture.captureSelfInclude Kubeshark's own traffic in capturefalse
tap.capture.dbMaxSizeMaximum size for capture database (e.g., 4Gi, 2000Mi).500Mi
tap.snapshots.local.storageClassStorage class for local snapshots volume. When empty, uses emptyDir. When set, creates a PVC with this storage class""
tap.snapshots.local.storageSizeStorage size for local snapshots volume (supports K8s quantity format: 1Gi, 500Mi, etc.)20Gi
tap.snapshots.cloud.providerCloud storage provider for snapshots: s3, azblob, or gcs. Empty string disables cloud storage. See Cloud Storage docs.""
tap.snapshots.cloud.prefixKey prefix in the bucket/container (e.g. snapshots/). See Cloud Storage docs.""
tap.snapshots.cloud.configMapsNames of pre-existing ConfigMaps with cloud storage env vars. Alternative to inline s3/azblob/gcs values below. See Cloud Storage docs.[]
tap.snapshots.cloud.secretsNames of pre-existing Secrets with cloud storage credentials. Alternative to inline s3/azblob/gcs values below. See Cloud Storage docs.[]
tap.snapshots.cloud.s3.bucketS3 bucket name. When set, the chart auto-creates a ConfigMap with SNAPSHOT_AWS_BUCKET.""
tap.snapshots.cloud.s3.regionAWS region for the S3 bucket.""
tap.snapshots.cloud.s3.accessKeyAWS access key ID. When set, the chart auto-creates a Secret with SNAPSHOT_AWS_ACCESS_KEY.""
tap.snapshots.cloud.s3.secretKeyAWS secret access key. When set, the chart auto-creates a Secret with SNAPSHOT_AWS_SECRET_KEY.""
tap.snapshots.cloud.s3.roleArnIAM role ARN to assume via STS for cross-account S3 access.""
tap.snapshots.cloud.s3.externalIdExternal ID for the STS AssumeRole call.""
tap.snapshots.cloud.azblob.storageAccountAzure storage account name. When set, the chart auto-creates a ConfigMap with SNAPSHOT_AZBLOB_STORAGE_ACCOUNT.""
tap.snapshots.cloud.azblob.containerAzure blob container name.""
tap.snapshots.cloud.azblob.storageKeyAzure storage account access key. When set, the chart auto-creates a Secret with SNAPSHOT_AZBLOB_STORAGE_KEY.""
tap.snapshots.cloud.gcs.bucketGCS bucket name. When set, the chart auto-creates a ConfigMap with SNAPSHOT_GCS_BUCKET.""
tap.snapshots.cloud.gcs.projectGCP project ID.""
tap.snapshots.cloud.gcs.credentialsJsonService account JSON key. When set, the chart auto-creates a Secret with SNAPSHOT_GCS_CREDENTIALS_JSON.""
tap.delayedDissection.cpuCPU allocation for delayed dissection jobs1
tap.delayedDissection.memoryMemory allocation for delayed dissection jobs4Gi
tap.release.repoURL of the Helm chart repositoryhttps://helm.kubeshark.com
tap.release.nameHelm release namekubeshark
tap.release.namespaceHelm release namespacedefault
tap.persistentStorageUse persistentVolumeClaim instead of emptyDirfalse
tap.persistentStorageStaticUse static persistent volume provisioning (explicitly defined PersistentVolume )false
tap.persistentStoragePvcVolumeModeSet the pvc volume mode (Filesystem|Block)Filesystem
tap.efsFileSytemIdAndPathEFS file system ID and, optionally, subpath and/or access point <FileSystemId>:<Path>:<AccessPointId>""
tap.storageLimitLimit of either the emptyDir or persistentVolumeClaim10Gi
tap.storageClassStorage class of the PersistentVolumeClaimstandard
tap.dryRunPreview of all pods matching the regex, without tapping themfalse
tap.dns.nameserversNameservers to use for DNS resolution[]
tap.dns.searchesSearch domains to use for DNS resolution[]
tap.dns.optionsDNS options to use for DNS resolution[]
tap.resources.hub.limits.cpuCPU limit for hub"" (no limit)
tap.resources.hub.limits.memoryMemory limit for hub5Gi
tap.resources.hub.requests.cpuCPU request for hub50m
tap.resources.hub.requests.memoryMemory request for hub50Mi
tap.resources.sniffer.limits.cpuCPU limit for sniffer"" (no limit)
tap.resources.sniffer.limits.memoryMemory limit for sniffer5Gi
tap.resources.sniffer.requests.cpuCPU request for sniffer50m
tap.resources.sniffer.requests.memoryMemory request for sniffer50Mi
tap.resources.tracer.limits.cpuCPU limit for tracer"" (no limit)
tap.resources.tracer.limits.memoryMemory limit for tracer5Gi
tap.resources.tracer.requests.cpuCPU request for tracer50m
tap.resources.tracer.requests.memoryMemory request for tracer50Mi
tap.probes.hub.initialDelaySecondsInitial delay before probing the hub5
tap.probes.hub.periodSecondsPeriod between probes for the hub5
tap.probes.hub.successThresholdNumber of successful probes before considering the hub healthy1
tap.probes.hub.failureThresholdNumber of failed probes before considering the hub unhealthy3
tap.probes.sniffer.initialDelaySecondsInitial delay before probing the sniffer5
tap.probes.sniffer.periodSecondsPeriod between probes for the sniffer5
tap.probes.sniffer.successThresholdNumber of successful probes before considering the sniffer healthy1
tap.probes.sniffer.failureThresholdNumber of failed probes before considering the sniffer unhealthy3
tap.serviceMeshCapture traffic from service meshes like Istio, Linkerd, Consul, etc.true
tap.tlsCapture the encrypted/TLS traffic from cryptography libraries like OpenSSLtrue
tap.disableTlsLogSuppress logging for TLS/eBPFtrue
tap.labelsKubernetes labels to apply to all Kubeshark resources{}
tap.annotationsKubernetes annotations to apply to all Kubeshark resources{}
tap.nodeSelectorTerms.workersNode selector terms for workers components[{"matchExpressions":[{"key":"kubernetes.io/os","operator":"In","values":["linux"]}]}]
tap.nodeSelectorTerms.hubNode selector terms for hub component[{"matchExpressions":[{"key":"kubernetes.io/os","operator":"In","values":["linux"]}]}]
tap.nodeSelectorTerms.frontNode selector terms for front-end component[{"matchExpressions":[{"key":"kubernetes.io/os","operator":"In","values":["linux"]}]}]
tap.priorityClassPriority class name for Kubeshark components""
tap.tolerations.workersTolerations for workers components[ {"operator": "Exists", "effect": "NoExecute"}
tap.tolerations.hubTolerations for hub component[]
tap.tolerations.frontTolerations for front-end component[]
tap.auth.enabledEnable authenticationfalse
tap.auth.typeAuthentication type (1 option available: saml)saml
tap.auth.approvedEmailsList of approved email addresses for authentication[]
tap.auth.approvedDomainsList of approved email domains for authentication[]
tap.auth.saml.idpMetadataUrlSAML IDP metadata URL
(effective, if tap.auth.type = saml)``
tap.auth.saml.x509crtA self-signed X.509 .cert contents
(effective, if tap.auth.type = saml)``
tap.auth.saml.x509keyA self-signed X.509 .key contents
(effective, if tap.auth.type = saml)``
tap.auth.saml.roleAttributeA SAML attribute name corresponding to user's authorization role
(effective, if tap.auth.type = saml)role
tap.auth.saml.rolesA list of SAML authorization roles and their permissions
(effective, if tap.auth.type = saml){"admin":{"canDownloadPCAP":true,"canUpdateTargetedPods":true,"canUseScripting":true, "scriptingPermissions":{"canSave":true, "canActivate":true, "canDelete":true}, "canStopTrafficCapturing":true, "canControlDissection":true, "filter":"","showAdminConsoleLink":true}}
tap.ingress.enabledEnable Ingressfalse
tap.ingress.classNameIngress class name""
tap.ingress.hostHost of the Ingressks.svc.cluster.local
tap.ingress.tlsIngress TLS configuration[]
tap.ingress.annotationsIngress annotations{}
tap.routing.front.basePathSet this value to serve front under specific base path. Example: /custompath (forward slash must be present)""
tap.ipv6Enable IPv6 support for the front-endtrue
tap.debugEnable debug modefalse
tap.telemetry.enabledEnable anonymous usage statistics collectiontrue
tap.resourceGuard.enabledEnable resource guard worker process, which watches RAM/disk usage and enables/disables traffic capture based on available resourcesfalse
tap.secretsList of secrets to be used as source for environment variables (e.g. kubeshark-license)[]
tap.sentry.enabledEnable sending of error logs to Sentryfalse
tap.sentry.environmentSentry environment to label error logs withproduction
tap.defaultFilterSets the default dashboard KFL filter (e.g. http). By default, this value is set to filter out noisy protocols such as DNS, UDP, ICMP and TCP. The user can easily change this, temporarily, in the Dashboard. For a permanent change, you should change this value in the values.yaml or config.yaml file.""
tap.globalFilterPrepends to any KFL filter and can be used to limit what is visible in the dashboard. For example, redact("request.headers.Authorization") will redact the appropriate field. Another example !dns will not show any DNS traffic.""
tap.metrics.portPod port used to expose Prometheus metrics49100
tap.enabledDissectorsThis is an array of strings representing the list of supported protocols. Remove or comment out redundant protocols (e.g., dns).The default list excludes: udp and tcp
tap.mountBpfBPF filesystem needs to be mounted for eBPF to work properly. This helm value determines whether Kubeshark will attempt to mount the filesystem. This option is not required if filesystem is already mounts. │ true
tap.hostNetworkEnable host network mode for worker DaemonSet pods. When enabled, worker pods use the host's network namespace for direct network access.true
tap.packetCapturePacket capture backend: best, af_packet, or pf_ringbest
tap.misc.trafficSampleRatePercentage of traffic to process (0-100)100
tap.misc.tcpStreamChannelTimeoutMsTimeout in milliseconds for TCP stream channel10000
tap.gitops.enabledEnable GitOps functionality. This will allow you to use GitOps to manage your Kubeshark configuration.false
tap.misc.tcpFlowTimeoutTCP flow aggregation timeout in seconds. Controls how long the worker waits before finalizing a TCP flow.1200
tap.misc.udpFlowTimeoutUDP flow aggregation timeout in seconds. Controls how long the worker waits before finalizing a UDP flow.1200
logs.fileLogs dump path""
pcapdump.enabledEnable recording of all traffic captured according to other parameters. Whatever Kubeshark captures, considering pod targeting rules, will be stored in pcap files ready to be viewed by toolsfalse
pcapdump.maxTimeThe time window into the past that will be stored. Older traffic will be discarded.2h
pcapdump.maxSizeThe maximum storage size the PCAP files will consume. Old files that cause to surpass storage consumption will get discarded.500MB
kube.configPathPath to the kubeconfig file ($HOME/.kube/config)""
kube.contextKubernetes context to use for the deployment""
dumpLogsEnable dumping of logsfalse
headlessEnable running in headless modefalse
licenseLicense key for the Pro/Enterprise edition""
scripting.enabledEnables scriptingfalse
scripting.envEnvironment variables for the scripting{}
scripting.sourceSource directory of the scripts""
scripting.watchScriptsEnable watch mode for the scripts in source directorytrue
timezoneIANA time zone applied to time shown in the front-end"" (local time zone applies)
supportChatEnabledEnable real-time support chat channel based on Intercomfalse
internetConnectivityTurns off API requests that are dependent on Internet connectivity such as telemetry and online-support.true

Installing with SAML enabled

Prerequisites:

1. Generate X.509 certificate & key (TL;DR: https://ubuntu.com/server/docs/security-certificates)

Example:

openssl genrsa -out mykey.key 2048
openssl req -new -key mykey.key -out mycsr.csr
openssl x509 -signkey mykey.key -in mycsr.csr -req -days 365 -out mycert.crt

What you get:

  • mycert.crt - use it for tap.auth.saml.x509crt
  • mykey.key - use it for tap.auth.saml.x509crt
2. Prepare your SAML IDP

You should set up the required SAML IDP (Google, Auth0, your custom IDP, etc.)

During setup, an IDP provider will typically request to enter:

  • Metadata URL
  • ACS URL (Assertion Consumer Service URL, aka Callback URL)
  • SLO URL (Single Logout URL)

Correspondingly, you will enter these (if you run the most default Kubeshark setup):

Otherwise, if you have tap.ingress.enabled == true, change protocol & domain respectively - showing example domain:

shell
helm install kubeshark kubeshark/kubeshark -f values.yaml

Set this value.yaml:

shell
tap:
  auth:
    enabled: true
    type: saml
    saml:
      idpMetadataUrl: "https://ti..th0.com/samlp/metadata/MpWiDCM..qdnDG"
      x509crt: |
        -----BEGIN CERTIFICATE-----
        MIIDlTCCAn0CFFRUzMh+dZvp+FvWd4gRaiBVN8EvMA0GCSqGSIb3DQEBCwUAMIGG
        MSQwIgYJKoZIhvcNAQkBFhV3ZWJtYXN0ZXJAZXhhbXBsZS5jb20wHhcNMjMxMjI4
        ........<redacted: please, generate your own X.509 cert>........
        ZMzM7YscqZwoVhTOhrD4/5nIfOD/hTWG/MBe2Um1V1IYF8aVEllotTKTgsF6ZblA
        miCOgl6lIlZy
        -----END CERTIFICATE-----
      x509key: |
        -----BEGIN PRIVATE KEY-----
        MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDlgDFKsRHj+mok
        euOF0IpwToOEpQGtafB75ytv3psD/tQAzEIug+rkDriVvsfcvafj0qcaTeYvnCoz
        ........<redacted: please, generate your own X.509 key>.........
        sUpBCu0E3nRJM/QB2ui5KhNR7uvPSL+kSsaEq19/mXqsL+mRi9aqy2wMEvUSU/kt
        UaV5sbRtTzYLxpOSQyi8CEFA+A==
        -----END PRIVATE KEY-----

Installing with Dex OIDC authentication

Click here to see full docs.

Choose this option, if you already have a running instance of Dex in your cluster & you want to set up Dex OIDC authentication for Kubeshark users.

Kubeshark supports authentication using Dex - A Federated OpenID Connect Provider. Dex is an abstraction layer designed for integrating a wide variety of Identity Providers.

Requirement: Your Dex IdP must have a publicly accessible URL.

Pre-requisites:

1. If you configured Ingress for Kubeshark:

(see section: "Installing with Ingress (EKS) enabled")

OAuth2 callback URL is:

https://<kubeshark-ingress-hostname>/api/oauth2/callback

2. If you did not configure Ingress for Kubeshark:

OAuth2 callback URL is:

http://0.0.0.0:8899/api/oauth2/callback

Use chosen OAuth2 callback URL to replace <your-kubeshark-host> in Step 3.

3. Add this static client to your Dex IdP configuration (config.yaml):

yaml
staticClients:
   - id: kubeshark
     secret: create your own client password
     name: Kubeshark
     redirectURIs:
     - https://<your-kubeshark-host>/api/oauth2/callback

Final step:

Add these helm values to set up OIDC authentication powered by your Dex IdP:

yaml
# values.yaml

tap:
  auth:
    enabled: true
    type: dex
    dexOidc:
      issuer: <put Dex IdP issuer URL here>
      clientId: kubeshark
      clientSecret: create your own client password
      refreshTokenLifetime: "3960h" # 165 days
      oauth2StateParamExpiry: "10m"
      bypassSslCaCheck: false

Note:

Set tap.auth.dexOidc.bypassSslCaCheck: true to allow Kubeshark communication with Dex IdP having an unknown SSL Certificate Authority.

This setting allows you to prevent such SSL CA-related errors:

tls: failed to verify certificate: x509: certificate signed by unknown authority


Once you run helm install kubeshark kubeshark/kubeshark -f ./values.yaml, Kubeshark will be installed with (Dex) OIDC authentication enabled.


Installing your own Dex IdP along with Kubeshark

Choose this option, if you need to deploy an instance of Dex IdP along with Kubeshark & set up Dex OIDC authentication for Kubeshark users.

Depending on Ingress enabled/disabled, your Dex configuration might differ.

Requirement: Please, configure Ingress using tap.ingress for your Kubeshark installation. For example:

yaml
tap:
  ingress:
    enabled: true
    className: "alb"
    host: ks.example.com
    tls: []
    annotations:
      alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-1:7..8:certificate/b...65c
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/scheme: internet-facing

The following Dex settings will have these values:

SettingValue
tap.auth.dexOidc.issuerhttps://ks.example.com/dex
tap.auth.dexConfig.issuerhttps://ks.example.com/dex
tap.auth.dexConfig.staticClients -> redirectURIshttps://ks.example.com/api/oauth2/callback
tap.auth.dexConfig.connectors -> config.redirectURIhttps://ks.example.com/dex/callback

Before proceeding with Dex IdP installation:

Please, make sure to prepare the following things first.

  1. Choose Connectors to enable in Dex IdP.
    • i.e. how many kind of "Log in with ..." options you'd like to offer your users
    • You will need to specify connectors in tap.auth.dexConfig.connectors
  2. Choose type of Storage to use in Dex IdP.
    • You will need to specify storage settings in tap.auth.dexConfig.storage
    • default: memory
  3. Decide on the OAuth2 ?state= param expiration time:
    • field: tap.auth.dexOidc.oauth2StateParamExpiry
    • default: 10m (10 minutes)
    • valid time units are s, m, h
  4. Decide on the refresh token expiration:
    • field 1: tap.auth.dexOidc.expiry.refreshTokenLifetime
    • field 2: tap.auth.dexConfig.expiry.refreshTokens.absoluteLifetime
    • default: 3960h (165 days)
    • valid time units are s, m, h
  5. Create a unique & secure password to set in these fields:
    • field 1: tap.auth.dexOidc.clientSecret
    • field 2: tap.auth.dexConfig.staticClients -> secret
    • password must be the same for these 2 fields
  6. Discover more possibilities of Dex Configuration
    • if you decide to include more configuration options, make sure to add them into tap.auth.dexConfig

Once you are ready with all the points described above:

Use these helm values.yaml fields to:

  • Deploy your own instance of Dex IdP along with Kubeshark
  • Enable OIDC authentication for Kubeshark users

Make sure to:

  • Replace <your-ingress-hostname> with a correct Kubeshark Ingress host (tap.auth.ingress.host).
    • refer to section Installing with Ingress (EKS) enabled to find out how you can configure Ingress host.

Helm values.yaml:

yaml
tap:
  auth:
    enabled: true
    type: dex
    dexOidc:
      issuer: https://<your-ingress-hostname>/dex

      # Client ID/secret must be taken from `tap.auth.dexConfig.staticClients -> id/secret`
      clientId: kubeshark
      clientSecret: create your own client password

      refreshTokenLifetime: "3960h" # 165 days
      oauth2StateParamExpiry: "10m"
      bypassSslCaCheck: false
    dexConfig:
      # This field is REQUIRED!
      #
      # The base path of Dex and the external name of the OpenID Connect service.
      # This is the canonical URL that all clients MUST use to refer to Dex. If a
      # path is provided, Dex's HTTP service will listen at a non-root URL.
      issuer: https://<your-ingress-hostname>/dex

      # Expiration configuration for tokens, signing keys, etc.
      expiry:
        refreshTokens:
          validIfNotUsedFor: "2160h" # 90 days
          absoluteLifetime: "3960h"  # 165 days

      # This field is REQUIRED!
      #
      # The storage configuration determines where Dex stores its state.
      # See the documentation (https://dexidp.io/docs/storage/) for further information.
      storage:
        type: memory

      # This field is REQUIRED!
      #
      # Attention:
      # Do not change this field and its values.
      # This field is required for internal Kubeshark-to-Dex communication.
      #
      # HTTP service configuration
      web:
        http: 0.0.0.0:5556

      # This field is REQUIRED!
      #
      # Attention:
      # Do not change this field and its values.
      # This field is required for internal Kubeshark-to-Dex communication.
      #
      # Telemetry configuration
      telemetry:
        http: 0.0.0.0:5558

      # This field is REQUIRED!
      #
      # Static clients registered in Dex by default.
      staticClients:
        - id: kubeshark
          secret: create your own client password
          name: Kubeshark
          redirectURIs:
          - https://<your-ingress-hostname>/api/oauth2/callback

      # Enable the password database.
      # It's a "virtual" connector (identity provider) that stores
      # login credentials in Dex's store.
      enablePasswordDB: true

      # Connectors are used to authenticate users against upstream identity providers.
      # See the documentation (https://dexidp.io/docs/connectors/) for further information.
      #
      # Attention:
      # When you define a new connector, `config.redirectURI` must be:
      # https://<your-ingress-hostname>/dex/callback
      #
      # Example with Google connector:
      # connectors:
      #  - type: google
      #    id: google
      #    name: Google
      #    config:
      #      clientID: your Google Cloud Auth app client ID
      #      clientSecret: your Google Auth app client ID
      #      redirectURI: https://<your-ingress-hostname>/dex/callback
      connectors: []