Uso de NodePort en un clúster Kubernetes sobre VirtualBox

El acceso a las aplicaciones desplegadas en el clúster de Kubernetes sobre VirtualBox requiere el uso de un NodePort. En un proveedor cloud se usaría un balanceador de carga.

La mayor dificultad para utilizar Kubernetes en máquinas virtuales de VirtualBox es la configuración del entorno de red como se ha visto en el tutorial Creación de un Clúster de Kubernetes usando Vagrant y Ansible en 2 minutos.

LAN, NAT, HOST Only and Tunnel Kubernetes networks
Red de un Clúster de Kubernetes en VirtualBox

El tutorial despliega una aplicación y posteriormente crea un NodePort para publicarla fuera del clúster de Kubernetes.

Prerrequisitos:

Desplegando aplicaciones en Kubernetes

En este ejemplo publicaremos una sencilla aplicación que se ejecuta sobre el servidor web Nginx.

Cree un fichero de configuración de la aplicación que define el nombre de la aplicación, las etiquetas, número de réplicas y las imágenes Docker que se requieren. Guárdela como nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: my-echo
          image: gcr.io/google_containers/echoserver:1.8

Aplique la configuración al clúster de Kubernetes

$ kubectl apply -f nginx.yaml 
deployment.apps/nginx-deployment created

La imagen Docker, en este ejemplo Nginx, debe estar disponible en el repositorio Docker público oficial (si utiliza una imagen Docker local, antes se debe subir a un repositorio Docker público oficial o a un repositorio privado, vea Pull an Image from a Private Registry o la sección Construyendo la Aplicación Color en el tutorial Patrones Istio: Reparto de tráfico en Kubernetes (Canary Release)).

Publicar una aplicación fuera del Clúster de Kubernetes

Para acceder al servidor de echo que acabamos de desplegar desde fuera del clúster, se requiere crear un NodePort. El NodePort permitirá acceder a cada uno de los servidore de echo Nginx (en round-robin) desde fuera del clúster.

En un clúster de Kubernetes alohado en un proveedor de Cloud privado como Azure, Google o AWS, se utiliza un balanceador de carga cloud nativo en lugar de un NodePort.

Añada la siguiente definición al fichero nginx.yaml (creado antes)

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service-np
  labels:
    name: nginx-service-np
spec:
  type: NodePort
  ports:
    - port: 8082        # Cluster IP, i.e. http://10.103.75.9:8082
      targetPort: 8080  # Application port
      nodePort: 30000   # (EXTERNAL-IP VirtualBox IPs) i.e. http://192.168.50.11:30000/ http://192.168.50.12:30000/ http://192.168.50.13:30000/
      protocol: TCP
      name: http
  selector:
    app: nginx

Aplique la configuración al clúster de Kubernetes

$ kubectl apply -f nginx.yaml 
deployment.apps/nginx-deployment unchanged
service/nginx-service-np created

Compruebe que el NodePort se ha creado

$ kubectl get services
NAME               TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes         ClusterIP      10.96.0.1      <none>        443/TCP          7h55m
nginx-service-np   NodePort       10.103.75.9    <none>        8082:30000/TCP   5h43m

Acceda a la aplicación usando curl (o con un navegado web) desde el entorno de desarrollo, usando una de las IPs públicas del clúster de Kubernetes (192.168.50.11, 192.168.50.12, 192.168.50.13) y el puerto del NodePort (30000).

$ curl http://192.168.50.11:30000/
Hostname: nginx-deployment-d7b95894f-2hpjk
Pod Information:
	-no pod information available-
Server values:
	server_version=nginx: 1.13.3 - lua: 10008
Request Information:
	client_address=192.168.116.0
	method=GET
	real path=/
	query=
	request_version=1.1
	request_uri=http://192.168.50.11:8080/
Request Headers:
	accept=*/*
	host=192.168.50.11:30000
	user-agent=curl/7.61.0
Request Body:
	-no body in request-

Repita la petición y verá que el valor de Hostname ha cambiado. Kubernetes está accediendo a una instancia diferente de la aplicación entre las disponibles en los PODS. El nombre del host se corresponde al NAME de los diferentes PODS en los que ha sido desplegada la aplicación Nginx.

$ kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-d7b95894f-2hpjk   1/1     Running   1          5h44m
nginx-deployment-d7b95894f-49lrh   1/1     Running   1          5h44m
nginx-deployment-d7b95894f-wl497   1/1     Running   1          5h44m

Diagrama de un NodePort en Kubernetes

El diagrama muestra los diferentes elementos que están involucrados en la publicación de una aplicación fuera del clúster de Kubernetes usando un NodePort. El maestro de Kubernetes, no mostrado, también ejecuta un proxy.

NodePort traffic in Kubernetes Cluster

Tráfico de red al ejecutar curl http://192.168.50.12:30000/

  1. Petición para acceder a 192.168.50.12:30000 (Node 1 Port NodePort) se recibe por el router vboxnet.
  2. Se enruta a la IP externa del nodo 1 de Kubernetes al puerto 30000
  3. La petición se envía al proxy de Kubernetes
  4. El proxy de Kubernetes envía la petición a la IP del clúster 10.103.75.9 y puerto 8082 que ha sido asignada a nginx-services-np (Nginx service NodePort).
  5. El Nginx service NodePort envía la petición a uno de los PODS disponibles para la aplicación Nginx, puede ser uno de los PODS ubicados en el mismo nodo de Kubernetes o uno diferente como el K8N-N-2.
Uso de NodePort en un clúster Kubernetes sobre VirtualBox

Leave a Reply

Your email address will not be published.