Condividi tramite


Risolvere i problemi del componente aggiuntivo Provider di segreti di Azure Key Vault nel servizio Azure Kubernetes

Questo articolo illustra come risolvere i problemi che possono verificarsi quando si usa il componente aggiuntivo Provider di segreti di Azure Key Vault in servizio Azure Kubernetes (servizio Azure Kubernetes).

Note

Questo articolo si applica alla versione del componente aggiuntivo gestito del servizio Azure Kubernetes del provider di segreti di Azure Key Vault. Se si usa la versione helm installata (autogestita), passare alla documentazione di GitHub del provider di Azure Key Vault per l'archivio segreti CSI Driver .

Prerequisiti

Elenco di controllo per la risoluzione dei problemi

Passaggio 1: Verificare che il componente aggiuntivo Provider di segreti di Azure Key Vault sia abilitato nel cluster

Eseguire il comando az aks show per verificare che il componente aggiuntivo sia abilitato nel cluster:

az aks show -g <aks-resource-group-name> -n <aks-name> --query 'addonProfiles.azureKeyvaultSecretsProvider'

L'output del comando dovrebbe essere simile al testo seguente:

{
  "config": null,
  "enabled": true,
  "identity": {
    "clientId": "<client-id>",
    "objectId": "<object-id>",
    "resourceId": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<azure-key-vault-secrets-provider-identity-name>"
  }
}

Se il enabled flag viene visualizzato come false nell'output precedente, il componente aggiuntivo Provider di segreti di Azure Key Vault non è abilitato nel cluster. In questo caso, fare riferimento alla documentazione di GitHub del provider di Azure Key Vault per l'archivio di segreti CSI driver per altri problemi.

Se il enabled flag viene visualizzato come true nell'output precedente, il componente aggiuntivo Provider di segreti di Azure Key Vault è abilitato nel cluster. In questo caso, andare ai passaggi successivi in questo articolo.

Passaggio 2: Controllare i log del provider dell'archivio segreti e dei pod del driver CSI

I log dei componenti aggiuntivi del provider di segreti di Azure Key Vault vengono generati sia da provider che da pod driver. Per risolvere i problemi che interessano il provider o il driver, esaminare i log del pod in esecuzione nello stesso nodo del pod dell'applicazione.

  1. Eseguire il comando kubectl get per trovare i pod del provider dell'archivio segreti e del driver CSI eseguiti nello stesso nodo in cui viene eseguito il pod dell'applicazione:

    kubectl get pod -l 'app in (secrets-store-provider-azure, secrets-store-csi-driver)' -n kube-system -o wide
    
  2. Eseguire il comando kubectl logs per visualizzare i log dal pod del provider dell'archivio segreti:

    kubectl logs -n kube-system <provider-pod-name> --since=1h | grep ^E
    
  3. Eseguire il comando kubectl logs per visualizzare i log dal pod del driver CSI dell'archivio segreti:

    kubectl logs -n kube-system <csi-driver-pod-name> -c secrets-store --since=1h | grep ^E
    

Dopo aver raccolto i log del provider dell'archivio segreti e dei pod del driver CSI, analizzare questi log in base alle cause indicate nelle sezioni seguenti per identificare il problema e la soluzione corrispondente.

Note

Se si apre una richiesta di supporto, è consigliabile includere i log pertinenti dal provider di Azure Key Vault e dal driver CSI dell'archivio segreti.

Causa 1: non è stato possibile recuperare il token dell'insieme di credenziali delle chiavi

È possibile che venga visualizzata la voce di errore seguente nei log o nei messaggi di evento:

Avviso FailedMount 74s kubelet MountVolume.SetUp non riuscito per il volume "secrets-store-inline" : kubernetes.io/csi: mounter. SetupAt failed: rpc error: code = Unknown desc = failed to mount secrets store objects for pod default/test, err: rpc error: code = Unknown desc = failed to mount objects, error: failed to get keyvault client: failed to get key vault token: nmi response failed with status code: 404, err: <nil>

Questo errore si verifica perché un componente NMI (Node Managed Identity) in aad-pod-identity ha restituito un messaggio di errore relativo a una richiesta di token.

Soluzione 1: Controllare i log dei pod NMI

Per altre informazioni su questo errore e su come risolverlo, controllare i log dei pod NMI e fare riferimento alla guida alla risoluzione dei problemi di identità dei pod di Microsoft Entra.

Causa 2: il pod del provider non può accedere all'istanza dell'insieme di credenziali delle chiavi

