Configurar um nome de domínio personalizado e um certificado SSL com o complemento de roteamento de aplicativo

Uma entrada é um objeto de API que define regras, que permitem acesso externo aos serviços em um cluster do AKS (Serviço de Kubernetes do Azure). Quando você cria um objeto Ingress que usa as classes Ingress do NGINX do complemento de roteamento de aplicativos, o complemento cria, configura e gerencia um ou mais controladores de entrada no cluster do AKS.

Este artigo mostra como definir uma configuração avançada de entrada para criptografar o tráfego com certificados SSL/TLS armazenados no Azure Key Vault e usar o DNS do Azure para gerenciar zonas DNS.

Complemento de roteamento de aplicativos com recursos do NGINX

O complemento de roteamento de aplicativos com o NGINX fornece o seguinte:

  • Configuração fácil de Controladores de entrada nginx gerenciados.
  • Integração a um DNS externo, como o DNS do Azure, para gerenciamento de zona privada e global
  • Terminação SSL com certificados armazenados em um cofre de chaves, como o Azure Key Vault.

Pré-requisitos

  • Um cluster do AKS com o complemento de roteamento de aplicativos.
  • Azure Key Vault, caso você deseje configurar a terminação SSL e armazenar certificados no cofre hospedado no Azure.
  • DNS do Azure, caso você deseje configurar o gerenciamento de zona privada e global e hospedá-los no Azure.
  • Para anexar um Azure Key Vault ou uma Zona DNS do Azure, você precisará da função Proprietário, Administrador de conta do Azure ou Coadministrador do Azure em sua assinatura do Azure.
  • Todas as zonas DNS públicas devem estar na mesma assinatura e no Grupo de Recursos.

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.

Configure o kubectl para se conectar ao seu cluster do Kubernetes usando o comando az aks get-credentials.

az aks get-credentials --resource-group <ResourceGroupName> --name <ClusterName>

Encerrar o tráfego HTTPS com certificados do Azure Key Vault

A fim de habilitar o suporte para o tráfego HTTPS, confira os seguintes pré-requisitos:

Criar um Azure Key Vault para armazenar o certificado

Observação

Se você já tiver um Azure Key Vault, pode ignorar esta etapa.

Crie um Azure Key Vault usando o comando az keyvault create.

az keyvault create --resource-group <ResourceGroupName> --location <Location> --name <KeyVaultName> --enable-rbac-authorization true

Criar e exportar um certificado SSL autoassinado

Para teste, você pode usar um certificado público autoassinado em vez de um certificado assinado por AC (autoridade de certificação). Se você já tiver um certificado, ignore esta etapa.

Cuidado

Certificados autoassinados são certificados digitais que não são assinados por uma AC de terceiros confiável. Os certificados autoassinados são criados, emitidos e assinados pela empresa ou pelo desenvolvedor responsável pelo site ou software que está sendo assinado. É por isso que os certificados autoassinados são considerados não seguros para sites e aplicativos voltados para o público. O Azure Key Vault tem uma parceria confiável com as seguintes Autoridades de Certificação.

  1. Crie um certificado SSL autoassinado para usar com a entrada por meio do comando openssl req. Substitua <Hostname> pelo nome DNS que você está usando.

    openssl req -new -x509 -nodes -out aks-ingress-tls.crt -keyout aks-ingress-tls.key -subj "/CN=<Hostname>" -addext "subjectAltName=DNS:<Hostname>"
    
  2. Exporte o certificado SSL e ignore o prompt de senha usando o comando openssl pkcs12 -export.

    openssl pkcs12 -export -in aks-ingress-tls.crt -inkey aks-ingress-tls.key -out aks-ingress-tls.pfx
    

Importar o certificado para o Azure Key Vault

Importe o certificado SSL para o Azure Key Vault usando o comando az keyvault certificate import. Se o certificado estiver protegido por senha, você poderá passar a senha pelo sinalizador --password.

az keyvault certificate import --vault-name <KeyVaultName> --name <KeyVaultCertificateName> --file aks-ingress-tls.pfx [--password <certificate password if specified>]

Importante

Para habilitar o complemento para recarregar certificados do Azure Key Vault quando eles forem alterados, habilite o recurso de autorrotação secreta do driver CSI do Repositório Secreto com o argumento --enable-secret-rotation. Quando a rotação automática é habilitada, o driver atualiza a montagem do pod e o segredo do Kubernetes sondando as alterações periodicamente, com base no intervalo de sondagem de rotação que você definiu. O intervalo de sondagem de rotação padrão é de dois minutos.

Habilitar integração do Azure Key Vault

