Partilhar via


Personalizar o CoreDNS com o Azure Kubernetes Service

O Serviço Kubernetes do Azure (AKS) usa o projeto CoreDNS para gerenciamento e resolução de DNS de cluster com todos os clusters 1.12.x e superiores. Para obter mais informações sobre a personalização do CoreDNS e o Kubernetes, consulte a documentação oficial upstream.

O AKS é um serviço gerenciado, portanto, você não pode modificar a configuração principal do CoreDNS (um CoreFile). Em vez disso, você usa um Kubernetes ConfigMap para substituir as configurações padrão. Para ver o AKS CoreDNS ConfigMaps padrão, use o kubectl get configmaps --namespace=kube-system coredns -o yaml comando.

Este artigo mostra como usar o ConfigMaps para opções básicas de personalização CoreDNS do AKS. Essa abordagem difere da configuração do CoreDNS em outros contextos, como CoreFile.

Nota

Anteriormente, o kube-dns era usado para gerenciamento e resolução de DNS de cluster, mas agora foi preterido. kube-dns oferecia diferentes opções de personalização através de um mapa de configuração do Kubernetes. CoreDNS não é compatível com kube-dns. Todas as personalizações usadas anteriormente devem ser atualizadas para CoreDNS.

Antes de começar

  • Este artigo pressupõe que você tenha um cluster AKS existente. Se precisar de um cluster AKS, você pode criar um usando a CLI do Azure, o Azure PowerShell ou o portal do Azure.
  • Verifique a versão do CoreDNS que você está executando. Os valores de configuração podem mudar entre versões.
  • Quando você cria configurações como os exemplos abaixo, seus nomes na seção de dados devem terminar em .server ou .override. Esta convenção de nomenclatura é definida no AKS CoreDNS ConfigMap padrão, que você pode visualizar usando o kubectl get configmaps --namespace=kube-system coredns -o yaml comando.

Suporte a plug-ins

Todos os plugins CoreDNS integrados são suportados. Nenhum complemento/plug-in de terceiros é suportado.

Reescrever DNS

Você pode personalizar CoreDNS com AKS para executar regravações de nomes DNS imediatas.

  1. Crie um arquivo chamado corednsms.yaml e cole o exemplo de configuração a seguir. Certifique-se de substituir <domain to be rewritten> por seu próprio nome de domínio totalmente qualificado.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: |
        <domain to be rewritten>.com:53 {
        log
        errors
        rewrite stop {
          name regex (.*)\.<domain to be rewritten>\.com {1}.default.svc.cluster.local
          answer name (.*)\.default\.svc\.cluster\.local {1}.<domain to be rewritten>.com
        }
        forward . /etc/resolv.conf # you can redirect this to a specific DNS server such as 10.0.0.10, but that server must be able to resolve the rewritten domain name
        }
    

    Importante

    Se você redirecionar para um servidor DNS, como o IP do serviço CoreDNS, esse servidor DNS deverá ser capaz de resolver o nome de domínio reescrito.

  2. Crie o ConfigMap usando o kubectl apply configmap comando e especifique o nome do seu manifesto YAML.

    kubectl apply -f corednsms.yaml
    
  3. Verifique se as personalizações foram aplicadas usando o kubectl get configmaps e especifique seu ConfigMap personalizado coredns.

    kubectl get configmaps --namespace=kube-system coredns-custom -o yaml
    
  4. Para recarregar o ConfigMap e permitir que o Kubernetes Scheduler reinicie o CoreDNS sem tempo de inatividade, execute uma reinicialização contínua usando kubectl rollout restarto .

    kubectl -n kube-system rollout restart deployment coredns
    

Servidor de encaminhamento personalizado

Se precisar especificar um servidor de encaminhamento para o tráfego de rede, você pode criar um ConfigMap para personalizar o DNS.

  1. Crie um arquivo chamado corednsms.yaml e cole o exemplo de configuração a seguir. Certifique-se de substituir o forward nome e o endereço pelos valores para seu próprio ambiente.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: | # you may select any name here, but it must end with the .server file extension
        <domain to be rewritten>.com:53 {
            forward foo.com 1.1.1.1
        }
    
  2. Crie o ConfigMap usando o kubectl apply configmap comando e especifique o nome do seu manifesto YAML.

    kubectl apply -f corednsms.yaml
    
  3. Para recarregar o ConfigMap e permitir que o Kubernetes Scheduler reinicie o CoreDNS sem tempo de inatividade, execute uma reinicialização contínua usando kubectl rollout restarto .

    kubectl -n kube-system rollout restart deployment coredns
    

Usar domínios personalizados

