Configuração de DNS
Cada cluster do Kubernetes tem um complemento de DNS integrado (Kube-DNS ou CoreDNS) para fornecer resolução de nome de domínio para cargas de trabalho no cluster. Ao lidar com uma alta simultaneidade de consultas do DNS, Kube-DNS/CoreDNS pode encontrar um gargalo de desempenho, ou seja, pode falhar ocasionalmente para atender consultas do DNS. Há casos em que as cargas de trabalho do Kubernetes iniciam consultas do DNS desnecessárias. Isso torna o DNS sobrecarregado se houver muitas consultas de DNS simultâneas. Ajustar a configuração de DNS para cargas de trabalho reduzirá os riscos de falhas de consulta do DNS até certo ponto.
Para obter mais informações sobre o DNS, consulte CoreDNS.
Itens de configuração de DNS
nameserver 10.247.x.x search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5
- nameserver: uma lista de endereços IP de um servidor de nomes que o resolvedor irá consultar. Se esse parâmetro for definido como 10.247.x.x, o resolvedor consultará o kube-dns/CoreDNS. Se este parâmetro for definido para outro endereço IP, o resolvedor irá consultar um servidor DNS na nuvem ou no local.
- search: uma lista de pesquisa de nome de host. Quando um nome de domínio não puder ser resolvido, as consultas de DNS serão tentadas combinando o nome de domínio com cada domínio na lista de pesquisa por vez até que uma correspondência seja encontrada ou todos os domínios na lista de pesquisa sejam tentados. Para clusters do CCE, a lista de pesquisa está atualmente limitada a três domínios por contêiner. Quando um nome de domínio inexistente está sendo resolvido, oito consultas de DNS serão iniciadas porque cada nome de domínio (incluindo aqueles na lista de pesquisa) será consultado duas vezes, uma para IPv4 e outra para IPv6.
- options: opções que permitem que certas variáveis internas do resolvedor sejam modificadas. As opções comuns incluem timeout e ndots.
O valor ndots:5 significa que, se um nome de domínio tiver menos de 5 pontos (.), as consultas de DNS serão tentadas combinando o nome de domínio com cada domínio na lista de pesquisa. Se nenhuma correspondência for encontrada depois que todos os domínios na lista de pesquisa forem tentados, o nome de domínio será usado para a consulta de DNS. Se o nome de domínio tiver 5 ou mais de 5 pontos, ele será tentado primeiro para consulta de DNS. Caso o nome de domínio não possa ser resolvido, as consultas de DNS serão tentadas combinando o nome de domínio com cada domínio na lista de pesquisa, por sua vez.
Por exemplo, o nome de domínio www.***.com tem apenas dois pontos (menor que o valor de ndots) e, portanto, a sequência de consultas DNS é a seguinte: www.***.default.svc.cluster.local, www.***.com.svc.cluster.local, www.***.com.cluster.local e www.***.com. Isso significa que pelo menos sete consultas de DNS serão iniciadas antes que o nome de domínio seja resolvido em um endereço IP. É claro que, quando muitas consultas desnecessárias de DNS serão iniciadas para acessar um nome de domínio externo. Há espaço para melhorias na configuração de DNS da carga de trabalho.
Para obter mais informações sobre as opções de configuração no arquivo de configuração do resolvedor usado pelos sistemas operacionais Linux, visite http://man7.org/linux/man-pages/man5/resolv.conf.5.html.
Configurar o DNS para uma carga de trabalho usando o console
O Kubernetes fornece opções de configuração relacionadas ao DNS para aplicações. O uso da configuração de DNS da aplicação pode efetivamente reduzir consultas de DNS desnecessárias em determinados cenários e melhorar a simultaneidade do serviço. O procedimento a seguir usa uma aplicação Nginx como exemplo para descrever como adicionar configurações de DNS para uma carga de trabalho no console.
- Efetue logon no console do CCE, acesse o console do cluster, selecione Workloads no painel de navegação e clique em Create Workload no canto superior direito.
- Configure informações básicas sobre a carga de trabalho. Para mais detalhes, consulte Criação de uma carga de trabalho.
- Na área Advanced Settings, clique na guia DNS e defina os seguintes parâmetros conforme necessário:
- DNS Policy: as políticas de DNS fornecidas no console correspondem ao campo dnsPolicy no arquivo YAML. Para mais detalhes, consulte Tabela 1.
- Supplement defaults: corresponde a dnsPolicy=ClusterFirst. Os contêineres podem resolver os nomes de domínio internos do cluster registrados por um serviço e os nomes de domínio externos expostos a redes públicas.
- Replace defaults: corresponde a dnsPolicy=None. Você deve configurar IP Address e Search Domain. Os contêineres usam apenas o endereço IP definido pelo usuário e as configurações de domínio de pesquisa para a resolução de nomes de domínio.
- Inherit defaults: corresponde a dnsPolicy=Default. Os contêineres usam a configuração de resolução de nome de domínio do nó em que os pods são executados e não podem resolver os nomes de domínio internos do cluster.
- Optional Objects: os parâmetros de opções no campo dnsConfig. Cada objeto pode ter uma propriedade de nome (obrigatório) e uma propriedade de valor (opcional). Depois de definir as propriedades, clique em confirm to add.
- timeout: intervalo de tempo limite, em segundos.
- ndots: número de pontos (.) que devem estar presentes em um nome de domínio. Se um nome de domínio tiver pontos menores que esse valor, o sistema operacional procurará o nome no domínio de pesquisa. Caso contrário, o nome é um nome de domínio totalmente qualificado (FQDN) e será tentado primeiro como um nome absoluto.
- IP Address: nameservers no dnsConfig. Você pode configurar o servidor de nomes de domínio para o nome de domínio personalizado. O valor é um ou um grupo de endereços IP do DNS.
- Search Domain: searches no dnsConfig. Uma lista de domínios de pesquisa do DNS para pesquisa de nome de host no pod. Esta propriedade é opcional. Quando especificada, a lista fornecida será mesclada nos nomes de domínio de pesquisa gerados a partir da política do DNS escolhida em dnsPolicy. Nomes de domínio duplicados são removidos.
- DNS Policy: as políticas de DNS fornecidas no console correspondem ao campo dnsPolicy no arquivo YAML. Para mais detalhes, consulte Tabela 1.
- Clique em Create Workload.
Configurar o DNS usando a carga de trabalho de YAML
apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: container-1 image: nginx:latest imagePullPolicy: IfNotPresent imagePullSecrets: - name: default-secret dnsPolicy: None dnsConfig: options: - name: ndots value: '5' - name: timeout value: '3' nameservers: - 10.2.3.4 searches: - my.dns.search.suffix
- dnsPolicy
O campo dnsPolicy é usado para configurar uma política de DNS para uma aplicação. O valor padrão é ClusterFirst. A tabela a seguir lista as configurações de dnsPolicy.
Tabela 1 dnsPolicy Parâmetro
Descrição
ClusterFirst (valor padrão)
Configuração de DNS personalizada adicionada à configuração de DNS padrão. Por padrão, a aplicação se conecta ao CoreDNS (CoreDNS do cluster do CCE conecta-se ao DNS na nuvem por padrão). O dnsConfig personalizado será adicionado aos parâmetros do DNS padrão. Os contêineres podem resolver os nomes de domínio internos do cluster registrados por um serviço e os nomes de domínio externos expostos a redes públicas. A lista de pesquisa (opção search) e ndots: 5 estão presentes no arquivo de configuração do DNS. Portanto, ao acessar um nome de domínio externo e um nome de domínio interno de cluster longo (por exemplo, kubernetes.default.svc.cluster.local), a lista de pesquisa geralmente será percorrida primeiro, resultando em pelo menos seis consultas de DNS inválidas. O problema de consultas de DNS inválidas desaparece somente quando um nome de domínio curto interno do cluster (por exemplo, kubernetes) está sendo acessado.
ClusterFirstWithHostNet
Por padrão, os aplicativos configurados com a rede do host são interconectados com a configuração de DNS do nó onde o pod está localizado. A configuração de DNS é especificada no arquivo de DNS para o qual o parâmetro de kubelet --resolv-conf aponta. Nesse caso, o cluster do CCE usa o DNS na nuvem. Se as cargas de trabalho precisarem usar Kube-DNS/CoreDNS do cluster, defina dnsPolicy como ClusterFirstWithHostNet e o arquivo de configuração de DNS do contêiner seja o mesmo que ClusterFirst, no qual ainda existem consultas de DNS inválidas.... spec: containers: - image: nginx:latest imagePullPolicy: IfNotPresent name: container-1 restartPolicy: Always hostNetwork: true dnsPolicy: ClusterFirstWithHostNet
Default
A configuração de DNS do nó onde o pod está localizado é herdada e a configuração de DNS personalizada é adicionada à configuração herdada. O arquivo de configuração de DNS do contêiner é o arquivo de configuração de DNS para o qual o sinalizador do kubelet --resolv-conf aponta. Neste caso, um DNS da nuvem é usado para clusters do CCE. Ambos os campos search e options são deixados sem especificação. Essa configuração só pode resolver os nomes de domínio externos registrados na Internet e não nomes de domínio internos de cluster. Essa configuração está livre do problema de consultas de DNS inválidas.
None
A configuração de DNS padrão é substituída pela configuração de DNS personalizada e somente a configuração de DNS personalizada é usada. Se dnsPolicy estiver definido como None, o campo dnsConfig deve ser especificado porque todas as configurações de DNS devem ser fornecidas usando o campo dnsConfig.
Se o campo dnsPolicy não for especificado, o valor padrão será ClusterFirst em vez de Default.
- dnsConfig
O campo dnsConfig é usado para configurar parâmetros de DNS para cargas de trabalho. Os parâmetros configurados são mesclados ao arquivo de configuração de DNS gerado de acordo com dnsPolicy. Se dnsPolicy estiver definido como None, o arquivo de configuração de DNS da carga de trabalho será especificado pelo campo dnsConfig. Se dnsPolicy não estiver definido como None, os parâmetros de DNS configurados em dnsConfig serão adicionados ao arquivo de configuração de DNS gerado de acordo com dnsPolicy.
Tabela 2 dnsConfig Parâmetro
Descrição
options
Uma lista opcional de objetos onde cada objeto pode ter uma propriedade de nome (obrigatória) e uma propriedade de valor (opcional). O conteúdo desta propriedade será mesclado com as opções geradas a partir da política de DNS especificada no dnsPolicy. As entradas duplicadas são removidas.
nameservers
Uma lista de endereços IP que serão usados como servidores DNS. Se dnsPolicy da carga de trabalho estiver definido como None, a lista deverá conter pelo menos um endereço IP, caso contrário, essa propriedade será opcional. Os servidores listados serão combinados com os servidores de nomes gerados a partir da política de DNS especificada em dnsPolicy com endereços duplicados removidos.
NOTA:Um máximo de três endereços de DNS podem ser configurados para um servidor de nomes no arquivo de configuração de DNS do contêiner.
- Se dnsPolicy estiver definida como ClusterFirst e o cluster usar CoreDNS, você pode adicionar dois endereços de DNS personalizados além do endereço de CoreDNS. Endereços de DNS em excesso são inválidos.
- Se dnsPolicy estiver definida como ClusterFirst e o cluster usar CoreDNS e NodeLocal DNSCache, você poderá adicionar um endereço de DNS personalizado além dos endereços de CoreDNS e NodeLocal DNSCache. Endereços de DNS em excesso são inválidos.
searches
Uma lista de domínios de pesquisa de DNS para pesquisa de nome de host no Pod. Esta propriedade é opcional. Quando especificada, a lista fornecida será mesclada nos nomes de domínio de pesquisa gerados a partir da política do DNS escolhida em dnsPolicy. Nomes de domínio duplicados são removidos. O Kubernetes permite no máximo 6 domínios de pesquisa.
Exemplos de configuração
O exemplo a seguir descreve como configurar o DNS para cargas de trabalho.
- Caso de uso 1: usar Kube-DNS/CoreDNS embutido em clusters do Kubernetes
Cenário
Kube-DNS/CoreDNS do Kubernetes no cluster aplica-se a resolver apenas nomes de domínio internos ao cluster ou nomes de domínio internos ao cluster + nomes de domínio externos. Este é o DNS padrão para cargas de trabalho.
Exemplo:
apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: ClusterFirst imagePullSecrets: - name: default-secret
Arquivo de configuração de DNS do contêiner:
nameserver 10.247.3.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5
- Caso de uso 2: usar um DNS em nuvem
Cenário
Um DNS não pode resolver nomes de domínio internos de cluster e, portanto, aplica-se ao cenário em que as cargas de trabalho acessam apenas nomes de domínio externos registrados na Internet.
Exemplo:
apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: Default # The DNS configuration file that the kubelet --resolv-conf parameter points to is used. In this case, the CCE cluster uses the DNS on the cloud. imagePullSecrets: - name: default-secret
Arquivo de configuração de DNS do contêiner:
nameserver 100.125.x.x
- Caso de uso 3: usar Kube-DNS/CoreDNS para cargas de trabalho em execução com hostNetwork
Cenário
Por padrão, um DNS é usado para cargas de trabalho em execução com hostNetwork. Se as cargas de trabalho precisarem usar Kube-DNS/CoreDNS, defina dnsPolicy como ClusterFirstWithHostNet.
Exemplo:
apiVersion: v1 kind: Pod metadata: name: nginx spec: hostNetwork: true dnsPolicy: ClusterFirstWithHostNet containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 imagePullSecrets: - name: default-secret
Arquivo de configuração de DNS do contêiner:
nameserver 10.247.3.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5
- Caso de uso 4: personalizar a configuração de DNS da aplicação
Cenário
Você pode personalizar de forma flexível o arquivo de configuração de DNS para aplicações. Usar dnsPolicy e dnsConfig juntos pode resolver quase todos os cenários, incluindo os cenários em que um DNS local será usado, vários DNSs serão em cascata e as opções de configuração de DNS serão modificadas.
Exemplo 1: usar seu DNS local
Defina dnsPolicy como None para que o arquivo de configuração de DNS do aplicação seja gerada com base no dnsConfig.
apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: "None" dnsConfig: nameservers: - 10.2.3.4 # IP address of your on-premises DNS searches: - ns1.svc.cluster.local - my.dns.search.suffix options: - name: ndots value: "2" - name: timeout value: "3" imagePullSecrets: - name: default-secret
Arquivo de configuração de DNS do contêiner:
nameserver 10.2.3.4 search ns1.svc.cluster.local my.dns.search.suffix options timeout:3 ndots:2
Exemplo 2: modificar a opção ndots no arquivo de configuração de DNS para reduzir consultas de DNS inválidas
Defina dnsPolicy para um valor diferente de None para que os parâmetros de DNS configurados em dnsConfig sejam adicionados ao arquivo de configuração de DNS gerado com base em dnsPolicy.
apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: "ClusterFirst" dnsConfig: options: - name: ndots value: "2" # The ndots:5 option in the DNS configuration file generated based on the ClusterFirst policy is changed to ndots:2. imagePullSecrets: - name: default-secret
Arquivo de configuração de DNS do contêiner:
nameserver 10.247.3.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:2
Exemplo 3: usar vários DNSs em sequência serial
apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: ClusterFirst # Added DNS configuration. The cluster connects to CoreDNS by default. dnsConfig: nameservers: - 10.2.3.4 # IP address of your on-premises DNS imagePullSecrets: - name: default-secret
Um máximo de três endereços de DNS podem ser configurados para um servidor de nomes no arquivo de configuração de DNS do contêiner.
- Se dnsPolicy estiver definida como ClusterFirst e o cluster usar CoreDNS, você pode adicionar dois endereços de DNS personalizados além do endereço de CoreDNS. Endereços de DNS em excesso são inválidos.
- Se dnsPolicy estiver definida como ClusterFirst e o cluster usar CoreDNS e NodeLocal DNSCache, você poderá adicionar um endereço de DNS personalizado além dos endereços de CoreDNS e NodeLocal DNSCache. Endereços de DNS em excesso são inválidos.
Arquivo de configuração de DNS do contêiner:
nameserver 10.247.3.10 10.2.3.4 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5