Bereitstellen und Konfigurieren einer Workloadidentität in einem Azure Kubernetes Service-Cluster (AKS)

Azure Kubernetes Service (AKS) ist ein verwalteter Kubernetes-Dienst, mit dem Sie schnell Kubernetes-Cluster bereitstellen und verwalten können. In diesem Artikel werden die folgenden Themen behandelt:

  • Bereitstellen eines AKS-Clusters mithilfe der Azure CLI, der den OpenID Connect-Zertifikataussteller und eine Microsoft Entra-Workload-ID enthält
  • Gewähren des Zugriffs auf Ihren Azure Key Vault
  • Erstellen einer Microsoft Entra-Workload-ID und eines Kubernetes-Dienstkontos
  • Konfigurieren der verwalteten Identität für den Tokenverbund

Für diesen Artikel werden Grundkenntnisse von Kubernetes-Konzepten vorausgesetzt. Weitere Informationen finden Sie unter Grundlegende Kubernetes-Konzepte für Azure Kubernetes Service (AKS). Wenn Sie noch nicht mit der Microsoft Entra-Workload-ID vertraut sind, lesen Sie den folgenden Übersichtsartikel.

  • Für diesen Artikel ist mindestens Version 2.47.0 der Azure CLI erforderlich. Bei Verwendung von Azure Cloud Shell ist die aktuelle Version bereits installiert.

  • Die Identität, die Sie zum Erstellen Ihres Clusters verwenden, verfügt über die erforderlichen Mindestberechtigungen. Weitere Informationen zu Zugriff und Identität für AKS finden Sie unter Zugriffs- und Identitätsoptionen für Azure Kubernetes Service (AKS).

  • Wenn Sie über mehrere Azure-Abonnements verfügen, wählen Sie mithilfe des Befehls az account die ID des Abonnements aus, in dem die Ressourcen fakturiert werden sollen.

Hinweis

Anstatt alle Schritte manuell zu konfigurieren, gibt es eine weitere Implementierung namens Dienstconnector, die Ihnen dabei hilft, einige Schritte automatisch zu konfigurieren und dasselbe Ergebnis zu erzielen. Siehe auch: Tutorial: Herstellen einer Verbindung mit einem Azure-Speicherkonto in Azure Kubernetes Service (AKS) mithilfe des Dienstconnectors und unter Verwendung einer Workloadidentität.

Exportieren von Umgebungsvariablen

Um die Schritte zum Konfigurieren der erforderlichen Identitäten zu vereinfachen, werden in den folgenden Schritten Umgebungsvariablen zum Verweisen auf den Cluster definiert.

Führen Sie die folgenden Befehle aus, um diese Variablen zu erstellen. Ersetzen Sie die Standardwerte für RESOURCE_GROUP, LOCATION, SERVICE_ACCOUNT_NAME, SUBSCRIPTION, USER_ASSIGNED_IDENTITY_NAME und FEDERATED_IDENTITY_CREDENTIAL_NAME.

export RESOURCE_GROUP="myResourceGroup"
export LOCATION="westcentralus"
export SERVICE_ACCOUNT_NAMESPACE="default"
export SERVICE_ACCOUNT_NAME="workload-identity-sa"
export SUBSCRIPTION="$(az account show --query id --output tsv)"
export USER_ASSIGNED_IDENTITY_NAME="myIdentity"
export FEDERATED_IDENTITY_CREDENTIAL_NAME="myFedIdentity"

Erstellen eines ACS-Clusters

Erstellen Sie einen AKS-Cluster über den Befehl az aks create mit dem Parameter --enable-oidc-issuer, um den OIDC-Aussteller zu verwenden. Im folgenden Beispiel wird ein Cluster mit dem Namen myAKSCluster mit einem Knoten in myResourceGroup erstellt.

az aks create -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys

Nach wenigen Minuten ist die Ausführung des Befehls abgeschlossen, und es werden Informationen zum Cluster im JSON-Format zurückgegeben.

Hinweis

Beim Erstellen eines AKS-Clusters wird automatisch eine zweite Ressourcengruppe erstellt, um die AKS-Ressourcen zu speichern. Weitere Informationen finden Sie unter Warum werden zwei Ressourcengruppen mit AKS erstellt?

Aktualisieren eines vorhandenen AKS-Clusters

Sie können mit dem Befehl az aks update mit dem Parameter --enable-oidc-issuer und --enable-workload-identity einen AKS-Cluster aktualisieren, um den OIDC-Aussteller (Vorschau) zu verwenden und Workloadidentität zu aktivieren. Im folgenden Beispiel wird ein Cluster mit dem Namen myAKSCluster aktualisiert.

