Configurare un nome di dominio personalizzato e un certificato SSL con il componente aggiuntivo di routing dell'applicazione

Un ingresso è un oggetto API che definisce le regole che consentono l'accesso esterno ai servizi in un cluster del servizio Azure Kubernetes. Quando si crea un oggetto ingresso che usa le classi nginx Ingress del componente aggiuntivo di routing dell'applicazione, il componente aggiuntivo crea, configura e gestisce uno o più controller in ingresso nel cluster del servizio Azure Kubernetes.

Questo articolo illustra come impostare una configurazione avanzata in ingresso per crittografare il traffico con certificati SSL/TLS archiviati in Azure Key Vault e usare DNS di Azure per gestire le zone DNS.

Componente aggiuntivo di routing dell’applicazione con funzionalità nginx

Il componente aggiuntivo di routing dell'applicazione con nginx offre quanto segue:

  • Configurazione semplice dei controller in ingresso nginx gestiti.
  • Integrazione con un DNS esterno, ad esempio DNS di Azure per la gestione globale e privata delle zone
  • Terminazione SSL con certificati archiviati in un insieme di credenziali delle chiavi, come Azure Key Vault.

Prerequisiti

  • Un cluster del servizio Azure Kubernetes con il componente aggiuntivo Instradamento dell'applicazione.
  • Azure Key Vault se si vuole configurare la terminazione SSL e archiviare i certificati nell'insieme di credenziali delle chiavi ospitato in Azure.
  • DNS di Azure se si vuole configurare la gestione delle zone globali e private e ospitarle in Azure.
  • Per collegare un'istanza di Azure Key Vault o una zona DNS di Azure, è necessario il ruolo Proprietario, Amministratore account di Azure o Coamministratore di Azure nella sottoscrizione di Azure.
  • Tutte le zone DNS pubbliche devono trovarsi nella stessa sottoscrizione e nello stesso gruppo di risorse.

Connettersi al cluster del servizio Azure Kubernetes

Per connettersi al cluster Kubernetes dal computer locale, si usa kubectl, ovvero il client da riga di comando di Kubernetes. È possibile installarlo in locale con il comando az aks install-cli. Se si usa Azure Cloud Shell, kubectl è già installato.

Per configurare kubectl per connettersi al cluster Kubernetes, usare il comando az aks get-credentials.

az aks get-credentials --resource-group <ResourceGroupName> --name <ClusterName>

Terminare il traffico HTTPS con certificati da Azure Key Vault

Per abilitare il supporto per il traffico HTTPS, vedere i prerequisiti seguenti:

  • Un certificato SSL. Se non si ha un certificato, è possibile crearne uno.

Creare un'istanza di Azure Key Vault per archiviare il certificato

Nota

Se si dispone già di un'istanza di Azure Key Vault, ignorare questo passaggio.

Creare un'istanza di Azure Key Vault usando il comando az keyvault create.

az keyvault create --resource-group <ResourceGroupName> --location <Location> --name <KeyVaultName> --enable-rbac-authorization true

Creare ed esportare un certificato SSL autofirmato

Per i test, è possibile usare un certificato pubblico autofirmato anziché un certificato firmato dall'autorità di certificazione (CA). Se si dispone già di un certificato, ignorare questo passaggio.

Attenzione

I certificati autofirmati sono certificati digitali non firmati da una CA di terze parti attendibile. I certificati autofirmati vengono creati, rilasciati e firmati dall'azienda o dallo sviluppatore responsabile della firma del sito Web o del software. Ecco perché i certificati autofirmati sono considerati non sicuri per siti Web e applicazioni pubblici. Azure Key Vault ha una relazione considerata attendibile con alcune autorità di certificazione.

  1. Creare un certificato SSL autofirmato da usare con Ingress con il comando openssl req. Assicurarsi di sostituire <Hostname> con il nome DNS in uso.

    openssl req -new -x509 -nodes -out aks-ingress-tls.crt -keyout aks-ingress-tls.key -subj "/CN=<Hostname>" -addext "subjectAltName=DNS:<Hostname>"
    
  2. Esportare il certificato SSL e ignorare la richiesta di immissione della password usando il comando openssl pkcs12 -export.

    openssl pkcs12 -export -in aks-ingress-tls.crt -inkey aks-ingress-tls.key -out aks-ingress-tls.pfx
    

