Saltar a contenido

Desplegando Kubernetes#

Actualmente disponemos diferentes formas de desplegar Kubernetes. Basado en la nube, siendo este muy sencillo de configurar y mantener, y basado en máquinas físicas (bare metal), sistema más complejo de desplegar y mantener.

Este proyecto lo llevaremos a cabo en un clúster con 3 Raspberry Pi, explicando en este apartado los pasos necesarios para desplegar nuestro clúster de Kubernetes.

Comenzaremos haciendo una breve introducción de las primeras configuraciones que debemos realizar para acceder a nuestras Raspberry Pi. Puesto que este proyecto se centra en Kubernetes, no profundizaremos en los pasos que debemos seguir para tener un SO funcionando en una Raspberry Pi.

El sistema elegido para cada una de nuestras Raspberry Pi ha sido CentOS 7, la cual podemos descargar desde este enlace. Ya que el proyecto que realizamos se basa centra en Kubernetes, no profundizaremos sobre los pasos que debemos seguir para instalar y configurar los SO en la Raspberry Pi.

Una vez que tenemos la imagen que deseamos (la elegida ha sido la minimal) podemos seguir los pasos para preparar la tarjeta SD y las recomendaciones que nos encontramos en la wiki de CentOS.

Partiendo de que ya tenemos las Raspberry Pi funcionando correctamente, vamos a configurar nuestro equipo agregando las llaves y los datos de conexión para facilitar el acceso vía ssh.

Fichero .ssh/config

Host rpi4
    HostName 192.168.11.200
    User root
    IdentityFile ~/.ssh/rpi4.pub
Host rpi2
    HostName 192.168.11.205
    User root
    IdentityFile ~/.ssh/rpi2.pub
Host rpi2-nfs
    Hostname 192.168.11.220
    User root
    IdentityFile ~/.ssh/rpi2-nfs.pub

A continuación nos centraremos con las configuraciones que debemos realizar para preprar nuestro clúster. En primer lugar configurar el fichero /etc/hosts de cada una de las placas y añadir todos los nodos que conforman el clúster.

192.168.11.200 rpi4.local
192.168.11.205 rpi2.local
192.168.11.206 rpi3-node.local
192.168.11.207 rpi3.local

En la distribuciones que cuentan con SELinux es necesario establecerlo en el modo permisivo. Esto se debe a que los contenedores necesitan acceder al sistema de ficheros del anfitrión.

Establecer SELinux en modo permisivo en la sesión actual.

setenforce 0

De igual modo es neceario modificar el fichero SELinux para que se aplique la configuración de forma permanente.

sed -i 's/SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

Necesitamos abrir una serie de puertos para diferentes finalidades.

Protocolo Puerto Función Comando
TCP 64443 Kubernetes API firewall-cmd --permanent --add-port=6443/tcp
TCP 2379-2380 API del cliente del servidor etcd firewall-cmd --permanent --add-port=2379-2380/tcp
TCP 10250 Kubelet API firewall-cmd --permanent --add-port=10250/tcp
TCP 10251 Kube-scheduler firewall-cmd --permanent --add-port=10251/tcp
TCP 10252 Kube-controller-manager firewall-cmd --permanent --add-port=10252/tcp

Después de configurar los puertos en el firewall es necesario ejecutar los siguientes comandos:

#Recargar la configuración del firewall
firewall-cmd --reload

#Añadir el modulo br_netfilter al kernel
modprobe br_netfilter

#Iptables configuration
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

#Deshabilitar swap
swapoff -a