az aks update -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity

Abrufen der OIDC-Aussteller-URL

Um die URL des OIDC-Ausstellers abzurufen und in einer Umgebungsvariable zu speichern, führen Sie den folgenden Befehl aus. Ersetzen Sie den Standardwert für das Argument -n (der Name des Clusters):

export AKS_OIDC_ISSUER="$(az aks show -n myAKSCluster -g "${RESOURCE_GROUP}" --query "oidcIssuerProfile.issuerUrl" -o tsv)"

Die Variable sollte die URL des Ausstellers enthalten, ähnlich wie im folgenden Beispiel:

https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/

Standardmäßig ist für den Aussteller die Verwendung der Basis-URL https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid} festgelegt, wobei der Wert für {region} dem Standort entspricht, in dem der AKS-Cluster bereitgestellt ist. Der Wert {uuid} steht für den OIDC-Schlüssel.

Erstellen einer verwalteten Identität

Verwenden Sie den Azure CLI-Befehl az account set zum Festlegen eines bestimmten Abonnements als aktuelles aktives Abonnement. Verwenden Sie dann den Befehl az identity create, um eine verwaltete Identität zu erstellen.

az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"

Als Nächstes erstellen wir eine Variable für die ID der verwalteten Identität.

export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"

Erstellen eines Kubernetes-Dienstkontos

Erstellen Sie ein Kubernetes-Dienstkonto, und kommentieren Sie es mit der Client-ID der verwalteten Identität, die Sie im vorherigen Schritt erstellt haben. Verwenden Sie den Befehl az aks get-credentials, und ersetzen Sie die Werte für den Clusternamen und den Ressourcengruppennamen.

az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"

Kopieren Sie die folgende mehrzeilige Eingabe, und fügen Sie sie in die Azure CLI ein.

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    azure.workload.identity/client-id: "${USER_ASSIGNED_CLIENT_ID}"
  name: "${SERVICE_ACCOUNT_NAME}"
  namespace: "${SERVICE_ACCOUNT_NAMESPACE}"
EOF

Die folgende Ausgabe ähnelt der erfolgreichen Erstellung der Identität:

serviceaccount/workload-identity-sa created

Einrichten von Anmeldeinformationen für eine Verbundidentität

Erstellen Sie mit dem Befehl az identity federated-credential create die Verbundidentitäts-Anmeldeinformationen in Verbindung mit der verwalteten Identität, dem Dienstkontoaussteller und dem Antragsteller.

az identity federated-credential create --name ${FEDERATED_IDENTITY_CREDENTIAL_NAME} --identity-name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --issuer "${AKS_OIDC_ISSUER}" --subject system:serviceaccount:"${SERVICE_ACCOUNT_NAMESPACE}":"${SERVICE_ACCOUNT_NAME}" --audience api://AzureADTokenExchange

Hinweis

Es dauert einige Sekunden, bis die Verbundidentitäts-Anmeldeinformationen nach dem erstmaligen Hinzufügen weitergegeben werden. Wenn eine Tokenanforderung unmittelbar nach dem Hinzufügen der Verbundidentitäts-Anmeldeinformationen erfolgt, kann dies einige Minuten lang zu Fehlern führen, da der Cache im Verzeichnis noch mit alten Daten gefüllt wird. Um dieses Problem zu vermeiden, können Sie eine kleine Verzögerung nach dem Hinzufügen der Verbundidentitäts-Anmeldeinformationen hinzufügen.

Bereitstellen der Anwendung

Wenn Sie Ihre Anwendungspods bereitstellen, sollte das Manifest auf das Dienstkonto verweisen, das im Schritt Erstellen eines Kubernetes-Dienstkontos erstellt wurde. Das folgende Manifest zeigt, wie auf das Konto verwiesen wird, insbesondere auf die Eigenschaften metadata\namespace und spec\serviceAccountName:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: your-pod
  namespace: "${SERVICE_ACCOUNT_NAMESPACE}"
  labels:
    azure.workload.identity/use: "true"  # Required, only the pods with this label can use workload identity
spec:
  serviceAccountName: "${SERVICE_ACCOUNT_NAME}"
  containers:
    - image: <your image>
      name: <containerName>
EOF

Wichtig

Vergewissern Sie sich, dass für die Anwendungspods, die eine Workloadidentität nutzen, die Bezeichnung azure.workload.identity/use: "true" zur Podspezifikation hinzugefügt wurde. Andernfalls tritt für die Pods nach dem Neustart ein Fehler auf.

