Kubernetes, também conhecido como K8s, é um sistema de código aberto de orquestração para automatizar a implantação, o dimensionamento e o gerenciamento de aplicativos em contêineres. Sua portabilidade, flexibilidade e recursos de dimensionamento automático o tornam um sistema amplamente utilizado. Acima de todos os recursos de destaque, a opção de criar registros DNS para serviços e pods o torna imbatível em relação a outros sistemas de software. O serviço DNS do Kubernetes permite que você entre em contato com os serviços usando nomes DNS consistentes em vez de endereços IP.
Pré-requisitos
Para aproveitar ao máximo o tutorial e entender melhor o serviço DNS do Kubernetes, certifique-se de se atualizar com os conceitos básicos do Kubernetes. Você também se beneficiará ao ler a Visão geral de terminologias, componentes e conceitos de DNS para obter uma melhor compreensão dos conceitos de DNS. Além disso, uma visão geral do ecossistema Docker e os conceitos básicos da tecnologia de conteinerização trarão uma grande vantagem.
O que é um sistema DNS?
O Domain Name System (DNS) é um mecanismo para vincular vários tipos de informações a nomes fáceis de lembrar, como endereços IP. O uso de um sistema DNS para traduzir nomes de solicitação em endereços IP facilita para os usuários finais alcançarem o nome de domínio de destino sem esforço. A maioria dos clusters Kubernetes inclui um serviço DNS interno configurado por padrão para oferecer uma abordagem leve para descoberta de serviços. Mesmo quando pods e serviços são criados, excluídos ou movidos entre nós, a descoberta de serviços integrada simplifica a identificação e a comunicação dos aplicativos com os clusters Kubernetes.
Nas versões recentes do Kubernetes, as especificidades técnicas do serviço DNS do Kubernetes mudaram. Este tutorial tem como objetivo apresentar as implementações kube-dns e CoreDNS do serviço DNS do Kubernetes. Entenderemos os registros DNS do Kubernetes em detalhes e demonstraremos como o DNS do Kubernetes funciona.
O que está incluído no serviço DNS do Kubernetes?
Anteriormente, o serviço DNS do Kubernetes era baseado no kube-dns antes do lançamento da versão 1.11. No entanto, a segurança e a privacidade ainda eram uma preocupação séria. Mais tarde, a comunidade Kubernetes introduziu o CoreDNS na nova versão 1.11 para resolver os problemas de segurança e estabilidade do kube-dns.
Não importa qual versão do software você esteja usando para lidar com registros DNS, o kube-dns e o CoreDNS funcionam de maneira semelhante:
- Um kube-dns serviço e um ou mais pods são criados.
- O kube-dns serviço monitora a API do Kubernetes para eventos de serviço e endpoint e altera suas entradas DNS conforme apropriado. Quando você modifica esses serviços do Kubernetes e seus pods relacionados com operações de criação, edição ou exclusão, esses eventos são acionados automaticamente.
- Kubelet atribui o IP do cluster do kube-dns serviço para cada novo pod etc/resolv.conf nameserver opção, juntamente com as configurações de search adequadas para permitir nomes de host mais curtos:
|
1 2 3 |
nameserver 10.32.0.10 search namespace.svc.cluster.local svc.cluster.local cluster.local options ndots:5 |
-
Os aplicativos em contêineres podem então resolver nomes de host como example-service.namespace para o endereço IP do cluster apropriado.
Uma visão geral dos registros DNS do Kubernetes
Vamos entender melhor os registros DNS do Kubernetes com a ajuda de um exemplo. O registro DNS A completo para um serviço do Kubernetes será parecido com:
service.namespace.svc.cluster.local
Um pod teria um registro neste formato, que representaria o endereço IP real do pod:
10.32.0.125.namespace.pod.cluster.local
Além disso, SRV registros são criados para as portas especificadas de um serviço do Kubernetes:
|
1 |
_port-name._protocol.service.namespace.svc.cluster.local |
Como resultado, seu aplicativo ou microsserviço pode acessar um nome de host simples e consistente para alcançar outros serviços ou pods no cluster, graças ao mecanismo integrado de descoberta de serviços baseado em DNS.
Resolvendo nomes de host mais curtos e pesquisando domínios
Você nem sempre precisará utilizar o hostname completo para acessar outro serviço devido aos sufixos de domínio de busca definidos no resolv.conf arquivo. Se você estiver entrando em contato com um serviço no mesmo namespace, poderá apenas chamá-lo pelo seu nome:
|
1 |
other-service |
Adicione other-service à consulta se o serviço estiver em um namespace diferente:
|
1 |
other-service.other-namespace |
Você precisará utilizar pelo menos o seguinte se estiver buscando um pod:
|
1 |
pod-ip.other-namespace.pod |
Apenas os .svc sufixos são completados automaticamente no arquivo resolv.conf padrão. Portanto, é essencial especificar as configurações até .pod. A seguir, vamos analisar as complexidades das duas implementações alternativas de DNS do Kubernetes que conhecemos até agora.
Implementação de DNS do Kubernetes
A versão 1.11 do Kubernetes forneceu um novo software para gerenciar o serviço kube-dns , conforme mencionado na seção anterior. O principal motivo por trás da nova atualização foi melhorar o desempenho e a segurança do serviço. Vamos começar com a integração do kube-dns desde o início.
-
kube-dns
Na versão anterior do Kubernetes 1.11, o serviço kube-dns tinha três containers operando em um pod kube-dns no namespace kube-system . Dê uma olhada nos três containers abaixo:
- kube-dns: um container que executa o SkyDNS e funciona como um serviço de resolução de consultas DNS.
- dnsmasq: as respostas do SkyDNS são armazenadas em cache pelo dnsmasq, um resolvedor e cache DNS leve e comum.
- sidecar: um container ao lado do serviço que realiza relatórios de métricas e reage a verificações de integridade.
O CoreDNS foi criado como resultado de vulnerabilidades de segurança no Dnsmasq e preocupações de desempenho de escalabilidade com o SkyDNS.
-
CoreDNS
Como um novo serviço de DNS do Kubernetes, o CoreDNS foi atualizado para Disponibilidade Geral (General Availability) no Kubernetes 1.11. Isso significa que ele está pronto para produção e será usado por muitas ferramentas de instalação e provedores gerenciados de Kubernetes como o serviço de DNS padrão do cluster.
O CoreDNS é um servidor DNS flexível e extensível que atua como um cluster DNS do Kubernetes. Ele executa todas as funcionalidades do sistema anterior. Um container DNS é responsável por resolver e armazenar em cache as consultas DNS. O CoreDNS responde a verificações de integridade e fornece métricas em um único container. Além disso, ele aborda algumas falhas menores e fornece novos recursos para resolver problemas de desempenho e segurança:
- Alguns conflitos entre o uso de stubDomains e serviços externos foram resolvidos.
- Ao randomizar a ordem em que algumas entradas são retornadas, o CoreDNS pode melhorar o balanceamento de carga baseado em DNS do tipo round-robin.
- Ao iterar de forma mais eficiente sobre cada um dos sufixos de domínio de busca definidos no resolv.conf, um recurso chamado autopath pode melhorar os tempos de resposta do DNS ao resolver hostnames externos.
- Mesmo que o pod não exista, o kube-dns 10.32.0.125.namespace.pod.cluster.local sempre resolverá para 10.32.0.125. O CoreDNS oferece um modo de pods validados que só resolverá se existir um pod com o endereço IP e namespace corretos.
Para aprimorar seus conhecimentos sobre os endpoints, autopaths, e wildcards do Kubernetes, confira um tutorial sobre como o Kubernetes permite a leitura de dados de zona de seu cluster.
Recursos de Personalização
O Kubernetes permite que você configure pods de DNS e personalize a resolução de DNS do cluster, graças ao serviço de personalização de DNS do KubernetesOs administradores podem aproveitar esses serviços para alterar os nameservers upstream ou os sufixos de domínio de busca definidos no resolv.conf. Acima de tudo, há um recurso adicional para personalizar pods e containers usando a opção dnsConfig :

