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.
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>"
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.
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.
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)
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.
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
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 solohttps://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 sezionetls
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 disecretName
sia uguale akeyvault-
seguito del valore del nome della risorsa Ingress (dametadata.name
). Nell'esempio YAML,secretName
deve essere uguale akeyvault-<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>
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.
Azure Kubernetes Service