Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Best practices for DNS in Kubernetes clusters

Última actualización: Sep 18, 2026

DNS es un servicio de infraestructura crítico en Kubernetes. Una configuración incorrecta del cliente y una escala grande del clúster pueden provocar tiempos de espera agotados y errores de resolución. Optimice la configuración del cliente y del servidor con estas mejores prácticas.

Notas de uso

Esta información no aplica a CoreDNS administrado ni a los clústeres de ACK que tienen habilitado Auto Mode. CoreDNS administrado se escala automáticamente según la carga de trabajo, por lo que no se requieren ajustes manuales.

Contenido

Las mejores prácticas de DNS abarcan el lado del cliente y el lado del servidor:

Consulte la documentación oficial de CoreDNS.

Optimizar las solicitudes de resolución de nombres de dominio

La resolución de DNS es una de las actividades de red más frecuentes en Kubernetes. Muchas solicitudes se pueden optimizar o evitar:

  • (Recomendado) Utilice grupos de conexiones. Si una aplicación en contenedores accede con frecuencia a otro servicio, almacene en caché las conexiones ascendentes en memoria para evitar la resolución de DNS y la configuración de TCP en cada acceso.

  • Utilice sondeos asíncronos o prolongados para obtener la dirección IP de un nombre de dominio DNS.

  • Utilice la caché de DNS:

    • (Recomendado) Si su aplicación no puede usar grupos de conexiones, almacene en caché los resultados de la resolución de DNS en el lado de la aplicación o use NodeLocal DNSCache.

    • Si NodeLocal DNSCache no está disponible, almacene en caché las consultas de DNS dentro del contenedor con Name Service Cache Daemon (NSCD). Consulte Uso de NSCD en clústeres de Kubernetes.

  • Optimice el archivo resolv.conf: los parámetros ndots y search afectan la eficiencia de la resolución según la forma en que escriba los nombres de dominio en las configuraciones del contenedor. Consulte DNS policy configuration and domain name resolution para obtener detalles sobre ndots y search.

  • Optimice la configuración del nombre de dominio para minimizar los intentos de resolución y reducir el tiempo de resolución:

    • Para acceder a un Service en el mismo namespace, utilice <service-name>, donde service-name es el nombre del Service.

    • Para acceder a un Service entre distintos namespaces, utilice <service-name>.<namespace-name>, donde namespace-name es el namespace del Service.

    • Para dominios externos, utilice nombres de dominio completos (FQDN). Agregue un punto final (.) para especificar direcciones absolutas y evitar la concatenación no válida de dominios de search. Por ejemplo, utilice www.aliyun.com. en lugar de www.aliyun.com.

      • En clústeres con versión 1.33 o posterior, establezca el dominio de búsqueda como un único "." (consulte 125883) para lograr un efecto similar:

        dnsPolicy: None
        dnsConfig:
          nameservers: ["192.168.0.10"]  ## Replace 192.168.0.10 with the actual CoreDNS service clusterIP
          searches:
          - .
          - default.svc.cluster.local  ## Replace "default" with your namespace name
          - svc.cluster.local
          - cluster.local

        Después de aplicar esta configuración, el archivo /etc/resolv.conf del pod se muestra de la siguiente manera:

        search . default.svc.cluster.local svc.cluster.local cluster.local
        nameserver 192.168.0.10

        Un "." como primer dominio de búsqueda trata todas las solicitudes de dominio como FQDN y las resuelve directamente sin intentos de búsqueda innecesarios.

        Importante

        Establezca dnsPolicy en None para que esta configuración surta efecto.

        Ejemplo completo de carga de trabajo

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          labels:
            app: nginx
          name: nginx
          namespace: default
        spec:
          progressDeadlineSeconds: 600
          replicas: 3
          revisionHistoryLimit: 10
          selector:
            matchLabels:
              app: nginx
          strategy:
            rollingUpdate:
              maxSurge: 25%
              maxUnavailable: 25%
            type: RollingUpdate
          template:
            metadata:
              labels:
                app: nginx
            spec:
              containers:
              - image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
                imagePullPolicy: Always
                name: nginx
                resources: {}
                terminationMessagePath: /dev/termination-log
                terminationMessagePolicy: File
              dnsPolicy: None
              dnsConfig:
                nameservers: ["192.168.0.10"]  ## Replace 192.168.0.10 with the actual CoreDNS service clusterIP
                searches:
                - .
                - default.svc.cluster.local
                - svc.cluster.local
                - cluster.local
              hostname: nginx
              restartPolicy: Always
              schedulerName: default-scheduler
              securityContext: {}
              subdomain: subdomain
              terminationGracePeriodSeconds: 30