Importare il certificato in Azure Key Vault

Importare il certificato SSL in Azure Key Vault usando il comando az keyvault certificate import. Se il certificato è protetto da password, è possibile passare la password tramite il flag --password.

az keyvault certificate import --vault-name <KeyVaultName> --name <KeyVaultCertificateName> --file aks-ingress-tls.pfx [--password <certificate password if specified>]

Importante

Per consentire al componente aggiuntivo di ricaricare i certificati da Azure Key Vault quando cambiano, è necessario abilitare la funzionalità di rotazione automatica dei segreti del driver CSI dell'archivio segreti con l'argomento --enable-secret-rotation. Quando la rotazione automatica è abilitata, il driver aggiorna il montaggio dei pod e il segreto Kubernetes eseguendo periodicamente il polling delle modifiche, in base all'intervallo di polling di rotazione definito. L'intervallo di polling di rotazione predefinito è due minuti.

Abilitare l’integrazione di Azure Key Vault

In un cluster con il componente aggiuntivo di routing dell'applicazione abilitato, usare il comando az aks approuting update con gli argomenti --enable-kv e --attach-kv per abilitare il provider Azure Key Vault per il driver CSI dell'archivio di segreti e applicare le assegnazioni di ruolo necessarie.

Azure Key Vault offre due sistemi di autorizzazione: il controllo degli accessi in base al ruolo di Azure, che opera sul piano di controllo, e il modello dei criteri di accesso, che opera sia sul piano di controllo che sul piano dati. L'operazione --attach-kv sceglierà il modello di accesso appropriato da usare.

Nota

Il comando az aks approuting update --attach-kv usa le autorizzazioni dell'utente che esegue il comando per creare l'assegnazione di ruolo di Azure Key Vault. Questo ruolo viene assegnato all'identità gestita del componente aggiuntivo. Per altre informazioni sulle identità gestite del servizio Azure Kubernetes, vedere Riepilogo delle identità gestite.

Recuperare l'ID risorsa di Azure Key Vault.

KEYVAULTID=$(az keyvault show --name <KeyVaultName> --query "id" --output tsv)

Aggiornare quindi il componente aggiuntivo di routing dell'app per abilitare il driver CSI dell'archivio di segreti di Azure Key Vault e applicare l'assegnazione di ruolo.

az aks approuting update --resource-group <ResourceGroupName> --name <ClusterName> --enable-kv --attach-kv ${KEYVAULTID}

Abilitare l'integrazione di DNS di Azure

Per abilitare il supporto per le zone DNS, esaminare i prerequisiti seguenti:

  • Il componente aggiuntivo di routing dell’app può essere configurato per creare automaticamente record in una o più zone DNS globali e private di Azure per gli host definiti nelle risorse in ingresso. Tutte le zone DNS di Azure globali devono trovarsi nello stesso gruppo di risorse e tutte le zone DNS di Azure private devono trovarsi nello stesso gruppo di risorse. Se non si ha una zona DNS di Azure, è possibile crearne una.

Creare una zona DNS di Azure pubblica

Nota

Se si ha già una zona DNS di Azure, ignorare questo passaggio.

  1. Creare una zona DNS di Azure usando il comando az network dns zone create.

    az network dns zone create --resource-group <ResourceGroupName> --name <ZoneName>
    

Collegare la zona DNS di Azure al componente aggiuntivo di routing dell'applicazione

Nota

