Configurar o controlador de entrada NGINX para dar suporte à zona DNS privada do Azure com o complemento de roteamento de aplicativos

Este artigo demonstra como configurar um controlador de entrada NGINX para trabalhar com o balanceador de carga interno do Azure e configurar uma zona DNS privada do Azure para habilitar a resolução de DNS para os pontos de extremidade privados para resolver domínios específicos.

Antes de começar

Conectar-se ao cluster do AKS

Para se conectar ao cluster do Kubernetes no computador local, use o kubectl, o cliente de linha de comando do Kubernetes. Instale-o localmente usando o comando az aks install-cli. Se você usa o Azure Cloud Shell, o kubectl já estará instalado.

O exemplo a seguir configura a conexão com seu cluster chamado myAKSCluster no myResourceGroup usando o comando az aks get-credentials.

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

Criar uma rede virtual

Para publicar uma zona DNS privada na sua rede virtual, é necessário especificar uma lista de redes virtuais que têm permissão para resolver registros dentro da zona. Elas são chamadas de vínculos de rede virtual.

O exemplo a seguir cria uma rede virtual denominada myAzureVNet no grupo de recursos myResourceGroup e uma sub-rede denominada mySubnet para criar dentro da VNet com um prefixo de endereço 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

Criar uma zona DNS privada do Azure

Observação

Você pode configurar o complemento de roteamento de aplicativos para criar automaticamente registros em uma ou mais zonas DNS globais e privadas do Azure para hosts definidos nos recursos de Entrada. Todas as zonas DNS globais do Azure e todas as zonas DNS privadas do Azure precisam estar no mesmo grupo de recursos.

Crie uma zona DNS usando o comando az network private-dns zone create, especificando o nome da zona e o grupo de recursos no qual ela será criada. O exemplo a seguir cria uma zona DNS denominada private.contoso.com no grupo de recursos myResourceGroup.

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

Crie um link de rede virtual para a zona DNS criada anteriormente usando o comando az network private-dns link vnet create. O exemplo a seguir cria um link chamado myDNSLink para a zona private.contoso.com para a rede virtual myAzureVNet. Inclua o parâmetro --registration-enabled para especificar que o link não está habilitado para registro.

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

O recurso de registro automático da zona DNS privada do Azure gerencia registros DNS para máquinas virtuais implantadas em uma rede virtual. Quando você vincula uma rede virtual a uma zona DNS privada com essa configuração habilitada, um registro DNS é criado em cada máquina virtual do Azure para o seu nó AKS implantado na rede virtual.

Anexar uma zona DNS privada do Azure ao complemento de roteamento de aplicativos

Observação

O comando az aks approuting zone add usa as permissões do usuário que está executando o comando para criar a atribuição de função Zona DNS do Azure. A função Colaborador de Zona DNS Privada é uma função incorporada para gerenciar recursos DNS privados e é atribuída à identidade gerenciada do complemento. Para obter mais informações sobre as identidades gerenciadas do AKS, confira Resumo das identidades gerenciadas.

  1. Recupere a ID do recurso para a zona DNS usando o comando az network dns zone show e defina a saída em uma variável denominada ZONEID. O exemplo a seguir consulta a zona private.contoso.com no grupo de recursos myResourceGroup.

    ZONEID=$(az network private-dns zone show --resource-group myResourceGroup --name private.contoso.com --query "id" --output tsv)
    
  2. Atualize o complemento para habilitar a integração com o DNS do Azure usando o comando az aks approuting zone. Você pode transmitir uma lista separada por vírgulas de IDs do recurso de zona DNS. O exemplo a seguir atualiza o cluster do AKS myAKSCluster no grupo de recursos myResourceGroup.

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

Criar um controlador de entrada NGINX com um endereço IP privado e um balanceador de carga interno

O complemento de roteamento de aplicativos usa uma definição de recurso personalizado (CRD) do Kubernetes chamada NginxIngressController para configurar controladores de entrada NGINX. Você pode criar mais controladores de entrada ou modificar uma configuração existente.

A CRD NginxIngressController tem um campo loadBalancerAnnotations para controlar o comportamento do serviço do controlador de entrada NGINX definindo anotações do balanceador de carga.

Execute as etapas a seguir para criar um controlador de entrada NGINX com um Azure Load Balancer voltado para o interior com um endereço IP privado.

  1. Copie o manifesto YAML a seguir em um novo arquivo chamado nginx-internal-controller.yaml e salve o arquivo em seu computador 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. Crie os recursos do controlador de entrada NGINX usando o comando kubectl apply.

    kubectl apply -f nginx-internal-controller.yaml
    

    O seguinte exemplo de saída mostra o recurso criado:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
    
  3. Verificar se o controlador de entrada foi criado

    Você pode verificar o status do controlador de entrada NGINX usando o comando kubectl get nginxingresscontroller.

    kubectl get nginxingresscontroller
    

    A saída de exemplo a seguir mostra o recurso criado. Pode levar alguns minutos para que o controlador esteja disponível:

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

Implantar um aplicativo

O complemento de roteamento de aplicativos usa anotações em objetos Ingress do Kubernetes para criar os recursos apropriados.

  1. Crie um namespace de aplicativo chamado hello-web-app-routing para executar os pods de exemplo usando o comando kubectl create namespace.

    kubectl create namespace hello-web-app-routing
    
  2. Crie a implantação copiando o manifesto YAML a seguir em um novo arquivo chamado deployment.yaml e salve o arquivo no computador 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. Crie o serviço copiando o manifesto YAML a seguir em um novo arquivo chamado service.yaml e salve o arquivo no computador 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. Crie os recursos de cluster usando o comando kubectl apply.

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

    O seguinte exemplo de saída mostra o recurso criado:

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

    O seguinte exemplo de saída mostra o recurso criado:

    service/aks-helloworld created created
    

Crie o recurso entrada que usa um nome de host na zona DNS privada do Azure e um endereço IP privado

  1. Copie o manifesto YAML a seguir em um novo arquivo chamado ingress.yaml e salve o arquivo no computador local.

    Atualize <Hostname> com o nome do seu host DNS, por exemplo, helloworld.private.contoso.com. Verifique se você está especificando nginx-internal para 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. Crie os recursos de cluster usando o comando kubectl apply.

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

    O seguinte exemplo de saída mostra o recurso criado:

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

Verificar se a entrada gerenciada foi criada

Verifique se a entrada gerenciada foi criada usando o comando kubectl get ingress.

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

O seguinte exemplo de saída mostra a entrada gerenciada criada:

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

Verifique se a Zona DNS privada do Azure foi atualizada

Em alguns minutos, execute o comando az network private-dns record-set a list para exibir os registros A da sua Zona DNS privada do Azure. Especifique o nome do grupo de recursos e o nome da zona DNS. Neste exemplo, o grupo de recursos é myResourceGroup e a zona DNS é private.contoso.com.

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

A saída do exemplo a seguir mostra o registro criado:

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

Próximas etapas

Para obter outras informações de configuração relacionadas à criptografia SSL e outras configurações avançadas do controlador de entrada NGINX e dos recursos de entrada, consulte Configuração de DNS e SSL e Configuração do complemento de roteamento de aplicativos.