Este dilema se puede resolver de diversas formas, por lo tanto te mostramos la que en nuestra opinión es la solución más completa.
Solución:
Debe configurarse en el servidor DNS.
Ya sea kube-dns o coredns (preferido en las versiones más nuevas de K8)
kube-dns: es una opción cli --domain
core-dns: puede configurar el K8s ConfigMap
Y ves aquí:
El kubelet pasa DNS a cada contenedor con el indicador –cluster-dns=.
Si desea saber cómo se resuelve un pod cluster.local
lo hace a través de la /etc/resolv.conf
que el kubelet se monta en cada pod. El contenido es algo como esto:
$ cat /etc/resolv.conf
nameserver 10.96.0.10
search .svc.cluster.local svc.cluster.local cluster.local
options ndots:5
10.96.0.10
es tuyo coredns
o kube-dns
dirección IP del clúster.
Ejecutar una consulta de DNS contra el servicio kubernetes.predeterminado es una posible solución. Aquí hay un ejemplo de una sola línea en shell:
kubectl run -it --image=ubuntu --restart=Never shell --
sh -c 'apt-get update > /dev/null && apt-get install -y dnsutils > /dev/null &&
nslookup kubernetes.default | grep Name | sed "s/Name:skubernetes.default//"'
Esto devolverá como última línea:
.svc.cluster.local
Sin embargo, creo que sería más robusto implementar este algoritmo en un lenguaje de programación como go que tiene un buen cliente DNS implementado en neto biblioteca, aquí hay un ejemplo que puede ejecutar en un pod:
package main
import (
"fmt"
"net"
"strings"
)
// GetClusterDomain returns Kubernetes cluster domain, default to "cluster.local"
func getClusterDomain() string
apiSvc := "kubernetes.default.svc"
cname, err := net.LookupCNAME(apiSvc)
if err != nil
defaultClusterDomain := "cluster.local"
return defaultClusterDomain
clusterDomain = strings.TrimPrefix(cname, apiSvc)
clusterDomain = strings.TrimSuffix(clusterDomain, ".")
return clusterDomain
func main()
fmt.Println(getClusterDomain())
Sección de Reseñas y Valoraciones
Si te mola el asunto, tienes la habilidad dejar una reseña acerca de qué te ha impresionado de esta división.