Condividi tramite


Risoluzione dei problemi relativi al certificato CA plug-in istio service mesh

Questo articolo illustra la risoluzione dei problemi comuni relativi alla funzionalità dei certificati dell'autorità di certificazione (CA) del componente aggiuntivo Istio e offre soluzioni per risolvere questi problemi. L'articolo esamina anche il processo generale di configurazione dei certificati CA plug-in per il componente aggiuntivo service mesh.

Note

Questo articolo presuppone che la revisione asm-1-21 Istio sia distribuita nel cluster.

Prerequisiti

Processo di configurazione generale

  • Prima di abilitare il componente aggiuntivo Istio per usare la funzionalità certificati CA plug-in, è necessario abilitare il componente aggiuntivo Azure Key Vault per l'archivio segreti nel cluster. Assicurarsi che Azure Key Vault e il cluster si trovino nello stesso tenant di Azure.

  • Dopo aver abilitato il componente aggiuntivo del provider di segreti di Azure Key Vault, è necessario configurare l'accesso all'insieme di credenziali delle chiavi di Azure per l'identità gestita assegnata dall'utente creata dal componente aggiuntivo.

  • Dopo aver concesso l'autorizzazione per l'identità gestita assegnata dall'utente per accedere ad Azure Key Vault, è possibile usare la funzionalità certificati CA plug-in insieme al componente aggiuntivo Istio. Per altre informazioni, vedere la sezione Abilitare il componente aggiuntivo Istio per l'uso di un certificato CA plug-in.

  • Per consentire al cluster di rilevare automaticamente le modifiche nei segreti di Azure Key Vault, è necessario abilitare la rotazione automatica per il componente aggiuntivo del provider di segreti di Azure Key Vault.

  • Anche se le modifiche apportate al certificato intermedio vengono applicate automaticamente, le modifiche apportate al certificato radice vengono prelevate solo dal piano di controllo dopo il riavvio della istiod distribuzione da parte di un cronjob distribuito dal componente aggiuntivo, come illustrato nella sezione Risorse distribuite. Questo processo cronjob viene eseguito a intervalli di 10 minuti.

Abilitare il componente aggiuntivo Istio per l'uso di un certificato ca plug-in

La funzionalità certificati CA plug-in del componente aggiuntivo Istio consente di configurare i certificati radice e intermedi del plug-in per la mesh. Per fornire informazioni sul certificato plug-in quando si abilita il componente aggiuntivo, specificare i parametri seguenti per il comando az aks mesh enable nell'interfaccia della riga di comando di Azure.

Parametro Descrizione
--key-vault-id<resource-id> ID risorsa di Azure Key Vault. Questa risorsa dovrebbe trovarsi nello stesso tenant del cluster gestito. Questo ID risorsa deve essere nel formato dell'ID risorsa del modello di Azure Resource Manager (modello di Resource Manager).
--root-cert-object-name<root-cert-obj-name> Nome dell'oggetto certificato radice in Azure Key Vault.
--ca-cert-object-name<inter-cert-obj-name> Nome dell'oggetto certificato intermedio nell'insieme di credenziali delle chiavi di Azure.
--ca-key-object-name<inter-key-obj-name> Nome dell'oggetto chiave privata del certificato intermedio nell'insieme di credenziali delle chiavi di Azure.
--cert-chain-object-name<cert-chain-obj-name> Nome dell'oggetto catena di certificati in Azure Key Vault.

Se si vuole usare la funzionalità certificati CA plug-in, è necessario specificare tutti e cinque i parametri. Tutti gli oggetti di Azure Key Vault devono essere di tipo Segreto.

Per altre informazioni, vedere Plug in CA certificates for Istio-based service mesh add-on servizio Azure Kubernetes.

Risorse distribuite

