IBM Cloud Docs
Configuración del proveedor de DNS de clúster

Configuración del proveedor de DNS de clúster

Se asigna un nombre DNS (Sistema de nombres de dominio) a cada servicio del clúster de IBM Cloud® Kubernetes Service, que el proveedor de DNS del clúster registra para resolver solicitudes de DNS. Para obtener más información sobre DNS para servicios y pods, consulte la documentación de Kubernetes.

El proveedor de DNS de clúster es CoreDNS, que es un servidor DNS autoritativo de propósito general que proporciona una integración compatible con versiones anteriores, pero extensible, con Kubernetes. Debido a que CoreDNS es un solo proceso ejecutable, tiene menos dependencias y partes móviles que puedan experimentar problemas que otros proveedores de DNS de clúster. El proyecto también se ha escrito en el mismo lenguaje que el proyecto Kubernetes, Go, lo que ayuda a proteger la memoria. Por último, CoreDNS admite casos de uso más flexibles que otros proveedores de DNS en clúster, ya que puede crear entradas DNS personalizadas, como las configuraciones comunes en los documentos de CoreDNS.

Escalado automático del proveedor de DNS de clúster

De forma predeterminada, CoreDNS incluye un despliegue para escalar automáticamente los pods de CoreDNS como respuesta al número de nodos trabajadores y núcleos dentro del clúster. Puede ajustar los parámetros del programa de escalado automático de CoreDNS editando el mapa de configuración de escalado automático de CoreDNS. Por ejemplo, si las apps hacen un uso intensivo del proveedor de DNS de clúster, es posible que tenga que aumentar el número mínimo de pods de CoreDNS para dar soporte a la app. Para más información, consulte la documentación de Kubernetes.

Antes de empezar: Inicie una sesión en su cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.

  1. Verifique que el despliegue del programa de escalado automático de CoreDNS está disponible. En la salida de la CLI, verifique que haya un despliegue disponible (AVAILABLE).

    kubectl get deployment -n kube-system coredns-autoscaler
    

    Salida de ejemplo

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    coredns-autoscaler   1/1     1            1           69d
    
  2. Edite los valores predeterminados correspondientes al programa de escalado automático de CoreDNS. Busque el campo data.linear, que toma como valor predeterminado un pod CoreDNS por cada 16 nodos de trabajador o 256 núcleos, con un mínimo de dos pods CoreDNS independientemente del tamaño del clúster (preventSinglePointFailure: true). Para obtener más información, consulte la documentación de Kubernetes.

    kubectl edit configmap -n kube-system coredns-autoscaler
    

    Salida de ejemplo

    apiVersion: v1
    data:
      linear: '{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true}'
    kind: ConfigMap
    metadata:
    ...
    

Personalización del proveedor de DNS de clúster

Puede personalizar CoreDNS editando el mapa de configuración de CoreDNS. Por ejemplo, es posible que desee configurar dominios de apéndice y servidores DNS en sentido ascendente para resolver servicios que apunten a hosts externos. Además, puede configurar varios Corefiles dentro de CoreDNS ConfigMap. Para más información, consulte la documentación de Kubernetes.

El almacenamiento en memoria caché de DNS de NodeLocal se basa en CoreDNS para mantener la memoria caché de las resoluciones de DNS. Para mantener la coherencia de la resolución de DNS, mantenga sin cambios la memoria caché de DNS de NodeLocal y las configuraciones de CoreDNS aplicables, como los dominios de apéndice.

