Defina dnsPolicy para controlar o comportamento de DNS do pod e use hostAliases para mapear domínios a IPs fixos.
Pré-requisitos
Funcionamento do CoreDNS no ACK
O ACK implanta o CoreDNS em todos os clusters. Um Service chamado kube-dns o expõe para consultas de DNS dos pods. Por padrão, dois pods coredns atuam como backend.
Inspecione os componentes de DNS no cluster:
# Check the kube-dns Service
kubectl get svc kube-dns -n kube-system
# Check the coredns Deployment
kubectl get deployment coredns -n kube-system
Consulte Visão geral do DNS.
Defina uma política de DNS para um pod
A dnsPolicy controla como o pod resolve nomes de domínio. O ACK oferece suporte a quatro políticas:
|
Política |
Comportamento |
|
|
O pod usa o CoreDNS. O arquivo |
|
|
O pod ignora as configurações de DNS do cluster. Use |
|
|
O pod herda as configurações de DNS do nó. No ACK, os nós são instâncias ECS, portanto o pod usa o |
|
|
Destinada a pods com hostNetwork. Sem esta política, um pod hostNetwork assume o valor |
A políticaDefaultnão é a configuração padrão. Se você omitir adnsPolicy, o pod usaráClusterFirst.
Use o CoreDNS para resolver nomes de domínio
Use ClusterFirst (padrão) quando os pods precisarem acessar outros Services do cluster.
Defina dnsPolicy: ClusterFirst na especificação do pod:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: ClusterFirst
Aplique o manifesto e verifique a resolução de DNS:
kubectl apply -f pod.yaml
# Verify that the pod resolves cluster Services correctly
kubectl exec alpine -- nslookup kubernetes.default
Personalize as configurações de DNS de um pod
Use dnsPolicy: None para ter controle total sobre o servidor DNS e os domínios de busca do pod.
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: None
dnsConfig:
nameservers: ["169.254.xx.xx"]
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "2"
O campo dnsConfig aceita as seguintes propriedades:
nameservers: IPs dos servidores DNS para o pod. Aceita até três endereços. Obrigatório quando
dnsPolicyforNone; opcional nos demais casos. Os valores são mesclados aos nameservers gerados pela política, e as duplicatas são removidas.searches: Domínios de busca DNS para consulta de hostnames. Campo opcional com limite de seis entradas. Mescla-se aos domínios de busca gerados pela política, eliminando duplicatas. Caso o servidor DNS esteja inacessível, apenas o primeiro domínio é tentado.
options: Objetos contendo um
nameobrigatório e umvalueopcional. São mesclados às opções geradas pela política, com remoção de duplicatas. Consulte Políticas de resolução e cache de DNS.
Aplique o manifesto e verifique a configuração:
kubectl apply -f pod.yaml
# Check the DNS configuration inside the pod
kubectl exec alpine -- cat /etc/resolv.conf
Consulte DNS para Services e Pods.
Use as configurações de DNS do nó
Use dnsPolicy: Default quando os pods não precisarem dos Services do cluster e devam resolver nomes via DNS da Alibaba Cloud em vez do CoreDNS.
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: Default
Aplique o manifesto e valide a configuração:
kubectl apply -f pod.yaml
# Confirm the pod inherits the node's resolv.conf
kubectl exec alpine -- cat /etc/resolv.conf
Permita que pods hostNetwork acessem Services do cluster
Pods configurados com hostNetwork: true assumem por padrão a política de DNS Default, o que impede o acesso aos Services do cluster por nome. Defina dnsPolicy: ClusterFirstWithHostNet para restaurar a resolução de DNS do cluster.
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
Aplique o manifesto e verifique o funcionamento:
kubectl apply -f pod.yaml
# Verify that the pod resolves cluster Services correctly
kubectl exec alpine -- nslookup kubernetes.default
Mapeie nomes de domínio para endereços IP específicos
Há dois métodos disponíveis:
Todos os pods (global): Ative o plugin hosts do CoreDNS para aplicar o mapeamento em todo o cluster. Consulte Configurar recursos estendidos com base no CoreDNS.
Pod individual: Use o campo
hostAliasespara adicionar entradas ao arquivo/etc/hostsdesse pod específico.
Adicione aliases de host a um pod
O campo hostAliases insere entradas no arquivo /etc/hosts do pod após a inicialização pelo Kubernetes.
Não edite o arquivo /etc/hosts diretamente. O kubelet gerencia esse arquivo e sobrescreve alterações manuais sempre que o pod é iniciado ou reiniciado.
apiVersion: v1
kind: Pod
metadata:
name: hostaliases-pod
spec:
hostAliases:
- ip: "127.0.**.**"
hostnames:
- "foo.local"
- "bar.local"
- ip: "10.1.**.**"
hostnames:
- "foo.remote"
containers:
- name: cat-hosts
image: busybox:1.28
command:
- cat
args:
- "/etc/hosts"
Após a inicialização, o arquivo /etc/hosts contém as entradas gerenciadas pelo Kubernetes seguidas pelos seus aliases:
# Kubernetes-managed hosts file.
127.0.**.** localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
10.200.**.** hostaliases-pod
# Entries added by HostAliases.
127.0.**.** foo.local bar.local
10.1.**.** foo.remote
Aplique o manifesto e confirme que os aliases resolvem corretamente:
kubectl apply -f hostaliases-pod.yaml
# Check that the aliases appear in /etc/hosts
kubectl exec hostaliases-pod -- cat /etc/hosts
# Verify resolution
kubectl exec hostaliases-pod -- nslookup foo.local
Próximos passos
Melhores práticas para serviços de DNS — otimize o desempenho e a confiabilidade do DNS no ACK.
Políticas de resolução e cache de DNS — referência sobre resolução e cache do CoreDNS.