Nell'ambito della distribuzione del componente aggiuntivo per la funzionalità dei certificati plug-in, nel cluster vengono distribuite le risorse seguenti:

  • Il cacerts segreto Kubernetes viene creato nello aks-istio-system spazio dei nomi al momento della distribuzione del componente aggiuntivo. Questo segreto contiene segreti sincronizzati di Azure Key Vault:

    kubectl describe secret cacerts --namespace aks-istio-system
    
    Name:         cacerts
    Namespace:    aks-istio-system
    Labels:       secrets-store.csi.k8s.io/managed=true
    Annotations:  <none>
    
    Type:  opaque
    
    Data
    ====
    ca-cert.pem:     1968 bytes
    ca-key.pem:      3272 bytes
    cert-chain.pem:  3786 bytes
    root-cert.pem:   3636 bytes
    
  • L'oggetto istio-spc-asm-1-21 SecretProviderClass viene creato nello aks-istio-system spazio dei nomi al momento della distribuzione del componente aggiuntivo. Questa risorsa contiene parametri specifici di Azure per il driver CSI (Secrets Store Container Storage Interface):

    kubectl get secretproviderclass --namespace aks-istio-system
    
    NAME                 AGE
    istio-spc-asm-1-21   14h
    
  • Il istio-ca-root-cert file configmap viene creato nello aks-istio-system spazio dei nomi e in tutti gli spazi dei nomi gestiti dall'utente. Questo configmap contiene il certificato radice usato dall'autorità di certificazione e viene usato dai carichi di lavoro negli spazi dei nomi per convalidare la comunicazione da carico di lavoro a carico di lavoro, come indicato di seguito:

    kubectl describe configmap istio-ca-root-cert --namespace aks-istio-system
    
    Name:         istio-ca-root-cert
    Namespace:    aks-istio-system
    Labels:       istio.io/config=true
    Annotations:  <none>
    
    Data
    ====
    root-cert.pem:
    ----
    -----BEGIN CERTIFICATE-----
    <certificate data>
    -----END CERTIFICATE-----
    
  • L'oggetto istio-cert-validator-cronjob-asm-1-21 cronjob viene creato nello spazio dei aks-istio-system nomi . Questo processo cronjob è pianificato per l'esecuzione ogni 10 minuti per verificare la presenza di aggiornamenti nel certificato radice. Se il certificato radice presente nel cacerts segreto Kubernetes non corrisponde alla istio-ca-root-cert mappa di configurazione nello spazio dei aks-istio-system nomi, riavvia la istiod-asm-1-21 distribuzione:

    kubectl get cronjob --namespace aks-istio-system
    
    NAME                                    SCHEDULE       SUSPEND   ACTIVE
    istio-cert-validator-cronjob-asm-1-21   */10 * * * *   False     0     
    

    È possibile eseguire il comando seguente per controllare i log di cronjob per l'ultima esecuzione:

    kubectl logs --namespace aks-istio-system $(kubectl get pods --namespace aks-istio-system | grep 'istio-cert-validator-cronjob-' | sort -k8 | tail -n 1 | awk '{print $1}')
    

    Questo comando genera uno dei messaggi di output seguenti, a seconda che sia stato rilevato un aggiornamento del certificato radice:

    Root certificate update not detected.
    
    Root certificate update detected. Restarting deployment...
    deployment.apps/istiod-asm-1-21 restarted
    Deployment istiod-asm-1-21 restarted.
    

Determinare il tipo di certificato nei log di distribuzione

È possibile visualizzare i istiod log di distribuzione per determinare se si dispone di un certificato CA autofirmato o di un certificato della CA plug-in. Per visualizzare i log, eseguire il comando seguente:

kubectl logs deploy/istiod-asm-1-21 --container discovery --namespace aks-istio-system | grep -v validationController

Immediatamente prima di ogni voce del log del certificato è un'altra voce di log che descrive quel tipo di certificato. Per un certificato della CA autofirmato, la voce indica "Nessun certificato plugged-in all'indirizzo etc/cacerts/ca-key.pem; viene usato il certificato autofirmato." Per un certificato plug-in, la voce indica "Usa certificato plugged-in in etc /cacerts/ca-key.pem". Le voci di log di esempio relative ai certificati sono illustrate nelle tabelle seguenti.

  • Voci di log per un certificato della CA autofirmato

    Timestamp: Livello log Message
    2023-11-20T23:27:36.649019Z info Uso del formato di file istiod per la firma di file ca
    2023-11-20T23:27:36.649032Z info Nessun certificato plug-in in in etc/cacerts/ca-key.pem; viene usato il certificato autofirmato
    2023-11-20T23:27:36.649536Z info Certificato x509 - <Dettagli certificato>
    2023-11-20T23:27:36.649552Z info I certificati Istiod vengono ricaricati
    2023-11-20T23:27:36.649613Z info spiffe Aggiunta di 1 certificato per considerare attendibile cluster.local nel verificatore di certificati peer
  • Voci di log per un certificato della CA plug-in

    Timestamp: Livello log Message
    2023-11-21T00:20:25.808396Z info Uso del formato di file istiod per la firma di file ca
    2023-11-21T00:20:25.808412Z info Usare il certificato plug-in in in etc/cacerts/ca-key.pem
    2023-11-21T00:20:25.808731Z info Certificato x509 - <Dettagli certificato>
    2023-11-21T00:20:25.808764Z info Certificato x509 - <Dettagli certificato>
    2023-11-21T00:20:25.808799Z info Certificato x509 - <Dettagli certificato>
    2023-11-21T00:20:25.808803Z info I certificati Istiod vengono ricaricati
    2023-11-21T00:20:25.808873Z info spiffe Aggiunta di 1 certificato per considerare attendibile cluster.local nel verificatore di certificati peer