Em um cluster com o complemento de roteamento de aplicativo habilitado, use o comando az aks approuting update com os argumentos --enable-kv e --attach-kv a fim de habilitar o provedor do Azure Key Vault para o Driver CSI do Repositório de Segredos e aplique as atribuições de função obrigatórias.

O Azure Key Vault oferece dois sistemas de autorização: controle de acesso baseado em função do Azure (Azure RBAC), que opera no plano de gerenciamento, e o modelo de política de acesso, que opera no plano de gerenciamento e no plano de dados. A operação --attach-kv escolherá o modelo de acesso apropriado a ser usado.

Observação

O comando az aks approuting update --attach-kv usa as permissões do usuário que está executando o comando para criar a atribuição de função do Azure Key Vault. Essa função é atribuída à identidade gerenciada do complemento. Para obter mais informações sobre as identidades gerenciadas do AKS, confira Resumo das identidades gerenciadas.

Recupere a ID do recurso do Azure Key Vault.

KEYVAULTID=$(az keyvault show --name <KeyVaultName> --query "id" --output tsv)

Em seguida, atualize o complemento de roteamento de aplicativos para habilitar o driver CSI do Repositório de Segredos do Azure Key Vault e aplicar a atribuição de função.

az aks approuting update --resource-group <ResourceGroupName> --name <ClusterName> --enable-kv --attach-kv ${KEYVAULTID}

Habilitar a integração do DNS do Azure

Para habilitar o suporte para zonas DNS, examine o seguinte pré-requisito:

  • O complemento de roteamento de aplicativos pode ser configurado para criar registros automaticamente em uma ou mais zonas DNS privadas e globais do Azure para os hosts definidos nos recursos de entrada. Todas as zonas DNS globais do Azure precisam estar no mesmo grupo de recursos, e todas as zonas DNS privadas do Azure precisam estar no mesmo grupo de recursos. Caso você não tenha uma zona DNS do Azure, crie uma.

Criar uma zona DNS pública do Azure

Observação

Se você já tiver uma Zona DNS do Azure, ignore esta etapa.

  1. Criar uma zona DNS do Azure usando o comando az network dns zone create.

    az network dns zone create --resource-group <ResourceGroupName> --name <ZoneName>
    

Anexar a zona DNS 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 da Zona DNS do Azure. Essa função é 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 como uma variável chamada ZONEID.

    ZONEID=$(az network dns zone show --resource-group <ResourceGroupName> --name <ZoneName> --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.

    az aks approuting zone add --resource-group <ResourceGroupName> --name <ClusterName> --ids=${ZONEID} --attach-zones
    

Criar a Entrada que usa um nome do host e um certificado do Azure Key Vault

O complemento de roteamento de aplicativos cria uma classe Ingress no cluster chamada webapprouting.Kubernetes.azure.com. Quando você cria um objeto Ingress com essa classe, ela ativa o complemento.

  1. Obtenha o URI de certificado para usar na entrada por meio do Azure Key Vault usando o comando az keyvault certificate show.

    az keyvault certificate show --vault-name <KeyVaultName> --name <KeyVaultCertificateName> --query "id" --output tsv
    

    A saída de exemplo a seguir mostra o URI do certificado retornado do comando:

    https://KeyVaultName.vault.azure.net/certificates/KeyVaultCertificateName/ea62e42260f04f17a9309d6b87aceb44
    
  2. 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 host DNS e <KeyVaultCertificateUri> com o URI retornado do comando para consultar o Azure Key Vault na etapa 1 acima. O valor da cadeia de caracteres para *<KeyVaultCertificateUri>* deve incluir apenas https://yourkeyvault.vault.azure.net/certificates/certname. A versão do certificado no final da cadeia de caracteres URI deve ser omitida para obter a versão atual.

    A chave secretName na seção tls define o nome do segredo que contém o certificado para esse recurso de Entrada. Esse certificado é apresentado no navegador quando um cliente navega até a URL especificada na chave <Hostname>. Certifique-se de que o valor de secretName seja igual a keyvault- seguido do valor do nome do recurso de Entrada (de metadata.name). No exemplo yaml, secretName precisa ser igual a keyvault-<your Ingress name>.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.azure.com/tls-cert-keyvault-uri: <KeyVaultCertificateUri>
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: webapprouting.kubernetes.azure.com
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
      tls:
      - hosts:
        - <Hostname>
        secretName: keyvault-<your ingress name>
    
  3. 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   webapprouting.kubernetes.azure.com   myapp.contoso.com   20.51.92.19   80, 443   4m

Próximas etapas

Saiba mais sobre como monitorar as métricas do controlador Ingress-nginx incluídas no complemento de roteamento de aplicativos com o Prometheus no Grafana (versão prévia) como parte da análise de desempenho e uso do aplicativo.