Configuración de DNS
Cada clúster de Kubernetes tiene un complemento de DNS integrado (Kube-DNS o CoreDNS) para proporcionar resolución de nombres de dominio para las cargas de trabajo del clúster. Cuando se maneja una alta concurrencia de consultas de DNS, Kube-DNS/CoreDNS puede encontrar un cuello de botella de rendimiento, es decir, puede fallar ocasionalmente para satisfacer las consultas de DNS. Hay casos en los que las cargas de trabajo de Kubernetes inician consultas de DNS innecesarias. Esto hace que el DNS se sobrecargue si hay muchas consultas de DNS simultáneas. Al ajustar la configuración de DNS para las cargas de trabajo, se reducirán en cierta medida los riesgos de fallas en las consultas de DNS.
Para obtener más información acerca de DNS, consulte coredns (complemento de recursos del sistema, obligatorio).
Conceptos de configuración de DNS
nameserver 10.247.x.x search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5
- nameserver: una lista de direcciones IP de un servidor de nombres que el solucionador consultará. Si este parámetro se establece en 10.247.x.x, el solucionador consultará el kube-dns/CoreDNS. Si este parámetro se establece en otra dirección IP, el solucionador consultará un servidor DNS en la nube o local.
- search: una lista de búsqueda para la búsqueda de nombre de host. Cuando un nombre de dominio no se puede resolver, las consultas de DNS se intentarán combinar el nombre de dominio con cada dominio en la lista de búsqueda a su vez hasta que se encuentre una coincidencia o se intenten todos los dominios en la lista de búsqueda. En el caso de los clústeres de CCE, la lista de búsqueda se limita actualmente a tres dominios por contenedor. Cuando se resuelve un nombre de dominio inexistente, se iniciarán ocho consultas de DNS porque cada nombre de dominio (incluidos los de la lista de búsqueda) se consultará dos veces, una para IPv4 y la otra para IPv6.
- options: opciones que permiten modificar ciertas variables internas de resolución. Las opciones comunes incluyen el tiempo de espera y los ndots.
El valor ndots:5 significa que si un nombre de dominio tiene menos de 5 puntos (.), las consultas de DNS se intentarán combinando el nombre de dominio con cada dominio en la lista de búsqueda a su vez. Si no se encuentra ninguna coincidencia después de probar todos los dominios de la lista de búsqueda, el nombre de dominio se utiliza para la consulta de DNS. Si el nombre de dominio tiene 5 o más de 5 puntos, se intentará primero para la consulta de DNS. En caso de que el nombre de dominio no se pueda resolver, las consultas de DNS se intentarán combinando el nombre de dominio con cada dominio en la lista de búsqueda a su vez.
Por ejemplo, el nombre de dominio www.***.com tiene solo dos puntos (más pequeño que el valor de ndots) y, por lo tanto, la secuencia de consultas de DNS es como las siguientes: www.***.default.svc.cluster.local, www.***.com.svc.cluster.local, www.***.com.cluster.local y www.***.com. Esto significa que se iniciarán al menos siete consultas de DNS antes de que el nombre de dominio se resuelva en una dirección IP. Está claro que cuando se iniciarán muchas consultas de DNS innecesarias para acceder a un nombre de dominio externo. Hay margen para mejorar la configuración de DNS de la carga de trabajo.
Para obtener más información acerca de las opciones de configuración en el archivo de configuración de resolución utilizado por los sistemas operativos Linux, visite http://man7.org/linux/man-pages/man5/resolv.conf.5.html.
Configuración de DNS mediante la carga de trabajo de YAML
apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: container-1 image: nginx:latest imagePullPolicy: IfNotPresent imagePullSecrets: - name: default-secret dnsPolicy: None dnsConfig: options: - name: ndots value: '5' - name: timeout value: '3' nameservers: - 10.2.3.4 searches: - my.dns.search.suffix
dnsPolicy
Parámetro |
Descripción |
---|---|
ClusterFirst (default value) |
El CoreDNS del clúster de CCE, que se conecta en cascada con el DNS en la nube de forma predeterminada, se utiliza para las cargas de trabajo. Los contenedores pueden resolver tanto los nombres de dominio internos de clúster registrados por un Service como los nombres de dominio externos expuestos a las redes públicas. La lista de búsqueda (opción search) y ndots: 5 están presentes en el archivo de configuración de DNS. Por lo tanto, al acceder a un nombre de dominio externo y a un nombre de dominio interno de clúster largo (por ejemplo, kubernetes.default.svc.cluster.local), la lista de búsqueda generalmente se recorrerá primero, resultando en al menos seis consultas de DNS no válidas. El problema de las consultas de DNS no válidas desaparece solo cuando se accede a un nombre de dominio interno de clúster corto (por ejemplo, kubernetes). |
ClusterFirstWithHostNet |
De forma predeterminada, el archivo de configuración de DNS al que apunta el indicador --resolv-conf está configurado para las cargas de trabajo que se ejecutan con hostNetwork=true es decir, se utiliza un DNS en la nube para los clústeres de CCE. Si las cargas de trabajo necesitan usar Kube-DNS/CoreDNS del clúster, establezca dnsPolicy en ClusterFirstWithHostNet y el archivo de configuración de DNS de contenedor es el mismo que ClusterFirst en el que aún existen las consultas de DNS no válidas.
... spec: containers: - image: nginx:latest imagePullPolicy: IfNotPresent name: container-1 restartPolicy: Always hostNetwork: true dnsPolicy: ClusterFirstWithHostNet |
Default |
El archivo de configuración de DNS del contenedor es el archivo de configuración de DNS al que apunta el indicador --resolv-conf del kubelet. En este caso, se utiliza un DNS en la nube para los clústeres de CCE. Tanto los campos search como options se dejan sin especificar. Esta configuración solo puede resolver los nombres de dominio externos registrados con Internet, y no los nombres de dominio internos de clúster. Esta configuración está libre de la emisión de consultas de DNS no válidas. |
None |
Si dnsPolicy está establecido en None debe especificarse el campo dnsConfig porque se supone que todas las configuraciones de DNS se proporcionan mediante el campo dnsConfig. |
Si no se especifica el campo dnsPolicy, el valor predeterminado es ClusterFirst en lugar de Default.
dnsConfig
Parámetro |
Descripción |
---|---|
options |
Una lista opcional de objetos donde cada objeto puede tener una propiedad name (obligatoria) y una propiedad value (opcional). El contenido de esta propiedad se combinará con las opciones generadas a partir de la política de DNS especificada de dnsPolicy. Se eliminan las entradas duplicadas. |
nameservers |
Una lista de direcciones IP que se utilizarán como servidores de DNS. Si dnsPolicy de la carga de trabajo se establece en None, la lista debe contener al menos una dirección IP; de lo contrario, esta propiedad es opcional. Los servidores listados se combinarán con los servidores de nombres generados a partir de la política de DNS especificada de dnsPolicy con las direcciones duplicadas quitadas. |
searches |
Una lista de dominios de búsqueda de DNS para la búsqueda de nombre de host en el Pod. Esta propiedad es opcional. Cuando se especifica, la lista proporcionada se fusionará con los nombres de dominio de búsqueda generados a partir de la política de DNS elegida de dnsPolicy. Se quitan los nombres de dominio duplicados. Kubernetes permite un máximo de 6 dominios de búsqueda. |
Configuración de DNS para una carga de trabajo mediante la consola
Kubernetes proporciona opciones de configuración relacionadas con DNS para las aplicaciones. El uso de la configuración de DNS de la aplicación puede reducir eficazmente las consultas DNS innecesarias en ciertos escenarios y mejorar la concurrencia del servicio. En el siguiente procedimiento se utiliza una aplicación de Nginx como ejemplo para describir cómo agregar configuraciones de DNS para una carga de trabajo en la consola.
- Inicie sesión en la consola de CCE, acceda a la consola del clúster, seleccione Workloads en el panel de navegación y haga clic en Create Workload en la esquina superior derecha.
- Configure la información básica sobre la carga de trabajo. Para obtener más información, véase Creación de una Deployment.
- En el área Advanced Settings, haga clic en la ficha DNS y establezca los siguientes parámetros según sea necesario:
- DNS Policy: Las políticas de DNS proporcionadas en la consola corresponden al campo dnsPolicy del archivo YAML. Para obtener más información, véase Tabla 1.
- Supplement defaults: corresponde a dnsPolicy=ClusterFirst. Los contenedores pueden resolver tanto los nombres de dominio internos de clúster registrados por un Service como los nombres de dominio externos expuestos a las redes públicas.
- Replace defaults: corresponde a dnsPolicy=None. Debe configurar IP Address y Search Domain. Los contenedores solo utilizan la dirección IP definida por el usuario y las configuraciones de dominio de búsqueda para la resolución de nombres de dominio.
- Inherit defaults: corresponde a dnsPolicy=Default. Los contenedores utilizan la configuración de resolución de nombres de dominio desde el nodo en el que se ejecutan los pods y no pueden resolver los nombres de dominio internos del clúster.
- Optional Objects: los parámetros de opciones del campo de dnsConfig. Cada objeto puede tener una propiedad del nombre (requerida) y una propiedad del valor (opcional). Después de establecer las propiedades, haga clic en confirm to add.
- timeout: Intervalo de tiempo de espera, en segundos.
- ndots: Número de puntos (.) que deben estar presentes en un nombre de dominio. Si un nombre de dominio tiene puntos menores que este valor, el sistema operativo buscará el nombre en el dominio de búsqueda. Si no, el nombre es un nombre de dominio completo (FQDN) y se probará primero como un nombre absoluto.
- IP Address: nameservers en dnsConfig. Puede configurar el servidor de nombres de dominio para el nombre de dominio personalizado. El valor es una o un grupo de direcciones IP de DNS.
- Search Domain: searches en dnsConfig. Una lista de dominios de búsqueda de DNS para la búsqueda de nombre de host en el pod. Esta propiedad es opcional. Cuando se especifica, la lista proporcionada se fusionará con los nombres de dominio de búsqueda generados a partir de la política de DNS elegida de dnsPolicy. Se quitan los nombres de dominio duplicados.
- DNS Policy: Las políticas de DNS proporcionadas en la consola corresponden al campo dnsPolicy del archivo YAML. Para obtener más información, véase Tabla 1.
- Hacer clic en Create Workload.
Ejemplos de configuración
En el ejemplo siguiente se describe cómo configurar DNS para las cargas de trabajo.
- Caso del uso 1: Uso de Kube-DNS/CoreDNS construido en los clústeres de Kubernetes
Escenario
Kubernetes en clúster Kube-DNS/CoreDNS es aplicable para resolver solo nombres de dominio internos de clúster o nombres de dominio internos de clúster + nombres de dominio externos. Este es el DNS predeterminado para las cargas de trabajo.
Por ejemplo:
apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: ClusterFirst
Archivo de configuración de DNS del contenedor:
nameserver 10.247.3.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5
- Caso de uso 2: Uso de un DNS en la nube
Escenario
Un DNS no puede resolver nombres de dominio internos de clúster y, por lo tanto, es aplicable al escenario en el que las cargas de trabajo acceden solo a los nombres de dominio externos registrados con Internet.
Por ejemplo:
apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: Default//The DNS configuration file that the kubelet's --resolv-conf flag points to is used. In this case, a DNS is used for CCE clusters.
Archivo de configuración de DNS del contenedor:
nameserver 100.125.x.x
- Caso de uso 3: Uso de Kube-DNS/CoreDNS para cargas de trabajo que se ejecutan con hostNetwork
Escenario
De forma predeterminada, se utiliza un DNS para las cargas de trabajo que se ejecutan con hostNetwork. Si las cargas de trabajo necesitan usar Kube-DNS/CoreDNS, establezca dnsPolicy en ClusterFirstWithHostNet.
Por ejemplo:
apiVersion: v1 kind: Pod metadata: name: nginx spec: hostNetwork: true dnsPolicy: ClusterFirstWithHostNet containers: - name: nginx image: nginx:alpine ports: - containerPort: 80
Archivo de configuración de DNS del contenedor:
nameserver 10.247.3.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5
- Caso del uso 4: Personalización de la configuración de DNS de la aplicación
Escenario
Puede personalizar de forma flexible el archivo de configuración de DNS para las aplicaciones. El uso de dnsPolicy y dnsConfig juntos puede abordar casi todos los escenarios, incluidos los escenarios en los que se usará un DNS local, varios DNS se conectarán en cascada y las opciones de configuración de DNS se modificarán.
Ejemplo 1: Uso de su DNS local
Establezca dnsPolicy a None para que el archivo de configuración DNS de la aplicación se genere basado en dnsConfig.
apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: "None" dnsConfig: nameservers: - 10.2.3.4 //IP address of your on-premises DNS searches: - ns1.svc.cluster.local - my.dns.search.suffix options: - name: ndots value: "2" - name: timeout value: "3"
Archivo de configuración de DNS del contenedor:
nameserver 10.2.3.4 search ns1.svc.cluster.local my.dns.search.suffix options timeout:3 ndots:2
Ejemplo 2: Modificación de la opción de ndots en el archivo de configuración de DNS para reducir las consultas de DNS no válidas
Establezca dnsPolicy en un valor distinto de None para que los parámetros de DNS configurados en dnsConfig se agreguen al archivo de configuración de DNS generado según dnsPolicy.
apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: "ClusterFirst" dnsConfig: options: - name: ndots value: "2" //Changes the ndots:5 option in the DNS configuration file generated based on the ClusterFirst policy to ndots:2.
Archivo de configuración de DNS del contenedor:
nameserver 10.247.3.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:2