Actualmente puedo resolver todos los servicios a direcciones IP y telnet y hacerles ping. No se pueden resolver pods en direcciones IP. Aunque puede buscar direcciones IP de pods con kubectl y telnet y hacerles ping. ¿Cómo necesito configurar DNS para resolver pods en Kubernetes 1.9.6, dns-controller:1.9.1?
Respuesta1
Es un poco más fácil trabajar con la respuesta de @mk_sta; puede ejecutar esta línea para probar su DNS:
kubectl run busybox --image=busybox --rm --attach --command -- sh -c "cat /etc/resolv.conf; nslookup $POD.$NAMESPACE.pod.cluster.local"
Salida de ejemplo:
If you don't see a command prompt, try pressing enter.
Server: 100.64.0.10
Address: 100.64.0.10:53
*** Can't find $POD.$NAMESPACE.pod.cluster.local: No answer
deployment.apps "busybox" deleted
La ventaja es que elimina la implementación/pods después de la ejecución.
Para mí, el problema fue que mis pods están en un conjunto con estado y, por lo tanto, la resolución DNS del pod es un poco diferente. Tienes que usar (por ejemplo):
web-{0..N-1}.nginx.default.svc.cluster.local
pod-N.$GOVERNING_STATEFULSET.$NAMESPACE.svc.cluster.local
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
Eso es algo que puede salir mal. Es posible que desee proporcionar más información sobre su caso particular.
Respuesta2
Puede crear un Pod de prueba busybox
para verificar la función de resolución de DNS y depurar el problema:
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
Verifique /etc/resolv.conf
el archivo en el busybox
Pod:
kubectl exec busybox cat /etc/resolv.conf
El contenido debería ser así:
search default.svc.cluster.local svc.cluster.local cluster.local .....
nameserver 10.0.0.10
options ndots:5
Realice una solicitud de búsqueda al Pod de destino en su clúster:
kubectl exec -ti busybox -- nslookup XXX-XX-XX-XX.default.pod.cluster.local
En caso de que no haya resuelto el nombre DNS de los Pods, puede verificar los registros de los componentes DNS con kubectl logs
el comando:
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c kubedns
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c dnsmasq
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c healthz
Respuesta3
La mejor manera que he visto de resolver esto es creando un Jump Pod.
Paso 1. Cree el pod con un archivo de especificaciones.
cat << ENDL >> jumpod.yml
apiVersion: v1
kind: Pod
metadata:
name: jumpod
namespace: default
spec:
containers:
- name: busybox
image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
ENDL
Paso 2. Aplique o cree Ether el pod en el clúster y luego en un nodo. Tenga en cuenta que estará ubicado en el espacio de nombres predeterminado.
kubectl apply -f jumpod.yml
Ahora puede usar este pod para obtener el DNS de un pod o servicio.
Por ejemplo:
Búsqueda de pods Paso 3. Obtenga la dirección IP del pod que está buscando.
kubectl get pods -o wide
Paso 4. Utilice el Jump Pod para realizar una búsqueda nslookup
kubectl exec -it jumpod ping 10.244.0.149
Servicio de búsqueda Paso 5. Busque la dirección IP de los servicios que desee utilizar.
kubectl get services --all-namespaces
Paso 6. Ahora use el módulo de salto para realizar una búsqueda en la dirección IP del servicio.
kubectl exec -it jumpod nslookup 10.245.150.103
A continuación se muestra un ejemplo de cómo el clúster principal que usa nslookup no funcionará y cómo funcionará el BusyBox (también conocido como Jump Pod).
$ kubectl exec -it jumpod nslookup 10.245.150.103
Server: 10.245.0.10
Address 1: 10.245.0.10 kube-dns.kube-system.svc.cluster.local
Name: 10.245.150.103
Address 1: 10.245.150.103 hello.develop.svc.cluster.local
$ nslookup 10.245.150.103
Server: 8.8.8.8
Address: 8.8.8.8#53
** server can't find 103.150.245.10.in-addr.arpa: NXDOMAIN
¡Espero que esto ayude!
PD: Si por casualidad necesitas exportar el archivo DNS que creaste dentro del pod, puedes usar esto.
kubectl cp default/POD_NAME:bin/FILE_NAME /Users/username/FILE_NAME
o simplemente use > para exportarlo a un archivo.