Share via


Configurare il controller di ingresso NGINX per supportare la zona DNS privata di Azure con il componente aggiuntivo routing delle applicazioni

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 per risolvere domini specifici.

Operazioni preliminari

Connessione al cluster del servizio Azure Kubernetes

Per connettersi al cluster Kubernetes dal computer locale, usare kubectl, il client da riga di comando kubernetes. È possibile installarlo in locale usando 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 az aks get-credentials comando .

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 all'interno della 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 di routing 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 crearlo. L'esempio seguente crea una zona DNS denominata private.contoso.com nel gruppo di risorse myResourceGroup .

az network private-dns zone create --resource-group myResourceGoup --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 --registration-enabled parametro 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 della zona privata DNS di Azure gestisce 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 di routing dell'applicazione

Nota

Il az aks approuting zone add comando usa le autorizzazioni dell'utente che esegue il comando per creare l'assegnazione di ruolo zona DNS di Azure. Il ruolo collaboratore zona DNS privato è un ruolo predefinito per la gestione delle risorse DNS private e 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 az network dns zone show comando 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 az aks approuting zone comando . È possibile passare un elenco delimitato da virgole di ID risorsa 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 dell'applicazione usa una definizione di risorsa personalizzata (CRD) kubernetes chiamata NginxIngressController per configurare i controller di ingresso NGINX. È possibile creare più controller di ingresso o modificare una configurazione esistente.

NginxIngressController CRD ha un loadBalancerAnnotations campo per controllare il comportamento del servizio del controller di ingresso NGINX impostando le annotazioni del servizio di bilanciamento del carico.

Seguire questa procedura per creare un controller di ingresso NGINX con un servizio di bilanciamento del carico interno di Azure 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 di ingresso NGINX usando il kubectl apply comando .

    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 di ingresso sia stato creato

    È possibile verificare lo stato del controller di ingresso NGINX usando il kubectl get nginxingresscontroller comando .

    kubectl get nginxingresscontroller
    

    L'output di esempio seguente mostra la risorsa creata. La disponibilità del controller potrebbe richiedere alcuni minuti:

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

Distribuire un'applicazione

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

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

    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 del cluster usando il kubectl apply comando .

    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, helloworld.private.contoso.comad esempio . Verificare di specificare 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 usando il kubectl apply comando .

    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'ingresso gestito sia stato creato

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

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

In pochi minuti eseguire il comando az network private-dns record-set a list per visualizzare i record A per la zona DNS privata di Azure. Specificare il nome del gruppo di risorse e il nome 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 correlate 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 di routing delle applicazioni.