Comprender la configuración de DNS en los contenedores

  • Los distintos resolvedores de DNS pueden comportarse de manera diferente. Es posible que observe que dig <dominio> se ejecute correctamente mientras que ping <dominio> falle.

  • Evite las imágenes base de Alpine. En su lugar, utilice otras imágenes base como Debian o CentOS. La biblioteca musl libc de Alpine difiere de glibc y puede causar estos problemas:

    • Alpine 3.18 y versiones anteriores no admiten volver a TCP para las consultas de DNS.

    • Alpine 3.3 y versiones anteriores no admiten el parámetro search ni los dominios de búsqueda, lo cual bloquea la detección de servicios.

    • Las consultas simultáneas a varios servidores de DNS en /etc/resolv.conf pueden invalidar las optimizaciones de NodeLocal DNSCache.

    • Las consultas A y AAAA simultáneas en el mismo socket pueden desencadenar conflictos de puerto de origen de conntrack en kernels antiguos, lo que provoca pérdida de paquetes.

    Consulte musl libc.

  • En aplicaciones Go, comprenda las diferencias entre las implementaciones de resolvedor de DNS de CGO y Pure Go.

Evitar tiempos de espera agotados probabilísticos en la resolución de DNS causados por defectos de IPVS

Cuando IPVS se usa como modo de balanceo de carga de kube-proxy, es posible que experimente tiempos de espera agotados intermitentes en la resolución de DNS durante la reducción de escala o el reinicio de CoreDNS debido a un defecto del kernel de Linux. Consulte IPVS.

Reduzca el impacto de los defectos de IPVS con uno de estos métodos:

Usar NodeLocal DNSCache

En algunos escenarios, CoreDNS puede presentar estos problemas:

  • Las consultas A y AAAA simultáneas pueden causar pérdida de paquetes y errores de resolución de DNS en casos poco frecuentes.

  • Las tablas de conntrack llenas en los nodos pueden causar pérdida de paquetes y errores de resolución de DNS.

Instale el complemento NodeLocal DNSCache para mejorar la estabilidad y el rendimiento de DNS. Este complemento ejecuta una caché de DNS en cada nodo. Consulte Use the NodeLocal DNSCache component para conocer el despliegue en clústeres de ACK.

Importante

Después de instalar NodeLocal DNSCache, inyecte la configuración de la caché de DNS en sus pods. Etiquete un namespace para inyectar automáticamente la configuración de la caché de DNS en los nuevos pods:

kubectl label namespace default node-local-dns-injection=enabled

Usar una versión adecuada de CoreDNS

CoreDNS mantiene una buena compatibilidad con versiones anteriores en distintas versiones de Kubernetes. Mantenga CoreDNS en una versión reciente y estable. La página Component Management de la consola de ACK proporciona funciones de instalación, actualización y configuración. Supervise el estado del componente y actualice CoreDNS durante las horas de menor actividad cuando haya una actualización disponible.

Las versiones de CoreDNS anteriores a v1.7.0 presentan riesgos conocidos, entre los que se incluyen, sin limitarse a ellos:

La versión mínima recomendada de CoreDNS depende de la versión del clúster de Kubernetes:

Versión del clúster