È possibile che venga visualizzata la voce di errore seguente nei log o nei messaggi di evento:

E1029 17:37:42.461313 1 server.go:54] non è riuscito a elaborare la richiesta di montaggio, errore: keyvault. BaseClient#GetSecret: Richiesta di invio non riuscita: StatusCode=0 -- Errore originale: scadenza del contesto superata

Questo errore si verifica perché il pod del provider non può accedere all'istanza dell'insieme di credenziali delle chiavi. L'accesso potrebbe essere impedito per uno dei motivi seguenti:

  • Una regola del firewall blocca il traffico in uscita dal provider.

  • I criteri di rete configurati nel cluster del servizio Azure Kubernetes bloccano il traffico in uscita.

  • I pod del provider vengono eseguiti nella rete host. Un errore può verificarsi se un criterio blocca questo traffico o se si verificano problemi di rete nel nodo.

Soluzione 2: Controllare i criteri di rete, l'elenco di elementi consentiti e la connessione al nodo

Per risolvere il problema, eseguire le azioni seguenti:

  • Inserire i pod del provider nell'elenco elementi consentiti.

  • Verificare la presenza di criteri configurati per bloccare il traffico.

  • Assicurarsi che il nodo disponga della connettività all'ID Microsoft Entra e all'insieme di credenziali delle chiavi.

Per testare la connettività all'insieme di credenziali delle chiavi di Azure dal pod in esecuzione nella rete host, seguire questa procedura:

  1. Creare il pod:

    cat <<EOF | kubectl apply --filename -
    apiVersion: v1
    kind: Pod
    metadata:
      name: curl
    spec:
      hostNetwork: true
      containers:
      - args:
        - tail
        - -f
        - /dev/null
        image: curlimages/curl:7.75.0
        name: curl
      dnsPolicy: ClusterFirst
      restartPolicy: Always
    EOF
    
  2. Eseguire kubectl exec per eseguire un comando nel pod creato:

    kubectl exec --stdin --tty  curl -- sh
    
  3. Eseguire l'autenticazione con l'insieme di credenziali delle chiavi di Azure:

    curl -X POST 'https://login.microsoftonline.com/<aad-tenant-id>/oauth2/v2.0/token' \
         -d 'grant_type=client_credentials&client_id=<azure-client-id>&client_secret=<azure-client-secret>&scope=https://vault.azure.net/.default'
    
  4. Provare a ottenere un segreto già creato nell'insieme di credenziali delle chiavi di Azure:

    curl -X GET 'https://<key-vault-name>.vault.azure.net/secrets/<secret-name>?api-version=7.2' \
         -H "Authorization: Bearer <access-token-acquired-above>"
    

Causa 3: l'identità gestita assegnata dall'utente non è corretta nella risorsa personalizzata SecretProviderClass

Se si verifica un codice di errore HTTP "400" che è accompagnato da una descrizione dell'errore "Identità non trovata", l'identità gestita assegnata dall'utente non è corretta nella SecretProviderClass risorsa personalizzata. La risposta completa è simile al testo seguente:

MountVolume.SetUp failed for volume "<volume-name>" :  
  rpc error:  
    code = Unknown desc = failed to mount secrets store objects for pod <namespace>/<pod>,  
    err: rpc error: code = Unknown desc = failed to mount objects,  
    error: failed to get objectType:secret, objectName:<key-vault-secret-name>, objectVersion:: azure.BearerAuthorizer#WithAuthorization:  
      Failed to refresh the Token for request to https://<key-vault-name>.vault.azure.net/secrets/<key-vault-secret-name>/?api-version=2016-10-01:  
        StatusCode=400 -- Original Error: adal: Refresh request failed.  
        Status Code = '400'.  
        Response body: {"error":"invalid_request","error_description":"Identity not found"}  
        Endpoint http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&client_id=<userAssignedIdentityID>&resource=https%!!(MISSING)A(MISSING)%!!(MISSING)F(MISSING)%!!(MISSING)F(MISSING)vault.azure.net

Soluzione 3: Aggiornare SecretProviderClass usando il valore userAssignedIdentityID corretto

Trovare l'identità gestita assegnata dall'utente corretta e quindi aggiornare la SecretProviderClass risorsa personalizzata per specificare il valore corretto nel userAssignedIdentityID parametro . Per trovare l'identità gestita assegnata dall'utente corretta, eseguire il comando az aks show seguente nell'interfaccia della riga di comando di Azure:

az aks show --resource-group <resource-group-name> \
    --name <cluster-name> \
    --query addonProfiles.azureKeyvaultSecretsProvider.identity.clientId \
    --output tsv