Antes de empezar: Inicie una sesión en su cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.

  1. Verifique que el despliegue CoreDNS está disponible. En la salida de la CLI, verifique que haya un despliegue disponible (AVAILABLE).

    kubectl get deployment -n kube-system coredns
    

    Salida de ejemplo

    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    coredns   3/3     3            3           69d
    
  2. Edite los valores predeterminados correspondientes al mapa de configuración de CoreDNS. Utilice un archivo Corefile en la sección data del mapa de configuración para personalizar los dominios de apéndice (stub) y los servidores DNS en sentido ascendente. Para más información, consulte la documentación de Kubernetes.

    El plugin proxy de CoreDNS ha quedado en desuso y ha sido sustituido por el plugin forward. Si actualiza el mapa de configuración de CoreDNS, asegúrese de sustituir todas las instancias de proxy por forward.

    kubectl edit configmap -n kube-system coredns
    

    Salida de ejemplo de CoreDNS

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: coredns
    namespace: kube-system
      data:
        Corefile: |
          import <MyCorefile>
          .:53 {
              errors
              health {
                lameduck 10s
              }
              ready
              kubernetes cluster.local in-addr.arpa ip6.arpa {
                 pods insecure
                 fallthrough in-addr.arpa ip6.arpa
                 ttl 30
              }
              prometheus :9153
              forward . /etc/resolv.conf {
                  max_concurrent 1000
              }
              cache 30 {
                  disable success cluster.local
                  disable denial cluster.local
              }
              loop
              reload
              loadbalance
          }
        <MyCorefile>: |
          abc.com:53 {
            errors
            cache 30
            loop
            forward . 1.2.3.4
            }
    
  3. Opcional: añada archivos Corefile personalizados al mapa de configuración de CoreDNS. En el ejemplo siguiente, incluya import <MyCoreFile> en la sección data.Corefile y rellene la sección data.<MyCorefile> con la información del Corefile personalizado. Para obtener más información, consulte la documentación de importación de Corefile.

    El plugin proxy de CoreDNS ha quedado en desuso y ha sido sustituido por el plugin forward. Si actualiza el mapa de configuración de CoreDNS, asegúrese de sustituir todas las instancias de proxy por forward.

    kubectl edit configmap -n kube-system coredns
    

    Ejemplo de salida de Corefile personalizado

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns
      namespace: kube-system
    data:
      Corefile: |
        import <MyCorefile>
        .:53 {
            errors
            health
            kubernetes cluster.local in-addr.arpa ip6.arpa {
               pods insecure
               upstream 172.16.0.1
               fallthrough in-addr.arpa ip6.arpa
            }
            prometheus :9153
            forward . /etc/resolv.conf {
                max_concurrent 1000
            }
            cache 30 {
                disable success cluster.local
                disable denial cluster.local
            }
            loop
            reload
            loadbalance
        }
      <MyCorefile>: |
        abc.com:53 {
          errors
          cache 30
          loop
          forward . 1.2.3.4
        }
    
  4. Después de unos minutos, los pods de CoreDNS captan los cambios del mapa de configuración.

Configuración de memoria caché de DNS NodeLocal

Configure el agente de memoria caché de DNS NodeLocal en determinados nodos trabajadores para mejorar el rendimiento y la disponibilidad de DNS del clúster en el clúster de IBM Cloud Kubernetes Service. Para más información, consulte los documentos de la Kubernetes.

De forma predeterminada, las solicitudes de DNS de clúster para pods que utilizan una política de DNS de ClusterFirst se envían al servicio de DNS de clúster. Si habilita la colocación en memoria caché de DNS NodeLocal en un nodo trabajador, las solicitudes DNS del clúster para estos pods que se encuentran en el nodo trabajador se envían en su lugar a la memoria caché de DNS local, que escucha en la dirección IP de enlace local 169.254.20.10. La memoria caché de DNS también escucha en la IP del clúster del servicio kube-dns en el espacio de nombres kube-system.

No añada la etiqueta de memoria caché de DNS si ya utiliza DNS con distinción de zonas en el clúster. Además, el almacenamiento en memoria caché de DNS de NodeLocal se basa en CoreDNS para mantener la memoria caché de las resoluciones de DNS. Para mantener la coherencia de la resolución de DNS, mantenga sin cambios la memoria caché de DNS de NodeLocal y las configuraciones de CoreDNS aplicables, como los dominios de apéndice.

La memoria caché de DNS NodeLocal está disponible a nivel general en clústeres que ejecutan Kubernetes 1.18 o posteriores, pero que siguen inhabilitados de forma predeterminada.

Habilitación de la memoria caché de DNS NodeLocal

Habilite la memoria caché de DNS NodeLocal para uno o más nodos trabajadores en el clúster de Kubernetes.

Los pasos siguientes actualizan los pods de DNS que se ejecutan en nodos trabajadores específicos. También puede etiquetar la agrupación de nodos trabajadores de modo que los nodos futuros hereden la etiqueta.