Versión mínima recomendada de CoreDNS

Inferior a 1.14.8

v1.6.2 (ya no recibe mantenimiento)

1.14.8 y posteriores, inferior a 1.20.4

v1.7.0.0-f59c03d-aliyun

1.20.4 y posteriores, inferior a 1.21.0

v1.8.4.1-3a376cc-aliyun

1.21.0 y posteriores

v1.11.3.2-f57ea7ed6-aliyun

Supervisar el estado de ejecución de CoreDNS

Métricas de monitoreo

CoreDNS expone métricas de estado, como los resultados de resolución, a través de una interfaz estándar de Prometheus para ayudar a detectar anomalías en CoreDNS o en los servidores de DNS ascendentes.

Prometheus for ACK incluye métricas de monitoreo y reglas de alerta integradas para CoreDNS. Habilite Prometheus y Dashboard en la consola de Container Service for Kubernetes. Consulte CoreDNS component monitoring.

Si utiliza una instancia de Prometheus autogestionada, observe las métricas relevantes y configure alertas para las críticas. Consulte la documentación oficial de Prometheus para CoreDNS.

Registros de operación

Utilice los registros de CoreDNS para diagnosticar las causas raíz cuando ocurran anomalías de DNS. Habilite los registros de resolución de dominios y la recopilación de registros de SLS. Consulte Analyze and monitor CoreDNS logs.

Entrega de eventos de Kubernetes

En CoreDNS v1.9.3.6-32932850-aliyun y versiones posteriores, habilite el plugin k8s_event para entregar los registros críticos de CoreDNS como eventos de Kubernetes al Event Hub. Consulte la documentación del plugin k8s_event.

Las instancias de CoreDNS recién desplegadas tienen esta función habilitada de forma predeterminada. Al actualizar desde una versión anterior, modifique manualmente el archivo de configuración para habilitarla.

  1. Abra el archivo de configuración de CoreDNS:

    kubectl -n kube-system edit configmap/coredns
  2. Agregue los plugins kubeAPI y k8s_event.

    apiVersion: v1
    data:
      Corefile: |
        .:53 {
            errors
            health {
                lameduck 15s
            }
            // Begin addition (ignore other differences).
            kubeapi
            k8s_event {
              level info error warning // Deliver critical logs with info, error, or warning levels.
            }
            // End addition.
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods verified
                fallthrough in-addr.arpa ip6.arpa
            }
            // Omitted below.
        }
  3. Compruebe el estado y los registros del pod de CoreDNS. Si los registros contienen la palabra reload, la modificación fue exitosa.

Garantizar la alta disponibilidad de CoreDNS

CoreDNS es el DNS autorizado del clúster. Un fallo de CoreDNS puede interrumpir el acceso interno a los Services y afectar gran parte de su negocio. Garantice la alta disponibilidad de CoreDNS con estas medidas:

Evaluar la presión sobre el componente CoreDNS

Ejecute pruebas de estrés de DNS para evaluar la presión sobre el complemento CoreDNS. Las herramientas de código abierto como DNSPerf pueden ayudarle. Si no puede evaluar con precisión la presión de DNS, siga estas recomendaciones:

  • Despliegue como mínimo dos pods de CoreDNS, cada uno con límites de recursos de como mínimo 1 núcleo de CPU y 1 GB de memoria.

  • La capacidad de QPS de CoreDNS se relaciona con el uso de CPU. Con NodeLocal DNSCache, cada núcleo de CPU admite más de 10,000 QPS. Los QPS de DNS de la carga de trabajo del negocio varían significativamente. Supervise el uso máximo de CPU por cada pod de CoreDNS y aumente las réplicas cuando el uso supere un núcleo durante los periodos pico. Si desconoce el uso máximo, despliegue un pod de CoreDNS por cada ocho nodos del clúster como medida conservadora.

Ajustar la cantidad de pods de CoreDNS

