Distribuera och konfigurera arbetsbelastningsidentitet i ett AKS-kluster (Azure Kubernetes Service)

Azure Kubernetes Service (AKS) är en hanterad Kubernetes-tjänst som gör att du snabbt kan distribuera och hantera Kubernetes-kluster. I den här artikeln kommer du att:

  • Distribuera ett AKS-kluster med hjälp av Azure CLI som innehåller OpenID Anslut Issuer och ett Microsoft Entra-arbetsbelastnings-ID
  • Bevilja åtkomst till ditt Azure Key Vault
  • Skapa ett Microsoft Entra-arbetsbelastnings-ID och Kubernetes-tjänstkonto
  • Konfigurera den hanterade identiteten för tokenfederation.

Den här artikeln förutsätter att du har en grundläggande förståelse för Kubernetes-begrepp. Mer information finns i Viktiga koncept för Azure Kubernetes Service (AKS). Om du inte är bekant med Microsoft Entra-arbetsbelastnings-ID kan du läsa följande översiktsartikel .

  • Den här artikeln kräver version 2.47.0 eller senare av Azure CLI. Om du använder Azure Cloud Shell är den senaste versionen redan installerad.

  • Den identitet som du använder för att skapa klustret har lämpliga minimibehörigheter. Mer information om åtkomst och identitet för AKS finns i Åtkomst- och identitetsalternativ för Azure Kubernetes Service (AKS).

  • Om du har flera Azure-prenumerationer väljer du lämpligt prenumerations-ID där resurserna ska faktureras med kommandot az account .

Kommentar

I stället för att konfigurera alla steg manuellt finns det en annan implementering som heter Service Anslut or som hjälper dig att konfigurera vissa steg automatiskt och uppnå samma resultat. Se även: Självstudie: Anslut till Azure Storage-konto i Azure Kubernetes Service (AKS) med Service Anslut eller med hjälp av arbetsbelastningsidentitet.

Exportera miljövariabler

För att förenkla stegen för att konfigurera de identiteter som krävs definierar stegen nedan miljövariabler som referens i klustret.

Kör följande kommandon för att skapa dessa variabler. Ersätt standardvärdena för RESOURCE_GROUP, LOCATION, SERVICE_ACCOUNT_NAME, SUBSCRIPTION, USER_ASSIGNED_IDENTITY_NAMEoch 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"

Skapa AKS-kluster

Skapa ett AKS-kluster med kommandot az aks create med parametern --enable-oidc-issuer för att använda OIDC-utfärdaren. I följande exempel skapas ett kluster med namnet myAKSCluster med en nod i myResourceGroup:

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

Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.

Kommentar

När du skapar ett AKS-kluster skapas en andra resursgrupp automatiskt för att lagra AKS-resurserna. Mer information finns i Varför skapas två resursgrupper med AKS?.

Uppdatera ett befintligt AKS-kluster

Du kan uppdatera ett AKS-kluster med kommandot az aks update med parametern --enable-oidc-issuer--enable-workload-identity och för att använda OIDC-utfärdaren och aktivera arbetsbelastningsidentitet. I följande exempel uppdateras ett kluster med namnet myAKSCluster:

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

Hämta url:en för OIDC-utfärdaren

Kör följande kommando för att hämta url:en för OIDC-utfärdaren och spara den i en miljövariabel. Ersätt standardvärdet för argumenten -n, som är namnet på klustret:

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

Variabeln ska innehålla utfärdar-URL:en som liknar följande exempel:

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

Som standard är utfärdaren inställd på att använda bas-URL:en https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid}, där värdet för {region} matchar platsen där AKS-klustret distribueras. Värdet {uuid} representerar OIDC-nyckeln.

Skapa en hanterad identitet

Använd kommandot Azure CLI az account set för att ange en specifik prenumeration som den aktuella aktiva prenumerationen. Använd sedan kommandot az identity create för att skapa en hanterad identitet.

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

Nu ska vi skapa en variabel för det hanterade identitets-ID:t.

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

Skapa Kubernetes-tjänstkonto

Skapa ett Kubernetes-tjänstkonto och kommentera det med klient-ID:t för den hanterade identiteten som skapades i föregående steg. Använd kommandot az aks get-credentials och ersätt värdena för klusternamnet och resursgruppens namn.

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

Kopiera och klistra in följande indata med flera rader i Azure CLI.

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

Följande utdata liknar lyckade skapande av identiteten:

serviceaccount/workload-identity-sa created

Upprätta federerade identitetsautentiseringsuppgifter

Använd kommandot az identity federated-credential create för att skapa den federerade identitetsautentiseringsuppgiften mellan den hanterade identiteten, utfärdaren av tjänstkontot och ämnet.

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

Kommentar

När autentiseringsuppgifterna för federerade identiteter har lagts till tar det några sekunder innan de sprids. Om en tokenbegäran görs omedelbart efter att den federerade identitetsautentiseringsuppgiften har lagts till kan det leda till fel i ett par minuter eftersom cachen fylls i i katalogen med gamla data. För att undvika det här problemet kan du lägga till en liten fördröjning när du har lagt till den federerade identitetsautentiseringsuppgiften.

Distribuera appen

När du distribuerar programpoddar bör manifestet referera till tjänstkontot som skapades i steget Skapa Kubernetes-tjänstkonto . Följande manifest visar hur du refererar till kontot, särskilt metadata\namespace och spec\serviceAccountName-egenskaper :

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

Viktigt!

Se till att dina programpoddar som använder arbetsbelastningsidentitet har lagt till följande etikett azure.workload.identity/use: "true" i poddspecifikationen, annars misslyckas poddarna när de har startats om.

Valfritt – Bevilja behörigheter för åtkomst till Azure Key Vault

Det här steget är nödvändigt om du behöver komma åt hemligheter, nycklar och certifikat som monteras i Azure Key Vault från en podd. Utför följande steg för att konfigurera åtkomst med en hanterad identitet. De här stegen förutsätter att du redan har skapat och konfigurerat ett Azure Key Vault i din prenumeration. Om du inte har något kan du läsa Skapa ett Azure Key Vault med hjälp av Azure CLI.

Innan du fortsätter behöver du följande information:

  • Namn på Nyckelvalvet
  • Resursgrupp som innehåller Nyckelvalvet

Du kan hämta den här informationen med hjälp av Azure CLI-kommandot az keyvault list.

  1. Ange en åtkomstprincip för den hanterade identiteten för åtkomst till hemligheter i ditt Key Vault genom att köra följande kommandon:

    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. Skapa en hemlighet i Key Vault:

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

    export KEYVAULT_URL="$(az keyvault show -g ${KEYVAULT_RESOURCE_GROUP} -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
    
  4. Distribuera en podd som refererar till tjänstkontot och Key Vault-URL:en ovan:

    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
    

Om du vill kontrollera om alla egenskaper matas in korrekt av webhooken använder du kommandot kubectl describe :

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

Om det lyckas bör utdata se ut ungefär så här:

      SECRET_NAME:                 ${KEYVAULT_SECRET_NAME}

Om du vill kontrollera att podden kan hämta en token och komma åt resursen använder du kommandot kubectl logs:

kubectl logs quick-start

Om det lyckas bör utdata se ut ungefär så här:

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

Inaktivera arbetsbelastningsidentitet

Om du vill inaktivera Microsoft Entra-arbetsbelastnings-ID:t i AKS-klustret där det har aktiverats och konfigurerats kan du köra följande kommando:

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

Nästa steg

I den här artikeln distribuerade du ett Kubernetes-kluster och konfigurerade det att använda en arbetsbelastningsidentitet inför programarbetsbelastningar för att autentisera med den autentiseringsuppgiften. Nu är du redo att distribuera ditt program och konfigurera det så att det använder arbetsbelastningsidentiteten med den senaste versionen av Azure Identity-klientbiblioteket . Om du inte kan skriva om programmet för att använda den senaste klientbiblioteksversionen kan du konfigurera programpodden att autentisera med hanterad identitet med arbetsbelastningsidentitet som en kortsiktig migreringslösning.