Cómo implementar el equilibrio de carga de Nginx en un clúster de Kubernetes en Ubuntu 18.04 LTS

Kubernetes es un sistema de orquestación de contenedores gratuito y de código abierto que puede utilizarse para desplegar y gestionar contenedores. Fue desarrollado por Google y diseñado especialmente para el autoescalado y los despliegues automatizados. Kubernetes puede ejecutarse en cualquier infraestructura en la nube y en metal desnudo. Kubernetes te permite distribuir múltiples aplicaciones en un clúster de nodos. Kubernetes viene con un rico conjunto de características que incluyen la autocuración, la autoescalabilidad, el equilibrio de carga, la ejecución por lotes, el escalado horizontal, el descubrimiento de servicios, la orquestación del almacenamiento y muchas más.

En este tutorial, aprenderemos a configurar el equilibrio de carga de Nginx con Kubernetes en Ubuntu 18.04.

Requisitos

  • Dos servidores con Ubuntu 18.04 instalado.
  • Mínimo 2 GB de RAM instalados en cada servidor.
  • Una contraseña de root configurada en ambos servidores.

Cómo empezar

En primer lugar, tendrás que actualizar ambos servidores con la última versión estable. Puedes actualizarlos ejecutando el siguiente comando:

apt-get update -y
apt-get upgrade -y

Una vez actualizados ambos servidores, reinícialos para aplicar todos los cambios.

Por defecto, Kuberenetes no soporta la memoria swap y no funcionará si ésta está activa. Por tanto, deberás desactivar la memoria swap en ambos servidores.

Para desactivar la memoria de intercambio temporalmente ejecuta el siguiente comando:

swapoff -a

Para desactivar la memoria de intercambio permanentemente abre el archivo /etc/fstab:

nano /etc/fstab

Comenta la última línea:

# /etc/fstab: static file system information.
#
# use 'blkid' to print the universally unique identifier for a
# device; this may be used with uuid= as a more robust way to name devices
# that works even if disks are added and removed. see fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
# swap was on /dev/sda4 during installation #UUID=65se21r-1d3t-3263-2198-e564c275e156 none swap sw 0 0

Guarda y cierra el archivo. A continuación, ejecuta el siguiente comando para aplicar los cambios de configuración:

mount -a

A continuación, tendrás que configurar la resolución de nombres de host en ambos servidores. Así, cada servidor podrá comunicarse con el otro utilizando el nombre de host.

Para ello, abre el archivo /etc/hosts con tu editor preferido:

nano /etc/hosts

Añade las siguientes líneas:

192.168.0.103 master
192.168.0.100 slave

Guarda y cierra el archivo, cuando hayas terminado. A continuación, pasa al siguiente paso.

Instalar Docker y Kubernetes

A continuación, tendrás que instalar la herramienta Docker y Kubernetes kubelet, kubeadm y kubectl en ambos servidores.

Primero, instala los paquetes necesarios y añade la clave GPG con el siguiente comando:

apt-get install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

A continuación, añade el repositorio de Docker CE en ambos servidores ejecutando el siguiente comando:

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

A continuación, actualiza el repositorio e instala Docker CE con el siguiente comando:

apt-get update -y
apt-get install docker-ce -y

Una vez completada la instalación, comprueba el estado de Docker CE con el siguiente comando:

systemctl status docker

Deberías ver la siguiente salida:

? docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-07-19 07:05:50 UTC; 1h 24min ago
     Docs: https://docs.docker.com
 Main PID: 3619 (dockerd)
    Tasks: 8
   CGroup: /system.slice/docker.service
           ??3619 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.574491681Z" level=warning msg="Your kernel does not support swap memory limit"
Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.575196691Z" level=warning msg="Your kernel does not support cgroup rt period"
Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.575733336Z" level=warning msg="Your kernel does not support cgroup rt runtime"
Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.582517104Z" level=info msg="Loading containers: start."
Jul 19 07:05:49 master dockerd[3619]: time="2019-07-19T07:05:49.391255541Z" level=info msg="Default bridge (docker0) is assigned with an IP add
Jul 19 07:05:49 master dockerd[3619]: time="2019-07-19T07:05:49.681478822Z" level=info msg="Loading containers: done."
Jul 19 07:05:50 master dockerd[3619]: time="2019-07-19T07:05:50.003776717Z" level=info msg="Docker daemon" commit=0dd43dd graphdriver(s)=overla
Jul 19 07:05:50 master dockerd[3619]: time="2019-07-19T07:05:50.009892901Z" level=info msg="Daemon has completed initialization"
Jul 19 07:05:50 master systemd[1]: Started Docker Application Container Engine.
Jul 19 07:05:50 master dockerd[3619]: time="2019-07-19T07:05:50.279284258Z" level=info msg="API listen on /var/run/docker.sock"