La cantidad de pods de CoreDNS determina directamente los recursos de cómputo disponibles. Ajústela según su evaluación.

Importante

Dado que UDP carece de retransmisión, la reducción de escala o el reinicio de pods de CoreDNS puede causar tiempos de espera agotados en la resolución de DNS en todo el clúster durante hasta cinco minutos si existen defectos de UDP de IPVS en los nodos del clúster. Consulte Troubleshoot DNS resolution anomalies para conocer las soluciones relacionadas con IPVS.

  • Ajustar automáticamente la cantidad de pods según las políticas recomendadas

    Despliegue el siguiente recurso dns-autoscaler. Este ajusta la cantidad de pods de CoreDNS en tiempo real con una proporción de un pod por cada ocho nodos del clúster. Cantidad de réplicas: replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica)), restringida por los límites max y min.

    dns-autoscaler

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dns-autoscaler
      namespace: kube-system
      labels:
        k8s-app: dns-autoscaler
    spec:
      selector:
        matchLabels:
          k8s-app: dns-autoscaler
      template:
        metadata:
          labels:
            k8s-app: dns-autoscaler
        spec:
          serviceAccountName: admin
          containers:
          - name: autoscaler
            image: registry.cn-hangzhou.aliyuncs.com/acs/cluster-proportional-autoscaler:1.8.4
            resources:
              requests:
                cpu: "200m"
                memory: "150Mi"
            command:
            - /cluster-proportional-autoscaler
            - --namespace=kube-system
            - --configmap=dns-autoscaler
            - --nodelabels=type!=virtual-kubelet
            - --target=Deployment/coredns
            - --default-params={"linear":{"coresPerReplica":64,"nodesPerReplica":8,"min":2,"max":100,"preventSinglePointFailure":true}}
            - --logtostderr=true
            - --v=9
  • Ajustes manuales

    Ajuste manualmente la cantidad de pods de CoreDNS:

    kubectl scale --replicas={target} deployment/coredns -n kube-system # Replace {target} with the desired pod count
  • No utilizar el escalado automático de cargas de trabajo

    Los mecanismos de escalado automático de cargas de trabajo, como el escalado horizontal de pods (HPA) o CronHPA, desencadenan operaciones de escalado frecuentes. Debido a las anomalías de resolución durante la reducción de escala de pods, no utilice el escalado automático de cargas de trabajo para los pods de CoreDNS.

Ajustar las especificaciones de los pods de CoreDNS

Modifique las especificaciones de los pods para ajustar los recursos de CoreDNS. En los clústeres administrados de ACK Pro, los pods de CoreDNS tienen un límite de memoria predeterminado de 2Gi y ningún límite de CPU. Establezca el límite de CPU en 4096m, con un mínimo de 1024m. Ajuste la configuración de los pods de CoreDNS en la consola.

Modificar la configuración de CoreDNS en la consola

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.

  2. En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Add-ons.

  3. Haga clic en la pestaña Network, busque la tarjeta CoreDNS y luego haga clic en Configuration.

  4. Modifique la configuración de CoreDNS y haga clic en OK.

    En el cuadro de diálogo de configuración de parámetros de CoreDNS, establezca los parámetros de recursos como MemoryRequest (por ejemplo, 100Mi), CpuRequest (por ejemplo, 100m), MemoryLimit (por ejemplo, 2Gi) y CpuLimit. De manera opcional, establezca etiquetas de NodeSelector (por ejemplo, Key: kubernetes.io/os, Value: linux). Modificar estos parámetros regenera la plantilla YAML del componente y puede sobrescribir los cambios realizados con kubectl.

Programar pods de CoreDNS

Importante

Las configuraciones de programación incorrectas pueden impedir el despliegue de los pods de CoreDNS y provocar fallos en CoreDNS. Asegúrese de comprender completamente scheduling antes de continuar.

