Uso de DNSCache de NodeLocal para mejorar el rendimiento de DNS
Desafíos
Durante la resolución de DNS, si hay un gran número de solicitudes, CoreDNS estará bajo presión, lo que tiene los siguientes impactos:
- La consulta se vuelve lenta, lo que afecta al rendimiento del servicio.
- CoreDNS requiere especificaciones más altas.
Solución
DNSCache de NodeLocal mejora el rendimiento de DNS del clúster mediante la ejecución de proxys de caché de DNS en nodos del clúster.
Después de habilitar DNSCache de NodeLocal, una consulta de DNS pasa por la ruta como se muestra a continuación.
Instalación del complemento
CCE proporciona node-local-dns adicional para que instale DNSCache de NodeLocal.
- El complemento node-local-dns solo admite clústeres de v1.19 y posteriores.
- DNSCache de NodeLocal sirve como un proxy de almacenamiento en caché transparente para CoreDNS y no proporciona complementos como hosts o reescritura. Si desea habilitar estos complementos, modifique las configuraciones de CoreDNS.
- Los pods no se pueden inyectar automáticamente en el espacio de nombres del kube-system.
- (Opcional) Modifique la configuración de CoreDNS para que CoreDNS utilice preferentemente UDP para comunicarse con el servidor DNS ascendente.
El DNSCache de NodeLocal utiliza TCP para comunicarse con el CoreDNS. El CoreDNS se comunica con el servidor DNS ascendente basándose en el protocolo utilizado por el origen de la solicitud. Sin embargo, el servidor en la nube no es compatible con TCP. Para utilizar DNSCache de NodeLocal, debe modificar la configuración de CoreDNS para que UDP se utilice preferentemente para comunicarse con el servidor de DNS ascendente, evitando excepciones de resolución.
Ejecute el siguiente comando:
kubectl edit configmap coredns -nkube-system
En el complemento de reenvío, especifique perfer_udp como el protocolo utilizado por las solicitudes. Después de la modificación, CoreDNS utiliza preferentemente UDP para comunicarse con el sistema aguas arriba.
forward . /etc/resolv.conf { prefer_udp }
- Inicie sesión en la consola de CCE y acceda a la consola del clúster. Elija Add-ons en el panel de navegación, localice node-local-dns a la derecha y haga clic en Install.
- En la página Install Add-on, seleccione las especificaciones del complemento y establezca los parámetros relacionados.
enable_dnsconfig_admission: si se debe inyectar automáticamente DNSConfig a los pods recién creados. El valor predeterminado es false. El valor true permite la inyección automática, evitando la inyección de archivos YAML pod configurados manualmente.
- Haga clic en Install.
Uso de DNSCache de NodeLocal
Puede utilizar DNSCache de NodeLocal de cualquiera de las siguientes maneras:
- Inyección automática: configure automáticamente el campo dnsConfig del pod al crearlo. (Los pods no se pueden inyectar automáticamente en el espacio de nombres del kube-system.)
- Configuración manual: configure manualmente el campo dnsConfig del pod.
Inyección automática
Deben cumplirse las siguientes condiciones:
- enable_dnsconfig_admission se ha establecido en true para el complemento.
- La etiqueta node-local-dns-injection=enabled se ha agregado al espacio de nombres.
kubectl label namespace default node-local-dns-injection=enabled
- El nuevo pod no se ejecuta en el espacio de nombres de kube-system o de kube-public.
- La etiqueta node-local-dns-injection=disabled para deshabilitar la inyección de DNS no se agrega al nuevo pod.
- El nuevo pod utiliza la red host y DNSPolicy es ClusterFirstWithHostNet. Alternativamente, el pod no utiliza la red anfitriona y DNSPolicy es ClusterFirst.
Después de activar la inyección automática, los siguientes ajustes de dnsConfig se agregan automáticamente al pod creado. Además de la dirección de DNSCache de NodeLocal 169.254.20.10, la dirección de CoreDNS 10.247.3.10 se agrega a nameservers asegurando una alta disponibilidad del servidor de DNS del servicio.
dnsConfig: nameservers: - 169.254.20.10 - 10.247.3.10 searches: - default.svc.cluster.local - svc.cluster.local - cluster.local options: - name: timeout value: '' - name: ndots value: '5' - name: single-request-reopen
Configuración manual
Agregue manualmente la configuración dnsConfig al pod.
Cree un pod y configure dnsConfig en 169.254.20.10.
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx:alpine name: container-0 dnsConfig: nameservers: - 169.254.20.10 searches: - default.svc.cluster.local - svc.cluster.local - cluster.local options: - name: ndots value: '2' imagePullSecrets: - name: default-secret