Risolvere i problemi relativi al provider di Key Vault di Azure per il driver CSI dell'archivio segreti
Questo articolo illustra i problemi comuni che potrebbero verificarsi quando si usa il driver CSI (Microsoft Azure Key Vault Provider for Secrets Store Container Storage Interface) in servizio Azure Kubernetes (AKS). L'articolo fornisce suggerimenti per la risoluzione di questi problemi.
Prerequisiti
Strumento Kubernetes kubectl (per installare kubectl usando l'interfaccia della riga di comando di Azure, eseguire il comando az aks install-cli ).
Componente aggiuntivo Del driver CSI dell'archivio segreti Kubernetes , abilitato nel cluster del servizio Azure Kubernetes
Strumento URL client (curl)
Strumento da riga di comando Netcat (
nc
) per le connessioni TCP
Elenco di controllo per la risoluzione dei problemi
I log Key Vault di Azure sono disponibili nei pod del provider e del driver. Per risolvere i problemi che interessano il provider o il driver, esaminare i log del provider o del pod del driver in esecuzione nello stesso nodo in cui viene eseguito il pod dell'applicazione.
Passaggio 1 della risoluzione dei problemi: controllare i log del provider dell'archivio segreti
Per trovare il secrets-store-provider-azure
pod eseguito nello stesso nodo in cui viene eseguito il pod dell'applicazione, eseguire i comandi kubectl get e kubectl logs seguenti che selezionano l'applicazione secrets-store-provider-azure
:
kubectl get pods --selector 'app in (csi-secrets-store-provider-azure, secrets-store-provider-azure)' \
--all-namespaces \
--output wide
kubectl logs <provider-pod-name> --since=1h | grep ^E
Passaggio 2 della risoluzione dei problemi: Controllare i log dei driver CSI dell'archivio segreti
Per accedere ai log del driver CSI dell'archivio segreti, eseguire gli stessi comandi del passaggio 1, ma selezionare invece l'applicazione secrets-store-csi-driver
e specificare il secrets-store
contenitore:
kubectl get pods --selector app=secrets-store-csi-driver --all-namespaces --output wide
kubectl logs <driver-pod-name> --container secrets-store --since=1h | grep ^E
Nota
Se si apre una richiesta di supporto, è consigliabile includere i log pertinenti del provider di Azure Key Vault e del driver CSI dell'archivio segreti.
Causa 1: Impossibile recuperare il token dell'insieme di credenziali delle chiavi
Nei log o nei messaggi di evento potrebbe essere visualizzata la voce di errore seguente:
Avviso FailedMount 74s kubelet MountVolume.SetUp failed for 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 DIM (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 relativi all'identità del pod Microsoft Entra.
Causa 2: il pod del provider non può accedere all'istanza dell'insieme di credenziali delle chiavi
Nei log o nei messaggi di evento potrebbe essere visualizzata la voce di errore seguente:
E1029 17:37:42.461313 1 server.go:54] non è riuscito a elaborare la richiesta di montaggio, errore: keyvault. BaseClient#GetSecret: Errore durante l'invio della richiesta: 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 il traffico o se si verificano instabilità di rete nel nodo.
Soluzione 2: Controllare i criteri di rete, l'elenco di indirizzi consentiti e la connessione al nodo
Per risolvere il problema, eseguire le azioni seguenti:
Inserire i pod del provider nell'elenco consentiti.
Verificare la presenza di criteri configurati per bloccare il traffico.
Assicurarsi che il nodo disponga della connettività a Microsoft Entra ID 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:
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
Eseguire kubectl exec per eseguire un comando nel pod creato:
kubectl exec --stdin --tty curl -- sh
Eseguire l'autenticazione usando 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'
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'istanza del codice di errore HTTP "400" accompagnata 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'utentedell'articolo Fornire un'identità per accedere al driver CSI provider di Azure Key Vault per l'archivio segreti.
Causa 4: l'endpoint privato 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 Key Vault di Azure 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 del Key Vault 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"}
Soluzione 4a: Configurare un collegamento di rete virtuale e un peering di rete virtuale per connettere le reti virtuali
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 del servizio Azure Kubernetes a livello di zona DNS di Azure privato .
Aggiungere il peering di rete virtuale tra la rete virtuale del cluster del servizio Azure Kubernetes e la rete virtuale dell'endpoint privato Key Vault.
Questi passaggi sono descritti in modo più dettagliato nelle sezioni seguenti.
Passaggio 1: Creare il collegamento di rete virtuale
Connettersi ai nodi del cluster del servizio Azure Kubernetes per determinare se il nome di dominio completo (FQDN) del Key Vault viene risolto tramite un indirizzo IP pubblico o un indirizzo IP privato. Se si riceve il messaggio di errore "Accesso alla rete pubblica disabilitato e la richiesta non proviene da un servizio attendibile né tramite un collegamento privato approvato", l'endpoint Key Vault probabilmente viene 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 sarà 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 del servizio Azure Kubernetes a livello di zona DNS privato. Un collegamento di rete virtuale è già stato creato automaticamente per la rete virtuale dell'endpoint privato Key Vault.
Per creare il collegamento alla rete virtuale, seguire questa procedura:
Nel portale di Azure cercare e selezionare DNS privato zone.
Nell'elenco delle zone DNS private selezionare il nome della zona DNS privata. In questo esempio la zona DNS privata viene privatelink.vaultcore.azure.net.
Nel riquadro di spostamento della zona DNS privata individuare l'intestazione Impostazioni e quindi selezionare Collegamenti di rete virtuale.
Nell'elenco dei collegamenti di rete virtuale selezionare Aggiungi.
Nella pagina Aggiungi collegamento alla rete virtuale completare i campi seguenti.
Nome del 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 di rete virtuale. Rete virtuale Selezionare il nome della rete virtuale del cluster del servizio Azure Kubernetes. Fare clic sul 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. Pertanto, non esiste alcuna connettività tra il servizio Azure Kubernetes e il Key Vault. È possibile testare tale configurazione usando il comando Netcat (nc) seguente:
nc -v -w 2 <key-vault-name>.vault.azure.net 443
Se la connettività tra il servizio Azure Kubernetes e il Key Vault non è disponibile, 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 il servizio Azure Kubernetes e il Key Vault, aggiungere il peering di rete virtuale tra le reti virtuali seguendo questa procedura:
Andare al portale di Azure.
Usare una delle opzioni seguenti per seguire le istruzioni riportate nella sezione Creare un peer di rete virtualedell'esercitazione: Connettere le reti virtuali con il 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'estremità):
Passare alla rete virtuale del servizio Azure Kubernetes e eseguirne il peering alla rete virtuale dell'endpoint privato Key Vault.
Passare alla rete virtuale dell'endpoint privato Key Vault e eseguirne il peering alla rete virtuale del servizio Azure Kubernetes.
Nel portale di Azure cercare e selezionare il nome dell'altra rete virtuale (la rete virtuale a cui è stato peering nel passaggio precedente).
Nel riquadro di spostamento della rete virtuale individuare l'intestazione Impostazioni e quindi selezionare Peering.
Nella pagina peering della 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 il 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 il Key Vault dovrebbero ora avere esito positivo. Assicurarsi inoltre che i segreti 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 Azure Key Vault codici errore API REST.
Causa 5: il driver secrets-store.csi.k8s.io non è presente nell'elenco dei driver CSI registrati
Se viene visualizzato il messaggio di errore seguente relativo a un driver mancante secrets-store.csi.k8s.io
negli eventi del pod, i pod del driver CSI dell'archivio segreti non sono in esecuzione 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 è stato trovato nell'elenco dei driver CSI registrati
Soluzione 5a: Installare il driver CSI dell'archivio segreti
Se è stato installato il provider di Key Vault usando i manifesti di distribuzione, seguire le istruzioni per installare il driver CSI dell'archivio segreti.
Soluzione 5b: ridistribuire il driver CSI dell'archivio segreti e il provider di Key Vault aggiungendo la tolleranza di taint
Se è già stato distribuito il driver CSI dell'archivio segreti, verificare se il nodo è contaminato. Se il nodo è contaminato, ridistribuire il driver CSI dell'archivio segreti e Key Vault provider aggiungendo la tolleranza per i taints.
Soluzione 5c: (solo Windows) Usare i valori di configurazione Helm durante l'installazione del driver CSI dell'archivio segreti e del provider di Key Vault
Se l'applicazione è in esecuzione in un nodo Windows, installare il driver CSI dell'archivio segreti e il provider di Key Vault nei nodi Windows usando i valori di configurazione Helm.
Causa 6: il driver non può comunicare con il provider
Se nei log o negli eventi viene visualizzato il messaggio di errore seguente, il driver non può comunicare con il provider:
Avviso FailedMount 85s (x10 over 5m35s) kubelet, aks-default-28951543-vmss000000 MountVolume.SetUp failed for volume "secrets-store01-inline" : kubernetes.io/csi: mounter. SetupAt failed: rpc error: code = Unknown desc = failed to mount secrets store objects for pod default/nginx-secrets-store-inline-user-msi, err: failed to find provider binary azure, err: stat /etc/kubernetes/secrets-store-csi-providers/azure/provider-azure: no such file or directory
Soluzione 6a: (versioni del provider precedenti alla versione 0.0.9) Assicurarsi che i pod del provider vengano eseguiti in tutti i nodi
Se la versione del provider di Key Vault installata è precedente alla versione 0.0.9, assicurarsi che i pod del provider siano in esecuzione in tutti i nodi.
Soluzione 6b: (provider versione 0.0.9 e successive) Usare gRPC per la comunicazione del provider
Se è stato installato Key Vault provider versione 0.0.9 o successiva, configurare il driver per comunicare con il provider usando gRPC.
Causa 7: il driver CSI non è in grado di creare il segreto Kubernetes
Se viene visualizzato il messaggio di errore seguente nel contenitore dell'archivio segreto nel driver CSI, non sono stati installati il ruolo del cluster controllo degli accessi in base al ruolo e l'associazione di ruoli del cluster. Il ruolo del cluster e l'associazione del ruolo del cluster sono necessari per consentire al driver CSI di sincronizzare il contenuto montato come segreto Kubernetes.
E0610 22:27:02.283100 1 secretproviderclasspodstatus_controller.go:325] "failed to create Kubernetes secret" err="secrets is forbidden: User \"system:serviceaccount:default:secrets-store-csi-driver\" cannot create resource \"secrets\" in API group \"\" nello spazio dei nomi \"default\"" spc="default/azure-linux" pod="default/busybox-linux-5f479855f7-jvfw4" secret="default/dockerconfig" spcps="default/busybox-linux-5f479855f7-jvfw4-default-azure-linux"
Soluzione 7: installare il ruolo del cluster e l'associazione di ruoli del cluster necessari
Quando si installa o si aggiorna il driver CSI e il provider di Key Vault usando i grafici Helm dal repository GitHub secrets-store-csi-driver-provider-azure, impostare il secrets-store-csi-driver.syncSecret.enabled
parametro Helm su true
. Questa modifica di configurazione installa il ruolo del cluster e l'associazione di ruoli del cluster necessari.
Per verificare che il ruolo del cluster e l'associazione di ruoli del cluster siano installati, eseguire i comandi seguenti kubectl get
:
# Synchronize as Kubernetes secret cluster role.
kubectl get clusterrole/secretprovidersyncing-role
# Synchronize as Kubernetes secret cluster role binding.
kubectl get clusterrolebinding/secretprovidersyncing-rolebinding
Causa 8: la richiesta non è autenticata
La richiesta non è autenticata per Key Vault, come indicato da un codice di errore "401".
Soluzione 8: 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 Sui codici di errore dell'API REST di Azure Key Vault.
Causa 9: il numero di richieste supera il numero massimo indicato
Il numero di richieste supera il limite massimo indicato per l'intervallo di tempo, come indicato da un codice di errore "429".
Soluzione 9: 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 Sui 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.
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per