Per informazioni su come configurare una SecretProviderClass risorsa personalizzata in formato YAML, vedere la sezione Usare un'identità gestita assegnata dall'utente nell'articolo Fornire un'identità per accedere al provider di Azure Key Vault per il driver CSI dell'archivio segreti.

Causa 4: l'endpoint privato di Key Vault si trova in una rete virtuale diversa rispetto ai nodi del servizio Azure Kubernetes

L'accesso alla rete pubblica non è consentito a livello di Azure Key Vault e la connettività tra servizio Azure Kubernetes e Key Vault viene effettuata tramite un collegamento privato. Tuttavia, i nodi del servizio Azure Kubernetes e l'endpoint privato dell'insieme di credenziali delle chiavi si trovano in reti virtuali diverse. Questo scenario genera un messaggio simile al testo seguente:

MountVolume.SetUp failed for volume "<volume>" :  
  rpc error:  
    code = Unknown desc = failed to mount secrets store objects for pod <namespace>/<pod>,  
    err: rpc error: code = Unknown desc = failed to mount objects,  
    error: failed to get objectType:secret, objectName: :<key-vault-secret-name>, objectVersion:: keyvault.BaseClient#GetSecret:  
      Failure responding to request:  
        StatusCode=403 -- Original Error: autorest/azure: Service returned an error.  
        Status=403 Code="Forbidden"  
        Message="Public network access is disabled and request is not from a trusted service nor via an approved private link.\r\n  
        Caller: appid=<application-id>;oid=<object-id>;iss=https://sts.windows.net/<id>/;xms_mirid=/subscriptions/<subscription-id>/resourcegroups/<aks-infrastructure-resource-group>/providers/Microsoft.Compute/virtualMachineScaleSets/aks-<nodepool-name>-<nodepool-id>-vmss;xms_az_rid=/subscriptions/<subscription-id>/resourcegroups/<aks-infrastructure-resource-group>/providers/Microsoft.Compute/virtualMachineScaleSets/aks-<nodepool-name>-<nodepool-id>-vmss \r\n  
        Vault: <keyvaultname>;location=<location>" InnerError={"code":"ForbiddenByConnection"}

La correzione del problema di connettività è in genere un processo in due passaggi:

  • Creare un collegamento di rete virtuale per la rete virtuale del cluster servizio Azure Kubernetes a livello di zona DNS di Azure privato.

  • Aggiungere il peering di rete virtuale tra la rete virtuale del cluster servizio Azure Kubernetes e la rete virtuale dell'endpoint privato di Key Vault.

Questi passaggi vengono descritti in modo più dettagliato nelle sezioni seguenti.

Connettersi ai nodi del cluster del servizio Azure Kubernetes per determinare se il nome di dominio completo (FQDN) dell'insieme di credenziali delle chiavi viene risolto tramite un indirizzo IP pubblico o un indirizzo IP privato. Se viene visualizzato il messaggio di errore "L'accesso alla rete pubblica è disabilitato e la richiesta non proviene da un servizio attendibile né tramite un collegamento privato approvato", l'endpoint dell'insieme di credenziali delle chiavi viene probabilmente risolto tramite un indirizzo IP pubblico. Per verificare la presenza di questo scenario, eseguire il comando nslookup :

nslookup <key-vault-name>.vault.azure.net

Se il nome di dominio completo viene risolto tramite un indirizzo IP pubblico, l'output del comando è simile al testo seguente:

root@aks-<nodepool-name>-<nodepool-id>-vmss<scale-set-instance>:/# nslookup <key-vault-name>.vault.azure.net
Server:         168.63.129.16
Address:        168.63.129.16#53

Non-authoritative answer:
<key-vault-name>.vault.azure.net  canonical name = <key-vault-name>.privatelink.vaultcore.azure.net.
<key-vault-name>.privatelink.vaultcore.azure.net  canonical name = data-prod.weu.vaultcore.azure.net.
data-prod-weu.vaultcore.azure.net  canonical name = data-prod-weu-region.vaultcore.azure.net.
data-prod-weu-region.vaultcore.azure.net  canonical name = azkms-prod-weu-b.westeurope.cloudapp.azure.com.
Name:   azkms-prod-weu-b.westeurope.cloudapp.azure.com
Address: 20.1.2.3

In questo caso, creare un collegamento di rete virtuale per la rete virtuale del cluster servizio Azure Kubernetes a livello di zona DNS privato. Un collegamento di rete virtuale viene già creato automaticamente per la rete virtuale dell'endpoint privato di Key Vault.

