CoreDNS es el servidor del sistema de nombres de dominio (DNS) predeterminado de los clústeres de Container Service for Kubernetes (ACK). Este tema presenta los plugins que proporciona CoreDNS y cómo configurarlos en diversos escenarios.
Requisitos previos
Escenarios de uso
En este tema se utiliza como ejemplo un pod que emplea CoreDNS para la resolución DNS. dnsPolicy: ClusterFirst se especifica en la configuración de la política DNS del pod. Por ejemplo:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: ClusterFirst
Para obtener más información sobre cómo establecer el parámetro dnsPolicy en varios escenarios, consulte Configure DNS resolution.
Configuraciones predeterminadas de CoreDNS
En el namespace kube-system encontrará un ConfigMap de CoreDNS. CoreDNS configura y habilita los plugins que se especifican en el ConfigMap. Los ConfigMaps de las distintas versiones de CoreDNS presentan ligeras diferencias. Lea la documentación oficial de CoreDNS antes de modificar las configuraciones. A continuación se muestra el contenido del archivo de configuración predeterminado que usa CoreDNS 1.6.2:
Corefile: |
.:53 {
errors
log
health {
lameduck 15s
}
ready
kubernetes {{.ClusterDomain}} in-addr.arpa ip6.arpa {
pods verified
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf {
prefer_udp
}
cache 30
loop
reload
loadbalance
}
Reemplace ClusterDomain por el nombre de dominio del clúster que especifique al crear el clúster. El nombre de dominio predeterminado del clúster es cluster.local.
|
Parámetro |
Descripción |
|
errors |
Imprime los errores en la salida estándar (stdout). |
|
health |
Genera informes de comprobación de estado para CoreDNS. El puerto de escucha predeterminado es el 8080. Este plugin sirve para evaluar el estado de salud de CoreDNS. Consulte |
|
ready |
Reporta el estado de los plugins de CoreDNS. El puerto de escucha predeterminado es el 8181. Este plugin evalúa si los plugins de CoreDNS están listos. Consulte |
|
kubernetes |
El plugin kubernetes de CoreDNS proporciona resolución DNS para los servicios de un clúster de ACK. |
|
prometheus |
Exporta las métricas de CoreDNS. Consulte |
|
forward o proxy |
Reenvía las consultas DNS al servidor DNS predefinido. De forma predeterminada, las consultas DNS de nombres de dominio fuera del dominio del clúster de Kubernetes se reenvían al resolvedor DNS predefinido (/etc/resolv.conf). Las configuraciones predeterminadas se basan en el archivo /etc/resolv.conf del host. |
|
cache |
Habilita la caché DNS. |
|
loop |
Detecta bucles. Si detecta uno, suspende CoreDNS. |
|
reload |
Permite recargar automáticamente un Corefile modificado. Después de editar el ConfigMap, espere 2 minutos para que los cambios surtan efecto. |
|
loadbalance |
Funciona como un load balancer DNS de tipo round-robin para aleatorizar el orden de los registros A, AAAA y MX en la respuesta. |
|
|
CoreDNS v1.12.1 introduce el plugin multisocket para mejorar el rendimiento en entornos con alto consumo de CPU. Al habilitarlo, este plugin permite que CoreDNS escuche en el mismo puerto mediante varios sockets simultáneamente. Para obtener instrucciones detalladas, consulte DNS best practices. |
Configurar funciones extendidas basadas en CoreDNS
Es posible configurar funciones extendidas basadas en CoreDNS en los siguientes escenarios:
-
Escenario 1: habilitar la recopilación de registros
Para recopilar el registro de todas las resoluciones DNS que ejecuta CoreDNS, habilite el plugin log. Agregue el parámetro log a Corefile. Por ejemplo:
Corefile: | .:53 { errors log health { lameduck 15s } 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 { prefer_udp } cache 30 loop reload loadbalance } -
Escenario 2: personalizar servidores DNS para nombres de dominio específicos
Si necesita que un servidor DNS definido por el usuario resuelva los nombres de dominio con el sufijo example.com (por ejemplo, el servidor DNS 10.10.0.10), agregue una configuración de resolución personalizada para esos nombres de dominio. Por ejemplo:
example.com:53 { errors cache 30 forward . 10.10.0.10 { prefer_udp } }A continuación se muestra la configuración completa de Corefile:
Corefile: | .:53 { errors health { lameduck 15s } 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 { prefer_udp } cache 30 loop reload loadbalance } example.com:53 { errors cache 30 forward . 10.10.0.10 { prefer_udp } } -
Escenario 3: personalizar servidores DNS para nombres de dominio externos
Cuando los nombres de dominio que deben resolverse mediante servidores DNS definidos por el usuario no comparten el mismo sufijo, utilice dichos servidores para resolver todos los nombres de dominio externos. En este escenario, debe reenviar a Alibaba Cloud DNS los nombres de dominio que los servidores personalizados no puedan resolver. No modifique los archivos /etc/resolv.conf de las instancias de Elastic Compute Service (ECS) del clúster de ACK. Por ejemplo, si las direcciones IP de los servidores DNS definidos por el usuario son 10.10.0.10 y 10.10.0.20, modifique el parámetro forward. Por ejemplo:
Corefile: | .:53 { errors health { lameduck 15s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . 10.10.0.10 10.10.0.20 { prefer_udp } cache 30 loop reload loadbalance } -
Escenario 4: personalizar hosts para nombres de dominio específicos
Configure el plugin hosts si desea personalizar los hosts para nombres de dominio específicos. Por ejemplo, cuando necesite dirigir www.example.com a 127.0.0.1. Por ejemplo:
Corefile: | .:53 { errors health { lameduck 15s } ready hosts { 127.0.0.1 www.example.com fallthrough } kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { prefer_udp } cache 30 loop reload loadbalance }ImportanteDebe especificar fallthrough. De lo contrario, podría fallar la resolución de los nombres de dominio distintos al especificado.
-
Escenario 5: habilitar el acceso externo a los servicios de un clúster de ACK
Si desea que un proceso en una instancia ECS de un clúster de ACK acceda a los servicios del clúster, establezca la dirección IP del clúster de kube-dns como valor del parámetro
nameserveren el archivo /etc/resolv.conf de la instancia ECS. No modifique otras configuraciones del archivo /etc/resolv.conf.Dentro de una red interna, utilice una instancia de Server Load Balancer (SLB) orientada a la red interna para permitir el acceso interno a los servicios del clúster de ACK. Luego, inicie sesión en la consola de Alibaba Cloud DNS PrivateZone y agregue un registro A que apunte a la dirección IP privada de la instancia SLB.
-
Escenario 6: usar un nombre de dominio para permitir el acceso a un servicio en un clúster de ACK o habilitar la resolución CNAME para un clúster de ACK
Utilice foo.example.com para permitir todo el acceso a su servicio en un clúster de ACK desde Internet, redes internas y dentro del propio clúster. A continuación se describe cómo habilitar esta función:
Su servicio
foo.default.svc.cluster.localestá expuesto al acceso externo mediante una instancia SLB orientada a Internet. El nombre de dominiofoo.example.comse resuelve a la dirección IP de dicha instancia SLB.Su servicio
foo.default.svc.cluster.localestá expuesto al acceso interno mediante una instancia SLB orientada a la red interna. Inicie sesión en la consola de Alibaba Cloud DNS PrivateZone para dirigirfoo.example.coma la dirección IP de la instancia SLB interna en la virtual private cloud (VPC) donde se despliega el clúster de ACK. Para conocer el procedimiento, consulte Scenario 4: Customize hosts for specified domain names.-
Dentro del clúster de ACK, utilice el plugin rewrite para agregar un registro CNAME que dirija
foo.example.comafoo.default.svc.cluster.local. Por ejemplo:Corefile: | .:53 { errors health { lameduck 15s } ready rewrite stop { name exact foo.example.com foo.default.svc.cluster.local answer name foo.default.svc.cluster.local foo.example.com } kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { prefer_udp } cache 30 loop reload loadbalance }
-
Escenario 7: configurar CoreDNS para que no devuelva direcciones IPv6 resueltas mediante registros AAAA
Si sus pods de aplicación no requieren resultados de resolución basados en registros AAAA, configure CoreDNS para interceptar dichos resultados y devolver un código NODATA. Esto minimiza la transferencia de datos. Por ejemplo:
Corefile: | .:53 { errors health { lameduck 15s } # Add the following line to enable the template plug-in. Do not modify other settings. template IN AAAA . } -
Escenario 8: habilitar la función MCS de ACK One
NotaCoreDNS 1.9.3 o versiones posteriores admiten la función de servicios multiclúster (MCS) de Distributed Cloud Container Platform for Kubernetes (ACK One). Para habilitarla, compruebe que actualizó CoreDNS a la versión 1.9.3 o posterior. Para obtener más información, consulte Configure ACK to automatically update CoreDNS y Manually update CoreDNS.
-
Ejecute el siguiente comando para actualizar el ConfigMap de CoreDNS:
kubectl edit configmap/coredns -n kube-system -
Agregue una línea arriba de la que comienza con
kubernetesy especifiquemulticluster clusterset.localen la nueva línea para habilitar el plugin multicluster, el cual activa la función MCS de ACK One. Esta configuración establece los sufijos de los nombres de dominio de los servicios multiclúster comoclusterset.local.Corefile: | .:53 { # Irrelevant lines are not shown. # Add the following line. multicluster clusterset.local kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } # Irrelevant lines are not shown. } Presione Esc, introduzca :wq! y luego presione Enter para guardar el archivo y salir del modo de edición.
-
-
Escenario 9: especificar distintos servidores DNS ascendentes para dominios externos
Requisitos previos
CoreDNS versión 1.11.3 o posterior.
Configuración
Defina varias directivas
forwarddentro de un solo bloque de servidor. Cada directiva puede especificar un servidor DNS ascendente distinto para un dominio específico. Para consultar la lista completa de parámetros, revise la documentación oficial del plugin forward.Ejemplo
Corefile: | .:53 { # ... other configurations ... kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } # Forward queries for foo.com to DNS server 10.20.0.1 forward foo.com 10.20.0.1 # Forward queries for bar.com to DNS server 10.30.0.1 forward bar.com 10.30.0.1 # Forward all other queries to the DNS servers specified in the node's /etc/resolv.conf forward . /etc/resolv.conf # ... other configurations ... }