A atualização desta configuração forçará a reescrita do resolv.conf de um pod, permitindo que as alterações entrem em vigor. A configuração acima criará um arquivo contendo as linhas nameserver 203.0.113.44 e search custom.dns.local , o que se transfere diretamente para as opções normais do resolv.conf .
Conclusão
Neste tutorial, apresentamos os conceitos básicos do serviço DNS do Kubernetes e sua implementação em diferentes versões. Os registros DNS do Kubernetes também foram discutidos com a ajuda de um exemplo. Além disso, destacamos algumas opções de configuração adicionais para personalizar pods e resolver consultas DNS. Isso cobre o básico do serviço DNS do Kubernetes, mas seu aprendizado não deve terminar aqui. Consulte a documentação oficial do Kubernetes para explorar mais sobre o assunto.
Para aprofundar seus conhecimentos em DevOps e mergulhar nos conceitos essenciais do Kubernetes, confira os seguintes tutoriais do nosso blog:
- Introdução ao Helm: Gerenciador de Pacotes para Kubernetes
- Como Instalar e Usar o Kubernetes no Ubuntu 20.04
- Implantar uma Aplicação PHP em um Cluster Kubernetes com Ubuntu 18.04
Boa computação!
Comentários
Nenhum comentário ainda. Seja o primeiro.