Configurare il controller di ingresso NGINX per supportare la zona DNS privata di Azure con il componente aggiuntivo Instradamento dell'applicazione

Questo articolo illustra come configurare un controller di ingresso NGINX per lavorare con il servizio di bilanciamento del carico interno di Azure e configurare una zona DNS di Azure privata per abilitare la risoluzione DNS per gli endpoint privati in modo da risolvere domini specifici.

Operazioni preliminari

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.

L'esempio seguente configura la connessione al cluster denominato myAKSCluster in myResourceGroup usando il comando az aks get-credentials.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

Creare una rete virtuale

Per pubblicare una zona DNS privata nella rete virtuale, è necessario specificare un elenco di reti virtuali autorizzate a risolvere i record nella zona. Questi collegamenti sono denominati collegamenti di rete virtuale.

L'esempio seguente crea una rete virtuale denominata myAzureVNet nel gruppo di risorse myResourceGroup e una subnet denominata mySubnet da creare all'interno della rete virtuale con un prefisso di indirizzo specifico.

az network vnet create \
  --name myAzureVNet \
  --resource-group myResourceGroup \
  --location eastus \
  --address-prefix 10.2.0.0/16 \
  --subnet-name mysubnet \
  --subnet-prefixes 10.2.0.0/24

Creare una zona DNS privata di Azure

Nota

È possibile configurare il componente aggiuntivo Instradamento dell'applicazione 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 e tutte le zone DNS di Azure private devono trovarsi nello stesso gruppo di risorse.

Creare una zona DNS usando il comando az network private-dns zone create, specificando il nome della zona e il gruppo di risorse in cui crearla. L'esempio seguente crea una zona DNS denominata private.contoso.com nel gruppo di risorse myResourceGroup.

az network private-dns zone create --resource-group myResourceGroup --name private.contoso.com

Creare un collegamento di rete virtuale alla zona DNS creata in precedenza usando il comando az network private-dns link vnet create. L'esempio seguente crea un collegamento denominato myDNSLink alla zona private.contoso.com per la rete virtuale myAzureVNet. Includere il parametro --registration-enabled per specificare che il collegamento non è abilitato per la registrazione.

az network private-dns link vnet create --resource-group myResourceGroup \
  --name myDNSLink \
  --zone-name private.contoso.com \
  --virtual-network myAzureVNet \
  --registration-enabled false

La funzionalità di registrazione automatica delle zona DNS privato di Azure consente di gestire i record DNS per le macchine virtuali distribuite in una rete virtuale. Quando si collega una rete virtuale a una zona DNS privata con questa impostazione abilitata, viene creato un record DNS per ogni macchina virtuale di Azure per il nodo del servizio Azure Kubernetes distribuito nella rete virtuale.

