Uso de CoreDNS para la resolución personalizada de nombres de dominio
Desafíos
Al usar CCE, es posible que deba resolver nombres de dominio internos personalizados en los siguientes escenarios:
- En el código heredado, se configura un nombre de dominio fijo para invocar a otros servicios internos. Si el sistema decide usar Kubernetes Services, la carga de trabajo de refactorización de código podría ser pesada.
- Se crea un servicio fuera del clúster. Los datos del clúster deben enviarse al servicio con un nombre de dominio fijo.
Solución
Existen varias soluciones basadas en CoreDNS para la resolución personalizada de nombres de dominio:
- Configuración del dominio Stub para CoreDNS: Puede agregarlo en la consola, que es fácil de operar.
- Uso del complemento Hosts de CoreDNS para configurar la resolución de cualquier nombre de dominio: Puede agregar cualquier conjunto de registros, lo cual es similar a agregar un conjunto de registros en el archivo /etc/hosts local.
- Uso del complemento Rewrite de CoreDNS para apuntar un nombre de dominio a un servicio en el clúster: Se asigna un apodo al Kubernetes Service. No es necesario conocer de antemano la dirección IP del registro de resolución.
- Uso del complemento Forward de CoreDNS para configurar el DNS autoconstruido como DNS ascendente: El DNS autoconstruido puede gestionar un gran número de registros de resolución. No es necesario modificar la configuración de CoreDNS al agregar o eliminar registros.
Precauciones
La modificación incorrecta en la configuración de CoreDNS puede provocar errores de resolución de nombres de dominio en el clúster. Realice pruebas antes y después de la modificación.
Configuración del dominio Stub para CoreDNS
Los administradores de clústeres pueden modificar el ConfigMap para CoreDNS Corefile para cambiar el funcionamiento de la detección de servicios.
Suponga que un administrador de clúster tiene un servidor de Consul DNS ubicado en 10.150.0.1 y que todos los nombres de dominio Consul tienen el sufijo .consul.local.
- Inicie sesión en la consola de CCE y acceda a la consola del clúster.
- En el panel de navegación, elija Add-ons. En la página mostrada, haga clic en Edit en CoreDNS.
- Agregue un dominio stub en el área Parameters.
Modifique el parámetro stub_domains en el formato de un par clave-valor. La clave es un nombre de dominio de sufijo de DNS y el valor es una dirección IP de DNS o un grupo de direcciones IP de DNS.
{ "stub_domains": { "consul.local": [ "10.150.0.1" ] }, "upstream_nameservers": [] }
- Haga clic en OK.
También puede modificar el ConfigMap de la siguiente manera:
Los valores de los parámetros en rojo en el ejemplo solo se pueden modificar y no se pueden eliminar.
$ kubectl edit configmap coredns -n kube-system apiVersion: v1 data: Corefile: |- .:5353 { bind {$POD_IP} cache 30 errors health {$POD_IP}:8080 kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } loadbalance round_robin prometheus {$POD_IP}:9153 forward . /etc/resolv.conf { policy random } reload } consul.local:5353 { bind {$POD_IP} errors cache 30 forward . 10.150.0.1 } kind: ConfigMap metadata: creationTimestamp: "2022-05-04T04:42:24Z" labels: app: coredns k8s-app: coredns kubernetes.io/cluster-service: "true" kubernetes.io/name: CoreDNS release: cceaddon-coredns name: coredns namespace: kube-system resourceVersion: "8663493" uid: bba87142-9f8d-4056-b8a6-94c3887e9e1d
Modificación del archivo de configuración hosts de CoreDNS
- Utilice kubectl para conectarse al clúster.
- Modifique el archivo de configuración de CoreDNS y agregue el nombre de dominio personalizado al archivo hosts.
Apunte www.example.com a 192.168.1.1. Cuando CoreDNS resuelve www.example.com, 192.168.1.1 se devuelve.
Se debe configurar el campo fallthrough. fallthrough indica que cuando el nombre de dominio a resolver no se encuentra en el archivo hosts, la tarea de resolución se transfiere al siguiente complemento de CoreDNS. Si no se especifica fallthrough, la tarea finaliza y la resolución del nombre de dominio se detiene. Como resultado, la resolución de nombres de dominio en el clúster falla.
Para obtener más información sobre cómo configurar el archivo hosts, visite https://coredns.io/plugins/hosts/.
$ kubectl edit configmap coredns -n kube-system apiVersion: v1 data: Corefile: |- .:5353 { bind {$POD_IP} cache 30 errors health {$POD_IP}:8080 kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } hosts { 192.168.1.1 www.example.com fallthrough } loadbalance round_robin prometheus {$POD_IP}:9153 forward . /etc/resolv.conf reload } kind: ConfigMap metadata: creationTimestamp: "2021-08-23T13:27:28Z" labels: app: coredns k8s-app: coredns kubernetes.io/cluster-service: "true" kubernetes.io/name: CoreDNS release: cceaddon-coredns name: coredns namespace: kube-system resourceVersion: "460" selfLink: /api/v1/namespaces/kube-system/configmaps/coredns uid: be64aaad-1629-441f-8a40-a3efc0db9fa9
Después de modificar el archivo hosts en CoreDNS, no es necesario configurar el archivo hosts en cada pod.
Adición de la configuración Rewrite de CoreDNS para apuntar el nombre de dominio a los servicios en el clúster
Utilice el complemento Rewrite de CoreDNS para resolver un nombre de dominio especificado en el nombre de dominio de un Service.
- Utilice kubectl para conectarse al clúster.
- Modifique el archivo de configuración de CoreDNS para que apunte example.com al servicio example en el espacio de nombres default.
$ kubectl edit configmap coredns -n kube-system apiVersion: v1 data: Corefile: |- .:5353 { bind {$POD_IP} cache 30 errors health {$POD_IP}:8080 kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } rewrite name example.com example.default.svc.cluster.local loadbalance round_robin prometheus {$POD_IP}:9153 forward . /etc/resolv.conf reload } kind: ConfigMap metadata: creationTimestamp: "2021-08-23T13:27:28Z" labels: app: coredns k8s-app: coredns kubernetes.io/cluster-service: "true" kubernetes.io/name: CoreDNS release: cceaddon-coredns name: coredns namespace: kube-system resourceVersion: "460" selfLink: /api/v1/namespaces/kube-system/configmaps/coredns uid: be64aaad-1629-441f-8a40-a3efc0db9fa9
Uso de CoreDNS a DNS autoconstruido en cascada
- Utilice kubectl para conectarse al clúster.
- Modifique el archivo de configuración de CoreDNS y cambie /etc/resolv.conf después de forward a la dirección IP del servidor de DNS externo.
$ kubectl edit configmap coredns -n kube-system apiVersion: v1 data: Corefile: |- .:5353 { bind {$POD_IP} cache 30 errors health {$POD_IP}:8080 kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } loadbalance round_robin prometheus {$POD_IP}:9153 forward . 192.168.1.1 reload } kind: ConfigMap metadata: creationTimestamp: "2021-08-23T13:27:28Z" labels: app: coredns k8s-app: coredns kubernetes.io/cluster-service: "true" kubernetes.io/name: CoreDNS release: cceaddon-coredns name: coredns namespace: kube-system resourceVersion: "460" selfLink: /api/v1/namespaces/kube-system/configmaps/coredns uid: be64aaad-1629-441f-8a40-a3efc0db9fa9