Deploy an Insight Point to a Kubernetes cluster
An Insight Point is a lightweight agent that runs in your environment to securely connect Veza to internal data sources, relay webhooks, route Lifecycle Management actions, and support OAA custom integrations. Veza provides a Helm chart to deploy and manage an Insight Point on Kubernetes. Once deployed, the Insight Point can serve any integration that requires private network connectivity, including the Kubernetes integration for cluster RBAC discovery.
The Insight Point Helm chart accepts the following configuration parameters via --set flags. Typically only key is required. To pull from a different registry, such as a mirror or private registry, or your Veza tenant's own registry domain (a mirror hosted by Veza), set the image parameter to your image reference; see Pulling Insight Point images from your tenant domain for options and prerequisites.
key is your unique Insight Point registration key, generated in the Veza UI.
Create a key in Veza: Integrations > Insight Points > Create
Store this value securely as it cannot be recovered if lost
The Insight Point registration key can be referenced from a pre-existing Kubernetes Secret instead of being passed inline with --set key=<key>. This is useful when your values.yaml file is tracked in source control and cannot contain the registration key directly.
Create the Secret in the target namespace before installing the chart:
Install the chart using --set keySecret.name in place of --set key:
If the Secret stores the key under a field name other than the default key, set keySecret.path to the field name:
Only one of key or keySecret.name can be set. Providing both causes the install to fail.
If your Insight Point needs to trust custom Certificate Authorities (for example, when connecting through a corporate proxy with SSL inspection, or when the control plane uses certificates signed by a private CA), you can provide a custom CA bundle.
The CA bundle should be in PEM format and can contain multiple certificates.
Important: Do not use skipVerify=true in production. Instead, add your custom CA certificates using this feature. The skipVerify option should only be used for testing and development.
Create a file ca-values.yaml with the certificate contents:
Install or upgrade with:
To use an existing ConfigMap containing your CA bundle:
Note: The custom CA bundle is mounted to /etc/ssl/certs/ca-certificates.crt inside the container, which is the standard location for Go applications. This will replace the default system CA bundle, so ensure your custom bundle includes any default certificates you need to trust.
When using an HTTPS inspection proxy:
Set addr to your proxy's address if different from the Veza endpoint. This value overrides the default request authority.
Ensure your proxy can connect to your Veza deployment.
authority specifies the domain name to use for TLS certificate validation and is only required when addr points to a proxy instead of directly to Veza. Must be a specific domain (wildcards not supported).
You can inject additional environment variables into the Insight Point pod using the env parameter. This is required by integrations that read configuration from the pod environment, such as Active Directory with .
In your values.yaml:
Or using --set flags:
Some integrations require credential files to be present at specific paths on the Insight Point pod. The Helm chart does not support arbitrary volume mounts. The /tmp directory is available as an ephemeral volume inside the container and can be used to place credential files.
Use kubectl cp to copy files to a running pod:
Tags are custom key-value labels that help organize and categorize your Insight Point instances. For an overview of tags, their use cases, and requirements, see in the main Insight Point documentation.
Create or edit your values.yaml:
Then install:
The Insight Point Helm chart supports high availability (HA) deployment to ensure continuous operation and resilience against node failures or pod disruptions. By default, the chart deploys three replicas of the Insight Point. You can customize the HA settings based on your requirements.
For high availability, deploy multiple Insight Point replicas:
Single Instance: Use replicaCount: 1 for basic deployments
High Availability: Use replicaCount: 2 or higher for production environments
Recommended: replicaCount: 3 (default) provides good balance of availability and resource usage
When running multiple replicas, configure pod anti-affinity to distribute pods across nodes or availability zones:
Soft Anti-Affinity: Kubernetes will try to place pods on different nodes/zones but will allow co-location if necessary
Hard Anti-Affinity: Kubernetes will never place pods on the same node/zone, which may prevent scheduling if insufficient resources
Control the number of pods that can be disrupted simultaneously during maintenance:
The PodDisruptionBudget ensures that at least one Insight Point remains available during cluster updates, node maintenance, or voluntary pod evictions.
The webhook relay service allows the Insight Point to forward webhook requests to destinations in your private network. For an overview of webhook relay, when to use it, security considerations, and supported host formats, see in the main Insight Point documentation.
The following parameters configure webhook relay behavior:
Configure webhook relay when installing or upgrading the Insight Point:
Or when upgrading an existing deployment:
Create or edit a values.yaml file with webhook relay configuration:
Then install or upgrade with the values file:
To verify webhook relay is configured correctly:
Check the Helm values:
Check the pod environment variables:
If webhook relay is enabled but not working:
Verify the allowed hosts are in the correct format
Check that the destination is included in the allowed hosts list
Review the Insight Point logs for validation or connection errors:
Ensure the destination is actually reachable from the Insight Point's network
By default, the Helm chart creates a ClusterRole, ServiceAccount, and ClusterRoleBinding to enable the Insight Point to discover Kubernetes RBAC entities. The ClusterRole grants the following permissions:
When enableSecrets=true is set, the ClusterRole additionally grants list access to secrets across all namespaces.
Disabling RBAC resource creation: If your organization manages RBAC separately, set createClusterRole=false. When disabled, the chart skips all three RBAC resources — the ClusterRole, ClusterRoleBinding, and ServiceAccount. The pod will use the namespace default ServiceAccount. Create your own ServiceAccount, ClusterRole, and ClusterRoleBinding in the veza namespace before deploying.
The Insight Point can retrieve credentials from external secrets vault providers (such as Azure Key Vault) instead of requiring credentials to be passed directly. This is configured using the secretsVaultsConfig parameter or a reference to an existing Kubernetes secret.
If the secrets vault configuration already exists as a Kubernetes secret:
Only one of secretsVaultsConfig or secretsVaultsConfigSecretRef can be set.
The Helm chart supports standard Kubernetes scheduling parameters for controlling pod placement.
Constrain Insight Point pods to nodes with specific labels:
Allow pods to schedule on tainted nodes:
Control how pods are distributed across topology domains:
The Helm chart applies a pod-level that runs the Insight Point as the non-root nonroot user (UID/GID 1001) baked into the container image. The defaults are:
The defaults reproduce the chart's prior hard-coded settings. Existing deployments that do not override this value are unaffected
On OpenShift, assign UID/GID ranges per namespace and reject pods whose IDs fall outside the assigned range. The chart's default IDs (1001) are unlikely to be inside the range, so the pod is rejected at admission.
To let the platform assign IDs, override podSecurityContext and set the ID fields to null. The runAsNonRoot and seccompProfile assertions should be kept:
To omit the pod-level security context entirely and let the platform inject everything (including a default seccomp profile), set the value to null:
The Helm chart sets fixed resource requests and limits of 2 CPU cores and 4 GB RAM per pod. These values match the and cannot be overridden via Helm values. If your workload requires different resource allocation, contact Veza support.
Insight Point pods are configured to pull images on start, but a running pod keeps using the image it started with until it is restarted. The Helm chart includes a CronJob that periodically restarts the Insight Point to pull the latest image to keep it current with bug fixes and security patches.
This job is enabled by default and runs weekly (Sundays at 04:00 in the cluster timezone). The restart is graceful: pods are replaced one at a time, and Kubernetes waits for each replacement to become ready before continuing. In high-availability deployments (replicaCount greater than 1), the Insight Point remains available throughout the restart.
To change the schedule — for example, to refresh daily at 02:00 — set imageRefresh.schedule:
To disable the scheduled refresh entirely:
When enabled, the chart creates a Role, ServiceAccount, and RoleBinding scoped to the install namespace, granting permission to restart only the Insight Point's own workload. These are removed when the feature is disabled.
A Kubernetes Helm chart is a package format used to define, install, and upgrade applications in Kubernetes. Helm is often referred to as a package manager for Kubernetes. To install the chart, you will need:
System Resources: Ensure your Kubernetes cluster has sufficient resources to meet the (minimum: 2 CPU cores, 4 GB RAM per Insight Point pod).
Insight Point Key: You will need to generate a secret key for the Insight Point. To create one, go to Veza Integrations > Insight Point > Create.
Insight Point Version: Note the most recent Insight Point version from .
Customize Values and Install the Insight Point:
Use the helm install command to install the Insight Point into the Kubernetes cluster. Replace <NAME>, <VERSION>, <KEY>, and key with your specific values:
--namespace <NAMESPACE>: required if installing the Insight Point into a different namespace than the default.
OAuth2 client credentials provisioning is available on an Early Access basis. Contact Veza support to enable it for your organization.
Generate the OAuth2 provisioning values from the Veza Integrations > Insight Point > Create page. Create a Kubernetes Secret with the OAuth2 client credentials, then install the chart:
The chart sets AUTH_TYPE automatically when oauth2.enabled=true. Use --set-string for vezaVault.secretContent so Helm preserves the plain:<base64> value as a string.
vezaVault.secretContent appears in the Veza UI at creation time only, and you cannot retrieve it afterward. Include the plain: prefix, or the value fails to parse.
Rotating the client secret: Follow the standard flow at . After creating the new secret in the Veza UI, update the clientSecret key in the veza-ip-oauth2 Secret (kubectl edit secret veza-ip-oauth2 -n veza) and roll the deployment (kubectl rollout restart deployment/veza-insight-point -n veza), then delete the old secret from the UI.
keySecret.name is an alternative to key, referencing the registration key from a pre-existing Kubernetes Secret. See .skipVerify (TLS_INSECURE_SKIP_VERIFY) should only be set to true to disable certificate validation for testing/troubleshooting.
Use the custom CA bundle feature (above) to trust your proxy's CA certificate.
Access to the Kubernetes Cluster: Ensure you have the necessary permissions and access credentials to interact with the target Kubernetes cluster.
Helm Installed: Ensure Helm version 3.8 or greater is installed on your local machine. You can install Helm by following the official documentation: .
Your organization security policies must allow chart installation from the VEZA ECR public.ecr.aws/veza
--create-namespace: required if the namespace does not exist yet.
--set enableSecrets=true: optional field, required to enable Kubernetes Secrets extraction. Secrets are not extracted by default.
A Veza Insight Point Key must be provided. To do this, you can specify the value with the --set key=<registration-key> option when installing the chart.
Example:
Verify Installation:
Verify the status of the installation by running:
This command will return a list of Helm releases, including the Insight Point you just installed. Ensure the STATUS is "DEPLOYED."
Get Insight Point Logs:
If the Insight Point fails to initialize or can't connect to Veza, you can get more details by reviewing the container logs. You can retrieve this using the terminal:
Upgrade and Maintain:
Over time, you may need to upgrade the Insight Point to newer versions or adjust its configuration. Use the helm upgrade command to make these changes.
Standard upgrade:
Note that newer versions can introduce breaking changes (e.g., replacing Kubernetes resources with others), which can cause a brief unavailability of the Insight Point.
Uninstall the Insight Point:
If you need to uninstall the Insight Point, you can do so using the helm uninstall command:
key
Insight Point Registration key for connecting to Veza
""
--set key=abc123
keySecret.name
Reference to existing Kubernetes Secret containing the registration key
kubectl create secret generic my-ip-key \
--namespace veza \
--from-literal=key=<your-registration-key>helm install veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--namespace veza \
--create-namespace \
--set keySecret.name=my-ip-keykubectl create secret generic my-ip-key \
--namespace veza \
--from-literal=registration-key=<your-registration-key>
helm install veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--namespace veza \
--create-namespace \
--set keySecret.name=my-ip-key \
--set keySecret.path=registration-keycaBundle: |
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKZ...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKZ...
-----END CERTIFICATE-----helm install veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--namespace veza \
--create-namespace \
--set key=<your-registration-key> \
--values ca-values.yaml# Create ConfigMap from your CA certificate file
kubectl create configmap custom-ca-bundle \
--from-file=ca-certificates.crt=/path/to/your/ca-bundle.crt \
-n veza
# Reference in helm install
helm install veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--namespace veza \
--create-namespace \
--set key=<your-registration-key> \
--set caBundleConfigMapRef=custom-ca-bundleenv:
- name: KRB5_CONFIG
value: /tmp/krb5.conf
- name: KRB5CCNAME
value: /tmp/krb5cc_go
- name: LDAP_CERTIFICATE
value: /tmp/ldap_cert.pemhelm upgrade veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--namespace veza \
--reuse-values \
--set env[0].name=KRB5_CONFIG \
--set env[0].value=/tmp/krb5.conf \
--set env[1].name=KRB5CCNAME \
--set env[1].value=/tmp/krb5cc_go# Find the pod name
kubectl get pods -n veza -l app=veza-insight-point
# Copy the Kerberos configuration and LDAP certificate
kubectl cp krb5.conf veza/<pod-name>:/tmp/krb5.conf
kubectl cp ldap_cert.pem veza/<pod-name>:/tmp/ldap_cert.pem# Custom tags
tags:
environment: production
datacenter: us-west-1
team: platform-engineering
owner: ops-team@company.comhelm install veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
-f values.yaml \
--namespace vezahelm install veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--set key=<your-registration-key> \
--set tags.environment=production \
--set tags.datacenter=us-west-1 \
--set tags.team=platform-engineering \
--namespace vezahelm upgrade veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--reuse-values \
--set tags.environment=production \
--set tags.new_key=new_value \
--namespace vezapodAntiAffinity.type
Anti-affinity enforcement
soft (preferred) or hard (required)
soft
podDisruptionBudget.enabled
Enable PodDisruptionBudget
true
podDisruptionBudget.minAvailable
Minimum pods that must remain available
webhookRelay.enabled
Enable the webhook relay service
false
--set webhookRelay.enabled=true
helm install veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--namespace <NAMESPACE> \
--set key=<KEY> \
--set webhookRelay.enabled=true \
--set webhookRelay.allowedHosts[0]="webhook.site" \
--set webhookRelay.allowedHosts[1]="*.example.com" \
--set webhookRelay.allowedHosts[2]="172.17.0.0/24"helm upgrade veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--namespace <NAMESPACE> \
--set webhookRelay.enabled=true \
--set webhookRelay.allowedHosts[0]="webhook.site" \
--set webhookRelay.allowedHosts[1]="*.example.com"key: "<your-insight-point-key>"
webhookRelay:
enabled: true
allowedHosts:
- "webhook.site"
- "*.example.com" # Wildcard domain
- "172.17.0.100" # IP address
- "10.0.0.0/8" # CIDR range
- "172.16.*" # Wildcard IPhelm install veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--namespace <NAMESPACE> \
--values values.yamlhelm get values veza-insight-point -n <NAMESPACE>kubectl get pods -n <NAMESPACE> -l app=veza-insight-point -o jsonpath='{.items[0].spec.containers[0].env}' | jqkubectl logs -l app=veza-insight-point -n <NAMESPACE>namespaces
""
list
Discover cluster namespaces
secretsVaultsConfig:
vaults:
- name: example-vault
vault_provider: azure_key_vault
auth_type: client_secret
auth_config:
vault_uri: https://my-vault.vault.azure.net
tenant_id: <tenant-id>
client_id: <client-id>
client_secret: <client-secret>helm install veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--namespace veza \
--create-namespace \
--set key=<your-registration-key> \
--set secretsVaultsConfigSecretRef=my-vault-configsecretsVaultsConfig
Inline YAML configuration for secrets vault providers
{}
secretsVaultsConfigSecretRef
Reference to an existing Kubernetes secret with vault config
nodeSelector:
disktype: ssd
node-role.kubernetes.io/compute: "true"tolerations:
- key: dedicated
operator: Equal
value: insight-point
effect: NoScheduletopologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: insight-pointpodSecurityContext:
fsGroup: 1001
runAsNonRoot: true
runAsUser: 1001
runAsGroup: 1001
seccompProfile:
type: RuntimeDefaultpodSecurityContext.fsGroup
Group ID applied to files in mounted volumes so the container process can write to them; matches the nonroot user in the image
1001
podSecurityContext.runAsNonRoot
Prevents the pod from running as root even if the image is misconfigured to do so
podSecurityContext:
fsGroup: null
runAsUser: null
runAsGroup: null
runAsNonRoot: true
seccompProfile:
type: RuntimeDefaultpodSecurityContext: nullimageRefresh.enabled
Enable the scheduled image refresh
true
imageRefresh.schedule
Cron schedule for the refresh (cluster timezone)
helm upgrade veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--namespace <NAMESPACE> \
--reuse-values \
--set imageRefresh.schedule="0 2 * * *"helm upgrade veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--namespace <NAMESPACE> \
--reuse-values \
--set imageRefresh.enabled=falsehelm install <NAME> oci://public.ecr.aws/veza/helm-chart/insight-point --version <VERSION> --namespace <NAMESPACE> --create-namespace --set key=<KEY># Create the veza namespace (skip if it already exists)
kubectl create namespace veza
# Create the Secret with OAuth2 client credentials
kubectl create secret generic veza-ip-oauth2 \
--namespace veza \
--from-literal=clientId=<oauth2-client-id> \
--from-literal=clientSecret=<oauth2-client-secret>
# Install the chart with OAuth2 enabled
helm install veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point \
--version <VERSION> \
--namespace veza \
--create-namespace \
--set insightPointId=<insight-point-id> \
--set addr=<tenant>.vezacloud.com \
--set oauth2.enabled=true \
--set oauth2.secretName=veza-ip-oauth2 \
--set-string vezaVault.secretContent='plain:<vault-secret>'Files in /tmp are stored in an ephemeral volume and are lost if the pod restarts. Re-copy credential files after any pod restart. Plan a process to renew the credential cache before tickets expire — the default lifetime is 5 days, subject to the maximum configured on your domain controller.
Helm merges the podSecurityContext value with the chart defaults field-by-field. A partial override (for example, setting only runAsNonRoot: true) does not remove the default IDs — they remain in place and the pod is still rejected. You must explicitly set each ID field to null to clear it.
""
--set keySecret.name=my-ip-key
keySecret.path
Field name within the referenced Secret containing the registration key
"key"
--set keySecret.path=registration-key
image
Container image to deploy
public.ecr.aws/veza/insight_point:latest
--set image=my-registry/insight_point:v1
addr
Address for Veza API connection. Optional with a registration key (overrides the key's default); required with OAuth2.
""
--set addr=customer.vezacloud.com
skipVerify
Disable TLS certificate validation
false
--set skipVerify=true
authority
Overrides the request authority for certificate validation
""
--set authority=veza.example.com
caBundle
Custom CA certificate bundle in PEM format (inline)
""
See
caBundleConfigMapRef
Reference to existing ConfigMap containing CA bundle
""
--set caBundleConfigMapRef=custom-ca-bundle
env
List of additional environment variables to inject into the pod
[]
See
replicaCount
Number of Insight Point replicas for high availability
3
--set replicaCount=1
createClusterRole
Create ClusterRole for Kubernetes integration RBAC
true
--set createClusterRole=false
roleName
Name of the ClusterRole created when createClusterRole is enabled
veza-insight-point
--set roleName=custom-veza-role
enableSecrets
Enable Kubernetes Secrets extraction via ClusterRole permissions
false
--set enableSecrets=true
nodeSelector
Constrain pods to nodes with specific labels
{}
--set nodeSelector.disktype=ssd
tolerations
Allow pods to schedule on tainted nodes
[]
See
topologySpreadConstraints
Control pod distribution across topology domains
[]
See
imageRefresh.enabled
Periodically restart the Insight Point to pull the latest image
true
--set imageRefresh.enabled=false
imageRefresh.schedule
Cron schedule for the periodic image refresh (cluster timezone)
0 4 * * 0
--set imageRefresh.schedule="0 4 * * 0"
insightPointId
Insight Point identifier from the Veza UI (used with OAuth2 provisioning)
""
--set insightPointId=abc123
oauth2.enabled
Enable OAuth2 client credentials authentication (Early Access)
false
--set oauth2.enabled=true
oauth2.secretName
Name of a Kubernetes Secret containing clientId and clientSecret
""
--set oauth2.secretName=veza-ip-oauth2
vezaVault.secretName
Name of a Kubernetes Secret containing a vaultSecret key
""
--set vezaVault.secretName=veza-ip-vault
vezaVault.secretContent
Inline Veza vault key. Use --set-string to preserve the plain:<base64> format
""
--set-string vezaVault.secretContent='plain:...'
podAntiAffinity.topologyKey
Distribution topology
kubernetes.io/hostname (nodes) or topology.kubernetes.io/zone (zones)
kubernetes.io/hostname
1
webhookRelay.allowedHosts
A list of allowed destinations (supports multiple formats as documented in )
""
--set 'webhookRelay.allowedHosts[0]=172.17.0.0/24' --set 'webhookRelay.allowedHosts[1]=172.16.0.*' --set 'webhookRelay.allowedHosts[3]=*.example.com'
configmaps
""
get
Read configuration
clusterroles
rbac.authorization.k8s.io
list
Discover RBAC roles
clusterrolebindings
rbac.authorization.k8s.io
list
Discover role assignments
roles
rbac.authorization.k8s.io
list
Discover namespace-scoped roles
rolebindings
rbac.authorization.k8s.io
list
Discover namespace-scoped role assignments
""
true
podSecurityContext.runAsUser
User ID the container process runs as; matches the nonroot user in the image
1001
podSecurityContext.runAsGroup
Primary group ID for the container process; matches the nonroot user in the image
1001
podSecurityContext.seccompProfile.type
Seccomp profile applied to the container; RuntimeDefault uses the container runtime's default, restricting the syscalls the container can invoke
RuntimeDefault
0 4 * * 0
helm install veza-insight-point oci://public.ecr.aws/veza/helm-chart/insight-point --version <VERSION> --namespace veza --create-namespace --set enableSecrets=true --set key=<YOUR_KEY>helm list -n <NAMESPACE>kubectl logs -l app=<veza-insight-point> -n <NAMESPACE>helm upgrade <veza-insight-point> oci://public.ecr.aws/veza/helm-chart/insight-point --version <VERSION> --namespace <NAMESPACE>helm uninstall <veza-insight-point> --namespace <NAMESPACE>