Configurare un gateway NAT per l'indirizzo IP statico per il traffico in uscita da un gruppo di contenitori

La configurazione di un gruppo di contenitori con un indirizzo IP esterno consente ai client esterni di usare l'indirizzo IP per accedere a un contenitore nel gruppo. Ad esempio, un browser può accedere a un'app Web in esecuzione in un contenitore. Tuttavia, attualmente un gruppo di contenitori usa un indirizzo IP diverso per il traffico in uscita. Questo indirizzo IP in uscita non è esposto a livello di codice, che rende più complesso il monitoraggio e la configurazione dei gruppi di contenitori delle regole del firewall client.

Questo articolo illustra la procedura per configurare un gruppo di contenitori in una rete virtuale integrata con un gateway NAT (Network Address Translation). Configurando un gateway NAT per SNAT un intervallo di indirizzi della subnet delegato a Istanze di Azure Container (ACI), è possibile identificare il traffico in uscita dai gruppi di contenitori. Il traffico in uscita del gruppo di contenitori userà l'indirizzo IP pubblico del gateway NAT. Un singolo gateway NAT può essere usato da più gruppi di contenitori distribuiti nella subnet della rete virtuale delegata ad ACI.

In questo articolo si usa l'interfaccia della riga di comando di Azure per creare le risorse per questo scenario:

  • Gruppi di contenitori distribuiti in una subnet delegata nella rete virtuale
  • Un gateway NAT distribuito nella rete con un indirizzo IP pubblico statico

Si convalida quindi l'uscita dai gruppi di contenitori di esempio tramite il gateway NAT.

Nota

Il servizio ACI consiglia l'integrazione con un gateway NAT per carichi di lavoro in contenitori con requisiti di uscita statici ma non di ingresso statici. Per l'architettura ACI che supporta sia l'ingresso statico che l'uscita, vedere l'esercitazione seguente: Usare Firewall di Azure per l'ingresso e l'uscita.

Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.

Prerequisiti

Avviare Azure Cloud Shell

Azure Cloud Shell è una shell interattiva gratuita che può essere usata per eseguire la procedura di questo articolo. Include strumenti comuni di Azure preinstallati e configurati per l'uso con l'account.

Per aprire Cloud Shell, basta selezionare Prova nell'angolo superiore destro di un blocco di codice. È anche possibile avviare Cloud Shell in una scheda separata del browser visitando https://shell.azure.com.

Quando si apre Cloud Shell, verificare che Bash sia selezionato per l'ambiente in uso. Le sessioni successive useranno l'interfaccia della riga di comando di Azure in un ambiente Bash, selezionare Copia per copiare i blocchi di codice, incollarli in Cloud Shell e premere INVIO per eseguirlo.

Accedere ad Azure

Cloud Shell viene autenticato automaticamente con l'account iniziale con cui è stato eseguito l'accesso. Usare lo script seguente per accedere usando una sottoscrizione diversa, sostituendo <Subscription ID> con l'ID sottoscrizione di Azure. Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.

subscription="<subscriptionId>" # add subscription here

az account set -s $subscription # ...or use 'az login'

Per altre informazioni, vedere Impostare una sottoscrizione attiva o accedere in modo interattivo

Nota

Per scaricare lo script completo, passare allo script completo.

Introduzione

Questa esercitazione usa una variabile casuale. Se si usa un gruppo di risorse esistente, modificare il valore di questa variabile in modo appropriato.

resourceGroup=resourceGroup$RANDOM

Gruppo di risorse di Azure: se non si ha già un gruppo di risorse di Azure, creare un gruppo di risorse con il comando az group create . Modificare il valore della posizione in base alle esigenze.

az group create --name $resourceGroup --location eastus

Distribuire ACI in una rete virtuale

In un caso tipico, potrebbe essere già disponibile una rete virtuale di Azure in cui distribuire un gruppo di contenitori. A scopo dimostrativo, i comandi seguenti creano una rete virtuale e una subnet quando viene creato il gruppo di contenitori. La subnet viene delegata a Istanze di Azure Container.

Il gruppo di contenitori esegue una piccola app Web dall'immagine aci-helloworld . Come illustrato in altri articoli della documentazione, questa immagine include una piccola app Web scritta in Node.js che serve una pagina HTML statica.

Creare il gruppo di contenitori con il comando az container create :

az container create \
  --name appcontainer \
  --resource-group $resourceGroup \
  --image mcr.microsoft.com/azuredocs/aci-helloworld \
  --vnet aci-vnet \
  --vnet-address-prefix 10.0.0.0/16 \
  --subnet aci-subnet \
  --subnet-address-prefix 10.0.0.0/24