Tanto el comando relacionado tanto con iptables como con swap únicamente afectan al sistema en ejecución, por lo que si deseamos que los cambios sean permanentes es necesario realizar varias modificaciones.

  • Fichero /etc/fstab: comentar (#) la línea que hace referencia a swap.

  • Fichero /etc/sysctl.conf: añadir la línea net.bridge.bridge-nf-call-iptables=1.

A continuación procederemos a la instalación de los paquetes necesarios para el funcionamiento del Nodo Master.

Note

En la guía que podemos encontrar en la web de Kubernetes, nos facilitan los datos del repositorio para la descarga de paquetes. Este repositorio no funciona correctamente en armhfp. La alternativa que tenemos es decargarnos los paquetes manualmente desde este enlace e instalarlos con rpm.

Debido a que el repositorio que hemos configurado no funciona correctamente es necesario realizar la instalación de los paquetes y sus dependencias manualmente.

Una vez descargado kubeadm, si ejecutamos el comando rpm -ivh kbueadm.armhfp.rpm nos aparecerá el siguiente mensaje:

error: Error de dependencias:
    cri-tools >= 1.13.0 es necesario por kubeadm-1.18.2-0.armhfp
    kubectl >= 1.13.0 es necesario por kubeadm-1.18.2-0.armhfp
    kubelet >= 1.13.0 es necesario por kubeadm-1.18.2-0.armhfp
    kubernetes-cni >= 0.7.5 es necesario por kubeadm-1.18.2-0.armhfp

Vamos a descargarnos los paquetes manualmente.

#cri-tools
curl -O https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-armhfp/Packages/7a54305aa8552436821a60337683164a50d34fd76ac558dfd2ef529e6e29395e-cri-tools-1.13.0-0.armhfp.rpm

Note

Será necesario seguir el mismo procedimiento con el resto de paquetes.

Procedemos a instalar los paquetes.

#Kubeadm
rpm -ivh --ignorearch *.rpm

Note

La opción --ignorearch es necesaria puesto que los metadatos de los paquetes rpm que hacen referencia a la arquitectura no son correctos. Es posible que nos dé algún error de dependencias, será necesario instalar los paquetes que nos indique.

Continuamos con la puesta en marcha del sistema, iniciando y habilitando los diferentes servicios necesarios para el correcto funcionamiento de kubernetes.

#Docker
yum install -y docker

systemctl enable docker

systemctl start docker

#Kubelet
systemctl enable kubelet

systemctl start kubelet

Si comprobamos el estado de kubelet systemctl status kubeletet, es posible que aparezca un error relacionado con cgroup_driver. Para solucionarlos es necesario añadir en el fichero /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS=--cgroup-driver=systemd.

El siguiente paso será iniciar kubeadm ejecutando el comando kubeadm init. Si la ejecución del comando ha sido exitosa veremos la siguiente información.

Warning

Es posible que nos aparezca un error cgroups_memory missing. Para solventar este error es necesario añadir cgroup_enable=memory y cgroup_memory=1 en el fichero /boot/cmdline.txt.

kubeadm init

Siguiendo las indicaciones que podemos ver en la imagen ejecutaremos los comandos que nos indican.

mkdir -p $HOME/.kube

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config

Kubectl es la herramienta de línea de comandos (más adelante se estudiará en profundidad) utilizada para controlar Kubernetes. Uno de los primeros comandos que utilizaremos será para comprobar el estado de los nodos.

kubectl get nodes

El resultado nos mostrará el/los nodos que tenemos en nuestro clúster. En el momento de instalación solo disponíamos del Nodo Master.

NAME   STATUS     ROLES    AGE     VERSION
rpi4   NotReady   master   6h45m   v1.18.2

El Nodo Master se encuentra como no disponible, será necesario seleccionar el modo de gestionar la red de Kubernetes de la lista que podemos encontrar aquí. La elegida es Weave Net from Weaveworks puesto que es simple de utilizar y su funcionamiento es fiable.

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

Para añadir nodos a nuestro clúster será necesario seguir el proceso que hemos seguido hasta este momento. El único comando que no es necesario ejecutar es kubeadm init, que es el comando encargado de crear el clúster de Kubernetes.

Al final del proceso será necesario añadir el nuevo nodo al clúster ejecutando el comando que hemos visto en la imagen anterior.

kubeadm join 192.168.11.200:6443 --token yk32k7.oc6ezdeidt9w3331 --discovery-token-ca-cert-hash sha256:c3c449377707d7f1a85dad7e67f6ad6de864780430b78107f07b86209abdbe60

Note

Si no hemos capturado la información que nos mostraba la cli después de crear el clúster, podemos obtener la misma información ejecutando kubeadm token create --print-join-command.