I dettagli del certificato in una voce di log vengono visualizzati come valori delimitati da virgole per l'autorità di certificazione, il soggetto, il numero di serie (SN, una stringa esadecimale lunga) e i valori timestamp iniziale e finale che definiscono quando il certificato è valido.

Per un certificato ca autofirmato, è disponibile una voce di dettaglio. I valori di esempio per questo certificato sono illustrati nella tabella seguente.

Autorità di certificazione Oggetto SN NotBefore NotAfter
"O=cluster.local" "" <Valore esadecimale a 32 cifre> "2023-11-20T23:25:36Z" "2033-11-17T23:27:36Z"

Per un certificato CA plug-in, sono disponibili tre voci di dettaglio. Le altre due voci sono relative a un aggiornamento del certificato radice e a una modifica al certificato intermedio. I valori di esempio per queste voci sono illustrati nella tabella seguente.

Autorità di certificazione Oggetto SN NotBefore NotAfter
CN=Intermediate CA - A1,O=Istio,L=cluster-A1" "" <Valore esadecimale a 32 cifre> "2023-11-21T00:18:25Z" "2033-11-18T00:20:25Z"
CN=Root A,O=Istio" "CN=Intermediate CA - A1,O=Istio,L=cluster-A1" <Valore esadecimale a 40 cifre> "2023-11-04T01:40:22Z" "2033-11-01T01:40:22Z"
CN=Root A,O=Istio" "CN=Root A,O=Istio" <Valore esadecimale a 40 cifre> "2023-11-04T01:38:27Z" "2033-11-01T01:38:27Z"

Risolvere i problemi comuni

Problema 1: L'accesso ad Azure Key Vault non è configurato correttamente

Dopo aver abilitato il componente aggiuntivo del provider di segreti di Azure Key Vault, è necessario concedere l'accesso per l'identità gestita assegnata dall'utente del componente aggiuntivo all'insieme di credenziali delle chiavi di Azure. La configurazione dell'accesso ad Azure Key Vault causa un blocco dell'installazione del componente aggiuntivo.

kubectl get pods --namespace aks-istio-system

Nell'elenco dei pod è possibile vedere che i istiod-asm-1-21 pod sono bloccati in uno Init:0/2 stato.

NOME READY STATO RIAVVII AGE
istiod-asm-1-21-6fcfd88478-2x95b 0/1 Terminating 0 5m55s
istiod-asm-1-21-6fcfd88478-6x5hh 0/1 Terminating 0 5m40s
istiod-asm-1-21-6fcfd88478-c48f9 0/1 Init:0/2 0 54s
istiod-asm-1-21-6fcfd88478-wl8mw 0/1 Init:0/2 0 39 s

Per verificare il problema di accesso ad Azure Key Vault, eseguire il kubectl get pods comando per individuare i pod con l'etichetta secrets-store-provider-azure nello spazio dei kube-system nomi :

kubectl get pods --selector app=secrets-store-provider-azure --namespace kube-system --output name | xargs -I {} kubectl logs --namespace kube-system {}

L'output di esempio seguente mostra che si è verificato un errore "403 Accesso negato" perché non si dispone delle autorizzazioni "get" per i segreti nell'insieme di credenziali delle chiavi:

"failed to process mount request" err="failed to get objectType:secret, objectName:<secret-object-name>, objectVersion:: keyvault. BaseClient#GetSecret: Errore durante la risposta alla richiesta: StatusCode=403 -- Errore originale: autorest/azure: Il servizio ha restituito un errore. Status=403 Code=\"Forbidden\" Message=\"The user, group or application 'appid=<appid>; oid=<oid>; iss=<iss>' non dispone dell'autorizzazione per ottenere segreti per l'insieme di credenziali delle chiavi 'MyAzureKeyVault; location=eastus'. Per informazioni sulla risoluzione di questo problema, vedere https://go.microsoft.com/fwlink/?linkid=2125287\" InnerError={\"code\":\"AccessDenied\"}"

