Kubernetes Networking - DNS, Service e Ingress
IPs para PODs y Servicios
Todos los PODS tienen asignada una dirección IP única dentro del cluster. Esto se logra asignando a cada nodo una subred única del CIDR del CLUSTER, desde la cual se asignan direcciones IP a los pods en ese nodo.
Cada recurso tipo Service, también cuenta con una dirección IP única.
Durante la instalación y configuración inicial de un cluster de Rancher Kubernetes Engine, se definen los segmentos de red para la asignación de IPs para los PODS y para los recursos tipo Services.

Para las direcciones IP de los PODs, cada Nodo del cluster cuenta con un tamaño de subnet para asignar dichas direcciones IPs.

DNS para Services y Pods
Kubernetes crea registros DNS para servicios y pods. Los Servicios pueden accederse y consultarse con nombres DNS con un sentido, en lugar de direcciones IP.
Rancher Kubernetes Engine (RKE) implementa el software CoreDNS por defecto para proporcionar un servicio de resolución de nombres, dentro del cluster es posible ejecutar el siguiente comando para ver la disponibilidad del servicio de CoreDNS:
kubectl get pods -n kube-system | grep coredns
De forma predeterminada, CoreDNS utilizará los servidores de nombres configurados del host (que normalmente residen en /etc/resolv.conf), por defecto se crea un dominio del cluster llamado: cluster.local
Un Pod tiene la siguiente resolución de DNS:
pod-ip-address.my-namespace.pod.cluster.local.
Todos los pods expuestos por un servicio tienen la siguiente resolución de DNS disponible:
pod-ip-address.service-name.my-namespace.svc.cluster.local
Por ejemplo, si un Pod del componente metrics-server en el Namespace kube-system tiene la dirección IP 10.248.1.152 y el nombre de dominio de su clúster es cluster.local, entonces el Pod tiene los siguientes nombres de DNS:
10-248-1-152.pod.kube-system.svc.cluster.local 10-248-1-152.metrics-server.kube-system.svc.cluster.local
También se crea un registro de DNS por cada servicio creado dentro del cluster con la siguiente estructura de nombres:
metrics-server.kube-system.svc.cluster.local

Laboratorio: Resolución de nombres por medio de DNS del Clúster
Lo anterior puede comprobarse obteniendo la IP del POD y probando la resolución de nombres con la siguiente secuencia de comandos dentro de un cluster de RKE:
- Crear un nuevo namespace llamado example-dns
kubectl create ns example-dns -
Extraiga la IP del servicio Metrics Server:
Guarde la IP obtenida del Pod, ya que será utilizada posteriormente, suponiendo que la IP obtenida es 10.42.1.14, usted la utilizará para resolución de nombres de la siguiente manera: 10-42-1-14, reemplazando los . por -kubectl get pods -n kube-system -o wide | grep metrics-server -
Crear un nuevo POD para hacer las comprobaciones de DNS:
kubectl -n example-dns run pod-test-dns -it --rm --image=centos -- /bin/bash - Revisar dentro del POD creado anteriormente la configuración de resolución de nombres
Deberá obtener un resultado como el siguiente:
[root@pod-test-dns /]# cat /etc/resolv.confnameserver 10.150.0.10 search example-dns.svc.cluster.local svc.cluster.local cluster.local comcel.com.gt options ndots:5 - Ejecute el siguiente comando para comprobar la resolución de nombres de un POD dentro del Namespace kube-system:
ping 10-42-1-14.kube-system.pod.cluster.local - Ejecute el siguiente comando para comprobar la resolución de nombres de un POD expuesto por un Servicio dentro del Namespace kube-system:
ping 10-42-1-14.metrics-server.kube-system.svc.cluster.local - Abra una nueva terminal con acceso al cluster, y ejecute el siguiente comando para verificar los servicios dentro del Namespace kube-system:
kubectl get svc -n kube-system - Ejecute el siguiente comando para comprobar la resolución de nombres de un Servicio dentro del Namespace kube-system:
ping metrics-server.kube-system.svc.cluster.local - Puede salir del POD creado para las pruebas:
exit - Elimine el POD creado anteriormente:
kubectl -n example-dns delete pod pod-test-dns --grace-period=0 --force - Elimine el Namespace creado para realizar las validaciones de DNS:
kubectl delete ns example-dns
Kubernetes Ingress y Kubernetes Servicios
Los servicios son los recursos que nos proporciona Kubernetes para conectar diferentes elementos de un Cluster entre ellos y con el exterior.
Un servicio en Kubernetes es un recurso creado con el fin de mantener un único punto constante de acceso a un grupo de pods. Cada servicio tiene una dirección IP y un puerto que nunca cambian.
Todos los servicios de Kubernetes tienen la capacidad de proporcionar acceso a un Cluster desde el exterior, pero cada uno lo hace de una manera diferente.
En Kubernetes existen los siguientes tipos de Servicios:
- ClusterIP
- NodePort
- LoadBalancer
Un Ingress se usa para exponer rutas HTTP y HTTPS desde el exterior a servicios dentro del Cluster. El tráfico entrante es controlado por las reglas que definimos en un archivo de configuración.
Los Ingreess operan en la séptima capa de red (http) y pueden proveer funcionalidades adicionales a los Servicios.
Este recurso funciona de un modo diferente a los Servicios. Cuando creamos un ClusterIP o un NodePort basta con crear un objeto Kubernetes de ese tipo de servicio y aplicarlo al Cluster. Pero antes de poder usar Ingress necesitamos de algo llamado “Controlador”.
Un controlador de Ingress es un Pod o conjunto de Pods que se ejecutan en nuestro Cluster y cuya función es asegurarse de que el tráfico entrante se administra del modo que nosotros hayamos especificado.
En RKE se instala un Ingress Controller por defecto: NGINX Ingress Controller

Laboratorio: Kubernetes Ingress y Servicios
La presenta guía muestra como habilitar el ingreso por parte de usuarios finales a una aplicación desplegada dentro de un cluster de Kubernetes.
- Ingrese al CLI del sistema operativo del servidor usado como Bastion con el usuario y la contraseña proporcionados.
Ingresar al cluster de Kubernetes cluster-users con sus respectivas credenciales
Crear un nuevo namespace llamado example-ingress
kubectl create ns example-ingress
kubectl config set-context --current --namespace=example-ingress
wget https://k8s.io/examples/controllers/nginx-deployment.yaml
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml
kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 1s
kubectl expose deployment nginx-deployment --port=80 --target-port=80
kubectl create service nodeport nginx --tcp=30080:80 --node-port=30080 --dry-run=client -o yaml > nodeport.yaml
cat nodeport.yaml
kubectl apply -f nodeport.yaml
kubectl get svc
curl http://student-X-worker:30080
kubectl describe svc nginx-deployment
# Ingresar al Nodo Worker
ssh student-X-worker -i student-X-private_key.pem
# Establecer el Wildcard Domain:
CLUSTER_WILDCARD=$(curl http://showip.net|tr '.' '-').nip.io
# Copiar la URL resultado del siguiente comando:
echo http://example-ingress.$CLUSTER_WILDCARD
# Salir del servidor Worker
exit
# Reemplazar el valor de $CLUSTER_WILDCARD
kubectl create ingress example-ingress --rule="example-ingress.$CLUSTER_WILDCARD/=nginx-deployment:80"
kubectl get ingress
# Reemplazar el valor de $CLUSTER_WILDCARD
http://example-ingress.$CLUSTER_WILDCARD
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.
kubectl delete ns example-ingress