Skip to main content
The operator is distributed as a Helm chart. Its image is available from ECR and GAR.

Installation

Add the Formal Helm repository:
Install the operator with an API key:
The chart stores formalAPIKey in a Secret, so the key is also in the Helm release. To keep the key out of Helm, create the Secret yourself and reference it with formalAPIKeySecret. The chart does not create or change that Secret, so External Secrets or another controller can manage it.
Or authenticate with OIDC. Create an OIDC integration first.
This will:
  1. Install the CRDs (FormalResource, FormalListener, FormalNativeUser, FormalPolicy)
  2. Create a ServiceAccount with the necessary RBAC permissions
  3. Deploy the operator
Configure exactly one auth method: formalAPIKey, formalAPIKeySecret, or oidc.

Configuration

Default resource requests and limits:

Upgrading

Each chart release pins a compatible operator image. helm upgrade does not update CRDs, so apply them from the new chart version first:

Image pull credentials

Azure AKS

On AKS, install azure-gar-cred before the operator. First complete the AKS identity setup.

ECR outside AWS

Install ecr-cred before the operator when the cluster lacks native ECR access. Set pullWithCredentials=true on the operator chart. Do not install ecr-cred and azure-gar-cred in the same namespace.

Configuration file

The chart mounts a ConfigMap at /etc/formal/config.yaml and sets FORMAL_CONFIG. The file holds non-secret settings:
FORMAL_API_KEY comes from the chart Secret or from the Secret in formalAPIKeySecret. Helm adds a checksum/config annotation so ConfigMap changes roll the pod. Verify: The pod has FORMAL_CONFIG=/etc/formal/config.yaml and the mounted file matches your values.

Authentication

Use an API key or OIDC. Do not set both.

AWS OIDC

Configure AWS credentials through IRSA, EKS Pod Identity, or the standard AWS environment variables. Verify: The operator pod starts and reconciles without FORMAL_API_KEY.

Azure OIDC

Use the azure token source on AKS with Workload Identity or on Azure compute with managed identity. Set the integration ID to the ID of your Formal OIDC integration.
Enabling oidc.azure labels the pod with azure.workload.identity/use=true. This token source does not support Azure DevOps Pipelines. Verify: The operator pod starts and reconciles without FORMAL_API_KEY.

Kubernetes ServiceAccount OIDC

Use oidc.serviceAccountToken when Formal can reach your cluster’s ServiceAccount issuer over public HTTPS. Amazon EKS hosts this issuer publicly, even for clusters with a private API endpoint. Find the issuer:
Create an OIDC integration with that issuer. Restrict the claim condition to the operator’s ServiceAccount:
The chart projects a ServiceAccount token with audience oidc.formal.ai/<integration_id> at /var/run/secrets/formal/token. Kubernetes rotates the token, and the operator reads it on every request. The chart configures the operator’s file token source in the ConfigMap:
Verify: The operator pod starts and reconciles without FORMAL_API_KEY.