Ejercicio: explore la funcionalidad de un clúster de Kubernetes
Hay varias opciones disponibles al ejecutar Kubernetes localmente. Puede instalar Kubernetes en máquinas físicas o virtuales, o bien usar una solución basada en la nube, como Azure Kubernetes Service (AKS).
Con todo, el objetivo de este ejercicio es explorar una instalación de Kubernetes con un clúster de un solo nodo. En este ejercicio, aprenderá a configurar e instalar un entorno de MicroK8s que sea fácil de configurar y anular. A continuación, implementará un servicio de Kubernetes y escalará horizontalmente a varias instancias para hospedar un sitio web.
Nota:
Este ejercicio es opcional e incluye pasos que explican cómo eliminar y desinstalar el software y los recursos que se usarán en él.
Tenga en cuenta que hay otras opciones, como MiniKube y la compatibilidad de Kubernetes en Docker, para hacer lo mismo.
¿Qué es MicroK8s?
MicroK8s es una opción para implementar un clúster de Kubernetes de un solo nodo como un único paquete para las estaciones de trabajo de destino y los dispositivos de Internet de las cosas (IoT). Canonical, el creador de Ubuntu Linux, desarrolló originalmente MicroK8s y lo sigue manteniendo.
MicroK8s se puede instalar en Linux, Windows y macOS, aunque las instrucciones de instalación son ligeramente diferentes en cada sistema operativo. Elija la opción que mejor se adapte a su entorno.
Instalación de MicroK8s en Linux
La instalación de MicroK8s en Linux es la opción de instalación con el menor número de pasos. Cambie a una ventana de terminal y ejecute los comandos de las siguientes instrucciones:
Instale la aplicación de ajuste de MicroK8s. Este paso puede tardar unos minutos en completarse, en función de la velocidad de la conexión a Internet y del escritorio.
sudo snap install microk8s --classic
Tras instalarse correctamente, aparece el siguiente mensaje.
2020-03-16T12:50:59+02:00 INFO Waiting for restart... microk8s v1.17.3 from Canonical✓ installed
Ya estamos preparados para instalar complementos en el clúster.
Instalación de MicroK8s en Windows
Para ejecutar MicroK8s en Windows, use Multipass. Multipass es un administrador de máquinas virtuales ligero para Linux, Windows y macOS.
Descargue e instale la versión más reciente de Multipass para Windows desde GitHub.
En una consola de comandos, ejecute el comando de inicio de Multipass para configurar y ejecutar la imagen de la máquina virtual de MicroK8s. Este paso puede tardar unos minutos en completarse, en función de la velocidad de la conexión a Internet y del escritorio.
multipass launch --name microk8s-vm --memory 4G --disk 40G
Una vez que reciba la confirmación de inicio de microk8s-vm, ejecute el comando
multipass shell microk8s-vm
para acceder a la instancia de máquina virtual.multipass shell microk8s-vm
Una vez que multipass funcione, se puede acceder a la máquina virtual Ubuntu para hospedar el clúster e instalar MicroK8s.
Instale la aplicación de ajuste de MicroK8s. Este paso puede tardar unos minutos en completarse, en función de la velocidad de la conexión a Internet y del escritorio.
sudo snap install microk8s --classic
Tras instalarse correctamente, aparece el siguiente mensaje:
2020-03-16T12:50:59+02:00 INFO Waiting for restart... microk8s v1.17.3 from Canonical✓ installed
Ya estamos preparados para instalar complementos en el clúster.
Instalación de MicroK8s en macOS
Para ejecutar MicroK8s en macOS, use Multipass. Multipass es un administrador de máquinas virtuales ligero para Linux, Windows y macOS.
Tiene dos opciones para instalar Multipass en macOS. Descargue e instale la versión más reciente de Multipass para macOS desde GitHub o bien use Homebrew para instalar Multipass con el comando
brew cask install multipass
.brew install --cask multipass
En una consola de comandos, ejecute el comando de inicio de Multipass para configurar y ejecutar la imagen de la máquina virtual de MicroK8s. Este paso puede tardar unos minutos en completarse, en función de la velocidad de la conexión a Internet y del escritorio.
multipass launch --name microk8s-vm --memory 4G --disk 40G
Una vez que reciba la confirmación de inicio de microk8s-vm, ejecute el comando
multipass shell microk8s-vm
para entrar en la instancia de máquina virtual.multipass shell microk8s-vm
Llegado este punto, se puede acceder a la máquina virtual de Ubuntu para hospedar el clúster. Todavía tiene que instalar MicroK8s. Siga estos pasos.
Instale la aplicación de ajuste de MicroK8s. Este paso puede tardar unos minutos en completarse, en función de la velocidad de la conexión a Internet y del escritorio.
sudo snap install microk8s --classic
Tras instalarse correctamente, aparece el siguiente mensaje:
2020-03-16T12:50:59+02:00 INFO Waiting for restart... microk8s v1.17.3 from Canonical✓ installed
Ya estamos preparados para instalar complementos en el clúster.
Preparación del clúster
Para ver el estado de los complementos instalados en el clúster, ejecute el comando status
de MicroK8s. Estos complementos prestan varios servicios, algunos de los cuales ya hemos abordado. Un ejemplo es la funcionalidad DNS.
Para comprobar el estado de la instalación, ejecute el comando
microk8s.status --wait-ready
.sudo microk8s.status --wait-ready
Observe que hay varios complementos deshabilitados en el clúster. No se preocupe por los complementos que no reconozca.
microk8s is running addons: cilium: disabled dashboard: disabled dns: disabled fluentd: disabled gpu: disabled helm3: disabled helm: disabled ingress: disabled istio: disabled jaeger: disabled juju: disabled knative: disabled kubeflow: disabled linkerd: disabled metallb: disabled metrics-server: disabled prometheus: disabled rbac: disabled registry: disabled storage: disabled
En la lista, se deben habilitar los complementos de DNS, Panel y Registro. Estos son los propósitos de cada complemento:
Complementos Propósito DNS Implementa el servicio de coreDNS
.Panel Implementa el servicio de kubernetes-dashboard
y otros servicios que admiten su funcionalidad. Se trata de una interfaz de usuario basada en web de uso general para clústeres de Kubernetes.Registro Implementa un registro privado y varios servicios que admiten su funcionalidad. Para almacenar contenedores privados, use este registro. Para instalar los complementos, ejecute el siguiente comando.
sudo microk8s.enable dns dashboard registry
Ahora ya está preparado para acceder al clúster con kubectl
.
Exploración del clúster de Kubernetes
MicroK8s proporciona una versión de kubectl
que se puede usar para interactuar con el nuevo clúster de Kubernetes. Esta copia de kubectl
permite tener una instalación paralela de otra instancia de kubectl
que funcione en todo el sistema sin afectar a su funcionalidad.
Ejecute el comando
snap alias
para asignar el aliaskubectl
amicrok8s.kubectl
. Este paso simplifica el uso.sudo snap alias microk8s.kubectl kubectl
Cuando el comando se completa correctamente, aparece la siguiente salida:
Added: - microk8s.kubectl as kubectl
Visualización de información del nodo de clúster
Como ya hemos dicho anteriormente, un clúster de Kubernetes se crea a partir de planes de control y nodos de trabajo. Vamos a explorar el clúster nuevo para ver qué hay instalado.
Compruebe los nodos que se están ejecutando en el clúster.
Sabemos que MicroK8s es una instalación de clúster de un solo nodo y, por tanto, esperamos ver un único nodo. Tenga en cuenta que este nodo es el plano de control y, a la vez, un nodo de trabajo del clúster. Confirme esta configuración ejecutando el comando
kubectl get nodes
. Para recuperar información sobre todos los recursos del clúster, ejecute el comandokubectl get
:sudo kubectl get nodes
El resultado es similar al del siguiente ejemplo, en el que se ve que solo hay un nodo en el clúster con el nombre
microk8s-vm
. Observe que el estado del nodo es Preparado. El estado Preparado indica que el plano de control puede programar cargas de trabajo en este nodo.NAME STATUS ROLES AGE VERSION microk8s-vm Ready <none> 35m v1.17.3
Puede obtener más información sobre el recurso específico solicitado. Por ejemplo, supongamos que debemos encontrar la dirección IP del nodo. Para capturar información adicional del servidor de API, ejecute el parámetro
-o wide
:sudo kubectl get nodes -o wide
El resultado es similar al ejemplo siguiente. Fíjese en que ahora se puede ver la dirección IP interna del nodo, el sistema operativo que se ejecuta en el nodo, la versión del kernel y el entorno de ejecución del contenedor.
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME microk8s-vm Ready <none> 36m v1.17.3 192.168.56.132 <none> Ubuntu 18.04.4 LTS 4.15.0-88-generic containerd://1.2.5
El paso siguiente es explorar los servicios que se ejecutan en el clúster. Al igual que con los nodos, para buscar información sobre los servicios que se ejecutan en el clúster, ejecute el comando
kubectl get
.sudo kubectl get services -o wide
El resultado es similar al ejemplo siguiente, pero observe que solo aparece un servicio. Antes instaló complementos en el clúster, por lo que es de esperar que también aparezcan estos servicios.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 37m <none>
El motivo de la lista de servicios únicos es que Kubernetes usa un concepto denominado espacios de nombres para dividir lógicamente un clúster en varios clústeres virtuales.
Para capturar todos los servicios de todos los espacios de nombres, pase el parámetro
--all-namespaces
:sudo kubectl get services -o wide --all-namespaces
El resultado es similar al ejemplo siguiente. Observe que hay tres espacios de nombres en el clúster. Son el espacio de nombres predeterminado y los espacios de nombres
container-registry
ykube-system
. Aquí puede ver las instancias deregistry
,kube-dns
ykubernetes-dashboard
que se han instalado. También hay servicios de soporte que se han instalado junto con algunos de los complementos.NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR container-registry registry NodePort 10.152.183.36 <none> 5000:32000/TCP 28m app=registry default kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 37m <none> kube-system dashboard-metrics-scraper ClusterIP 10.152.183.130 <none> 8000/TCP 28m k8s-app=dashboard-metrics-scraper kube-system heapster ClusterIP 10.152.183.115 <none> 80/TCP 28m k8s-app=heapster kube-system kube-dns ClusterIP 10.152.183.10 <none> 53/UDP,53/TCP,9153/TCP 28m k8s-app=kube-dns kube-system kubernetes-dashboard ClusterIP 10.152.183.132 <none> 443/TCP 28m k8s-app=kubernetes-dashboard kube-system monitoring-grafana ClusterIP 10.152.183.88 <none> 80/TCP 28m k8s-app=influxGrafana kube-system monitoring-influxdb ClusterIP 10.152.183.232 <none> 8083/TCP,8086/TCP 28m k8s-app=influxGrafana
Ahora que se muestran los servicios que se ejecutan en el clúster, puede programar una carga de trabajo en el nodo de trabajo.
Instalación de un servidor web en un clúster
Queremos programar un servidor web en el clúster para proporcionar un sitio web a los clientes. Podemos elegir entre varias opciones. En este ejemplo, se usa NGINX.
Como ya hemos comentado anteriormente, podemos usar archivos de manifiesto de pod para describir los pods, los conjuntos de réplicas y las implementaciones para definir cargas de trabajo. Como no se han tratado estos archivos en detalle, se ejecuta kubectl
para pasar la información directamente al servidor de la API.
Aunque el uso de kubectl
es práctico, usar archivos de manifiesto es el procedimiento más recomendado. Los archivos de manifiesto permiten poner al día o revertir fácilmente las implementaciones en el clúster. Estos archivos también ayudan a documentar la configuración de un clúster.
Para crear la implementación de NGINX, ejecute el comando
kubectl create deployment
. Especifique el nombre de la implementación y la imagen del contenedor para crear una instancia única del pod.sudo kubectl create deployment nginx --image=nginx
El resultado es similar a la salida siguiente:
deployment.apps/nginx created
Para capturar la información sobre la implementación, ejecute
kubectl get deployments
:sudo kubectl get deployments
El resultado es similar al ejemplo siguiente. Observe que el nombre de la implementación coincide con el nombre que le asignó y que hay disponible una implementación con este nombre cuyo estado es Preparado.
NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 18s
La implementación ha creado un pod. Para capturar información sobre los pods del clúster, ejecute el comando
kubectl get pods
:sudo kubectl get pods
El resultado es similar al ejemplo siguiente. Observe que el nombre del pod es un valor generado precedido por el nombre de la implementación y, asimismo, que el pod tiene el estado En ejecución.
NAME READY STATUS RESTARTS AGE nginx-86c57db685-dj6lz 1/1 Running 0 33s
Prueba de la instalación del sitio web
Para probar la instalación de NGINX, conéctese al servidor web usando la dirección IP del pod.
Para buscar la dirección del pod, pase el parámetro
-o wide
:sudo kubectl get pods -o wide
El resultado es similar al ejemplo siguiente. Observe que el comando devuelve tanto la dirección IP del nodo como el nombre del nodo en el que está programada la carga de trabajo.
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-86c57db685-dj6lz 1/1 Running 0 4m17s 10.1.83.10 microk8s-vm <none> <none>
Para acceder al sitio web, ejecute
wget
en la dirección IP que apareció antes:wget <POD_IP>
El resultado es similar a la salida siguiente:
--2020-03-16 13:34:17-- http://10.1.83.10/ Connecting to 10.1.83.10:80... connected. HTTP request sent, awaiting response... 200 OK Length: 612 [text/html] Saving to: 'index.html' index.html 100%[==============================================================================================>] 612 --.-KB/s in 0s 2020-03-16 13:34:17 (150 MB/s) - 'index.html' saved [612/612]
Escalado de una implementación de servidor web en un clúster
Supongamos que aumenta repentinamente el número de usuarios que acceden al sitio web y que este comienza a generar errores debido a la carga. Puede implementar más instancias del sitio en el clúster y dividir la carga entre las instancias.
Para escalar el número de réplicas de la implementación, ejecute el comando kubectl scale
. Hay que especificar el número de réplicas que son necesarias y el nombre de la implementación.
Para escalar el total de pods de NGINX a tres, ejecute el comando
kubectl scale
:sudo kubectl scale --replicas=3 deployments/nginx
El resultado es similar a la salida siguiente:
deployment.apps/nginx scaled
El comando scale permite escalar o reducir verticalmente el recuento de instancias.
Para comprobar el número de pods en ejecución, ejecute el comando
kubectl get
y vuelva a pasar el parámetro-o wide
:sudo kubectl get pods -o wide
El resultado es similar al ejemplo siguiente. Observe que ahora aparecen tres pods en ejecución, cada uno con su dirección IP única.
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-86c57db685-dj6lz 1/1 Running 0 7m57s 10.1.83.10 microk8s-vm <none> <none> nginx-86c57db685-lzrwp 1/1 Running 0 9s 10.1.83.12 microk8s-vm <none> <none> nginx-86c57db685-m7vdd 1/1 Running 0 9s 10.1.83.11 microk8s-vm <none> <none> ubuntu@microk8s-vm:~$
Tendría que aplicar varias configuraciones más al clúster para exponer eficazmente el sitio web como un sitio web de acceso público. por ejemplo, instalar un equilibrador de carga y asignar direcciones IP de nodo. Este tipo de configuraciones son aspectos avanzados que exploraremos más adelante. Hay instrucciones en el resumen por si decidiera desinstalar y limpiar la máquina virtual.