Antes de empezar, actualice las políticas de red de salida de DNS que se vean afectadas por esta función, como las políticas que dependen de selectores de pod o espacio de nombres para la salida de DNS.

kubectl get networkpolicy --all-namespaces -o yaml
  1. Inicie una sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.

  2. Si personaliza dominios de apéndice y servidores DNS en sentido ascendente para CoreDNS, también debe personalizar la memoria caché de DNS de NodeLocal con estos dominios de apéndice y servidores DNS en sentido ascendente.

  3. Obtenga una lista de los nodos del clúster. Los pods del agente de almacenamiento en memoria caché de DNS NodeLocal forman parte de un conjunto de daemons que se ejecuta en cada nodo.

    kubectl get nodes
    
  4. Añada la etiqueta ibm-cloud.kubernetes.io/node-local-dns-enabled=true al nodo trabajador. La etiqueta inicia el pod del agente de memoria caché de DNS en el nodo trabajador.

    1. Añada la etiqueta a uno o varios nodos trabajadores.

    2. Verifique que el nodo tiene la etiqueta comprobando que el campo NODE-LOCAL-DNS-ENABLED está establecido en true.

      kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
      

      Salida de ejemplo

      NAME          STATUS                      ROLES    AGE   VERSION       NODE-LOCAL-DNS-ENABLED
      10.xxx.xx.xxx Ready,SchedulingDisabled    <none>   28h   v1.32+IKS   true
      
    3. Verifique que el pod del agente de almacenamiento en memoria caché de DNS se está ejecutando en el nodo trabajador.

      kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
      

      Salida de ejemplo

      NAME                   READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
      node-local-dns-pvnjn   1/1     Running   0          1m    10.xxx.xx.xxx   10.xxx.xx.xxx  <none>           <none>
      
  5. Repita los pasos anteriores para cada nodo trabajador para habilitar la colocación en memoria caché de DNS.

Inhabilitación de la memoria caché de DNS NodeLocal

Puede inhabilitar la memoria caché de DNS NodeLocal para uno o para varios nodos trabajadores.

  1. Inicie una sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.

  2. Elimine la etiqueta ibm-cloud.kubernetes.io/node-local-dns-enabled del nodo trabajador. Esta acción finaliza el pod del agente de almacenamiento en memoria caché de DNS en el nodo trabajador.

    Ejecute el mandato siguiente para eliminar la etiqueta de todos los nodos de trabajador del clúster.

    kubectl label node --all --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
    

    Ejecute el mandato siguiente para eliminar la etiqueta de un nodo de trabajador individual.

    kubectl label node <node_name> "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
    
    1. Verifique que la etiqueta se ha eliminado comprobando que el campo NODE-LOCAL-DNS-ENABLED está vacío.

      kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
      

      Salida de ejemplo

      NAME          STATUS                      ROLES    AGE   VERSION       NODE-LOCAL-DNS-ENABLED
      10.xxx.xx.xxx Ready,SchedulingDisabled    <none>   28h   v1.32+IKS   
      
    2. Verifique que el pod ya no se está ejecutando en el nodo en el que está inhabilitada la memoria caché de DNS. La salida no muestra ningún pod.

      kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
      

      Salida de ejemplo

      No resources found.
      
  3. Repita los pasos anteriores para cada nodo trabajador para inhabilitar la colocación en memoria caché de DNS.

Personalización de la memoria caché de DNS local

Puede personalizar la memoria caché de DNS NodeLocal editando cualquiera de las dos mapas de configuración.

El almacenamiento en memoria caché de DNS de NodeLocal se basa en CoreDNS para mantener la memoria caché de las resoluciones de DNS. Para mantener la coherencia de la resolución de DNS, mantenga sin cambios la memoria caché de DNS de NodeLocal y las configuraciones de CoreDNS aplicables, como los dominios de apéndice.

Edición del mapa de configuración node-local-dns para actualizaciones generales de configuración

Edite el mapa de configuración node-local-dns para personalizar la configuración de la memoria caché de DNS de NodeLocal.

