Azure Deployment (AKS)

This guide provides step-by-step instructions for deploying Immuta 2026.1.x to Azure Kubernetes Service (AKS) with Azure Flexible Server for PostgreSQL and Azure Elastic for audit storage.

circle-info

For the official Immuta self-managed deployment documentation, see Install Immutaarrow-up-right.

Prerequisites

  • Azure CLI (az) installed and authenticated with a subscription that has permissions to create resource groups, AKS clusters, ACR registries, PostgreSQL Flexible Servers, and Elastic monitors

  • kubectl installed

  • Helm 3.2.0+ installed

  • skopeo installed (installation guidearrow-up-right) -- used to copy container images between registries

  • Immuta OCI registry credentials

  • A valid TLS certificate and private key for your Immuta hostname

Required Variables

Set these environment variables before starting. All subsequent commands reference them.

# Deployment naming -- used as a prefix for all Azure resources
export RELEASE_NAME=<your-release-name>        # e.g., immuta-prod (lowercase, alphanumeric + hyphens)
export ACR_NAME=<your-acr-name>                # e.g., immutaprod (alphanumeric only, globally unique)
export LOCATION=eastus                         # Azure region

# Immuta version
export IMMUTA_VERSION=2026.1.0

# Immuta registry credentials
export IMMUTA_USER=<your-immuta-registry-username>
export IMMUTA_TOKEN=<your-immuta-registry-token>

# PostgreSQL credentials
export PG_ADMIN_PASSWORD=<your-postgres-admin-password>
export IMMUTA_DB_PASSWORD=<your-immuta-db-password>

# TLS / Ingress
export IMMUTA_URL=<your-hostname>              # e.g., immuta.example.com
export TLS_CERT=<path-to-tls-cert>             # e.g., ./immuta.crt
export TLS_KEY=<path-to-tls-key>               # e.g., ./immuta.key

# Namespace
export NAMESPACE=immuta
circle-exclamation

Step 1: Create Resource Group and Container Registry

Create an Azure resource group to hold all deployment resources, and an Azure Container Registry (ACR) to host the Immuta container images.

Verify:

Step 2: Copy Immuta Images to ACR

Authenticate to ACR

Create a scoped ACR token and log in with skopeo:

Authenticate to Immuta Registry

Copy images

Verify:

Step 3: Deploy AKS Cluster

Create an AKS cluster with the Azure CNI network plugin, OIDC issuer, workload identity, and the app routing ingress controller. The cluster is attached to the ACR for image pulls.

circle-info

Adjust --node-vm-size and --node-count based on your workload. The minimum recommendation for Immuta is 3 nodes of Standard_D4s_v5 (4 vCPU, 16 GiB RAM each).

To see available Kubernetes versions in your region, run az aks get-versions --location ${LOCATION} -o table.

Connect kubectl to the cluster

Verify:

You should see your nodes in Ready status.

Step 4: Deploy Azure Flexible Server for PostgreSQL

This section creates a PostgreSQL Flexible Server in its own VNet, peers it with the AKS VNet, and configures private DNS so the cluster can resolve the database endpoint.

Create a private DNS zone

This allows the AKS cluster to resolve the PostgreSQL hostname privately.

Create the PostgreSQL Flexible Server

Enable required PostgreSQL extensions

Peer the PostgreSQL and AKS VNets

Bidirectional VNet peering allows the AKS pods to reach the PostgreSQL server over the private network.

Verify peering status:

Both peerings should show Connected.

Step 5: Configure PostgreSQL Databases

Immuta requires three databases: immuta, temporal, and temporal_visibility. Since the PostgreSQL Flexible Server is only reachable from within its peered VNet, use an ephemeral pod in the AKS cluster to run the database setup.

Create the namespace

Connect to PostgreSQL via an ephemeral pod

Launch a temporary PostgreSQL client pod inside the AKS cluster. The pod is automatically deleted when you exit.

circle-info

The FQDN is queried from Azure because the actual hostname (<server-name>.postgres.database.azure.com) differs from the private DNS zone name. If the connection fails, verify VNet peering shows Connected (Step 4) and the private DNS zone is linked to the AKS VNet.