Nota

Modificare il valore di --subnet address-prefix per lo spazio indirizzi IP necessario nella subnet. La subnet più piccola supportata è /29, che fornisce otto indirizzi IP. Alcuni >indirizzi IP sono riservati per l'uso da parte di Azure. Altre informazioni sono disponibili qui.

Creare un indirizzo IP pubblico

Nelle sezioni seguenti usare l'interfaccia della riga di comando di Azure per distribuire un gateway NAT di Azure nella rete virtuale. Per informazioni generali, vedere Avvio rapido: Creare un gateway NAT con l'interfaccia della riga di comando di Azure.

Usare prima di tutto az network vnet public-ip create per creare un indirizzo IP pubblico per il gateway NAT. Verrà usato per accedere a Internet. Verrà visualizzato un avviso relativo a una modifica che causa un'interruzione imminente in cui gli indirizzi IP dello SKU Standard saranno in grado di essere a conoscenza della zona di disponibilità per impostazione predefinita. Per altre informazioni sull'uso delle zone di disponibilità e degli indirizzi IP pubblici, vedere qui.

az network public-ip create \
  --name myPublicIP \
  --resource-group $resourceGroup \
  --sku standard \
  --zone 1 \
  --allocation static

Archiviare l'indirizzo IP pubblico in una variabile da usare durante il passaggio di convalida più avanti in questo script.

ngPublicIp="$(az network public-ip show \
  --name myPublicIP \
  --resource-group $resourceGroup \
  --query ipAddress --output tsv)"

Distribuire un gateway NAT in una rete virtuale

Usare il comando az network nat gateway create seguente per creare un gateway NAT che usa l'indirizzo IP pubblico creato nel passaggio precedente.

az network nat gateway create \
  --resource-group $resourceGroup \
  --name myNATgateway \
  --public-ip-addresses myPublicIP \
  --idle-timeout 10

Configurare il servizio NAT per la subnet di origine

Verrà configurata la subnet di origine aci-subnet per l'uso di una risorsa gateway NAT specifica myNATgateway con az network vnet subnet update. Questo comando attiverà il servizio NAT nella subnet specificata.

az network vnet subnet update \
    --resource-group $resourceGroup  \
    --vnet-name aci-vnet \
    --name aci-subnet \
    --nat-gateway myNATgateway

Testare l'uscita da un gruppo di contenitori

Testare l'accesso in ingresso all'oggetto appcontainer in esecuzione nella rete virtuale passando all'indirizzo IP pubblico del firewall. In precedenza, l'indirizzo IP pubblico è stato archiviato nella variabile $NG_PUBLIC_IP

Distribuire il contenitore di esempio seguente nella rete virtuale. Quando viene eseguita, invia una singola richiesta HTTP a http://checkip.dyndns.org, che visualizza l'indirizzo IP del mittente (indirizzo IP in uscita). Se la regola dell'applicazione nel firewall è configurata correttamente, viene restituito l'indirizzo IP pubblico del firewall.

az container create \
  --resource-group $resourceGroup \
  --name testegress \
  --image mcr.microsoft.com/azuredocs/aci-tutorial-sidecar \
  --command-line "curl -s http://checkip.dyndns.org" \
  --restart-policy OnFailure \
  --vnet aci-vnet \
  --subnet aci-subnet

Visualizzare i log del contenitore per verificare che l'indirizzo IP corrisponda all'indirizzo IP pubblico creato nel primo passaggio dell'esercitazione.

az container logs \
  --resource-group $resourceGroup \
  --name testegress

L'output è simile a:

<html><head><title>Current IP Check</title></head><body>Current IP Address: 52.142.18.133</body></html>

Questo indirizzo IP deve corrispondere all'indirizzo IP pubblico creato nel primo passaggio dell'esercitazione.

echo $ngPublicIp

Pulire le risorse

Quando non è più necessario, è possibile usare az group delete per rimuovere il gruppo di risorse e tutte le risorse correlate come indicato di seguito. Il parametro --no-wait restituisce il controllo al prompt senza attendere il completamento dell'operazione. Il parametro --yes conferma che si desidera eliminare le risorse senza un prompt aggiuntivo a tale scopo.

az group delete --name $resourceGroup --yes --no-wait

Passaggi successivi

Questo articolo illustra come configurare i gruppi di contenitori in una rete virtuale dietro un gateway NAT di Azure. Usando questa configurazione, si configura un singolo indirizzo IP statico in uscita dai gruppi di contenitori Istanze di Azure Container.

Per assistenza per la risoluzione dei problemi, vedere Risolvere i problemi di connettività NAT di Azure Rete virtuale.