Despliegue los pods de CoreDNS en varias zonas y nodos para evitar fallos de un solo nodo o de una sola zona. Las versiones de CoreDNS anteriores a v1.8.4.3 utilizan antiafinidad de nodo débil de forma predeterminada, lo que puede colocar todos los pods en el mismo nodo cuando los recursos son insuficientes. Elimine los pods para desencadenar una nueva programación o actualice a la última versión del componente. Las versiones de CoreDNS anteriores a v1.8 ya no reciben mantenimiento. Actualice lo antes posible.

Evite desplegar CoreDNS en nodos con uso total de CPU o memoria, ya que esto afecta los QPS de DNS y la latencia de respuesta. Utilice parámetros personalizados para programar CoreDNS en nodos dedicados y lograr una resolución de nombres de dominio estable.

Desplegar CoreDNS en nodos dedicados con parámetros personalizados

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.

  2. En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Nodes > Nodes.

  3. En la página Nodes, haga clic en Manage Labels and Taints.

  4. En la página Manage Labels and Taints, seleccione los nodos de destino y haga clic en Add Label.

    Nota

    Seleccione más nodos que la cantidad de réplicas de CoreDNS para evitar desplegar varias réplicas en un solo nodo.

  5. En el cuadro de diálogo Add, establezca los siguientes parámetros y haga clic en OK.

    • Name: node-role-type

    • Value: coredns

  6. En el panel de navegación izquierdo de la página de administración del clúster, seleccione Operations > Add-ons. Busque CoreDNS.

  7. En la tarjeta CoreDNS, haga clic en Configuration. En el cuadro de diálogo Configuration, haga clic en + Add junto a NodeSelector, establezca los siguientes parámetros y luego haga clic en OK.

    • Key: node-role-type

    • Value: coredns

    CoreDNS se programa nuevamente en los nodos con la etiqueta especificada.

Optimizar la configuración de CoreDNS

Container Service for Kubernetes (ACK) proporciona únicamente configuraciones predeterminadas de CoreDNS. Revise todos los parámetros y optimícelos para sus contenedores de aplicaciones. La configuración de CoreDNS es muy flexible. Consulte DNS policy configuration and domain name resolution y la documentación oficial de CoreDNS.

Las configuraciones predeterminadas de CoreDNS de versiones antiguas de Kubernetes pueden presentar riesgos. Compruébelas y optimícelas de la siguiente manera:

Utilice la inspección programada y el diagnóstico de fallos en Container Intelligence Operations para comprobar los archivos de configuración de CoreDNS. Si Container Intelligence Operations reporta anomalías en el ConfigMap de CoreDNS, revise los elementos anteriores.

Nota

CoreDNS puede consumir memoria adicional al recargar configuraciones. Después de modificar los elementos de configuración, supervise el estado de los pods. Si los pods experimentan escasez de memoria, aumente el límite de memoria en el Deployment de CoreDNS. Establezca la memoria en 2 GB.

Deshabilitar la configuración de afinidad para el servicio kube-dns

La configuración de afinidad puede causar desequilibrios de carga significativos entre las réplicas de CoreDNS. Deshabilítela con uno de estos métodos:

Método de consola

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.

  2. En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Network > Services.

  3. En el namespace kube-system, haga clic en Edit YAML a la derecha del servicio kube-dns.

    • Si sessionAffinity es None, omita los pasos restantes.

    • Si sessionAffinity es ClientIP, continúe con los pasos restantes.

  4. Elimine los campos sessionAffinity y sessionAffinityConfig junto con todas sus subclaves. Luego, haga clic en Update.

    # Delete all the following content.
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  5. Haga clic nuevamente en Edit YAML para el servicio kube-dns y compruebe que sessionAffinity sea None. Si es así, la actualización del servicio kube-dns fue exitosa.

