Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Actualización más reciente 2024-09-10 GMT+08:00

Configuración de DNS

Cada clúster de Kubernetes tiene un complemento de DNS integrado (Kube-DNS o CoreDNS) para proporcionar resolución de nombres de dominio para las cargas de trabajo del clúster. Cuando se maneja una alta concurrencia de consultas de DNS, Kube-DNS/CoreDNS puede encontrar un cuello de botella de rendimiento, es decir, puede fallar ocasionalmente para satisfacer las consultas de DNS. Hay casos en los que las cargas de trabajo de Kubernetes inician consultas de DNS innecesarias. Esto hace que el DNS se sobrecargue si hay muchas consultas de DNS simultáneas. Al ajustar la configuración de DNS para las cargas de trabajo, se reducirán en cierta medida los riesgos de fallas en las consultas de DNS.

Para obtener más información acerca de DNS, consulte coredns (complemento de recursos del sistema, obligatorio).

Conceptos de configuración de DNS

Ejecute el comando cat /etc/resolv.conf en un nodo de Linux o contenedor para ver el archivo de configuración del solucionador de DNS. A continuación se muestra un ejemplo de configuración de resolución de DNS de un contenedor en un clúster de Kubernetes:
nameserver 10.247.x.x
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
Opciones de configuración
  • nameserver: una lista de direcciones IP de un servidor de nombres que el solucionador consultará. Si este parámetro se establece en 10.247.x.x, el solucionador consultará el kube-dns/CoreDNS. Si este parámetro se establece en otra dirección IP, el solucionador consultará un servidor DNS en la nube o local.
  • search: una lista de búsqueda para la búsqueda de nombre de host. Cuando un nombre de dominio no se puede resolver, las consultas de DNS se intentarán combinar el nombre de dominio con cada dominio en la lista de búsqueda a su vez hasta que se encuentre una coincidencia o se intenten todos los dominios en la lista de búsqueda. En el caso de los clústeres de CCE, la lista de búsqueda se limita actualmente a tres dominios por contenedor. Cuando se resuelve un nombre de dominio inexistente, se iniciarán ocho consultas de DNS porque cada nombre de dominio (incluidos los de la lista de búsqueda) se consultará dos veces, una para IPv4 y la otra para IPv6.
  • options: opciones que permiten modificar ciertas variables internas de resolución. Las opciones comunes incluyen el tiempo de espera y los ndots.

    El valor ndots:5 significa que si un nombre de dominio tiene menos de 5 puntos (.), las consultas de DNS se intentarán combinando el nombre de dominio con cada dominio en la lista de búsqueda a su vez. Si no se encuentra ninguna coincidencia después de probar todos los dominios de la lista de búsqueda, el nombre de dominio se utiliza para la consulta de DNS. Si el nombre de dominio tiene 5 o más de 5 puntos, se intentará primero para la consulta de DNS. En caso de que el nombre de dominio no se pueda resolver, las consultas de DNS se intentarán combinando el nombre de dominio con cada dominio en la lista de búsqueda a su vez.

    Por ejemplo, el nombre de dominio www.***.com tiene solo dos puntos (más pequeño que el valor de ndots) y, por lo tanto, la secuencia de consultas de DNS es como las siguientes: www.***.default.svc.cluster.local, www.***.com.svc.cluster.local, www.***.com.cluster.local y www.***.com. Esto significa que se iniciarán al menos siete consultas de DNS antes de que el nombre de dominio se resuelva en una dirección IP. Está claro que cuando se iniciarán muchas consultas de DNS innecesarias para acceder a un nombre de dominio externo. Hay margen para mejorar la configuración de DNS de la carga de trabajo.

Para obtener más información acerca de las opciones de configuración en el archivo de configuración de resolución utilizado por los sistemas operativos Linux, visite http://man7.org/linux/man-pages/man5/resolv.conf.5.html.

Configuración de DNS mediante la carga de trabajo de YAML

Al crear una carga de trabajo con un archivo YAML, puede configurar la configuración de DNS en YAML. El siguiente es un ejemplo para una aplicación 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

El campo dnsPolicy se utiliza para configurar una política de DNS para una aplicación. El valor predeterminado es ClusterFirst. Los parámetros de DNS de dnsConfig se fusionarán con el archivo de DNS generado según dnsPolicy. Las reglas de fusión se explican más adelante en Tabla 2. Actualmente, dnsPolicy admite los cuatro valores siguientes:
Tabla 1 dnsPolicy

Parámetro

Descripción

ClusterFirst (default value)

