En este post vamos a preparar los nodos para instalar un clúster de Kubernetes (RKE) para después instalar un servidor Rancher para producción

Requisitos

  • Conocimientos básicos de Linux
  • Una computadora externa desde la cual vamos a aprovisionar los nodos (computadora de operador)
  • Nano instalado (sudo apt install nano) en la computadora de operador
  • Tres computadoras para el RKE con Linux 64 bits (debian)
  • servidor ssh instalado en los nodos para conexión externa

Para instalar el servidor Rancher y manejar clústeres de Kubernetes, necesitamos primero un clúster RKE, vamos a usar los tres nodos para alta disponibilidad.

Y te estarás preguntando..

Espera.. para instalar el servidor Rancher para manejar clústeres de Kubernetes, ¿ necesito primero instalar un clúster de Kubernetes?

La respuesta es si y no.

La mejor forma de desarrollar una aplicación altamente disponible es sobre Kubernetes, y es por eso que vamos a instalar el servidor Rancher sobre un clúster de Kubernetes, pero no va a ser una instalación típica, lo vamos a hacer con ayuda de RKE.

RKE es un motor de Kubernetes configurado por Rancher, asi que la instalación va a ser fácil y rápida, una vez que preparemos los nodos, eso es lo que vamos a hacer en este post.

Laboratorio

Genera una llave SSH

  1. Genera una llave ssh en la computadora del operador para instalar los nodos y guardarla en /home/(usuario)/.ssh/rke usando ssh-keygen (passphrase opcional)
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/(your user)/.ssh/id_rsa): /home/(your user)/.ssh/rke
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/(your user)/.ssh/rke
Your public key has been saved in /home/(your user)/.ssh/rke.pub
The key fingerprint is:
SHA256:sgdlTKIDjXv7c2X86wcbQ7e0TGeXz5JiWzk4qC61YtY javier@javier-Lenovo-ideapad-330S-15ARR
The key's randomart image is:
+---[RSA 3072]----+
|  .o  . .        |
|  .... +         |
|   .o   +       .|
|  . .. o    . +.+|
|   . .o S. o * Oo|
|    .  +. = O X o|
|     ..o.= o X o |
|      B.E   + .  |
|     o *.  .oo   |
+----[SHA256]-----+

La siguiente configuración debe de aplicarse en los tres nodos (pasos 2 a 33)

2. Copia la llave a los nodos, esto nos va a permitir conectarnos a los nodos sin poner la contraseña cada vez que nos conectemos mediante ssh.

ssh-copy-id -i ~/.ssh/rke (node user)@(node ip)
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/(your user)/.ssh/rke.pub"
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
ECDSA key fingerprint is SHA256:diitN4rOd6j9KdszklTR/QAb5/SiGw3Pwxx5rofnQ6g.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ubuntu@192.168.1.1's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'ubuntu@192.168.1.1'"
and check to make sure that only the key(s) you wanted were added.

3. Conectate al nodo con ssh usando el usuario, ip y contraseña del nodo

ssh (user)@(node ip)

Cambia el nombre del host

4. Edita el archivo /etc/hostname

sudo nano /etc/hostname

5. Agrega un nombre de host único, yo voy a usar raspb-ubuntu-1, raspb-ubuntu-2, raspb-ubuntu-3 para los nodos.

raspb-ubuntu-1

6. Guarda el archivo con control - 0 sal de la edición con Control - X

7. Reinicia el nodo

sudo reboot

8. Conectate al nodo con el nombre de host.

ssh (user)@raspb-ubuntu-1

Desinstala e instala una versión soportada de Docker

9. Desinstala cualquier versión anterior de docker

sudo apt-get remove docker docker-engine docker.io containerd
Si esto falla para desinstalar docker intenta, sudo apt-get remove docker-ce docker-ce-cli containerd.io

Este comando va a preservar el contenido de /var/lib/docker/ de cualquier imagen, volumen y configuración de alguna versión anterior de docker

10. Instala las dependencia necesarias para docker

sudo apt update && sudo apt install -y \
apt-transport-https ca-certificates curl \
gnupg-agent software-properties-common

11. Instala una versión de docker soportada por Rancher

Docker Version Install Script
19.03 curl https://releases.rancher.com/install-docker/19.03.sh | sh
18.09 curl https://releases.rancher.com/install-docker/18.09.sh | sh
18.06 curl https://releases.rancher.com/install-docker/18.06.sh | sh
17.03 curl https://releases.rancher.com/install-docker/17.03.sh | sh
curl https://releases.rancher.com/install-docker/19.03.sh | sh

12. Verifica tu versión de Docker

sudo docker version --format '{{.Server.Version}}'
19.03.13

13. Habilita el auto inicio de docker

sudo systemctl enable --now docker

14. Crea el grupo docker y agrega tu usuario al grupo de docker