Método de línea de comandos

  1. Consulte la configuración del servicio kube-dns:

    kubectl -n kube-system get svc kube-dns -o yaml
    • Si sessionAffinity es None, omita los pasos restantes.

    • Si sessionAffinity es ClientIP, continúe con los pasos restantes.

  2. Abra y edite el servicio kube-dns:

    kubectl -n kube-system edit service kube-dns
  3. Elimine toda la configuración relacionada con sessionAffinity (sessionAffinity, sessionAffinityConfig y todas las subclaves). Luego, guarde el cambio y salga.

    # Delete all the following content.
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  4. Después de la modificación, compruebe que sessionAffinity sea None. Si es así, la actualización del servicio kube-dns fue exitosa.

    kubectl -n kube-system get svc kube-dns -o yaml

Deshabilitar el plugin Autopath

Algunas versiones antiguas de CoreDNS tienen habilitado el plugin Autopath, lo que puede producir resultados de resolución incorrectos en escenarios extremos. Compruebe si el plugin está habilitado y deshabilítelo al editar el archivo de configuración. Consulte Autopath.

Nota

Después de deshabilitar el plugin Autopath, los QPS de consultas de DNS del lado del cliente pueden aumentar hasta tres veces, y el tiempo de resolución de un solo dominio puede incrementarse hasta tres veces. Supervise la carga de CoreDNS y el impacto en el negocio.

  1. Abra el archivo de configuración de CoreDNS con kubectl -n kube-system edit configmap coredns.

  2. Elimine la línea autopath @kubernetes y guarde el cambio.

  3. Compruebe el estado y los registros del pod de CoreDNS. Si los registros contienen la palabra reload, la modificación fue exitosa.

Configurar el apagado controlado para CoreDNS

El mecanismo lameduck de CoreDNS habilita el apagado controlado. Cuando CoreDNS se detiene o se reinicia, las solicitudes en curso se completan con normalidad en lugar de interrumpirse de forma abrupta. El mecanismo lameduck funciona de la siguiente manera:

  • Cuando CoreDNS finaliza, entra en modo Lameduck.

  • En el modo lameduck, CoreDNS deja de aceptar nuevas solicitudes. Sin embargo, continúa procesando las solicitudes existentes hasta que se completen o hasta que expire el tiempo de espera de lameduck.

Método de consola

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.

  2. En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Configurations > ConfigMaps.

  3. En el namespace kube-system, haga clic en Edit YAML a la derecha del elemento de configuración coredns.

  4. Asegúrese de que el plugin health esté habilitado y establezca el tiempo de espera de lameduck en 15s según la siguiente configuración. Luego, haga clic en OK.

  5. .:53 {
            errors       
            # The health plugin may have different default settings in various CoreDNS versions.
            # Case 1: health plugin disabled by default.   
            # Case 2: health plugin enabled by default but lameduck time not set.
            # health      
            # Case 3: health plugin enabled by default with lameduck time set to 5s.   
            # health {
            #     lameduck 5s
            # }      
            # For all three cases, modify uniformly as follows to set lameduck to 15s.
            health {
                lameduck 15s
            }       
            # Do not modify other plugins; omitted here.
        }

Si los pods de CoreDNS se ejecutan con normalidad, la configuración de apagado controlado se actualiza. Si los pods presentan un comportamiento anómalo, compruebe los eventos y registros de los pods para identificar la causa.

Método de línea de comandos

  1. Abra el archivo de configuración de CoreDNS:

  2. kubectl -n kube-system edit configmap/coredns
  3. Asegúrese de que el plugin health esté habilitado y establezca lameduck en 15s según el siguiente Corefile:

  4. .:53 {
            errors     
            # The health plugin may have different default settings in various CoreDNS versions.
            # Case 1: health plugin disabled by default.     
            # Case 2: health plugin enabled by default but lameduck time not set.
            # health
            # Case 3: health plugin enabled by default with lameduck time set to 5s.   
            # health {
            #     lameduck 5s
            # }
            # For all three cases, modify uniformly as follows to set lameduck to 15s.
            health {
                lameduck 15s
            }
            # Do not modify other plugins; omitted here.
        }
  5. Guarde los cambios y salga después de modificar el archivo de configuración de CoreDNS.

  6. Si CoreDNS se ejecuta con normalidad, la configuración de apagado controlado se actualiza. Si los pods presentan un comportamiento anómalo, compruebe los eventos y registros de los pods para identificar la causa.