Antes de empezar: Inicie una sesión en su cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.

  1. Verifique que el conjunto de daemons de memoria caché DNS de NodeLocal esté disponible.

    kubectl get ds -n kube-system node-local-dns
    

    Salida de ejemplo

    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                         AGE
    node-local-dns   4         4         4       4            4           ibm-cloud.kubernetes.io/node-local-dns-enabled=true   82d
    
  2. Edite los valores predeterminados o añada Corefiles personalizados al mapa de configuración de memoria caché de DNS NodeLocal. Cada Corefile que importe debe utilizar la vía de acceso coredns. Para más información, consulte la documentación de Kubernetes.

    Solo se admite un conjunto limitado de complementos para la caché DNS de NodeLocal.

    kubectl edit configmap -n kube-system node-local-dns
    

    Salida de ejemplo

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: node-local-dns
      namespace: kube-system
    data:
      Corefile: |
        # Add your NodeLocal DNS customizations as import files under ./coredns directory.
        # Refer to /docs/containers?topic=containers-cluster_dns for details.
        import ./coredns/<MyCorefile>
        cluster.local:53 abc.com:53 {
            errors
            cache {
                    success 9984 30
                    denial 9984 5
            }
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__CLUSTER__DNS__ {
                    force_tcp
            }
            prometheus :9253
            health 169.254.20.10:8080
            }
        in-addr.arpa:53 {
            errors
            cache 30
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__CLUSTER__DNS__ {
                    force_tcp
            }
            prometheus :9253
            }
        ip6.arpa:53 {
            errors
            cache 30
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__CLUSTER__DNS__ {
                    force_tcp
            }
            prometheus :9253
            }
        .:53 {
            errors
            cache 30 {
                  disable success cluster.local
                  disable denial cluster.local
            }
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__UPSTREAM__SERVERS__ {
                    force_tcp
            }
            prometheus :9253
            }
      <MyCorefile>: |
        # Add custom corefile content ...
    
  3. Después de unos minutos, los pods de memoria caché de DNS NodeLocal captan los cambios del mapa de configuración.

Edición del mapa de configuración node-local-dns-config para ampliar con dominios de apéndice o servidores en sentido ascendente

Edite el mapa de configuración node-local-dns-config para ampliar la configuración de la memoria caché de DNS NodeLocal, por ejemplo para personalizar los dominios de apéndice o los servidores de DNS en sentido ascendente. Para más información, consulte la documentación de Kubernetes.

Antes de empezar: Inicie una sesión en su cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.

  1. Verifique que el conjunto de daemons de memoria caché DNS de NodeLocal esté disponible.

    kubectl get ds -n kube-system node-local-dns
    

    Salida de ejemplo

    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                         AGE
    node-local-dns   4         4         4       4            4           ibm-cloud.kubernetes.io/node-local-dns-enabled=true   82d
    
  2. Confirme que la memoria caché de DNS NodeLocal tenga un mapa de configuración.

    1. Determine si el mapa de configuración de memoria caché de DNS NodeLocal exista.

      kubectl get cm -n kube-system node-local-dns-config
      

      Salida de ejemplo cuando no hay un mapa de configuración

      Error from server (NotFound): ConfigMaps "node-local-dns-config" not found
      
    2. Si el mapa de configuración no existe, cree un mapa de configuración de memoria caché de DNS de NodeLocal.

      kubectl create cm -n kube-system node-local-dns-config
      

      Salida de ejemplo

      configmap/node-local-dns-config created
      
  3. Edite el mapa de configuración de memoria caché DNS NodeLocal. El mapa de configuración utiliza la sintaxis de KubeDNS para personalizar los dominios de apéndice y los servidores DNS en sentido ascendente. Para más información, consulte la documentación de Kubernetes.

    kubectl edit cm -n kube-system node-local-dns-config
    

    Salida de ejemplo

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: node-local-dns-config
      namespace: kube-system
    data:
      stubDomains: |
          {"abc.com" : ["1.2.3.4"]}
    
  4. Después de unos minutos, los pods de memoria caché de DNS NodeLocal captan los cambios del mapa de configuración.

Configuración de DNS con distinción de zonas

Configure DNS con distinción de zonas para mejorar el rendimiento y la disponibilidad de DNS del clúster en su clúster multizona de IBM Cloud Kubernetes Service. Esta configuración amplía la memoria caché de DNS NodeLocal para dar preferencia al tráfico de DNS de clúster dentro de la misma zona.

