Skip to main content
Deploy the Resolve Satellite on Azure Kubernetes Service (AKS) using Helm and Microsoft Entra Workload ID. The satellite runs in one AKS cluster and can read that cluster and any number of other AKS clusters, without storing a Kubernetes token, client secret, or certificate.
For other Kubernetes clusters, see Resolve Satellite. For AWS ECS Fargate, see Satellite on AWS ECS.

Architecture

  • Compute: A satellite pod installed with Helm in one AKS cluster (the host cluster)
  • Identity: A user-assigned managed identity, federated with the satellite’s Kubernetes service account
  • Authentication: kubelogin, bundled in the satellite image, exchanges the pod’s service account token for a short-lived Microsoft Entra token
  • Authorization: A read-only ClusterRole bound to the managed identity on each cluster
  • Cluster access: One Kubernetes integration per cluster, each with a kubeconfig that holds only the API server address and CA certificate

Installation

Step 1: Prepare Resources

Gather the following information before deployment. See Resource Setup Reference below for how to create each resource.
The namespace and service account are bound into the federated credential. Choose them before creating the identity, and install the satellite with the same values.
Get the API server URL and CA certificate for each cluster:

Step 2: Create a Kubeconfig per Cluster

Each kubeconfig names one cluster and runs kubelogin to get a token. Give each cluster’s kubeconfig a different user name: the satellite caches tokens by user name.
kubeconfig-prod-eastus.yaml

Step 3: Deploy with Helm

Bind the satellite to the federated service account, turn on workload identity for its pod, and add one Kubernetes integration per cluster.
resolve-values.yaml
When you define a kubernetes integration, the chart skips its default in-cluster k8s integration. List the host cluster explicitly, as above, to read it with workload identity.
The kubeconfigs contain no credentials, so you can also create their Secrets with your usual configuration tooling and reference them with secretName instead of secret. See Secret Management.

Step 4: Monitor Deployment


Resource Setup Reference

The Helm chart does not create the following resources. They must exist before deployment.
The examples use the Azure CLI and kubectl. You can create the same resources with Terraform or another infrastructure-as-code tool: azurerm_user_assigned_identity for the managed identity, azurerm_federated_identity_credential for the federated credential (using the cluster’s oidc_issuer_url), and kubernetes_cluster_role_v1 and kubernetes_cluster_role_binding_v1 for the RBAC objects.

1. AKS Clusters

  • Host cluster: The OIDC issuer and workload identity must be enabled
  • Every cluster the satellite reads: Microsoft Entra ID integration must be enabled. Local accounts can be disabled

2. Managed Identity

Create a user-assigned managed identity for the satellite.
CLIENT_ID goes into the Helm values. OBJECT_ID is the user name Kubernetes RBAC sees for this identity.

3. Federated Credential

Federate the identity with the satellite’s service account on the host cluster. Only a pod running as this service account, in this namespace, on this cluster can use the identity.

4. Kubernetes RBAC

Apply this ClusterRole and ClusterRoleBinding to each cluster the satellite reads, including the host cluster. Replace OBJECT_ID with the identity’s object ID. The role grants read access only and does not include Secrets.
Use your usual admin access, or az aks command invoke for clusters you reach only through Azure.
The built-in Azure Kubernetes Service RBAC Reader role is not enough on its own. It excludes cluster-scoped resources the satellite reads, such as nodes, persistent volumes, storage classes, and custom resource definitions. AKS with Azure RBAC still evaluates Kubernetes RBAC, so this binding also works on clusters that use Azure RBAC.

5. Ingest Token

The ingest token authenticates your satellite with Resolve SaaS. Generate it from Resolve UI > Admin > Tokens and store it in a Kubernetes Secret, as described in Secret Management.

6. Network

  • Outbound HTTPS: Required from the host cluster to Resolve SaaS
  • API servers: The satellite pod must reach the API server of every cluster it reads. For private clusters, provide a route to the private endpoint, for example through VNet peering and private DNS

Configuration Reference

Helm Values

Kubeconfig Fields


Verification

1. Check Pod is Running

The satellite pod should be Running and ready.

2. Check Satellite Logs

Expected log messages: Resolve Satellite Tool Request entries with "result":"success" for each Kubernetes integration.

3. Check Satellite in Resolve UI

  1. Log in to Resolve UI
  2. Navigate to Admin > Satellites
  3. Verify your satellite appears with status “Connected” and each Kubernetes integration is healthy

Adding a Cluster

  1. Apply the Kubernetes RBAC ClusterRole and ClusterRoleBinding on the new cluster
  2. Create a kubeconfig for it with a new user name (see Step 2)
  3. Add a kubernetes integration for it to resolve-values.yaml and run the helm upgrade command from Step 3
The federated credential does not change: it belongs to the host cluster.

Deleting the Satellite

The managed identity, federated credential, and RBAC objects are not managed by the Helm chart. Delete them if no longer needed:

Troubleshooting

No AZURE_ Variables in the Satellite Pod

kubelogin fails because the pod has no workload identity configuration.
Restart the pod after fixing the values.

kubelogin Fails with a Federated Credential Error

The token exchange is rejected by Microsoft Entra ID.

Forbidden: Cannot List Resource Nodes

The identity authenticates but is not authorized. Check which user the cluster sees, using the kubeconfig of the failing integration:

Timeouts Reaching Another Cluster

Requests to one cluster time out while others succeed.
  • Verify the host cluster allows egress to that cluster’s API server
  • For private clusters, verify there is a route to the private endpoint, for example through VNet peering and private DNS