Cómo configurar Kubernetes DNS
Crea un Pod simple para usarlo como entorno de prueba
Crea un archivo llamado Busybox.yaml con el siguiente contenido:
busybox.yaml?
p>apiVersion: v1
tipo: Pod
metadatos:
nombre: ocupadobox
espacio de nombres: predeterminado p >
especificación:
contenedores:
- nombre: ocupadobox
imagen: ocupadobox
comando:
- dormir
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Siempre
Luego crea un pod usando este archivo y verificar su estado:
$ kubectl create -f busybox.yaml
pod "busybox" creado
$ kubectl get pods togetherbox
NOMBRE ?LISTO ESTADO REINICIA ? EDAD
busybox ? 1/1 ? En ejecución ?lt;some-timegt;
Una vez que el pod se está ejecutando, puede realizar nslookup en el ambiente . Si ve algo como lo siguiente, DNS está funcionando bien.
$ kubectl exec -ti ocupadobox -- nslookup kubernetes.default
Servidor: 10.0.0.10
Dirección 1: 10.0.0.10
Nombre: ?kubernetes.default
Dirección 1: 10.0.0.1
Si el comando nslookup falla, verifique lo siguiente:
Primero verifique la configuración DNS local
Eche un vistazo al archivo resolv.conf.
(Para obtener más información, consulte Herencia de DNS de nodos y problemas conocidos a continuación)
$ kubectl exec busybox cat /etc/resolv.conf
Verifique que las rutas de búsqueda y los servidores de nombres estén configurados de la siguiente manera (tenga en cuenta que las rutas de búsqueda pueden variar entre diferentes proveedores de nube):
buscar default.svc.cluster.local svc.cluster.local cluster.local google.internal c .gce_project_id.internal
nameserver 10.0.0.10
opciones ndots: 5
Los siguientes errores indican un problema con el complemento kube-dns o servicios relacionados:
$ kubectl exec -ti ocupadobox -- nslookup kubernetes.default
Servidor: 10.0.0.10
Dirección 1: 10.0.0.10
nslookup: no se puede resolver 'kubernetes .default'
o
$ kubectl exec -ti ocupadobox -- nslookup kubernetes.default
Servidor: 10.0.0.10 p>
Dirección 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local
nslookup: no se puede resolver 'kubernetes.default'
Compruebe si el pod DNS se está ejecutando
Utilice el comando kubectl get pods para verificar si el pod DNS se está ejecutando.
$ kubectl get pods --namespace=kube-system -l k8s-app=kube-dns
NOMBRE LISTO ESTADO REINICIA EDAD
...
kube-dns-v19-ezo1y ?3/3 ? Ejecutando ? 0 ?
Si ve que no hay pods en ejecución o el pod ha fallado o se ha completado, entonces en su En el entorno actual, es posible que el complemento DNS no esté implementado de forma predeterminada y tendrá que implementarlo manualmente.
Compruebe si hay errores en el pod DNS
Utilice el comando kubectl logs para ver los registros del demonio DNS.
$ registros de kubectl --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o nombre) -c kubedns
$ registros de kubectl --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o nombre) -c dnsmasq
$ registros de kubectl --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c sidecar
Vea si hay registros sospechosos. Las letras 'W', 'E', 'F' representan advertencias, errores y fallas. Busque entradas con estos niveles de registro y utilice "problemas de Kubernetes" para informar errores inesperados.
¿Está activo el servicio DNS?
Verifique que el servicio DNS esté iniciado utilizando el comando kubectl get service.
$ kubectl get svc --namespace=kube-system
NOMBRE ?CLUSTER-IP EXTERNAL-IP ? PUERTO(S) EDAD
...
kube-dns ?10.0.0.10 ?lt; nonegt; 53/UDP, 53/TCP 1h
...
Si ya has creado el servicio , o debería crearse de forma predeterminada pero no aparece, consulte "Servicios de depuración" para obtener más información.
¿Están expuestos los puntos finales DNS?
Puedes verificar si los puntos finales DNS están expuestos usando el comando kubectl get endpoints.
$ kubectl obtiene ep kube-dns --namespace=kube-system
NOMBRE ¿PUNTOS FINALES? EDAD
kube-dns ? 10.180.3.17:53 1h
Si no ve los puntos finales, consulte la sección Puntos finales en la documentación del servicio de depuración.
Para otros ejemplos de DNS de Kubernetes, consulte el ejemplo de ?cluster-dns en el repositorio de Kubernetes GitHub.
Problemas conocidos
Las instalaciones de Kubernetes no configuran el archivo resolv.conf del nodo para usar el DNS del clúster de forma predeterminada, ya que este proceso es específico de la distribución. Esto puede suceder eventualmente.
La libc de Linux no puede eludir (ver este error de 2005) la limitación de sólo 3 registros de servidor de nombres DNS y 6 registros de búsqueda de DNS. Kubernetes requiere 1 registro de servidor de nombres y 3 registros de búsqueda.
Esto significa que si la instalación local ya utiliza 3 servidores de nombres o utiliza más de 3 búsquedas, algunas de estas configuraciones se perderán. Como solución parcial, el nodo puede ejecutar dnsmasq, lo que proporcionará más entradas de servidor de nombres, pero no más entradas de búsqueda. También puedes usar el indicador kubelet?--resolv-conf?
Si está utilizando Alpine 3.3 o una versión anterior como imagen base, es posible que DNS no funcione correctamente debido a algunos problemas conocidos con Alpine.
resolución DNS de depuración de Kubernetes