Ejercicio: explore la funcionalidad de un clúster de Kubernetes

Completado

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:

  1. 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.

  1. Descargue e instale la versión más reciente de Multipass para Windows desde GitHub.

  2. 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
    
  3. 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.

  4. 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.

  1. 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
    
  2. 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
    
  3. 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.

  4. 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.

  1. 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
    
  2. 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.

  1. Ejecute el comando snap alias para asignar el alias kubectl a microk8s.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.

  1. 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 comando kubectl 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
    
  2. 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 y kube-system. Aquí puede ver las instancias de registry, kube-dns y kubernetes-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.

  1. 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
    
  2. 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
    
  3. 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.

  1. 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>
    
  2. 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.

  1. 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.

  2. 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.