Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2024-11-28 GMT+08:00

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

Execute o comando cat /etc/resolv.conf em um nó ou contêiner do Linux para exibir o arquivo de configuração do resolvedor de DNS. Veja a seguir um exemplo de configuração de resolvedor do DNS de um contêiner em um cluster do Kubernetes:
nameserver 10.247.x.x
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
Opções de configuração
  • 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.

  1. 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.
  2. Configure informações básicas sobre a carga de trabalho. Para mais detalhes, consulte Criação de uma carga de trabalho.
  3. 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.

  4. Clique em Create Workload.

Configurar o DNS usando a carga de trabalho de YAML

Ao criar uma carga de trabalho usando um arquivo YAML, você pode definir as definições de DNS no YAML. O seguinte é um exemplo para uma aplicação de Nginx:
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