Establecer el protocolo predeterminado para que el plugin Forward se comunique con los servidores DNS de VPC

NodeLocal DNSCache se comunica con CoreDNS mediante TCP. CoreDNS utiliza el mismo protocolo de las solicitudes entrantes cuando se comunica con los servidores DNS ascendentes. De forma predeterminada, las solicitudes de resolución de dominios externos desde los contenedores de aplicaciones pasan por NodeLocal DNSCache y CoreDNS. Después llegan a los servidores DNS de VPC (100.100.2.136 y 100.100.2.138) a través de TCP.

Los servidores DNS de VPC tienen una compatibilidad limitada con TCP. Si usa NodeLocal DNSCache, modifique la configuración de CoreDNS para preferir UDP en la comunicación con los servidores DNS ascendentes y evitar anomalías en la resolución. Modifique el ConfigMap coredns en el namespace kube-system. Consulte Manage ConfigMaps. En el plugin forward, especifique prefer_udp como protocolo ascendente. Tras este cambio, CoreDNS prefiere UDP para la comunicación ascendente:

# Before modification
forward . /etc/resolv.conf
# After modification
forward . /etc/resolv.conf {
  prefer_udp
}

Configurar el plugin de sondeo de disponibilidad Ready

Las versiones de CoreDNS posteriores a la 1.5.0 requieren el plugin ready para habilitar los sondeos de disponibilidad.

  1. Abra el archivo de configuración de CoreDNS:

    kubectl -n kube-system edit configmap/coredns
  2. Compruebe si existe la línea ready. Si no está presente, agregue ready. Presione Esc, escriba :wq! y luego presione Enter para guardar el cambio y salir.

    apiVersion: v1
    data:
     Corefile: |
      .:53 {
        errors
        health {
          lameduck 15s
        }
        ready # Add this line if missing, ensuring consistent indentation with Kubernetes.
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods verified
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . /etc/resolv.conf {
          max_concurrent 1000
                prefer_udp
        }
        cache 30
        loop
        log
        reload
        loadbalance
      }
  3. Compruebe el estado y los registros del pod de CoreDNS. Si los registros contienen la palabra reload, la modificación fue exitosa.

Configurar el plugin multisocket para mejorar el rendimiento de resolución de CoreDNS

CoreDNS v1.12.1 introdujo el plugin multisocket. Cuando se habilita, CoreDNS utiliza varios sockets para escuchar en el mismo puerto, lo que mejora el rendimiento en escenarios con un alto consumo de CPU. Consulte la documentación de la comunidad.

Habilite multisocket en el ConfigMap coredns:

.:53 {
        ...
        prometheus :9153
        multisocket [NUM_SOCKETS]
        forward . /etc/resolv.conf
        ...
}

NUM_SOCKETS especifica la cantidad de sockets que escuchan en el mismo puerto.

Alinee NUM_SOCKETS con el uso estimado de CPU, los límites de recursos de CPU y los recursos disponibles del clúster. Por ejemplo:

  • Si CoreDNS consume 4 núcleos en su punto máximo y hay 8 núcleos disponibles, establezca NUM_SOCKETS en 2.

  • Si CoreDNS consume 8 núcleos en su punto máximo y hay 64 núcleos disponibles, establezca NUM_SOCKETS en 8.

Pruebe diferentes configuraciones y mida las QPS y la carga para determinar la configuración óptima.

Si no especifica NUM_SOCKETS, CoreDNS utiliza GOMAXPROCS de forma predeterminada. Este valor equivale al límite de CPU del pod de CoreDNS o a la cantidad de núcleos de CPU del nodo cuando no se establece ningún límite.