Los paquetes de Kubernetes no están disponibles en el repositorio por defecto de Ubuntu 18.04. Por tanto, tendrás que añadir el repositorio de Kubernetes en ambos servidores.

Puedes añadirlo con los siguientes comandos:

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | tee /etc/apt/sources.list.d/kubernetes.list

A continuación, actualiza el repositorio e instala los paquetes de Kubernetes con el siguiente comando:

apt-get install kubelet kubeadm kubectl -y

Una vez instalados todos los paquetes, puedes proceder a configurar el servidor maestro.

Configurar el Servidor Maestro Kubernetes

En primer lugar, tendrás que inicializar tu clúster con su dirección IP privada en el servidor Maestro:

Puedes hacerlo con el comando kubeadm:

kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.0.103

Una vez que el Cluster se haya inicializado con éxito, deberías ver la siguiente salida:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.0.103:6443 --token zsyq2w.c676bxzjul3upd7u \
    --discovery-token-ca-cert-hash sha256:a720ae35d472162177f6ee39de758a5de40043f53e4a3e00aefd6f9832f3436c 

A continuación, tendrás que configurar la herramienta kubectl en tu servidor Maestro. Puedes hacerlo con el siguiente comando:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

A continuación, tendrás que desplegar una Interfaz de Red de Contenedores (CNI) en tu servidor. Porque el clúster no tiene una CNI.

Puedes desplegar la CNI en tu clúster con el siguiente comando:

kubectl apply -f https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml

Deberías ver la siguiente salida:

configmap/calico-config created
daemonset.extensions/calico-etcd created
service/calico-etcd created
daemonset.extensions/calico-node created
deployment.extensions/calico-kube-controllers created
deployment.extensions/calico-policy-controller created
clusterrolebinding.rbac.authorization.k8s.io/calico-cni-plugin created
clusterrole.rbac.authorization.k8s.io/calico-cni-plugin created
serviceaccount/calico-cni-plugin created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
serviceaccount/calico-kube-controllers created

Ahora puedes comprobar tus espacios de nombres ejecutando el siguiente comando:

kubectl get namespaces

Si todo va bien, deberías ver la siguiente salida:

NAME          STATUS    AGE
default       Active    4h
kube-public   Active    4h
kube-system   Active    4h

A continuación, verifica si el nodo maestro está ahora funcionando correctamente con el siguiente comando:

kubectl get nodes

Deberías ver la siguiente salida:

name          status    roles     age       version
master   Ready     master    12m       v1.15.3

Añade un esclavo al clúster de Kubernetes

A continuación, inicia sesión en tu servidor esclavo y ejecuta el siguiente comando para añadir el esclavo al clúster de Kubernetes:

kubeadm join 192.168.0.103:6443 --token zsyq2w.c676bxzjul3upd7u --discovery-token-ca-cert-hash sha256:a720ae35d472162177f6ee39de758a5de40043f53e4a3e00aefd6f9832f3436c

A continuación, ve al servidor maestro y comprueba si el esclavo se ha añadido a tu clúster de Kubernetes con el siguiente comando:

kubectl get nodes

Deberías ver la siguiente salida:

name status roles age version
master ready master 25m v1.15.3
slave ready 2m v1.15.3

Una vez que hayas terminado, puedes pasar al siguiente paso.

Despliega NGINX en el clúster de Kubernetes

El clúster de Kubernetes ya está instalado, configurado y funcionando correctamente. Es el momento de desplegar Nginx en el clúster de Kubernetes.

Ve al servidor maestro y crea un despliegue de Nginx con el siguiente comando:

kubectl create deployment nginx --image=nginx

Ahora puedes listar el despliegue de Nginx con el siguiente comando:

kubectl get deployments

Deberías ver la siguiente salida:

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           99s

Una vez desplegado el Nginx, se puede exponer la aplicación con el siguiente comando:

kubectl create service nodeport nginx --tcp=80:80

Ahora puedes ver una nueva dirección de Servicio y ClusterIP asignada con el siguiente comando::

kubectl get svc

Deberías ver la siguiente salida:

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.152.183.1             443/TCP   15m
nginx        ClusterIP   10.152.183.199           80:32456/TCP    60s

Enhorabuena! has desplegado con éxito Nginx en el clúster Kubernetes. También puedes añadir otro nodo al clúster de Kubernetes fácilmente. Para más información, consulta el documento oficial de Kubernetes en Kubernetes Doc. No dudes en preguntarme si tienes alguna duda.

También te podría gustar...