Talvez você queira configurar domínios personalizados que só podem ser resolvidos internamente. Por exemplo, você pode querer resolver o domínio personalizado puglife.local, que não é um domínio de nível superior válido. Sem um domínio personalizado ConfigMap, o cluster AKS não pode resolver o endereço.

  1. Crie um novo arquivo chamado corednsms.yaml e cole o exemplo de configuração a seguir. Certifique-se de atualizar o domínio personalizado e o endereço IP com os valores para seu próprio ambiente.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      puglife.server: | # you may select any name here, but it must end with the .server file extension
        puglife.local:53 {
            errors
            cache 30
            forward . 192.11.0.1  # this is my test/dev DNS server
        }
    
  2. Crie o ConfigMap usando o kubectl apply configmap comando e especifique o nome do seu manifesto YAML.

    kubectl apply -f corednsms.yaml
    
  3. Para recarregar o ConfigMap e permitir que o Kubernetes Scheduler reinicie o CoreDNS sem tempo de inatividade, execute uma reinicialização contínua usando kubectl rollout restarto .

    kubectl -n kube-system rollout restart deployment coredns 
    

Domínios de stub

CoreDNS também pode ser usado para configurar domínios de stub.

  1. Crie um arquivo chamado corednsms.yaml e cole o exemplo de configuração a seguir. Certifique-se de atualizar os domínios personalizados e endereços IP com os valores para seu próprio ambiente.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: | # you may select any name here, but it must end with the .server file extension
        abc.com:53 {
         errors
         cache 30
         forward . 1.2.3.4
        }
        my.cluster.local:53 {
            errors
            cache 30
            forward . 2.3.4.5
        }
    
    
  2. Crie o ConfigMap usando o kubectl apply configmap comando e especifique o nome do seu manifesto YAML.

    kubectl apply -f corednsms.yaml
    
  3. Para recarregar o ConfigMap e permitir que o Kubernetes Scheduler reinicie o CoreDNS sem tempo de inatividade, execute uma reinicialização contínua usando kubectl rollout restarto .

    kubectl -n kube-system rollout restart deployment coredns
    

Plug-in de hosts

Todos os plugins embutidos são suportados, então o plug-in de hosts CoreDNS está disponível para personalizar /etc/hosts também.

  1. Crie um arquivo chamado corednsms.yaml e cole o exemplo de configuração a seguir. Certifique-se de atualizar os endereços IP e nomes de host com os valores para seu próprio ambiente.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom # this is the name of the configmap you can overwrite with your changes
      namespace: kube-system
    data:
        test.override: | # you may select any name here, but it must end with the .override file extension
              hosts { 
                  10.0.0.1 example1.org
                  10.0.0.2 example2.org
                  10.0.0.3 example3.org
                  fallthrough
              }
    
  2. Crie o ConfigMap usando o kubectl apply configmap comando e especifique o nome do seu manifesto YAML.

    kubectl apply -f corednsms.yaml
    
  3. Para recarregar o ConfigMap e permitir que o Kubernetes Scheduler reinicie o CoreDNS sem tempo de inatividade, execute uma reinicialização contínua usando kubectl rollout restarto .

    kubectl -n kube-system rollout restart deployment coredns
    

Conclusão de domínio de pesquisa inválida para internal.cloudapp.net e reddog.microsoft.com

O DNS do Azure configura um domínio de pesquisa padrão em redes virtuais usando o DNS do Azure e um stub reddog.microsoft.com não funcional em redes virtuais usando servidores DNS personalizados (consulte a resolução de nomes para obter a documentação de <vnetId>.<region>.internal.cloudapp.net recursos para obter mais detalhes). O Kubernetes define as configurações de DNS do pod para ndots: 5 suportar adequadamente a resolução de nomes de host do serviço de cluster. Essas duas configurações se combinam para resultar em consultas de conclusão de domínio de pesquisa inválidas que nunca são enviadas para servidores de nomes upstream enquanto o sistema processa através da lista de pesquisa de domínio. Essas consultas inválidas causam atrasos na resolução de nomes e podem colocar carga extra nos servidores DNS upstream.

A partir da versão v20241025 do AKS, o AKS configura o CoreDNS para responder com o NXDOMAIN nos dois casos a seguir, a fim de evitar que essas consultas inválidas de conclusão de domínio de pesquisa sejam encaminhadas para o DNS upstream:

  • Qualquer consulta para o domínio raiz ou um subdomínio de reddog.microsoft.com.
  • Qualquer consulta a um subdomínio que tenha sete ou mais rótulos no nome de internal.cloudapp.net domínio.
    • Essa configuração permite que a resolução da máquina virtual por nome de host ainda seja bem-sucedida. Por exemplo, CoreDNS envia aks12345.myvnetid.myregion.internal.cloudapp.net (6 rótulos) para o DNS do Azure, mas rejeita mcr.microsoft.com.myvnetid.myregion.internal.cloudapp.net (8 rótulos)