El CoreDNS del clúster de CCE, que se conecta en cascada con el DNS en la nube de forma predeterminada, se utiliza para las cargas de trabajo. Los contenedores pueden resolver tanto los nombres de dominio internos de clúster registrados por un Service como los nombres de dominio externos expuestos a las redes públicas. La lista de búsqueda (opción search) y ndots: 5 están presentes en el archivo de configuración de DNS. Por lo tanto, al acceder a un nombre de dominio externo y a un nombre de dominio interno de clúster largo (por ejemplo, kubernetes.default.svc.cluster.local), la lista de búsqueda generalmente se recorrerá primero, resultando en al menos seis consultas de DNS no válidas. El problema de las consultas de DNS no válidas desaparece solo cuando se accede a un nombre de dominio interno de clúster corto (por ejemplo, kubernetes).

ClusterFirstWithHostNet

De forma predeterminada, el archivo de configuración de DNS al que apunta el indicador --resolv-conf está configurado para las cargas de trabajo que se ejecutan con hostNetwork=true es decir, se utiliza un DNS en la nube para los clústeres de CCE. Si las cargas de trabajo necesitan usar Kube-DNS/CoreDNS del clúster, establezca dnsPolicy en ClusterFirstWithHostNet y el archivo de configuración de DNS de contenedor es el mismo que ClusterFirst en el que aún existen las consultas de DNS no válidas.
...
spec:
  containers:
  - image: nginx:latest
    imagePullPolicy: IfNotPresent
    name: container-1
  restartPolicy: Always
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet

Default

El archivo de configuración de DNS del contenedor es el archivo de configuración de DNS al que apunta el indicador --resolv-conf del kubelet. En este caso, se utiliza un DNS en la nube para los clústeres de CCE. Tanto los campos search como options se dejan sin especificar. Esta configuración solo puede resolver los nombres de dominio externos registrados con Internet, y no los nombres de dominio internos de clúster. Esta configuración está libre de la emisión de consultas de DNS no válidas.

None

Si dnsPolicy está establecido en None debe especificarse el campo dnsConfig porque se supone que todas las configuraciones de DNS se proporcionan mediante el campo dnsConfig.

Si no se especifica el campo dnsPolicy, el valor predeterminado es ClusterFirst en lugar de Default.

dnsConfig

El campo dnsConfig se utiliza para configurar los parámetros de DNS para cargas de trabajo. Los parámetros configurados se fusionan con el archivo de configuración de DNS generado según dnsPolicy. Si dnsPolicy se establece en None, el campo dnsConfig especifica el archivo de configuración de DNS de la carga de trabajo. Si dnsPolicy no se establece en None, los parámetros de DNS configurados en el dnsConfig se agregan al archivo de configuración de DNS generado de acuerdo con la norma dnsPolicy.
Tabla 2 dnsConfig

Parámetro

Descripción

options

Una lista opcional de objetos donde cada objeto puede tener una propiedad name (obligatoria) y una propiedad value (opcional). El contenido de esta propiedad se combinará con las opciones generadas a partir de la política de DNS especificada de dnsPolicy. Se eliminan las entradas duplicadas.

nameservers

Una lista de direcciones IP que se utilizarán como servidores de DNS. Si dnsPolicy de la carga de trabajo se establece en None, la lista debe contener al menos una dirección IP; de lo contrario, esta propiedad es opcional. Los servidores listados se combinarán con los servidores de nombres generados a partir de la política de DNS especificada de dnsPolicy con las direcciones duplicadas quitadas.

searches

Una lista de dominios de búsqueda de DNS para la búsqueda de nombre de host en el Pod. Esta propiedad es opcional. Cuando se especifica, la lista proporcionada se fusionará con los nombres de dominio de búsqueda generados a partir de la política de DNS elegida de dnsPolicy. Se quitan los nombres de dominio duplicados. Kubernetes permite un máximo de 6 dominios de búsqueda.

Configuración de DNS para una carga de trabajo mediante la consola

