Recommended managed services
Persistent storage
The shared RWX PVC (used byprismeai-functions) must be backed by Azure Files with ZRS. Premium tier recommended for hot workloads.
Infrastructure as Code
Use Bicep, ARM templates or the Terraformazurerm provider; Azure’s documentation is the canonical reference. Prisme.ai doesn’t ship a dedicated Azure IaC bundle.
DNS and TLS
Create two records (Azure DNS or your registrar):Microsoft Entra ID passwordless auth
Entra ID lets you replace static passwords for Redis and PostgreSQL with short-lived tokens, using system-assigned or user-assigned managed identities. Two modes are available. They differ in how the token reaches the pod, and that difference decides what you have to configure:
Option B (recommended) is the better choice for a shared cluster. It is also the one with more moving parts, so work through the checklist at the end of this section before concluding it does not work.
1. Create the managed identity
clientIdgoes in your Helm values (azureManagedIdentityClientId) and in the ServiceAccount annotation.objectId(also calledprincipalId) is what you grant on Redis and register in PostgreSQL.
2. Wire the identity to AKS
Option A (simplest): bind to the cluster
Simplest, and applies to every workload on the node.azureSystemIdentity: true in your Helm values (see the table in step 3 for the full list). No ServiceAccount and no pod label are needed: IMDS answers regardless.
Option B (recommended): federated credentials, per ServiceAccount
First, make sure the cluster can do it at all:core and apps need separate credentials:
In your values, for every backend chart (everything except
prismeai-console and prismeai-pages):
If your chart exposes global.podLabels
Newer charts (prismeai-core >= 1.12.1 and prismeai-apps >= 0.7.1)
add two hooks that replace both the repetition above and the
post-install patch below. Check with helm show values <chart> | grep podLabels; if
it is there, the whole Workload Identity configuration below must be set
for both the core values file and the apps values file :
serviceAccount.name: prismeai-backends-sa on each backend. The
global annotations are merged into every ServiceAccount the release creates, so the
last-one-wins problem disappears, and Applying the pod label becomes unnecessary.
3. Set the identity on every client
Each backing-service client is configured independently. Setting only some of them leaves the rest on username/password authentication, which fails or silently keeps using an old secret. There are seven, across two Helm releases:
For Option A, set
azureSystemIdentity: true at those same seven paths instead.
Four of the seven are Redis. Configuring “the PostgreSQL ones” plus the broker still leaves sessions, contexts and the crawler/searchengine cache authenticating with a password.Watch
global.storage.searchengines in particular: the key says searchengines, but its value is a Redis URL (redis://user:password@host:6379/4) and it configures a Redis client. It is in the apps release, not core.4. Remove static passwords
5. Redis
- Open your Azure Cache for Redis / Azure Managed Redis instance.
- Settings → Authentication → Microsoft Entra Authentication — enable it.
- Add a data access policy for the identity’s objectId, not its clientId:
The client sends the token’s
oid claim as the Redis username, which is the objectId. Assigning the policy to the clientId by mistake produces WRONGPASS with a perfectly valid token.6. PostgreSQL
Connect as your Entra administrator, to thepostgres maintenance database:
pgaadauth_create_principal('PrismeaiIdentity', false, false) also exists and asks the server to resolve the name against Entra. For a user-assigned managed identity prefer the _with_oid form: it needs no directory lookup, so it works regardless of tenant restrictions. Keep the name-resolving form for human users and groups.PrismeaiIdentity should appear with principaltype = service and an objectid equal to the identity’s objectId.
7. Put the Postgres principal in the connection URL
Under Entra authentication the Azure token supplies the password; the username must come from the connection URL:url key of each PostgreSQL existingSecret — global.storage.permissions, prismeai-api-gateway.storage.users and prismeai-runtime.storage.collections.
Applying the pod label
Skip this section if your chart exposesglobal.podLabels (see above) — it exists only for charts that do not.
Otherwise, patch the deployments after every helm install or helm upgrade — the upgrade rewrites the pod template and drops the label:
Verify it actually worked
This is the only reliable check, and it takes one command:- Prints a path → the webhook fired and the pod is authenticating through federation. Option B is working.
- Prints nothing → the webhook did not fire. The pod is falling back to IMDS, whatever else appears to work. Re-check the pod label, the ServiceAccount annotation, and that
serviceAccount.nameis set on that chart.
Troubleshooting
Every message below was produced on a real cluster by breaking one thing deliberately, so they are what you will actually see.The federated credential does not match
az identity federated-credential create --subject. The subject is always
system:serviceaccount:<namespace>:<serviceaccountname>, so a mismatch means the
namespace is wrong, serviceAccount.name was not set on that chart, or the pod fell
back to the default ServiceAccount.
AADSTS70021 is the same failure for the issuer rather than the subject — check
--issuer against az aks show --query oidcIssuerProfile.issuerUrl.
A leftover password, on a server expecting a token
password is still set,
so the driver short-circuits Azure authentication and sends that password where
PostgreSQL expects a token. Remove it (step 4).
Both PostgreSQL and Redis fail together
They share exactly one thing: acquiring a token. Everything downstream — scopes, drivers, grants, servers — is separate. So a fault that takes out both is upstream of both: the pod label, the ServiceAccount annotation, or workload identity not enabled on the cluster. Do not start by looking at the databases.Symptom table
Ingress annotations
Application Gateway exposes two distinct settings:- Backend request timeout (≈ 60 s, under the api-gateway server keep-alive of 70 s): socket reuse between client requests.
- Idle request timeout (≈ 300 s): kill an in-flight request only after this much inactivity, so SSE / long LLM streams aren’t dropped.
Next Steps
Install with Helm
Configure values and deploy core + apps namespaces.
Databases
PostgreSQL or MongoDB, Redis, Elasticsearch or OpenSearch.
Install products
Fresh-install walkthrough.
Migration v27
Migrate an existing instance to v27.