Collegare una zona DNS privato di Azure al componente aggiuntivo Instradamento 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. Il ruolo Collaboratore per la zona DNS privato è un ruolo predefinito per la gestione delle risorse DNS privato. 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. L'esempio seguente esegue una query sulla zona private.contoso.com nel gruppo di risorse myResourceGroup.

    ZONEID=$(az network private-dns zone show --resource-group myResourceGroup --name private.contoso.com --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. L'esempio seguente aggiorna il cluster del servizio Azure Kubernetes myAKSCluster nel gruppo di risorse myResourceGroup.

    az aks approuting zone add --resource-group myResourceGroup --name myAKSCluster --ids=${ZONEID} --attach-zones
    

Creare un controller di ingresso NGINX con un indirizzo IP privato e un servizio di bilanciamento del carico interno

Il componente aggiuntivo di routing delle applicazioni usa una definizione di risorsa personalizzata (CRD, Custom Resource Definition) Kubernetes denominata NginxIngressController per configurare i controller in ingresso NGINX. È possibile creare più controller in ingresso o modificare una configurazione esistente.

La CRD NginxIngressController include un campo loadBalancerAnnotations che consente di controllare il comportamento del servizio del controller in ingresso NGINX impostando annotazioni del servizio di bilanciamento del carico.

Seguire questa procedura per creare un controller di ingresso NGINX con Azure Load Balancer interno con un indirizzo IP privato.

  1. Copiare il manifesto YAML seguente in un nuovo file denominato nginx-internal-controller.yaml e salvare il file nel computer locale.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-internal
    spec:
      ingressClassName: nginx-internal
      controllerNamePrefix: nginx-internal
      loadBalancerAnnotations: 
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    
  2. Creare le risorse del controller in ingresso NGINX con il comando kubectl apply.

    kubectl apply -f nginx-internal-controller.yaml
    

    L'output di esempio seguente mostra la risorsa creata:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
    
  3. Verificare che il controller in ingresso sia stato creato

    Per verificare lo stato del controller in ingresso NGINX, usare il comando kubectl get nginxingresscontroller.

    kubectl get nginxingresscontroller
    

    L'output di esempio seguente mostra la risorsa creata. Possono essere necessari alcuni minuti prima che il controller sia disponibile:

    NAME             INGRESSCLASS                         CONTROLLERNAMEPREFIX   AVAILABLE
    default          webapprouting.kubernetes.azure.com   nginx                  True
    nginx-internal   nginx-internal                       nginx-internal         True
    

Distribuire un'applicazione

Il componente aggiuntivo Instradamento dell'applicazione usa annotazioni negli oggetti ingresso Kubernetes per creare le risorse appropriate.

  1. Creare lo spazio dei nomi dell'applicazione denominato hello-web-app-routing per eseguire i pod di esempio con il comando kubectl create namespace.

    kubectl create namespace hello-web-app-routing
    
  2. Creare la distribuzione copiando il manifesto YAML seguente in un nuovo file denominato deployment.yaml e salvare il file nel computer locale.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aks-helloworld  
      namespace: hello-web-app-routing
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aks-helloworld
      template:
        metadata:
          labels:
            app: aks-helloworld
        spec:
          containers:
          - name: aks-helloworld
            image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
            ports:
            - containerPort: 80
            env:
            - name: TITLE
              value: "Welcome to Azure Kubernetes Service (AKS)"
    
  3. Creare il servizio copiando il manifesto YAML seguente in un nuovo file denominato service.yaml e salvare il file nel computer locale.

    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: aks-helloworld
    
  4. Creare le risorse cluster usando il comando kubectl apply.

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

    L'output di esempio seguente mostra la risorsa creata:

    deployment.apps/aks-helloworld created created
    
    kubectl apply -f service.yaml -n hello-web-app-routing
    

    L'output di esempio seguente mostra la risorsa creata:

    service/aks-helloworld created created
    

Creare la risorsa in ingresso che usa un nome host nella zona DNS privato di Azure e un indirizzo IP privato

  1. Copiare il manifesto YAML seguente in un nuovo file denominato ingress.yaml e salvare il file nel computer locale.

    Aggiornare <Hostname> con il nome dell'host DNS, ad esempio helloworld.private.contoso.com. Verificare di aver specificato nginx-internal per ingressClassName.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: nginx-internal
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
    
  2. Creare le risorse del cluster con 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   nginx-internal   helloworld.private.contoso.com   10.224.0.7   80      98s

Verificare che la zona DNS privato di Azure sia stata aggiornata

Tra qualche minuto, eseguire il comando az network private-dns record-set a list per visualizzare i record A per la zona DNS privato di Azure. Specificare il nome del gruppo di risorse e della zona DNS. In questo esempio, il gruppo di risorse è myResourceGroup e la zona DNS è private.contoso.com.

az network private-dns record-set a list --resource-group myResourceGroup --zone-name private.contoso.com

L'output di esempio seguente mostra il record creato:

[
  {
    "aRecords": [
      {
        "ipv4Address": "10.224.0.7"
      }
    ],
    "etag": "188f0ce5-90e3-49e6-a479-9e4053f21965",
    "fqdn": "helloworld.private.contoso.com.",
    "id": "/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/foo/providers/Microsoft.Network/privateDnsZones/private.contoso.com/A/helloworld",
    "isAutoRegistered": false,
    "name": "helloworld",
    "resourceGroup": "foo",
    "ttl": 300,
    "type": "Microsoft.Network/privateDnsZones/A"
  }
]

Passaggi successivi

Per altre informazioni di configurazione relative alla crittografia SSL di altri controller di ingresso NGINX avanzati e alla configurazione delle risorse in ingresso, vedere Configurazione DNS e SSL e configurazione del componente aggiuntivo Instradamento dell'applicazione.