Esse bloco é implementado no bloco de servidor padrão no Corefile para o cluster. Se necessário, essa configuração de rejeição pode ser desativada criando blocos de servidor personalizados para o domínio apropriado com um plug-in de encaminhamento habilitado:

  1. Crie um arquivo chamado corednsms.yaml e cole o exemplo de configuração a seguir. Certifique-se de atualizar os endereços IP e nomes de host com os valores para seu próprio ambiente.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom # this is the name of the configmap you can overwrite with your changes
      namespace: kube-system
    data:
        override-block.server:
           internal.cloudapp.net:53 {
               errors
               cache 30
               forward . /etc/resolv.conf
           }
           reddog.microsoft.com:53 {
               errors
               cache 30
               forward . /etc/resolv.conf
           }
    
  2. Crie o ConfigMap usando o kubectl apply configmap comando e especifique o nome do seu manifesto YAML.

    kubectl apply -f corednsms.yaml
    
  3. Para recarregar o ConfigMap e permitir que o Kubernetes Scheduler reinicie o CoreDNS sem tempo de inatividade, execute uma reinicialização contínua usando kubectl rollout restarto .

    kubectl -n kube-system rollout restart deployment coredns
    

Resolução de Problemas

Para obter etapas gerais de solução de problemas do CoreDNS, como verificar os pontos de extremidade ou a resolução, consulte Depurando a resolução DNS.

Configurar o dimensionamento de pod CoreDNS

Picos repentinos no tráfego DNS dentro de clusters AKS são uma ocorrência comum devido à elasticidade que o AKS fornece para cargas de trabalho. Esses picos podem levar a um aumento no consumo de memória pelos pods CoreDNS. Em alguns casos, esse aumento do consumo de memória pode causar Out of memory problemas. Para evitar esse problema, os clusters AKS dimensionam automaticamente os pods CoreDNS para reduzir o uso de memória por pod. As configurações padrão para essa lógica de dimensionamento automático são armazenadas no coredns-autoscaler ConfigMap. No entanto, você pode observar que o dimensionamento automático padrão de pods CoreDNS nem sempre é agressivo o suficiente para evitar Out of memory problemas para seus pods CoreDNS. Nesse caso, você pode modificar diretamente o coredns-autoscaler ConfigMap. Observe que simplesmente aumentar o número de pods CoreDNS sem abordar a Out of memory causa raiz do problema pode fornecer apenas uma correção temporária. Se não houver memória suficiente disponível nos nós onde os pods CoreDNS estão sendo executados, aumentar o número de pods CoreDNS não ajudará. Talvez seja necessário investigar mais e implementar soluções apropriadas, como otimizar o uso de recursos, ajustar solicitações e limites de recursos ou adicionar mais memória aos nós.

CoreDNS usa autoscaler proporcional de cluster horizontal para dimensionamento automático de pod. O coredns-autoscaler ConfigMap pode ser editado para configurar a lógica de dimensionamento para o número de pods CoreDNS. O coredns-autoscaler ConfigMap atualmente suporta dois valores de chave ConfigMap diferentes: linear e ladder que correspondem a dois modos de controle suportados. O linear controlador produz um número de réplicas no intervalo [min,max] equivalente a max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) ). O ladder controlador calcula o número de réplicas consultando duas funções de etapa diferentes, uma para dimensionamento de núcleo e outra para dimensionamento de nós, produzindo o máximo de dois valores de réplica. Para obter mais informações sobre os modos de controle e o formato ConfigMap, consulte a documentação upstream.

Importante

Recomenda-se um mínimo de 2 réplicas de pod CoreDNS por cluster. Configurar um mínimo de 1 réplica de pod CoreDNS pode resultar em falhas durante operações que exigem drenagem de nós, como operações de atualização de cluster.

Para recuperar o coredns-autoscaler ConfigMap, você pode executar o kubectl get configmap coredns-autoscaler -n kube-system -o yaml comando que retornará o seguinte:

apiVersion: v1
data:
  ladder: '{"coresToReplicas":[[1,2],[512,3],[1024,4],[2048,5]],"nodesToReplicas":[[1,2],[8,3],[16,4],[32,5]]}'
kind: ConfigMap
metadata:
  name: coredns-autoscaler
  namespace: kube-system
  resourceVersion: "..."
  creationTimestamp: "..."

Ativar o registo de consultas DNS

  1. Adicione a seguinte configuração ao seu ConfigMap personalizado de coredns:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      log.override: | # you may select any name here, but it must end with the .override file extension
            log
    
  2. Aplique as alterações de configuração e force o CoreDNS a recarregar o ConfigMap usando os seguintes comandos:

    # Apply configuration changes
    kubectl apply -f corednsms.yaml
    
    # Force CoreDNS to reload the ConfigMap
    kubectl -n kube-system rollout restart deployment coredns
    
  3. Exiba o log de depuração CoreDNS usando o kubectl logs comando.

    kubectl logs --namespace kube-system -l k8s-app=kube-dns
    

Próximos passos

Este artigo mostrou alguns cenários de exemplo para personalização CoreDNS. Para obter informações sobre o projeto CoreDNS, consulte a página do projeto upstream CoreDNS.

Para saber mais sobre os conceitos de rede principal, consulte Conceitos de rede para aplicações no AKS.