sudo usermod -aG docker $USER && sudo usermod -aG docker $USER

Deshabilita la memoria Swap

15. Este es un punto relacionado con seguridad, para evitar que un usuario pueda acceder al swap y obtener información sensible.

Edita el archivo /etc/fstab with sudo nano /etc/fstab y comenta con # el inicio del la linea swap

  GNU nano 4.8                                      /etc/fstab                                                 
# /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/sda5 during installation
UUID=5be72ab8-47e4-4826-8437-624da4b296df /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/sda1 during installation
UUID=8060-E869  /boot/efi       vfat    umask=0077      0       1
#/swapfile                                 none            swap    sw              0       0

16. Guarda con control + O y control - X para salir

17. Esto tomara efecto una vez que reiniciemos, pero para seguir trabajando en el host desactivemos el swap mediante comando

sudo swapoff -a

18. Verifica que no se este usando memoria swap con free -h

free -h
              total        used        free      shared  buff/cache   available
Mem:          7.6Gi       263Mi       6.8Gi       3.0Mi       580Mi       7.3Gi
Swap:            0B          0B          0B

Activa re-dirección de puerto

19. Activa re-dirección de puerto

sudo tee -a /etc/sysctl.d/99-kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

20. Cargar la nueva configuración

sudo sysctl --system

Abrir puertos y activar el firewall.

21. El firewall ufw debe de estar desactivado por defecto, puedes verificarlo con sudo ufw status

sudo ufw status
Status: inactive

Primero vamos a activar el puerto 22, tienes que hacer esto con cuidado, es posible que si activas el firewall antes de abrir los puertos para conectarte al host, este quede sin comunicación y la única forma de conectarte sera físicamente.

22. Permitir puerto 22 (ssh)

sudo ufw allow 22/tcp
Rules updated
Rules updated (v6)

23. Crea un script para permitir los puertos tcp necesarios por el servidor Rancher, la lista completa puedes encontrarla aquí

nano allowtcp.sh

24. Agrega esta información al archivo

#!/bin/bash
for i in 80 443 179 5473 6443 8472 2376 8472 2379:2380 9099 10250 10251 10252 10254 30000:32767; do
    sudo ufw allow ${i}/tcp;
    echo "${i}/tcp port enabled"
done

25. Guardar el archivo con control + O y control - X para salir

26. Agrega permisos de ejecución al archivo

chmod +x allowtcp.sh

27. Ejecuta el archivo con permisos de súper usuario

sudo ./allowtcp.sh
Rules updated
Rules updated (v6)
80/tcp port enabled
Rules updated
Rules updated (v6)
443/tcp port enabled
Rules updated
Rules updated (v6)
179/tcp port enabled
Rules updated
Rules updated (v6)
5473/tcp port enabled
Rules updated
Rules updated (v6)
6443/tcp port enabled
Rules updated
Rules updated (v6)
8472/tcp port enabled
Rules updated
Rules updated (v6)
2376/tcp port enabled
Skipping adding existing rule
Skipping adding existing rule (v6)
8472/tcp port enabled
Rules updated
Rules updated (v6)
2379:2380/tcp port enabled
Rules updated
Rules updated (v6)
9099/tcp port enabled
Rules updated
Rules updated (v6)
10250/tcp port enabled
Rules updated
Rules updated (v6)
10251/tcp port enabled
Rules updated
Rules updated (v6)
10252/tcp port enabled
Rules updated
Rules updated (v6)
10254/tcp port enabled
Rules updated
Rules updated (v6)
30000:32767/tcp port enabled

28. Ahora agreguemos los puertos udp necesarios por el servidor Rancher.

Crea un nuevo script.

nano allowudp.sh

29. Agrega la siguiente información

#!/bin/bash
for i in 8285 8472 4789 30000:32767; do
   sudo ufw allow ${i}/udp
   echo "${i}/udp port enabled"
done

30. Agregar permisos de ejecución

sudo chmod +x allowudp.sh

31. Ejecuta el script

sudo ./allowudp.sh
Rules updated
Rules updated (v6)
8285/udp port enabled
Rules updated
Rules updated (v6)
8472/udp port enabled
Rules updated
Rules updated (v6)
4789/udp port enabled
Rules updated
Rules updated (v6)
30000:32767/udp port enabed

32. Habilitemos el firewall

sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

33. Habilita la re-dirección SHH, edita el archivo /etc/ssh/ssh_config

sudo nano /etc/ssh/ssh_config

Y agrega esto al final del archivo

AllowTcpForwarding yes

Guarda con Control + O para guardar y Control + X para salir

Reinicia el servidor ssh

sudo systemctl restart ssh

Bien hecho! preparamos los nodos, para el clúster de Kubernetes de producción

En el siguiente post vamos a aprovisionar un clúster RKE e instalaremos el servidor Rancher

Referencias: