Condividi tramite


Distribuire e configurare l'identità del carico di lavoro in un servizio Azure Kubernetes abilitato dal cluster Azure Arc (anteprima)

Si applica a: Locale di Azure, versione 23H2

La federazione dell'identità del carico di lavoro consente di configurare un'identità gestita assegnata dall'utente o la registrazione dell'app in Microsoft Entra ID per considerare attendibili i token da un provider di identità esterno (IdP), ad esempio Kubernetes, consentendo l'accesso alle risorse protette da Microsoft Entra, ad esempio Azure Key Vault o Archiviazione BLOB di Azure.

servizio Azure Kubernetes (servizio Azure Kubernetes) abilitato da Azure Arc è un servizio Kubernetes gestito che consente di distribuire facilmente cluster Kubernetes abilitati per l'identità del carico di lavoro. Questo articolo descrive come eseguire le attività seguenti:

  • Creare un cluster Arc del servizio Azure Kubernetes con l'identità del carico di lavoro abilitata (anteprima).
  • Creare un account del servizio Kubernetes e associarlo all'identità gestita di Azure.
  • Creare una credenziale federata nell'identità gestita per considerare attendibile l'emittente OIDC.
  • Distribuire l'applicazione.
  • Esempio: concedere a un pod nel cluster l'accesso ai segreti in un insieme di credenziali delle chiavi di Azure.

Per una panoramica concettuale della federazione delle identità del carico di lavoro, consultare Federazione delle identità del carico di lavoro in Kubernetes abilitato con Azure Arc (anteprima).

Importante

Queste funzionalità di anteprima sono disponibili in modalità self-service e acconsentono esplicitamente. Le anteprime vengono fornite "così come sono" e "come disponibili" e sono escluse dai contratti di servizio e dalla garanzia limitata. servizio Azure Kubernetes, abilitate dalle anteprime di Azure Arc, sono parzialmente coperte dal supporto tecnico per il massimo sforzo.

Nota

Nell'anteprima pubblica, AKS su Azure Locale, versione 23H2, supporta l'abilitazione dell'identità del carico di lavoro durante la creazione del cluster AKS. Tuttavia, l'abilitazione dell'identità del carico di lavoro dopo la creazione del cluster o la disabilitazione successiva non è attualmente supportata.

Prerequisiti

Prima di distribuire un cluster Kubernetes con Azure Arc abilitato, è necessario disporre dei prerequisiti seguenti:

  • Se non hai un abbonamento Azure, crea un account gratuito prima di iniziare.
  • Questo articolo richiede la versione 1.4.23 o successiva dell'interfaccia della riga di comando di Azure. Se si usa Azure Cloud Shell, la versione più recente è già installata.

Esportare le variabili di ambiente

Per semplificare la procedura per configurare le identità necessarie, i comandi seguenti definiscono le variabili di ambiente a cui si fa riferimento negli esempi di questo articolo. Sostituire i valori seguenti con valori personalizzati:

$AZSubscriptionID = "00000000-0000-0000-0000-000000000000" 
$Location = "westeurope" 
$resource_group_name = "myResourceGroup" 

$aks_cluster_name = "myAKSCluster" 

$SERVICE_ACCOUNT_NAMESPACE = "default" 
$SERVICE_ACCOUNT_NAME = "workload-identity-sa" 

$FedIdCredentialName = "myFedIdentity" 
$MSIName = "myIdentity" 

# To access key vault secrets from a pod in the cluster, include these variables:
$KVName = "KV-workload-id" 
$KVSecretName= "KV-secret"

Impostare la sottoscrizione attiva

Prima di tutto, impostare la sottoscrizione come sottoscrizione attiva corrente. Eseguire il comando az account set con l'ID sottoscrizione:

az login  
az account set -s $AZSubscriptionID

Creare un gruppo di risorse

Un gruppo di risorse di Azure è un gruppo logico in cui le risorse di Azure vengono distribuite e gestite. Quando si crea un gruppo di risorse, viene richiesto di specificare una posizione. Questa posizione è la posizione di archiviazione dei metadati del gruppo di risorse e dove le risorse vengono eseguite in Azure se non si specifica un'altra regione durante la creazione della risorsa.

Per creare un gruppo di risorse, eseguire il comando az group create:

az group create --name $resource_group_name --location $Location

L'output di esempio seguente mostra la corretta creazione di un gruppo di risorse:

{ 
  "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup", 
  "location": "westeurope", 
  "managedBy": null, 
  "name": "$resource_group_name", 
  "properties": { 
    "provisioningState": "Succeeded" 
  }, 
  "tags": null 
}

Passaggio 1: Creare un cluster Arc del servizio Azure Kubernetes con l'identità del carico di lavoro abilitata

Per creare un cluster Arc del servizio Azure Kubernetes, sono necessari sia i $customlocation_ID valori e $logicnet_Id .

  • $customlocation_ID: ID di Azure Resource Manager del percorso personalizzato. Il percorso personalizzato viene configurato durante la distribuzione del cluster locale di Azure, versione 23H2. L'amministratore dell'infrastruttura deve fornire l'ID resource manager della posizione personalizzata. È anche possibile ottenere l'ID di Resource Manager usando $customlocation_ID = $(az customlocation show --name "<your-custom-location-name>" --resource-group $resource_group_name --query "id" -o tsv), se l'amministratore dell'infrastruttura fornisce un nome di percorso personalizzato e un nome del gruppo di risorse.
  • $logicnet_Id: ID di Azure Resource Manager della rete logica locale di Azure creata seguendo questa procedura. L'amministratore dell'infrastruttura deve fornire l'ID di Resource Manager della rete logica. È anche possibile ottenere l'ID di Resource Manager usando $logicnet_Id = $(az stack-hci-vm network lnet show --name "<your-lnet-name>" --resource-group $resource_group_name --query "id" -o tsv), se l'amministratore dell'infrastruttura fornisce un nome di rete logico e un nome del gruppo di risorse.

Eseguire il comando az aksarc create con il --enable-oidc-issuer --enable-workload-identity parametro . Specificare entra-admin-group-object-ids e assicurarsi di essere membri del gruppo di amministrazione di Microsoft Entra ID per l'accesso in modalità proxy:

az aksarc create  
-n $aks_cluster_name -g $resource_group_name  
--custom-location $customlocation_ID --vnet-ids $logicnet_Id  
--aad-admin-group-object-ids <entra-admin-group-object-ids> 
--generate-ssh-keys  
--enable-oidc-issuer --enable-workload-identity

Il comando viene completato dopo pochi minuti e vengono restituite informazioni in formato JSON sul cluster.

La distribuzione dell'estensione dell'identità del carico di lavoro potrebbe richiedere del tempo dopo aver creato correttamente un cluster di cui è stato effettuato il provisioning. Usare il comando seguente per controllare lo stato dell'estensione dell'identità del carico di lavoro:

az connectedk8s show -n $aks_cluster_name -g $resource_group_name
# agentState = "Succeeded" 
"agentPublicKeyCertificate": "", 
  "agentVersion": "1.21.10", 
  "arcAgentProfile": { 
    "agentAutoUpgrade": "Enabled", 
    "agentErrors": [], 
    "agentState": "Succeeded", 
    "desiredAgentVersion": "", 
    "systemComponents": null 

# oidcIssuerProfile "enabled": true and "issuerUrl" present 

"oidcIssuerProfile": { 
    "enabled": true, 
    "issuerUrl": "https://oidcdiscovery-{location}-endpoint-1111111111111111.000.azurefd.net/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/"}

Nella portale di Azure è possibile visualizzare l'estensione wiextension nella sezione Proprietà del cluster Kubernetes.

Importante

Nell'ambito del miglioramento della sicurezza per i cluster Arc del servizio Azure Kubernetes, l'abilitazione dell'identità del carico di lavoro attiva due modifiche. Prima di tutto, la chiave di firma dell'account del servizio Kubernetes ruota automaticamente ogni 45 giorni e rimane valida per 90 giorni. In secondo luogo, il --service-account-extend-token-expiration flag è disabilitato, riducendo la validità del token da un anno a un massimo di 24 ore.

Salvare l'URL dell'autorità emittente OIDC in una variabile di ambiente

Dopo aver creato correttamente il cluster del servizio Azure Kubernetes, è possibile ottenere l'URL dell'autorità emittente OIDC e salvarlo in una variabile di ambiente. Esegui questo comando:

$SERVICE_ACCOUNT_ISSUER =$(az connectedk8s show --n $aks_cluster_name --resource-group $resource_group_name --query "oidcIssuerProfile.issuerUrl" --output tsv)

Passaggio 2: Creare un account del servizio Kubernetes e associarlo all'identità gestita di Azure

Creare prima di tutto un'identità gestita. Eseguire il comando az identity create :

az identity create --name $MSIName --resource-group $resource_group_name --location $Location --subscription $AZSubscriptionID

Creare quindi variabili per l'ID client dell'identità gestita:

$MSIId=$(az identity show --resource-group $resource_group_name --name $MSIName --query 'clientId' --output tsv)
$MSIPrincipalId=$(az identity show --resource-group $resource_group_name --name $MSIName --query 'principalId' --output tsv)

Creare un account del servizio Kubernetes

Creare un account del servizio Kubernetes e annotarlo con l'ID client dell'identità gestita creata nel passaggio precedente:

az connectedk8s proxy -n $aks_cluster_name -g $resource_group_name

Aprire una nuova finestra. Copiare e incollare i comandi dell'interfaccia della riga di comando seguenti:

$yaml = @" apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: $MSIId name: $SERVICE_ACCOUNT_NAME namespace: $SERVICE_ACCOUNT_NAMESPACE "@ $yaml = $yaml -replace '\$MSIId', $MSIId ` -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME ` -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE $yaml | kubectl apply -f -

L'output seguente mostra la corretta creazione dell'account del servizio:

serviceaccount/workload-identity-sa created

Passaggio 3: Creare una credenziale federata nell'identità gestita per considerare attendibile l'emittente OIDC

Creare prima di tutto una credenziale di identità federata. Chiamare il comando az identity federated-credential create per creare le credenziali di identità federata tra l'identità gestita, l'autorità di certificazione dell'account del servizio e l'oggetto. Per altre informazioni sulle credenziali di identità federate in Microsoft Entra, vedere Panoramica delle credenziali di identità federate in Microsoft Entra ID.

# Create a federated credential 

az identity federated-credential create --name $FedIdCredentialName --identity-name $MSIName --resource-group $resource_group_name --issuer $SERVICE_ACCOUNT_ISSUER --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}" 

# Show the federated credential 

az identity federated-credential show --name $FedIdCredentialName --resource-group $resource_group_name --identity-name $MSIName

Nota

Dopo aver aggiunto una credenziale di identità federata, la propagazione richiede alcuni secondi. Le richieste di token effettuate immediatamente dopo potrebbero non riuscire finché la cache non viene aggiornata. Per evitare questo problema, prendere in considerazione l'aggiunta di un breve ritardo dopo la creazione delle credenziali dell'identità federata.

Passaggio 4: Distribuire l'applicazione

Quando si distribuiscono i pod dell'applicazione, il manifesto deve fare riferimento all'account del servizio creato nel passaggio Creare l'account del servizio Kubernetes. Il manifesto seguente mostra come fare riferimento all'account, in particolare le metadata\namespace proprietà e spec\serviceAccountName . Assicurarsi di specificare un'immagine per image e un nome del contenitore per containerName:

$image = "<image>"  # Replace <image> with the actual image name 
$containerName = "<containerName>"  # Replace <containerName> with the actual container name 

$yaml = @" 
apiVersion: v1 
kind: Pod 
metadata: 
  name: sample-quick-start 
  namespace: $SERVICE_ACCOUNT_NAMESPACE 
  labels: 
    azure.workload.identity/use: "true" # Required. Only pods with this label can use workload identity. 
spec: 
  serviceAccountName: $SERVICE_ACCOUNT_NAME 
  containers: 
    - image: $image 
      name: $containerName 
"@ 

# Replace variables within the YAML content 
$yaml = $yaml -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE ` 
                -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME 

# Apply the YAML configuration 
$yaml | kubectl apply -f - 

Importante

Assicurarsi che i pod dell'applicazione che usano l'identità del carico di lavoro includano l'etichetta azure.workload.identity/use: "true" nella specifica del pod. In caso contrario, i pod avranno esito negativo dopo il riavvio.

Esempio: Concedere le autorizzazioni per accedere ad Azure Key Vault

Le istruzioni in questo passaggio descrivono come accedere a segreti, chiavi o certificati in un insieme di credenziali delle chiavi di Azure dal pod. Gli esempi in questa sezione configurano l'accesso ai segreti in Key Vault per l'identità del carico di lavoro, ma è possibile eseguire passaggi simili per configurare l'accesso a chiavi o certificati.

L'esempio seguente illustra come usare il modello di autorizzazione Controllo degli accessi in base al ruolo di Azure per concedere al pod l'accesso a Key Vault. Per altre informazioni sul modello di autorizzazione Controllo degli accessi in base al ruolo di Azure per Azure Key Vault, vedere Concedere alle applicazioni l'autorizzazione per accedere ad Azure Key Vault usando il controllo degli accessi in base al ruolo di Azure.

  1. Creare un'istanza di Key Vault con la protezione dall'eliminazione e l'autorizzazione di Controllo degli accessi in base al ruolo abilitata. È anche possibile usare un'istanza di Key Vault esistente se è configurata sia per la protezione dall'eliminazione che per l'autorizzazione di Controllo degli accessi in base al ruolo:

    az keyvault create --name $KVName --resource-group $resource_group_name --location $Location --enable-purge-protection --enable-rbac-authorization
    
    # retrieve the key vault ID for role assignment
    $KVId=$(az keyvault show --resource-group $resource_group_name --name $KVName --query id --output tsv)
    
  2. Assegnare il ruolo Di responsabile dei segreti dell'insieme di credenziali delle chiavi di Controllo degli accessi in base al ruolo a se stessi in modo da poter creare un segreto nel nuovo insieme di credenziali delle chiavi. La propagazione delle nuove assegnazioni di ruolo può richiedere fino a cinque minuti, e possono essere aggiornate dal server di autorizzazione.

    az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets Officer" --scope $KVId --assignee-principal-type ServicePrincipal
    
  3. Creare un segreto in Key Vault:

    az keyvault secret set --vault-name $KVName --name $KVSecretName --value "Hello!"
    
  4. Assegnare il ruolo Utente dei segreti di Key Vault all'identità gestita assegnata dall'utente creata in precedenza. Questo passaggio concede all'identità gestita l'autorizzazione per leggere i segreti da Key Vault:

    az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets User" --scope $KVId --assignee-principal-type ServicePrincipal
    
  5. Creare una variabile di ambiente per l'URL di Key Vault:

    $KVUrl=$(az keyvault show --resource-group $resource_group_name --name $KVName --query properties.vaultUri --output tsv)
    
  6. Distribuire un pod che fa riferimento all'account del servizio e all'URL di Key Vault:

    $yaml = @" 
    apiVersion: v1 
    kind: Pod 
    metadata: 
      name: sample-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: $KVUrl 
          - name: SECRET_NAME 
            value: $KVSecretName 
      nodeSelector: 
        kubernetes.io/os: linux 
    "@ 
    
    # Replace variables within the YAML content 
    $yaml = $yaml -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE ` 
                    -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME ` 
                    -replace '\$KVUrl', $KVUrl ` 
                    -replace '\$KVSecretName', $KVSecretName 
    
    # Apply the YAML configuration 
    $yaml | kubectl --kubeconfig <path-to-aks-cluster-kubeconfig> apply -f -
    

Eliminare il cluster AKS Arc

Per eliminare il cluster AKS Arc, usare il comando az aksarc delete:

az aksarc delete -n $aks_cluster_name -g $resource_group_name

Nota

Si è verificato un problema noto durante l'eliminazione di un cluster AKS Arc con risorse PodDisruptionBudget (PDB): l'eliminazione potrebbe non riuscire a rimuovere queste risorse PDB. Microsoft è a conoscenza del problema e sta lavorando a una correzione.

PDB viene installato per impostazione predefinita nei cluster AKS Arc abilitati per l'identità del carico di lavoro. Per eliminare un cluster AKS Arc con identità del carico di lavoro abilitata, vedere la guida alla risoluzione dei problemi .

Passaggi successivi

In questo articolo è stato distribuito e configurato un cluster Kubernetes per l'uso di un'identità dei carichi di lavoro in preparazione per l'autenticazione dei carichi di lavoro dell'applicazione con tale credenziale. A questo punto è possibile distribuire l'applicazione e configurarla per usare l'identità dei carichi di lavoro con la versione più recente della libreria client Identità di Azure.