Per risolvere questo problema, configurare l'accesso all'identità gestita assegnata dall'utente per il componente aggiuntivo del provider di segreti di Azure Key Vault ottenendo le autorizzazioni Get e List per i segreti di Azure Key Vault e reinstallando il componente aggiuntivo Istio. Ottenere prima di tutto l'ID oggetto dell'identità gestita assegnata dall'utente per il componente aggiuntivo del provider di segreti di Azure Key Vault eseguendo il comando az aks show :

OBJECT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId')

Per impostare i criteri di accesso, eseguire il comando az keyvault set-policy seguente specificando l'ID oggetto ottenuto:

az keyvault set-policy --name $AKV_NAME --object-id $OBJECT_ID --secret-permissions get list

Note

È stato creato l'insieme di credenziali delle chiavi usando l'autorizzazione del controllo degli accessi in base al ruolo di Azure per il modello di autorizzazione anziché i criteri di accesso all'insieme di credenziali? In questo caso, vedere Fornire l'accesso a chiavi, certificati e segreti di Key Vault con un controllo degli accessi in base al ruolo di Azure per creare autorizzazioni per l'identità gestita. Aggiungere un'assegnazione di ruolo di Azure per il lettore di Key Vault per l'identità gestita assegnata dall'utente del componente aggiuntivo.

Problema 2: il rilevamento automatico delle modifiche ai segreti di Key Vault non è configurato

Per consentire a un cluster di rilevare automaticamente le modifiche nei segreti di Azure Key Vault, è necessario abilitare la rotazione automatica per il componente aggiuntivo del provider di Azure Key Vault. La rotazione automatica può rilevare automaticamente le modifiche nei certificati intermedi e radice. Per un cluster che abilita il componente aggiuntivo del provider di Azure Key Vault, eseguire il comando seguente az aks show per verificare se la rotazione automatica è abilitata:

az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.enableSecretRotation'

Se il cluster ha abilitato il componente aggiuntivo del provider di Azure Key Vault, eseguire il comando seguente az aks show per determinare l'intervallo di polling della rotazione:

az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.rotationPollInterval'

I segreti di Azure Key Vault vengono sincronizzati con il cluster quando il tempo di polling scade dopo la sincronizzazione precedente. Il valore di intervallo predefinito è di due minuti.

Problema 3: I valori del certificato sono mancanti o sono configurati in modo non corretto

Se gli oggetti segreti non sono presenti in Azure Key Vault o se questi oggetti sono configurati in modo non corretto, i istiod-asm-1-21 pod potrebbero rimanere bloccati in uno Init:0/2 stato, ritardando l'installazione del componente aggiuntivo. Per trovare la causa sottostante di questo problema, eseguire il comando seguente kubectl describe sulla istiod distribuzione e visualizzare l'output:

kubectl describe deploy/istiod-asm-1-21 --namespace aks-istio-system

Il comando visualizza eventi che potrebbero essere simili alla tabella di output seguente. In questo esempio, un segreto mancante è la causa del problema.

Type Motivo Età Da Message
Normale Pianificati 3m9s utilità di pianificazione predefinita Assegnata correttamente aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj a aks-userpool-24672518-vmss0000000
Avviso FailedMount 66 kubelet Impossibile collegare o montare volumi: volumi smontati=[cacerts], volumi non collegati=[], impossibile elaborare volumi=[]: timeout in attesa della condizione
Avviso FailedMount 61s (x9 oltre 3m9s) kubelet MountVolume.SetUp non riuscito per il volume "cacerts" : errore rpc: code = Unknown desc = failed to mount secrets store objects for pod aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj, err: rpc error: code = Unknown desc = failed to mount objects, error: failed to get objectType:secret, objectName:test-cert-chain, objectVersion:: keyvault. BaseClient#GetSecret: Errore durante la risposta alla richiesta: StatusCode=404 -- Errore originale: autorest/azure: Il servizio ha restituito un errore. Status=404 Code="SecretNotFound" Message="Un segreto con (name/id) test-cert-chain non è stato trovato in questo insieme di credenziali delle chiavi. Se il segreto è stato eliminato di recente, è possibile recuperarlo usando il comando di ripristino corretto. Per informazioni sulla risoluzione di questo problema, vedere https://go.microsoft.com/fwlink/?linkid=2125182"

Risorse

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

Dichiarazione di non responsabilità di contatti di terze parti

Microsoft fornisce informazioni di contatto di terze parti per aiutarti a trovare ulteriori informazioni su questo argomento. Queste informazioni di contatto sono soggette a modifica senza preavviso. Microsoft non garantisce l'accuratezza delle informazioni di contatto di terze parti.

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.