Il comando az aks approuting zone add usa le autorizzazioni dell'utente che esegue il comando per creare l'assegnazione di ruolo della zona DNS di Azure. Questo ruolo viene assegnato all'identità gestita del componente aggiuntivo. Per altre informazioni sulle identità gestite del servizio Azure Kubernetes, vedere Riepilogo delle identità gestite.

  1. Recuperare l'ID risorsa per la zona DNS usando il comando az network dns zone show e impostare l'output su una variabile denominata ZONEID.

    ZONEID=$(az network dns zone show --resource-group <ResourceGroupName> --name <ZoneName> --query "id" --output tsv)
    
  2. Aggiornare il componente aggiuntivo per abilitare l'integrazione con DNS di Azure usando il comando az aks approuting zone. È possibile passare un elenco delimitato da virgole di ID risorse della zona DNS.

    az aks approuting zone add --resource-group <ResourceGroupName> --name <ClusterName> --ids=${ZONEID} --attach-zones
    

Creare l'Ingress che usa un nome host e un certificato da Azure Key Vault

Il componente aggiuntivo di routing dell'applicazione crea una classe Ingress nel cluster denominato webapprouting.kubernetes.azure.com. Quando si crea un oggetto ingresso con questa classe, il componente aggiuntivo viene attivato.

  1. Ottenere l'URI del certificato da usare in Ingress da Azure Key Vault usando il comando az keyvault certificate show.

    az keyvault certificate show --vault-name <KeyVaultName> --name <KeyVaultCertificateName> --query "id" --output tsv
    

    L'output di esempio seguente mostra l'URI del certificato restituito dal comando:

    https://KeyVaultName.vault.azure.net/certificates/KeyVaultCertificateName/ea62e42260f04f17a9309d6b87aceb44
    
  2. Copiare il manifesto YAML seguente in un nuovo file denominato ingress.yaml e salvare il file nel computer locale.

    Eseguire l'aggiornamento <Hostname> con il nome dell'host DNS e <KeyVaultCertificateUri> con l'URI restituito dal comando per eseguire query su Azure Key Vault nel passaggio 1 precedente. Il valore stringa per *<KeyVaultCertificateUri>* deve includere solo https://yourkeyvault.vault.azure.net/certificates/certname. La versione del certificato alla fine della stringa URI deve essere omessa per ottenere la versione corrente.

    La chiave secretName nella sezione tls definisce il nome del segreto che contiene il certificato per questa risorsa in ingresso. Questo certificato viene presentato nel browser quando un client passa all'URL specificato nella chiave <Hostname>. Assicurarsi che il valore di secretName sia uguale a keyvault- seguito del valore del nome della risorsa Ingress (da metadata.name). Nell'esempio YAML, secretName deve essere uguale a keyvault-<your Ingress name>.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.azure.com/tls-cert-keyvault-uri: <KeyVaultCertificateUri>
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: webapprouting.kubernetes.azure.com
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
      tls:
      - hosts:
        - <Hostname>
        secretName: keyvault-<your ingress name>
    
  3. Creare le risorse del cluster usando il comando kubectl apply.

    kubectl apply -f ingress.yaml -n hello-web-app-routing
    

    L'output di esempio seguente mostra la risorsa creata:

    Ingress.networking.k8s.io/aks-helloworld created
    

Verificare che l'oggetto in ingresso gestito sia stato creato

È possibile verificare che l'ingresso gestito sia stato creato usando il comando kubectl get ingress.

kubectl get ingress -n hello-web-app-routing

L'output di esempio seguente mostra l'ingresso gestito creato:

NAME             CLASS                                HOSTS               ADDRESS       PORTS     AGE
aks-helloworld   webapprouting.kubernetes.azure.com   myapp.contoso.com   20.51.92.19   80, 443   4m

Passaggi successivi

Informazioni sul monitoraggio delle metriche del controller Ingress-nginx incluse nel componente aggiuntivo di routing delle applicazioni con Prometheus in Grafana come parte dell'analisi delle prestazioni e dell'utilizzo dell'applicazione.