Skip to content

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.

Kubernetes Network

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

Kubernetes Network

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

Kubernetes Network

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:

  1. Crear un nuevo namespace llamado example-dns
    kubectl create ns example-dns
    
  2. Extraiga la IP del servicio Metrics Server:

    kubectl get pods -n kube-system -o wide | grep 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 -

  3. Crear un nuevo POD para hacer las comprobaciones de DNS:

    kubectl -n example-dns run pod-test-dns -it --rm --image=centos -- /bin/bash
    

  4. Revisar dentro del POD creado anteriormente la configuración de resolución de nombres
    [root@pod-test-dns /]# cat /etc/resolv.conf
    
    Deberá obtener un resultado como el siguiente:
    nameserver 10.150.0.10
    search example-dns.svc.cluster.local svc.cluster.local cluster.local comcel.com.gt
    options ndots:5
    
  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
    
  6. 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
    
  7. 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
    
  8. 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
    
  9. Puede salir del POD creado para las pruebas:
    exit
    
  10. Elimine el POD creado anteriormente:
    kubectl -n example-dns delete pod pod-test-dns --grace-period=0 --force
    
  11. 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

Kubernetes Network

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.

  1. 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
Establecer el nuevo namespace por defecto en el contexto actual:
kubectl config set-context --current --namespace=example-ingress
2. Descargar y verificar el siguiente manifiesto:
wget https://k8s.io/examples/controllers/nginx-deployment.yaml
3. Después de examinar el archivo puedesejecutar el Deployment con el siguiente comando:
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml
4. Verificar el estado del Deployment con el siguiente comando:
kubectl get deployments
La salida debe ser parecida a la siguiente:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE 
nginx-deployment   3/3     3            3           1s
5. Exponer el deployment por medio de un servicio tipo ClusterIp con el siguiente comando:
kubectl expose deployment nginx-deployment --port=80 --target-port=80
6. Además es posible exponer este ejemplo de Deployment utilizando un tipo de servicio llamado NodePort, el cual utiliza un puerto de los HOST para publicar las aplicaciones
kubectl create service nodeport nginx --tcp=30080:80 --node-port=30080 --dry-run=client -o yaml > nodeport.yaml
7. Verificar y explorar el archivo creado anteriormente:
cat nodeport.yaml
8. Luego puede crear este servicio tipo NodePort con el siguiente comando:
kubectl apply -f nodeport.yaml
9. Listar los Servicios existentes en el Namespace actual
kubectl get svc
10. Verificar la conexión al servicio tipo NodePort con el siguiente comando:
curl http://student-X-worker:30080
11. Verificar en detalle el servicio nginx-deployment creado anteriormente
kubectl describe svc nginx-deployment
12. Extraer el Wildcard Domain para las aplicaciones en el nodo Worker
# 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
13. Crear el Ingress con la información extraida del Wworker
# Reemplazar el valor de $CLUSTER_WILDCARD
kubectl create ingress example-ingress --rule="example-ingress.$CLUSTER_WILDCARD/=nginx-deployment:80"
14. Verificar el Ingress creado
kubectl get ingress
15. Abrir una nueva ventana del Navegador Web y dirigirse a la siguiente URL:
# Reemplazar el valor de $CLUSTER_WILDCARD
http://example-ingress.$CLUSTER_WILDCARD
16. Deberá mostrarse la página de bienvenida de Nginx
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.
17. Eliminar el namespace llamado example-ingress
kubectl delete ns example-ingress