DEMO/Infrastructure

← Back to dashboard

Entra ID → Kubernetes real-identity federation

Audience: operator · Profile: demo · Read this when: you want people signing in to clusters as themselves rather than sharing a kubeconfig.

Part of Kubernetes federation with your IdP. Entra is the default provider, and the only one AKS trusts. The API tunnel, installing kubectl oidc-login and the shared settings are on that page.

Bind one Entra (Azure AD) security group to cluster RBAC and let its members sign in to your clusters as themselves — their Entra token carries the group's Object ID, which matches a Kubernetes Group subject. Entitle's Entra-ID integration JIT-grants group membership, so access appears (and expires) just-in-time with no impersonation and no synthetic subject.

This works natively on AKS. On EKS it needs the cluster to trust Entra as an OIDC identity provider; on GKE it uses Workforce Identity Federation + Connect Gateway. The one-click Entra federation action wires up whichever the cluster needs. Either way it's the same Entra group — on GKE the RBAC subject is that group Object ID wrapped in a workforce principalSet URI.

Cloud Trust mechanism End-user auth Reached via
AKS native managed-AAD (no action needed) Azure kubelogin (device code) API tunnel
EKS Entra federation action → OIDC identity provider kubectl oidc-login (int128) API tunnel
GKE Entra federation action → Workforce Identity Federation gcloud auth login Connect Gateway

EKS and GKE need different Entra app registrations — you cannot reuse one for both (see One-time setup §1). The Entra group is the same everywhere; only the app registration differs.


The pieces

  1. Entra group → RBAC — the per-cluster Entra group action binds the group's Object ID to a ClusterRole (default cluster-admin). The same group works on every cloud (the group Object ID is tenant-wide).
  2. Entra federation — the per-cluster action that makes the cluster trust Entra. AKS is native; EKS associates its EKS Entra app as an OIDC identity provider; GKE uses a workforce pool backed by a separate GKE Entra app. EKS and GKE use different app registrations (see §1).
  3. API tunnel — the existing per-cluster tunnel that reaches a private cluster's API server (kubectl → localhost:6443 → the endpoint).
  4. Entitle Entra-ID integration — configured once in the Entitle console; it JIT-grants membership in the group from (1). Nothing to configure in the dashboard.

One-time setup

1. Entra app registrations — one per cloud

EKS and GKE need separate app registrations — you cannot reuse one for both. Their OIDC clients are configured in mutually incompatible ways:

Making one registration behave as both a secret-less public client and a secret-bearing web client doesn't work in practice, so create two. (AKS needs no app registration — its managed-AAD integration is built in.) Both apps emit the same group claim, and the Entra group is shared across all clouds; only the registration differs.

1a. EKS app registration (e.g. "EKS Entra OIDC")

1b. GKE app registration (e.g. "GKE Entra WIF")

A second, distinct registration for Workforce Identity Federation:

Setting Emits You must also
Security groups every security group the user is in nothing — but risks the ~200-group overage
Groups assigned to the application only groups assigned to this enterprise app assign every group you bind (below)

Skip it and the failure is invisible from the cloud side: the RBAC group is absent from the assertion, so every binding on its principalSet — Kubernetes RBAC and Cloud IAM — matches nothing, while kubectl still appears to work because the sign-in group carries its own access. Nothing in GCP looks misconfigured, because nothing in GCP is. This cost a full afternoon on 2026-07-30; see Verify the binding is what's granting access.

Its client ID + secret feed the gcloud iam workforce-pools providers create-oidc command in the GKE section — they are not entered into the dashboard.

2. Dashboard settings (Settings → Kubernetes)

3. Entitle Entra-ID integration

In the Entitle console, connect the Entra-ID integration and publish a resource that grants membership in the group from step 2. (No dashboard change.)


End-user quick reference

What the user installs and runs, per cloud. All three end at kubectl get ns against the same Entra group — only the plumbing differs.

EKS AKS GKE
Install int128 kubelogin (kubectl oidc-login) Azure kubelogin gke-gcloud-auth-plugin
Sign in nothing up front — kubectl triggers device code nothing up front — kubectl triggers device code gcloud auth login --login-config=login.json
Prep the kubeconfig none none none
Reachability API tunnel connected in the rep console API tunnel connected in the rep console Connect Gateway (no tunnel)
K8s username entra:<object-id> <object-id> workforce principal://…

The API tunnel (EKS and AKS only)

EKS and AKS users reach a private API server through the per-cluster API (TCP) tunnel; GKE uses Connect Gateway instead. How the tunnel and its kubeconfig work is on the hub: The API tunnel.


Pages

One page per cloud:

Page Read it when
Entra federation to EKS you are federating an EKS cluster with Entra ID, or connecting to one as its user
Entra federation to AKS you are federating an AKS cluster with Entra ID, or connecting to one as its user
Entra federation to GKE you are federating a GKE cluster with Entra ID through Workforce Identity Federation, or connecting to one as its user


Notes & limits