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.

El tutorial despliega una aplicación y posteriormente crea un NodePort para publicarla fuera del clúster de Kubernetes.
Prerrequisitos:
- Creación de un Clúster de Kubernetes usando Vagrant y Ansible en 2 minutos.
- First Steps After Kubernetes Installation.
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.

Tráfico de red al ejecutar curl http://192.168.50.12:30000/
- Petición para acceder a 192.168.50.12:30000 (Node 1 Port NodePort) se recibe por el router vboxnet.
- Se enruta a la IP externa del nodo 1 de Kubernetes al puerto 30000
- La petición se envía al proxy de Kubernetes
- 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).
- 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.