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.
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.
Crie o ConfigMap usando o
kubectl apply configmap
comando e especifique o nome do seu manifesto YAML.kubectl apply -f corednsms.yaml
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
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 restart
o .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.
Crie um arquivo chamado
corednsms.yaml
e cole o exemplo de configuração a seguir. Certifique-se de substituir oforward
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 }
Crie o ConfigMap usando o
kubectl apply configmap
comando e especifique o nome do seu manifesto YAML.kubectl apply -f corednsms.yaml
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 restart
o .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.
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 }
Crie o ConfigMap usando o
kubectl apply configmap
comando e especifique o nome do seu manifesto YAML.kubectl apply -f corednsms.yaml
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 restart
o .kubectl -n kube-system rollout restart deployment coredns
Domínios de stub
CoreDNS também pode ser usado para configurar domínios de stub.
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 }
Crie o ConfigMap usando o
kubectl apply configmap
comando e especifique o nome do seu manifesto YAML.kubectl apply -f corednsms.yaml
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 restart
o .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.
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 }
Crie o ConfigMap usando o
kubectl apply configmap
comando e especifique o nome do seu manifesto YAML.kubectl apply -f corednsms.yaml
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 restart
o .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 rejeitamcr.microsoft.com.myvnetid.myregion.internal.cloudapp.net
(8 rótulos)
- Essa configuração permite que a resolução da máquina virtual por nome de host ainda seja bem-sucedida. Por exemplo, CoreDNS envia
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:
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 }
Crie o ConfigMap usando o
kubectl apply configmap
comando e especifique o nome do seu manifesto YAML.kubectl apply -f corednsms.yaml
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 restart
o .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
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
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
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.
Azure Kubernetes Service