Optional: Berechtigungen für den Zugriff auf Azure Key Vault erteilen

Dieser Schritt ist erforderlich, wenn Sie auf Geheimnisse, Schlüssel und Zertifikate zugreifen müssen, die im Azure Key Vault aus einem Pod eingebunden sind. Führen Sie die folgenden Schritte aus, um den Zugriff mit einer verwalteten Identität zu konfigurieren. In diesen Schritten wird davon ausgegangen, dass Sie in Ihrem Abonnement bereits einen Azure Key Vault erstellt und konfiguriert haben. Wenn Sie keinen haben, finden Sie weitere Informationen unter Erstellen eines Azure Key Vault mithilfe der Azure CLI.

Bevor Sie fortfahren, benötigen Sie die folgenden Informationen:

  • Name des Key Vault
  • Ressourcengruppe, die den Key Vault enthält

Sie können diese Informationen mithilfe dieses Azure CLI-Befehls abrufen: az keyvault list.

  1. Legen Sie eine Zugriffsrichtlinie für die verwaltete Identität fest, um auf Geheimnisse in Ihrem Key Vault zuzugreifen. Führen Sie dazu die folgenden Befehle aus:

    export KEYVAULT_RESOURCE_GROUP="myResourceGroup"
    export KEYVAULT_NAME="myKeyVault"
    export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"
    
    az keyvault set-policy --name "${KEYVAULT_NAME}" --secret-permissions get --spn "${USER_ASSIGNED_CLIENT_ID}"
    
  2. Erstellen eines Geheimnisses in Key Vault:

    export KEYVAULT_SECRET_NAME="my-secret"
    
    az keyvault secret set --vault-name "${KEYVAULT_NAME}" \
       --name "${KEYVAULT_SECRET_NAME}" \
       --value "Hello\!"
    
  3. Exportieren der Key Vault-URL:

    export KEYVAULT_URL="$(az keyvault show -g ${KEYVAULT_RESOURCE_GROUP} -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
    
  4. Stellen Sie einen Pod bereit, der auf das Dienstkonto und die Key Vault-URL verweist:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: quick-start
      namespace: ${SERVICE_ACCOUNT_NAMESPACE}
      labels:
        azure.workload.identity/use: "true"
    spec:
      serviceAccountName: ${SERVICE_ACCOUNT_NAME}
      containers:
        - image: ghcr.io/azure/azure-workload-identity/msal-go
          name: oidc
          env:
          - name: KEYVAULT_URL
            value: ${KEYVAULT_URL}
          - name: SECRET_NAME
            value: ${KEYVAULT_SECRET_NAME}
      nodeSelector:
        kubernetes.io/os: linux
    EOF
    

Um zu überprüfen, ob vom Webhook alle Eigenschaften ordnungsgemäß eingefügt werden, verwenden Sie den Befehl kubectl describe:

kubectl describe pod quick-start | grep "SECRET_NAME:"

Bei Erfolg sollte die Ausgabe dem folgenden Beispiel ähneln:

      SECRET_NAME:                 ${KEYVAULT_SECRET_NAME}

Um zu überprüfen, ob der Pod ein Token abrufen und auf die Ressource zugreifen kann, verwenden Sie den Befehl „kubectl logs“:

kubectl logs quick-start

Bei Erfolg sollte die Ausgabe dem folgenden Beispiel ähneln:

I0114 10:35:09.795900       1 main.go:63] "successfully got secret" secret="Hello\\!"

Deaktivieren der Workloadidentität

Um die Microsoft Entra-Workload-ID in dem AKS-Cluster zu deaktivieren, in dem sie aktiviert und konfiguriert wurde, können Sie den folgenden Befehl ausführen:

az aks update --resource-group "${RESOURCE_GROUP}" --name myAKSCluster --disable-workload-identity

Nächste Schritte

In diesem Artikel haben Sie einen Kubernetes-Cluster bereitgestellt und so konfiguriert, dass eine Workloadidentität zum Vorbereiten auf Anwendungsworkloads verwendet wird, um sich mit diesen Anmeldeinformationen zu authentifizieren. Jetzt können Sie Ihre Anwendung bereitstellen und konfigurieren, um die Workloadidentität mit der neuesten Version der Azure Identity-Clientbibliothek zu verwenden. Wenn Sie Ihre Anwendung nicht neu schreiben können, um die neueste Clientbibliotheksversion zu verwenden, können Sie Ihren Anwendungspod so einrichten, dass die Authentifizierung mithilfe der verwalteten Identität mit einer Workloadidentität als kurzfristige Migrationslösung durchgeführt wird.