Kubernetes proporciona opciones de configuración relacionadas con DNS para las aplicaciones. El uso de la configuración de DNS de la aplicación puede reducir eficazmente las consultas DNS innecesarias en ciertos escenarios y mejorar la concurrencia del servicio. En el siguiente procedimiento se utiliza una aplicación de Nginx como ejemplo para describir cómo agregar configuraciones de DNS para una carga de trabajo en la consola.

  1. Inicie sesión en la consola de CCE, acceda a la consola del clúster, seleccione Workloads en el panel de navegación y haga clic en Create Workload en la esquina superior derecha.
  2. Configure la información básica sobre la carga de trabajo. Para obtener más información, véase Creación de una Deployment.
  3. En el área Advanced Settings, haga clic en la ficha DNS y establezca los siguientes parámetros según sea necesario:

    • DNS Policy: Las políticas de DNS proporcionadas en la consola corresponden al campo dnsPolicy del archivo YAML. Para obtener más información, véase Tabla 1.
      • Supplement defaults: corresponde a dnsPolicy=ClusterFirst. Los contenedores pueden resolver tanto los nombres de dominio internos de clúster registrados por un Service como los nombres de dominio externos expuestos a las redes públicas.
      • Replace defaults: corresponde a dnsPolicy=None. Debe configurar IP Address y Search Domain. Los contenedores solo utilizan la dirección IP definida por el usuario y las configuraciones de dominio de búsqueda para la resolución de nombres de dominio.
      • Inherit defaults: corresponde a dnsPolicy=Default. Los contenedores utilizan la configuración de resolución de nombres de dominio desde el nodo en el que se ejecutan los pods y no pueden resolver los nombres de dominio internos del clúster.
    • Optional Objects: los parámetros de opciones del campo de dnsConfig. Cada objeto puede tener una propiedad del nombre (requerida) y una propiedad del valor (opcional). Después de establecer las propiedades, haga clic en confirm to add.
      • timeout: Intervalo de tiempo de espera, en segundos.
      • ndots: Número de puntos (.) que deben estar presentes en un nombre de dominio. Si un nombre de dominio tiene puntos menores que este valor, el sistema operativo buscará el nombre en el dominio de búsqueda. Si no, el nombre es un nombre de dominio completo (FQDN) y se probará primero como un nombre absoluto.
    • IP Address: nameservers en dnsConfig. Puede configurar el servidor de nombres de dominio para el nombre de dominio personalizado. El valor es una o un grupo de direcciones IP de DNS.
    • Search Domain: searches en dnsConfig. Una lista de dominios de búsqueda de DNS para la búsqueda de nombre de host en el pod. Esta propiedad es opcional. Cuando se especifica, la lista proporcionada se fusionará con los nombres de dominio de búsqueda generados a partir de la política de DNS elegida de dnsPolicy. Se quitan los nombres de dominio duplicados.

  4. Hacer clic en Create Workload.

Ejemplos de configuración

En el ejemplo siguiente se describe cómo configurar DNS para las cargas de trabajo.

  • Caso del uso 1: Uso de Kube-DNS/CoreDNS construido en los clústeres de Kubernetes

    Escenario

    Kubernetes en clúster Kube-DNS/CoreDNS es aplicable para resolver solo nombres de dominio internos de clúster o nombres de dominio internos de clúster + nombres de dominio externos. Este es el DNS predeterminado para las cargas de trabajo.

    Por ejemplo:

    apiVersion: v1
    kind: Pod
    metadata:
      namespace: default
      name: dns-example
    spec:
      containers:
      - name: test
        image: nginx:alpine
      dnsPolicy: ClusterFirst

    Archivo de configuración de DNS del contenedor:

    nameserver 10.247.3.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
  • Caso de uso 2: Uso de un DNS en la nube

    Escenario

    Un DNS no puede resolver nombres de dominio internos de clúster y, por lo tanto, es aplicable al escenario en el que las cargas de trabajo acceden solo a los nombres de dominio externos registrados con Internet.

    Por ejemplo:

    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's --resolv-conf flag points to is used. In this case, a DNS is used for CCE clusters.

    Archivo de configuración de DNS del contenedor:

    nameserver 100.125.x.x
  • Caso de uso 3: Uso de Kube-DNS/CoreDNS para cargas de trabajo que se ejecutan con hostNetwork

    Escenario

    De forma predeterminada, se utiliza un DNS para las cargas de trabajo que se ejecutan con hostNetwork. Si las cargas de trabajo necesitan usar Kube-DNS/CoreDNS, establezca dnsPolicy en ClusterFirstWithHostNet.

    Por ejemplo:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80

    Archivo de configuración de DNS del contenedor:

    nameserver 10.247.3.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
  • Caso del uso 4: Personalización de la configuración de DNS de la aplicación

    Escenario

    Puede personalizar de forma flexible el archivo de configuración de DNS para las aplicaciones. El uso de dnsPolicy y dnsConfig juntos puede abordar casi todos los escenarios, incluidos los escenarios en los que se usará un DNS local, varios DNS se conectarán en cascada y las opciones de configuración de DNS se modificarán.

    Ejemplo 1: Uso de su DNS local

    Establezca dnsPolicy a None para que el archivo de configuración DNS de la aplicación se genere basado en 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"

    Archivo de configuración de DNS del contenedor:

    nameserver 10.2.3.4
    search ns1.svc.cluster.local my.dns.search.suffix
    options timeout:3 ndots:2

    Ejemplo 2: Modificación de la opción de ndots en el archivo de configuración de DNS para reducir las consultas de DNS no válidas

    Establezca dnsPolicy en un valor distinto de None para que los parámetros de DNS configurados en dnsConfig se agreguen al archivo de configuración de DNS generado según 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" //Changes the ndots:5 option in the DNS configuration file generated based on the ClusterFirst policy to ndots:2.

    Archivo de configuración de DNS del contenedor:

    nameserver 10.247.3.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:2