Usando kubectl para crear un Deployment

Objetivos

Deployments Kubernetes

Una vez que tenemos el cluster de Kubernetes funcionando, podemos desplegar aplicaciones "conteinerizadas" en él. Para hacerlo, se utiliza un Deployment de Kubernetes. El Deployment le indica a Kubernetes cómo crear y actualizar instancias de tu aplicación. Una vez que hayas creado un Deployment, el control plane de Kubernetes planifica las instancias de la aplicación incluidas en ese Deployment para que se ejecuten en nodos individuales del clúster.

Una vez creadas las instancias de la aplicación, un controlador de despliegue de Kubernetes monitorea continuamente esas instancias. Si el nodo que aloja una instancia se apaga o se elimina, el controlador de despliegue reemplaza la instancia con una instancia en otro nodo del clúster. Esto proporciona un mecanismo de autocuración para abordar el fallo o mantenimiento programado de un equipo.

En un mundo pre-orquestación, a menudo se usaban scripts de instalación para iniciar aplicaciones, pero no permitían la recuperación ante fallos de equipos. Al crear sus instancias de aplicación y mantenerlas en ejecución en nodos, los despliegues de Kubernetes proporcionan un enfoque fundamentalmente diferente para la gestión de aplicaciones.

Desplegando tu primera aplicación en Kubernetes

Puedes crear y administrar un Deployment usando la interfaz de línea de comandos de Kubernetes, kubectl. Kubectl usa la API de Kubernetes para interactuar con el clúster. En este módulo, aprenderás los comandos Kubectl más comunes necesarios para crear Deployments que ejecutan tus aplicaciones en un clúster de Kubernetes.

Cuando creas un Deployment, deberás especificar la imagen del contenedor para tu aplicación y el número de réplicas que deseas ejecutar. Puedes cambiar esa información más tarde actualizando tu Deployment; Los módulos 5 y 6 del bootcamp discuten cómo puedes escalar y actualizar tus Deployments.

Las aplicaciones deben estar empaquetadas en uno de los formatos de contenedor admitidos para poder desplegarse en Kubernetes

Para su primer Deployment, usará una aplicación hello-node empaquetada en un contenedor Docker que usa NGINX para devolver todas las solicitudes. (Si aún no ha intentado crear una aplicación hello-node e implementarla usando un contenedor, puede hacerlo primero siguiendo las instrucciones del tutorial Hello Minikube).

Necesitará además tener instalado kubectl. Si necesita instalarlo, visite Preparar Entorno.

Ahora que sabe qué son los Despliegues, ¡despleguemos nuestra primera aplicación!

Fundamentos de kubectl

El formato normal de un comando kubectl es:

kubectl acción recurso

Esto realiza la acción especificada (como crear, describir o eliminar) sobre el recurso especificado (como nodo o deployment). Puedes usar --help después del subcomando para obtener información adicional sobre los parámetros posibles (por ejemplo: kubectl get nodes --help).

Chequear que kubectl está configurado para comunicarse con tu cluster, ejecutando el comando:

kubectl version

Esto verifica que kubectl está instalado y puedes ver tanto la versión del cliente (kubectl) como la del cluster kubernetes.

Como vimos en la parte de preparar el entorno, para ver los nodos del cluster debemos ejecutar el comando:

kubectl get nodes

Verás los nodos disponibles. Más adelante, Kubernetes elegirá dónde desplegar nuestra aplicación en función de los recursos disponibles de cada nodo.

Desplegar una aplicación

Depleguemos nuestra primera aplicación en Kubernetes con el comando kubectl create deployment. Necesitamos proporcionar el nombre del Deployment y la ubicación de la imagen de la aplicación (incluya la url completa del repositorio para las imágenes alojadas fuera de Docker Hub).

kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

Excelente! Acabas de desplegar tu primera aplicación creando un Deployment.

Esto realizó algunas cosas para ti:

Para listar tus Deployments, usa el comando:

kubectl get deployments

Podemos ver que hay un Deployment en ejecución con una sola instancia de nuestra aplicación. La instancia se está ejecutando dentro de un contenedor en uno de nuestros nodos.

Ver la aplicación

Los Pods que están en ejecución dentro de Kubernetes se ejecutan en una red privada y aislada. De forma predeterminada, son visibles desde otros Pods y Services dentro del mismo clúster Kubernetes, pero no fuera de esa red. Cuando usamos kubectl, estamos interactuando a través de un endpoint API para comunicarnos con nuestra aplicación.

Veremos otras maneras de exponer tu aplicación fuera del cluster de kubernetes en el Módulo 4.

El comando kubectl puede crear un proxy que reenviará las comunicaciones a la red privada de todo el clúster. El proxy se puede terminar presionando control-C y no mostrará ninguna salida mientras se esté ejecutando.

Debemos abrir una segunda ventana de terminal para ejecutar el proxy y en ella ejecutar el comando:

kubectl proxy

Ahora tenemos una conexión entre nuestro host (la terminal) y el clúster Kubernetes. El proxy permite el acceso directo a la API desde estas terminales.

Podemos ver todas esas API a través del endpoint del proxy. Por ejemplo, podemos consultar la versión del cluster directamente a través de la API usando el comando curl:

curl http://localhost:8001/version

Nota: Si el puerto 8001 no es accesible, asegúrese de que el proxy kubectl que inició anteriormente se esté ejecutando en la segunda terminal.

El API server creará automáticamente un endpoint para cada pod, basado en el nombre del pod, que también es accesible a través del proxy.

Primero necesitamos obtener el nombre del Pod, y lo almacenaremos en la variable de entorno POD_NAME:

export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')

echo "Nombre del Pod: $POD_NAME"

Podemos acceder al Pod a través del proxy, ejecutando:

curl "http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/"

Para que el nuevo Deployments sea accesible sin usar el proxy, se requiere un Service que se explicará en los próximos módulos.

Una vez que haya terminado con esta parte del tutorial, pase a Ver Pods y Nodos.