Share via


Configuración del controlador de entrada NGINX para que admita la zona DNS privada de Azure con el complemento de enrutamiento de aplicaciones

En este artículo se muestra cómo configurar un controlador de entrada NGINX para que funcione con el equilibrador de carga interno de Azure y cómo configurar una zona DNS privada de Azure para habilitar la resolución de DNS de los puntos de conexión privados y resolver dominios específicos.

Antes de empezar

Conectarse al clúster AKS

Para conectarse al clúster de Kubernetes desde su equipo local, use kubectl, el cliente de la línea de comandos de Kubernetes. Lo puede instalar localmente. Para ello debe usar el comando az aks install-cli. Si usa Azure Cloud Shell, kubectl ya está instalado.

En el ejemplo siguiente se configura la conexión al clúster denominado myAKSCluster en myResourceGroup mediante el comando az aks get-credentials.

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

Creación de una red virtual

Para publicar una zona DNS privada en la red virtual, tiene que especificar la lista de redes virtuales que pueden resolver registros en ella. Estos se denominan vínculos de red virtual.

En el ejemplo siguiente se crea una red virtual denominada myAzureVNet en el grupo de recursos myResourceGroup y una subred denominada mySubnet para crear dentro de la red virtual con un prefijo de dirección específico.

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

Creación de una zona DNS privada de Azure

Nota:

Puede configurar el complemento de enrutamiento de aplicaciones para crear registros automáticamente en una o varias zonas DNS globales y privadas de Azure para los hosts definidos en los recursos de entrada. Todas las zonas DNS globales y privadas de Azure deben estar en el mismo grupo de recursos.

Cree una zona DNS mediante el comando az network private-dns zone create, especificando el nombre de la zona y el grupo de recursos en el que se va a crear. En el ejemplo siguiente, se crea una zona DNS llamada private.contoso.com en el grupo de recursos MyResourceGroup.

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

Puede crear un vínculo de red virtual a la zona DNS que creó anteriormente con el comando az network private-dns link vnet create. En el ejemplo siguiente se crea un vínculo denominado myDNSLink a la zona private.contoso.com de la red virtual myAzureVNet. Incluya el parámetro --registration-enabled para especificar que el vínculo no está habilitado para el registro.

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

La característica de registro automático de zonas privadas de Azure DNS administra registros DNS para las máquinas virtuales implementadas en una red virtual. Al vincular una red virtual que tiene una zona DNS privada con esta configuración habilitada, se crea un registro DNS para cada máquina virtual de Azure del nodo de AKS implementado en la red virtual.

Asociación de una zona DNS privada de Azure al complemento de enrutamiento de aplicaciones

Nota:

El comando az aks approuting zone add usa los permisos del usuario que ejecuta el comando para crear la asignación de roles zona de Azure DNS. El rol Colaborador de zona DNS privada es un rol integrado para administrar recursos DNS privados que se asigna a la identidad administrada del complemento. Para obtener más información sobre las identidades administradas de AKS, consulte Resumen de identidades administradas.

  1. Recupere el id. de recurso de la zona DNS mediante el comando az network dns zone show y establezca la salida en una variable denominada ZONEID. En el ejemplo siguiente, se consulta la zona private.contoso.com en el grupo de recursos MyResourceGroup.

    ZONEID=$(az network private-dns zone show --resource-group myResourceGroup --name private.contoso.com --query "id" --output tsv)
    
  2. Actualice el complemento para habilitar la integración con Azure DNS mediante el comando az aks approuting zone. Puede pasar una lista separada por comas de identificadores de recursos de zona DNS. En el ejemplo siguiente se actualiza el clúster de AKS myAKSCluster en el grupo de recursos myResourceGroup.

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

Creación de un controlador de entrada NGINX con una dirección IP privada y un equilibrador de carga interno

El complemento de enrutamiento de aplicaciones usa una definición de recursos personalizados (CRD) de Kubernetes denominada NginxIngressController para configurar controladores de entrada NGINX. Puede crear más controladores de entrada o modificar la configuración existente.

La CRD NginxIngressController tiene un campo loadBalancerAnnotations para controlar el comportamiento del servicio del controlador de entrada NGINX al establecer anotaciones del equilibrador de carga.

Realice los pasos siguientes para crear un controlador de entrada NGINX con una instancia interna de Azure Load Balancer con una dirección IP privada.

  1. Copie el siguiente manifiesto YAML en un nuevo archivo denominado nginx-internal-controller.yaml y guarde el archivo en el equipo local.

    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. Cree los recursos del controlador de entrada NGINX mediante el comando kubectl apply.

    kubectl apply -f nginx-internal-controller.yaml
    

    En la siguiente salida de ejemplo se muestran los recursos creados:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
    
  3. Comprobación de que se creó el controlador de entrada

    Puede comprobar el estado del controlador de entrada NGINX mediante el comando kubectl get nginxingresscontroller.

    kubectl get nginxingresscontroller
    

    En la siguiente salida de ejemplo se muestra el recurso creado. El controlador puede tardar unos minutos en estar disponible:

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

Implementar una aplicación

El complemento de enrutamiento de aplicaciones usa anotaciones en objetos de entrada de Kubernetes para crear los recursos adecuados.

  1. Cree el espacio de nombres de una aplicación llamado hello-web-app-routing para ejecutar los pods de ejemplo mediante el comando kubectl create namespace.

    kubectl create namespace hello-web-app-routing
    
  2. Cree la implementación copiando el siguiente manifiesto YAML en un nuevo archivo denominado deployment.yaml y guarde el archivo en el equipo local.

    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. Cree el servicio copiando el siguiente manifiesto YAML en un nuevo archivo denominado service.yaml y guarde el archivo en el equipo local.

    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: aks-helloworld
    
  4. Cree los recursos del clúster mediante el comando kubectl apply.

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

    En la siguiente salida de ejemplo se muestran los recursos creados:

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

    En la siguiente salida de ejemplo se muestran los recursos creados:

    service/aks-helloworld created created
    

Cree el recurso de entrada que usa un nombre de host en la zona DNS privada de Azure y una dirección IP privada.

  1. Copie el siguiente manifiesto YAML en un nuevo archivo denominado ingress.yaml y guarde el archivo en el equipo local.

    Actualice <Hostname> con el nombre del host DNS, por ejemplo, helloworld.private.contoso.com. Compruebe que está especificando nginx-internal para el valor 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. Cree los recursos del clúster mediante el comando kubectl apply.

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

    En la siguiente salida de ejemplo se muestran los recursos creados:

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

Comprobación de que se creó la entrada administrada

Compruebe que la entrada administrada se ha creado con el comando kubectl get ingress.

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

En la siguiente salida de ejemplo se muestra la entrada administrada creada:

NAME             CLASS            HOSTS                            ADDRESS      PORTS   AGE
aks-helloworld   nginx-internal   helloworld.private.contoso.com   10.224.0.7   80      98s

Comprobación de que se actualizó la zona DNS privada de Azure

En unos minutos, ejecute el comando az network private-dns record-set a list para ver los registros A de la zona DNS privada de Azure. Especifique el nombre del grupo de recursos y el nombre de la zona DNS. En este ejemplo, el grupo de recursos es myResourceGroup y la zona DNS es private.contoso.com.

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

En la siguiente salida de ejemplo se muestra el registro creado:

[
  {
    "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"
  }
]

Pasos siguientes

En caso de que necesite otra información de configuración relacionada con el cifrado SSL, otro controlador de entrada NGINX y la configuración del recurso de entrada, revise Configuración de DNS y SSL y Configuración del complemento de enrutamiento de aplicaciones.