Per creare il collegamento della rete virtuale, seguire questa procedura:

  1. Nella portale di Azure cercare e selezionare DNS privato zone.

  2. Nell'elenco delle zone DNS private selezionare il nome della zona DNS privata. In questo esempio la zona DNS privata è privatelink.vaultcore.azure.net.

  3. Nel riquadro di spostamento della zona DNS privata individuare l'intestazione Impostazioni e quindi selezionare Collegamenti di rete virtuale.

  4. Nell'elenco dei collegamenti di rete virtuale selezionare Aggiungi.

  5. Nella pagina Aggiungi collegamento alla rete virtuale completare i campi seguenti.

    Nome campo Azione
    Nome collegamento Immettere un nome da usare per il collegamento alla rete virtuale.
    Abbonamento Selezionare il nome della sottoscrizione che si vuole contenere il collegamento alla rete virtuale.
    Rete virtuale Selezionare il nome della rete virtuale del cluster del servizio Azure Kubernetes.
  6. Selezionare il pulsante OK.

Dopo aver completato la procedura di creazione del collegamento, eseguire il nslookup comando . L'output dovrebbe ora essere simile al testo seguente che mostra una risoluzione DNS più diretta:

root@aks-<nodepool-name>-<nodepool-id>-vmss<scale-set-instance>:/# nslookup <key-vault-name>.vault.azure.net
Server:         168.63.129.16
Address:        168.63.129.16#53

Non-authoritative answer:
<key-vault-name>.vault.azure.net  canonical name = <key-vault-name>.privatelink.vaultcore.azure.net.
Name:   <key-vault-name>.privatelink.vaultcore.azure.net
Address: 172.20.0.4

Dopo aver aggiunto il collegamento alla rete virtuale, il nome di dominio completo deve essere risolvibile tramite un indirizzo IP privato.

Passaggio 2: Aggiungere il peering di rete virtuale tra reti virtuali

Se si usa un endpoint privato, è probabile che l'accesso pubblico sia stato disabilitato a livello di Key Vault. Di conseguenza, non esiste alcuna connettività tra il servizio Azure Kubernetes e l'insieme di credenziali delle chiavi. È possibile testare la configurazione usando il comando Netcat (nc) seguente:

nc -v -w 2 <key-vault-name>.vault.azure.net 443

Se la connettività non è disponibile tra il servizio Azure Kubernetes e l'insieme di credenziali delle chiavi, viene visualizzato un output simile al testo seguente:

nc: connect to <key-vault-name>.vault.azure.net port 443 (tcp) timed out: Operation now in progress