Create the Immuta role and databases

Run the following SQL statements:

Configure the immuta database

Configure the temporal database

Configure the temporal_visibility database

Verify databases

You should see immuta, temporal, and temporal_visibility with owner immuta.

Type \q to exit psql. The ephemeral pod is automatically deleted.

Step 6: Deploy Elasticsearch for Audit

Immuta requires Elasticsearch for the audit service. There are two options:

Option A: Azure Elastic Monitor (managed)

After the Elastic deployment completes:

  1. Navigate to the Azure Portal > your Elastic resource > Elasticsearch endpoint to find the endpoint URL

  2. Create a user for the audit service in Kibana:

    • Open Kibana from the Elastic resource overview

    • Navigate to Stack Management > Security > Users

    • Create a user (e.g., immuta-audit-service) with the superuser role (or a custom role with index create/write/read permissions)

  3. Note the endpoint URL and credentials for the Helm values in Step 8

circle-exclamation

Option B: In-cluster Elasticsearch using ECK

For deployments that prefer in-cluster Elasticsearch, follow the In-cluster Elasticsearch using ECK guide. Use the resulting in-cluster service endpoint (e.g., http://immuta-elasticsearch-es-http.immuta.svc.cluster.local:9200) in your Helm values.

Step 7: Create Kubernetes Secrets

TLS secret for ingress

The namespace was already created in Step 5. Create the TLS secret for the ingress controller:

Verify:

circle-info

Azure PostgreSQL Flexible Server uses DigiCert Global Root G2 certificates, which are included in standard system trust stores. Unlike AWS RDS (which requires an explicit CA bundle), no additional CA certificate secret is needed for Temporal's TLS connection to Azure PostgreSQL.

If Temporal pods fail to connect with TLS certificate errors, you can add an explicit CA certificate as a fallback. See the Troubleshooting section for details.

Step 8: Install Immuta via Helm

Authenticate Helm to the Immuta registry

Deploy Immuta

circle-exclamation
chevron-rightExample Helm Values (immuta-values.yaml)hashtag
circle-info

Temporal pods may show initial restarts while waiting for database connectivity. This is expected behavior and the pods should stabilize within a few minutes.

Step 9: Verify Deployment and Configure DNS

Wait for pods to become ready

Check pod status

All pods should show Running status (Temporal pods may take a few minutes to stabilize).

Check ingress

Configure DNS

Retrieve the ingress IP assigned by the app routing controller:

Create a DNS A record pointing ${IMMUTA_URL} to this IP address. If using Azure DNS zones, you can create a CNAME instead.

circle-info

If you manage your DNS zone in Azure, you can use ExternalDNSarrow-up-right to automate DNS record creation:

Access the Immuta UI

Navigate to https://${IMMUTA_URL} in your browser. You should see the Immuta login page.

Troubleshooting

Common Issues

Symptom
Likely Cause
Resolution

ImagePullBackOff

ACR authentication or image not found

Verify az acr repository list shows all images; check ACR is attached to AKS

Temporal pods in CrashLoopBackOff

Database unreachable or TLS cert issue

Check pod logs; if TLS errors, add explicit CA cert (see below)

Database connection errors

VNet peering not connected or wrong hostname

Check az network vnet peering list shows Connected; verify PostgreSQL hostname

Ingress has no IP

App routing addon not enabled or DNS not configured

Verify az aks show includes ingressProfile.webAppRouting.enabled: true

Audit service errors

Elasticsearch endpoint unreachable or wrong credentials

Test endpoint connectivity from a pod: kubectl exec -n ${NAMESPACE} <pod> -- curl -u user:pass <es-endpoint>

Temporal TLS fallback: adding an explicit CA certificate

If Temporal pods fail with TLS certificate verification errors, the container image may not include the DigiCert Global Root G2 certificate in its trust store. Add it explicitly:

Then add the following to the temporal.server section in your Helm values and re-run helm upgrade:

Useful commands

Cleanup

To remove all Azure resources created by this guide, delete the resource group. This removes the AKS cluster, ACR, PostgreSQL Flexible Server, Elastic Monitor, VNets, and all associated resources.

circle-exclamation

Last updated