Använda Microsoft Entra-poddhanterade identiteter i Azure Kubernetes Service (förhandsversion)
Microsoft Entra-poddhanterade identiteter använder Kubernetes-primitiver för att associera hanterade identiteter för Azure-resurser och identiteter i Microsoft Entra-ID med poddar. Administratörer skapar identiteter och bindningar som Kubernetes-primitiver som gör att poddar kan komma åt Azure-resurser som förlitar sig på Microsoft Entra-ID som identitetsprovider.
Viktigt!
Vi rekommenderar att du granskar Microsoft Entras arbetsbelastnings-ID. Den här autentiseringsmetoden ersätter poddhanterad identitet (förhandsversion), som integreras med kubernetes interna funktioner för att federera med externa identitetsprovidrar för programmets räkning.
Den öppen källkod Microsoft Entra-poddhanterade identiteten (förhandsversion) i Azure Kubernetes Service blev inaktuell den 24 september 2022 och projektet arkiverades i september 2023. Mer information finns i utfasningsmeddelandet. AKS Pod Identity Managed-tillägget kommer att korrigeras och stödjas till och med september 2025 för att ge kunderna tid att flytta över till Microsoft Entra-arbetsbelastnings-ID
Om du vill inaktivera det hanterade AKS-tillägget använder du följande kommando: az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"
.
Innan du börjar
Du måste ha Azure CLI version 2.20.0 eller senare installerad.
Begränsningar
- Högst 200 poddhanterade identiteter tillåts för ett kluster.
- Högst 200 poddhanterade identitetsfel tillåts för ett kluster.
- Poddhanterade identiteter är endast tillgängliga i Linux-nodpooler.
- Den här funktionen stöds endast för vm-skalningsuppsättningar med säkerhetskopierade kluster.
Installera Azure CLI-tillägget aks-preview
Viktigt!
AKS-förhandsversionsfunktioner är tillgängliga via självbetjäning och anmäl dig. Förhandsversioner tillhandahålls "som är" och "som tillgängliga", och de undantas från serviceavtalen och den begränsade garantin. AKS-förhandsversioner omfattas delvis av kundsupport på bästa sätt. Därför är dessa funktioner inte avsedda för produktionsanvändning. Mer information finns i följande supportartiklar:
Kör följande kommando för att installera aks-preview-tillägget:
az extension add --name aks-preview
Kör följande kommando för att uppdatera till den senaste versionen av tillägget som släpptes:
az extension update --name aks-preview
Registrera funktionsflaggan EnablePodIdentityPreview
Registrera funktionsflaggan EnablePodIdentityPreview
med kommandot az feature register , som du ser i följande exempel:
az feature register --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"
Det tar några minuter för statusen att visa Registrerad. Kontrollera registreringsstatusen med kommandot az feature show :
az feature show --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"
När statusen visar Registrerad uppdaterar du registreringen av Resursprovidern Microsoft.ContainerService med hjälp av kommandot az provider register :
az provider register --namespace Microsoft.ContainerService
Alternativ för åtgärdsläge
Microsoft Entra poddhanterad identitet stöder två driftslägen:
- Standardläge: I det här läget distribueras följande två komponenter till AKS-klustret:
- Managed Identity Controller (MIC): En MIC är en Kubernetes-styrenhet som bevakar ändringar i poddar, AzureIdentity och AzureIdentityBinding via Kubernetes API Server. När den identifierar en relevant ändring lägger MIC till eller tar bort AzureAssignedIdentity efter behov. När en podd schemaläggs tilldelar MIC den hanterade identiteten i Azure till den underliggande vm-skalningsuppsättningen som används av nodpoolen under fasen för att skapa den. När alla poddar som använder identiteten tas bort tas identiteten bort från nodpoolens vm-skalningsuppsättning, såvida inte samma hanterade identitet används av andra poddar. MIC vidtar liknande åtgärder när AzureIdentity eller AzureIdentityBinding skapas eller tas bort.
- Nodhanterad identitet (NMI): NMI är en podd som körs som en DaemonSet på varje nod i AKS-klustret. NMI fångar upp begäranden om säkerhetstoken till Azure Instance Metadata Service på varje nod, omdirigerar dem till sig själv och verifierar om podden har åtkomst till den identitet som den begär en token för och hämtar token från Microsoft Entra-klienten för programmets räkning.
- Hanterat läge: Det här läget erbjuder endast NMI. När det installeras via AKS-klustertillägget hanterar Azure skapandet av Kubernetes-primitiver (AzureIdentity och AzureIdentityBinding) och identitetstilldelning som svar på CLI-kommandon från användaren. Annars måste identiteten tilldelas och hanteras manuellt av användaren om den installeras via Helm-diagrammet. Mer information finns i Poddidentitet i hanterat läge.
När du installerar Microsoft Entra-poddhanterad identitet via Helm-diagrammet eller YAML-manifestet enligt installationsguiden kan du välja mellan standard
läget ochmanaged
. Om du i stället bestämmer dig för att installera microsoft Entra-poddhanterad identitet med hjälp av AKS-klustertillägget enligt beskrivningen i den här artikeln använder managed
installationen läget.
Skapa ett AKS-kluster med Azure Container Networking Interface (CNI)
Kommentar
Det här är den rekommenderade standardkonfigurationen
Skapa ett AKS-kluster med Azure CNI och poddhanterad identitet aktiverad. Följande kommandon använder az group create för att skapa en resursgrupp med namnet myResourceGroup och kommandot az aks create för att skapa ett AKS-kluster med namnet myAKSCluster i resursgruppen myResourceGroup .
az group create --name myResourceGroup --location eastus
az aks create \
--resource-group myResourceGroup \
--name myAKSCluster \
--enable-pod-identity \
--network-plugin azure \
--generate-ssh-keys
Använd az aks get-credentials för att logga in på ditt AKS-kluster. Det här kommandot laddar också ned och konfigurerar kubectl
klientcertifikatet på utvecklingsdatorn.
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
Kommentar
När du aktiverar poddhanterad identitet i ditt AKS-kluster läggs ett AzurePodIdentityException med namnet aks-addon-exception till i kube-system-namnområdet . Med En AzurePodIdentityException kan poddar med vissa etiketter komma åt SLUTpunkten för Azure Instance Metadata Service (IMDS) utan att fångas upp av NMI-servern. Aks-addon-exception tillåter AKS-tillägg från första part, till exempel Microsoft Entra-poddhanterad identitet, att fungera utan att behöva konfigurera en AzurePodIdentityException manuellt. Du kan också lägga till, ta bort och uppdatera en AzurePodIdentityException med hjälp av az aks pod-identity exception add
, az aks pod-identity exception delete
, az aks pod-identity exception update
eller kubectl
.
Uppdatera ett befintligt AKS-kluster med Azure CNI
Uppdatera ett befintligt AKS-kluster med Azure CNI för att inkludera poddhanterad identitet.
az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity
Använda Kubenet-nätverksinsticksprogrammet med Microsoft Entra-poddhanterade identiteter
Viktigt!
Att köra Microsoft Entra-poddhanterad identitet i ett kluster med Kubenet är inte en rekommenderad konfiguration på grund av säkerhetsproblem. Kubenet-standardkonfigurationen förhindrar inte förfalskning av ARP, som kan användas av en podd för att fungera som en annan podd och få åtkomst till en identitet som den inte är avsedd att ha. Följ åtgärdsstegen och konfigurera principer innan du aktiverar Microsoft Entra-poddhanterad identitet i ett kluster med Kubenet.
Riskreducering
För att minska sårbarheten på klusternivå kan du använda den inbyggda Azure-principen "Kubernetes-klustercontainrar bör endast använda tillåtna funktioner" för att begränsa CAP_NET_RAW attack.
Lägg till NET_RAW till "Nödvändiga släppfunktioner"
Om du inte använder Azure Policy kan du använda OpenPolicyAgent-antagningskontrollanten tillsammans med Gatekeeper som validerar webhooken. Förutsatt att du redan har Gatekeeper installerat i klustret lägger du till ConstraintTemplate av typen K8sPSPCapabilities:
kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/master/library/pod-security-policy/capabilities/template.yaml
Lägg till en mall för att begränsa yngningen av poddar med funktionen NET_RAW:
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPCapabilities
metadata:
name: prevent-net-raw
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
excludedNamespaces:
- "kube-system"
parameters:
requiredDropCapabilities: ["NET_RAW"]
Skapa ett AKS-kluster med Kubenet-nätverksinsticksprogrammet
Skapa ett AKS-kluster med Kubenet-nätverks-plugin och poddhanterad identitet aktiverad.
az aks create \
--resource-group $MY_RESOURCE_GROUP \
--name $MY_CLUSTER \
--enable-pod-identity \
--enable-pod-identity-with-kubenet \
--generate-ssh-keys
Uppdatera ett befintligt AKS-kluster med Kubenet-nätverksinsticksprogrammet
Uppdatera ett befintligt AKS-kluster med Kubenet-nätverksinsticksprogrammet så att det innehåller poddhanterad identitet.
az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet
Skapa en identitet
Viktigt!
Du måste ha relevanta behörigheter (till exempel Ägare) för din prenumeration för att skapa identiteten.
Skapa en identitet som ska användas av demopodden med az identity create och ange variablerna IDENTITY_CLIENT_ID och IDENTITY_RESOURCE_ID .
az group create --name myIdentityResourceGroup --location eastus
export IDENTITY_RESOURCE_GROUP="myIdentityResourceGroup"
export IDENTITY_NAME="application-identity"
az identity create --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
export IDENTITY_CLIENT_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query clientId -o tsv)"
export IDENTITY_RESOURCE_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query id -o tsv)"
Tilldela behörigheter för den hanterade identiteten
Den hanterade identitet som ska tilldelas till podden måste beviljas behörigheter som överensstämmer med de åtgärder som den kommer att vidta.
Om du vill köra demonstrationen måste den IDENTITY_CLIENT_ID hanterade identiteten ha behörighet som deltagare för virtuell dator i resursgruppen som innehåller VM-skalningsuppsättningen för ditt AKS-kluster.
# Obtain the name of the resource group containing the Virtual Machine Scale set of your AKS cluster, commonly called the node resource group
NODE_GROUP=$(az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)
# Obtain the id of the node resource group
NODES_RESOURCE_ID=$(az group show --name $NODE_GROUP -o tsv --query "id")
# Create a role assignment granting your managed identity permissions on the node resource group
az role assignment create --role "Virtual Machine Contributor" --assignee "$IDENTITY_CLIENT_ID" --scope $NODES_RESOURCE_ID
Skapa en poddidentitet
Skapa en poddhanterad identitet för klustret med hjälp av az aks pod-identity add
.
export POD_IDENTITY_NAME="my-pod-identity"
export POD_IDENTITY_NAMESPACE="my-app"
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE} --name ${POD_IDENTITY_NAME} --identity-resource-id ${IDENTITY_RESOURCE_ID}
Kommentar
"POD_IDENTITY_NAME" måste vara ett giltigt DNS-underdomännamn enligt definitionen i RFC 1123.
Kommentar
När du tilldelar den poddhanterade identiteten med hjälp pod-identity add
av försöker Azure CLI bevilja rollen Hanterad identitetsoperator över den poddhanterade identiteten (IDENTITY_RESOURCE_ID) till klusteridentiteten.
Azure skapar en AzureIdentity-resurs i klustret som representerar identiteten i Azure och en AzureIdentityBinding-resurs som ansluter AzureIdentity till en väljare. Du kan visa dessa resurser med
kubectl get azureidentity -n $POD_IDENTITY_NAMESPACE
kubectl get azureidentitybinding -n $POD_IDENTITY_NAMESPACE
Köra ett exempelprogram
För att en podd ska kunna använda Microsoft Entra poddhanterad identitet behöver podden en aadpodidbinding-etikett med ett värde som matchar en väljare från en AzureIdentityBinding. Som standard matchar väljaren namnet på den poddhanterade identiteten, men den kan också anges med hjälp av --binding-selector
alternativet när du anropar az aks pod-identity add
.
Om du vill köra ett exempelprogram med microsoft entra poddhanterad identitet skapar du en demo.yaml
fil med följande innehåll. Ersätt POD_IDENTITY_NAME, IDENTITY_CLIENT_ID och IDENTITY_RESOURCE_GROUP med värdena från föregående steg. Ersätt SUBSCRIPTION_ID med ditt prenumerations-ID.
Kommentar
I föregående steg skapade du variablerna POD_IDENTITY_NAME, IDENTITY_CLIENT_ID och IDENTITY_RESOURCE_GROUP . Du kan använda ett kommando som till exempel för att visa det värde som echo
du har angett för variabler, till exempel echo $POD_IDENTITY_NAME
.
apiVersion: v1
kind: Pod
metadata:
name: demo
labels:
aadpodidbinding: $POD_IDENTITY_NAME
spec:
containers:
- name: demo
image: mcr.microsoft.com/oss/azure/aad-pod-identity/demo:v1.6.3
args:
- --subscriptionid=$SUBSCRIPTION_ID
- --clientid=$IDENTITY_CLIENT_ID
- --resourcegroup=$IDENTITY_RESOURCE_GROUP
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
nodeSelector:
kubernetes.io/os: linux
Observera att podddefinitionen har en aadpodidbinding-etikett med ett värde som matchar namnet på den poddhanterade identitet som du körde az aks pod-identity add
i föregående steg.
Distribuera demo.yaml
till samma namnområde som din poddhanterade identitet med hjälp av kubectl apply
:
kubectl apply -f demo.yaml --namespace $POD_IDENTITY_NAMESPACE
Kontrollera att exempelprogrammet körs med .kubectl logs
kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE
Kontrollera att loggarna visar att en token har hämtats och att GET-åtgärden lyckas.
...
successfully doARMOperations vm count 0
successfully acquired a token using the MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token)
successfully acquired a token, userAssignedID MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token) clientID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
successfully made GET on instance metadata
...
Köra ett program med flera identiteter
Om du vill att ett program ska kunna använda flera identiteter anger du --binding-selector
till samma väljare när du skapar poddidentiteter.
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE} --name ${POD_IDENTITY_NAME_1} --identity-resource-id ${IDENTITY_RESOURCE_ID_1} --binding-selector myMultiIdentitySelector
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE} --name ${POD_IDENTITY_NAME_2} --identity-resource-id ${IDENTITY_RESOURCE_ID_2} --binding-selector myMultiIdentitySelector
Ange sedan fältet aadpodidbinding
i din podd-YAML till den bindningsväljare som du har angett.
apiVersion: v1
kind: Pod
metadata:
name: demo
labels:
aadpodidbinding: myMultiIdentitySelector
...
Inaktivera poddhanterad identitet i ett befintligt kluster
Om du vill inaktivera poddhanterad identitet i ett befintligt kluster tar du bort de poddhanterade identiteterna från klustret. Inaktivera sedan funktionen i klustret.
az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az aks update --resource-group myResourceGroup --name myAKSCluster --disable-pod-identity
Rensa
Om du vill ta bort en Microsoft Entra-poddhanterad identitet från klustret tar du bort exempelprogrammet och den poddhanterade identiteten från klustret. Ta sedan bort identiteten och rolltilldelningen för klusteridentiteten.
kubectl delete pod demo --namespace $POD_IDENTITY_NAMESPACE
az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az identity delete --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
az role assignment delete --role "Managed Identity Operator" --assignee "$IDENTITY_CLIENT_ID" --scope "$IDENTITY_RESOURCE_ID"
Nästa steg
Mer information om hanterade identiteter finns i Hanterade identiteter för Azure-resurser.
Azure Kubernetes Service