Per stabilire la connettività tra servizio Azure Kubernetes e Key Vault, aggiungere il peering di rete virtuale tra le reti virtuali seguendo questa procedura:

  1. Vai al portale di Azure.

  2. Usare una delle opzioni seguenti per seguire le istruzioni della sezione Creare un peer di rete virtuale dell'esercitazione: Connettere reti virtuali con peering di rete virtuale usando l'articolo portale di Azure per eseguire il peering delle reti virtuali e verificare che le reti virtuali siano connesse (da un'unica estremità):

    • Passare alla rete virtuale del servizio Azure Kubernetes ed eseguirne il peering alla rete virtuale dell'endpoint privato di Key Vault.

    • Passare alla rete virtuale dell'endpoint privato di Key Vault ed eseguire il peering alla rete virtuale del servizio Azure Kubernetes.

  3. Nella portale di Azure cercare e selezionare il nome dell'altra rete virtuale (la rete virtuale a cui è stato eseguito il peering nel passaggio precedente).

  4. Nel riquadro di spostamento della rete virtuale individuare l'intestazione Impostazioni e quindi selezionare Peering.

  5. Nella pagina peering di rete virtuale verificare che la colonna Nome contenga il nome del collegamento peering della rete virtuale remota specificata nel passaggio 2. Assicurarsi inoltre che la colonna Stato peering per il collegamento di peering abbia un valore Connesso.

Dopo aver completato questa procedura, è possibile eseguire di nuovo il comando Netcat. La risoluzione DNS e la connettività tra il servizio Azure Kubernetes e l'insieme di credenziali delle chiavi dovrebbero ora avere esito positivo. Assicurarsi inoltre che i segreti di Key Vault siano montati correttamente e funzionino come previsto, come illustrato nell'output seguente:

Connection to <key-vault-name>.vault.azure.net 443 port [tcp/https] succeeded!

Soluzione 4b: Risolvere i problemi relativi al codice di errore 403

Risolvere i problemi relativi al codice di errore "403" esaminando la sezione HTTP 403: Autorizzazioni insufficienti dell'articolo di riferimento codici di errore dell'API REST di Azure Key Vault.

Causa 5: il driver secrets-store.csi.k8s.io non è presente nell'elenco dei driver CSI registrati

Se viene visualizzato il seguente messaggio di errore relativo a un driver mancante secrets-store.csi.k8s.io negli eventi del pod, i pod del driver CSI dell'archivio segreti non vengono eseguiti nel nodo in cui è in esecuzione l'applicazione:

Avviso FailedMount 42s (x12 over 8m56s) kubelet, akswin000000 MountVolume.SetUp failed for volume "secrets-store01-inline" : kubernetes.io/csi: mounter. SetUpAt non è riuscito a ottenere il client CSI: il nome del driver secrets-store.csi.k8s.io non trovato nell'elenco dei driver CSI registrati

Soluzione 5: Risolvere i problemi del pod del driver CSI dell'archivio segreti in esecuzione nello stesso nodo

Recuperare lo stato del pod del driver CSI dell'archivio segreto in esecuzione nello stesso nodo eseguendo il comando seguente:

kubectl get pod -l app=secrets-store-csi-driver -n kube-system -o wide

Se lo stato del pod non Running è o nessuno dei contenitori in questo pod non è nello Ready stato, procedere con la verifica dei log per questo pod seguendo i passaggi descritti in Controllare i log del provider dell'archivio segreti e dei pod del driver CSI.

Causa 6: SecretProviderClass non trovato

Quando si descrive il pod dell'applicazione, potrebbe essere visualizzato l'evento seguente:

Events:
  Type     Reason       Age               From               Message
  ----     ------       ----              ----               -------
  Warning  FailedMount  2s (x5 over 10s)  kubelet            MountVolume.SetUp failed for volume "xxxxxxx" : rpc error: code = Unknown desc = failed to get secretproviderclass xxxxxxx/xxxxxxx, error: SecretProviderClass.secrets-store.csi.x-k8s.io "xxxxxxxxxxxxx" not found

Questo evento indica che il SecretProviderClass riferimento nella specifica del volume del pod non esiste nello stesso spazio dei nomi del pod dell'applicazione.

Soluzione 6a: Creare la risorsa SecretProviderClass mancante

Assicurarsi che la SecretProviderClass risorsa a cui si fa riferimento nella specifica del volume del pod esista nello stesso spazio dei nomi in cui è in esecuzione il pod dell'applicazione.

Soluzione 6b: Modificare la specifica del volume del pod dell'applicazione per fare riferimento al nome di risorsa SecretProviderClass corretto

Modificare la specifica del volume del pod dell'applicazione per fare riferimento al nome della risorsa corretto SecretProviderClass :

...
spec:
  containers:
  ...
  volumes:
    - name: my-volume
      csi:
        driver: secrets-store.csi.k8s.io
        readOnly: true
        volumeAttributes:
          secretProviderClass: "xxxxxxxxx"

Causa 7: La richiesta non è autenticata

La richiesta non è autenticata per Key Vault, come indicato da un codice di errore "401".

Soluzione 7: Risolvere i problemi relativi al codice di errore 401

Risolvere i problemi relativi al codice di errore "401" esaminando la sezione "HTTP 401: Richiesta non autenticata" dell'articolo di riferimento codici di errore dell'API REST di Azure Key Vault.

Causa 8: il numero di richieste supera il valore massimo indicato

Il numero di richieste supera il valore massimo indicato per l'intervallo di tempo, come indicato da un codice di errore "429".

Soluzione 8: Risolvere i problemi relativi al codice di errore 429

Risolvere i problemi relativi al codice di errore "429" esaminando la sezione "HTTP 429: Troppe richieste" dell'articolo di riferimento codici di errore dell'API REST di Azure Key Vault.

Dichiarazione di non responsabilità sulle informazioni di terze parti

I prodotti di terzi citati in questo articolo sono prodotti da società indipendenti da Microsoft. Microsoft non rilascia alcuna garanzia implicita o esplicita relativa alle prestazioni o all'affidabilità di tali prodotti

Contattaci per ricevere assistenza

In caso di domande o bisogno di assistenza, creare una richiesta di supporto tecnico oppure formula una domanda nel Supporto della community di Azure. È possibile anche inviare un feedback sul prodotto al feedback della community di Azure.