De forma predeterminada, el clúster está configurado con recursos DNS a nivel de clúster, no a recursos DNS con distinción de zonas. Incluso después de configurar un DNS con distinción de zonas, los recursos de DNS a nivel de clúster se siguen ejecutando como un DNS de reserva. Los recursos de DNS con distinción de zonas están separados del DNS a nivel de clúster y el cambio de DNS con distinción de zonas no afecta al DNS a nivel de clúster.

No utilice la etiqueta de memoria caché de DNS cuando utilice DNS con distinción de zonas en el clúster.

Configuración de DNS con distinción de zonas

Realice el paso siguiente para configurar DNS con reconocimiento de zona en el clúster multizona.

  1. Actualice las políticas de red de salida de DNS que se vean afectadas por DNS con reconocimiento de zona, como las políticas que dependen de selectores de espacio de nombres o pod para la salida de DNS. Ejecute el siguiente comando para obtener una lista de sus políticas de red.

    kubectl get networkpolicy --all-namespaces -o yaml
    
  2. Etiquete el coredns ConfigMap en el espacio de nombres kube-system con ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true.

    kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true"
    
  3. Renovar el maestro de clúster para desplegar los recursos DNS que tienen en cuenta las zonas.

    ibmcloud ks cluster master refresh -c <cluster_name_or_ID>
    
  4. Espere a que finalice la operación de renovación; para ello revise el Estado del nodo maestro en los detalles del clúster.

    ibmcloud ks cluster get -c <cluster_name_or_ID>
    
  5. Si personaliza dominios de apéndice y servidores DNS en sentido ascendente para CoreDNS, también debe personalizar la memoria caché de DNS de NodeLocal con estos dominios de apéndice y servidores DNS en sentido ascendente.

  6. Defina una variable de entorno para las zonas del clúster.

    ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
    
  7. Inicie los pods de CoreDNS y del programa de escalado automático de CoreDNS en todas las zonas.

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=1
    done
    
  8. Compruebe que los pods de CoreDNS y del programa de escalado automático de CoreDNS se están ejecutando en todas las zonas.

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}" -o wide
        kubectl get pods -n kube-system -l "k8s-app=coredns-${ZONE}" -o wide
    done
    
  9. Inicie los pods de memoria caché de DNS NodeLocal en todos los nodos trabajadores.

    kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true"
    
  10. Verifique que los pods de memoria caché de DNS NodeLocal se están ejecutando en todos los nodos trabajadores.

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=node-local-dns-${ZONE}" -o wide
    done
    
  11. Etiquete sus agrupaciones de nodos trabajadores para que los nodos trabajadores futuros hereden la etiqueta ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true.

Inhabilitación y supresión de DNS con distinción de zonas

Para eliminar DNS con distinción de zonas, primero tiene que inhabilitar DNS con distinción de zonas cada zona del clúster multizonas. A continuación, suprima los recursos de DNS con distinción de zonas.

  1. Elimine la etiqueta ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true de las agrupaciones de nodos trabajadores.

  2. Defina una variable de entorno para las zonas del clúster.

    ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
    
  3. Detenga los pods de memoria caché de DNS NodeLocal en todos los nodos trabajadores.

    kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled-"
    
  4. Detenga los pods del programa de escalado automático de CoreDNS en todas las zonas.

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=0
    done
    
  5. Compruebe que los pods del programa de escalado automático de CoreDNS ya no se están ejecutando en ninguna zona.

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}"
    done
    
  6. Detenga los pods de CoreDNS en todas las zonas.

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-${ZONE}" --replicas=0
    done
    
  7. Elimine la etiqueta ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true del mapa de configuración coredns en el espacio de nombres kube-system.

    kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns-"
    
  8. Renueve el nodo maestro del clúster para suprimir los recursos de DNS con distinción de zonas.

    ibmcloud ks cluster master refresh --cluster <cluster-name-or-id>
    
  9. Espere a que finalice la operación de renovación; para ello revise el Estado del nodo maestro en los detalles del clúster.

    ibmcloud ks cluster get -c <cluster_name_or_ID>