Post-Image

Desplegando un cluster de Kubernetes con Skuba

Skuba es una herramienta desarrollada por SUSE y cuyo código se encuentra publicado en su repositorio de Github que nos simplifica el despliegue y la actualización de un cluster de Kubernetes. Esta herramienta se basa en kubeadm para el despliegue y se encuentra programada en Go.

En este post vamos a indicaros como podéis deplegar un cluster de Kubernetes con dos masters y dos workers sobre la distribución openSUSE, se basa en el sistema SUSE CaaSP v4 pero al hacerlo sobre otra distribución no tendremos soporte por lo que será interesante para hacer pruebas y PoC para posteriomente realizar una instalación con soporte.

En primer lugar debemos preparar una plantilla (o los hosts que vayamos a utilizar), para ello necesitaremos proceder con los siguientes pasos.

En primer lugar debemos disponer de una clave privada y su correspondiente clave pública en los nodos para que se puede acceder sin necesidad de password. Además en nuestro caso no vamos a usar el usuario del sistema sino que usaremos uno al que hemos llamado “opensuse” al que le daremos permisos de sudo sin necesidad de password modificando el fichero /etc/sudoers y añadiendo la linea:

1
opensuse ALL=(ALL) NOPASSWD: ALL

Luego debemos configurar nuestros hosts para que se puedan realizar llamadas vía FQDN, para ello añadimos a /etc/hosts

1
2
3
4
10.10.1.16  kubemaster01 kubemaster01.alefnode.com skuba.alefnode.com # <-- Solo es identificativo lo suyo es utilizar un balanceador
10.10.1.17  kubemaster02 kubemaster02.alefnode.com
10.10.1.18  kubeworker01 kubeworker01.alefnode.com
10.10.1.19  kubeworker02 kubeworker02.alefnode.com

Luego deberemos dejar la swap deshabilitada en el arranque por lo que añadiremos el script en /etc/init.d/after.local

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
cat >> /etc/init.d/after.local << EOF
#! /bin/sh
#
# Copyright (c)  SuSE LINUX Products GmbH, Germany.  All rights reserved.
#
# Author: Werner Fink,
#
# /etc/init.d/after.local
#
# script with local commands to be executed from init after all scripts
# of a runlevel have been executed.
#
# Here you should add things, that should happen directly after
# runlevel has been reached.
#
swapoff -a
EOF
chmod +x /etc/init.d/after.local #Le damos permisos al script

El siguiente paso podemos decidir que queremos hacer, podemos tratar de usar el firewalld propio del sistema o si disponemos de uno externo tan solo podemos deshabilitarlo. En cualquier caso seria suficiente con abrir los puertos 6443, 32000 y 10250 vía firewalld ejecutando los comandos.

1
2
3
4
5
sudo firewall-cmd --permanent --zone=public --add-port=2379/tcp
sudo firewall-cmd --permanent --zone=public --add-port=6443/tcp
sudo firewall-cmd --permanent --zone=public --add-port=10250/tcp
sudo firewall-cmd --permanent --zone=public --add-port=32000/tcp
sudo firewall-cmd --reload

Nota: En caso de tener un firewall externo deshabilitaremos el servicio de firewalld

1
2
3
4
5
6
7
8
9
cat >> /etc/zypp/repos.d/skuba.repo << EOF
[home_m_meister_skuba-leap]
name=Branch project for package kubernetes (openSUSE_Leap_15.1)
type=rpm-md
baseurl=http://download.opensuse.org/repositories/home:/m_meister:/skuba-leap/openSUSE_Leap_15.1/
gpgcheck=1
gpgkey=http://download.opensuse.org/repositories/home:/m_meister:/skuba-leap/openSUSE_Leap_15.1/repodata/repomd.xml.key
enabled=1
EOF

Necesitaremos tener un agente de ssh corriendo en la máquina para poder utilizar el software de SUSE por ello añadiremos en $HOME/.bash_profile el siguiente contenido:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
     echo "Initialising new SSH agent..."
     /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
     echo succeeded
     chmod 600 "${SSH_ENV}"
     . "${SSH_ENV}" > /dev/null
     /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
     . "${SSH_ENV}" > /dev/null
     #ps ${SSH_AGENT_PID} doesn't work under cywgin
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
         start_agent;
     }
else
     start_agent;
fi

Por último debemos instalar go y skuba para poder proceder con la creación del cluster.

1
2
sudo zypper --gpg-auto-import-keys ref
sudo zypper install -y go skuba

Ya tenemos todas nuestras máquinas de OpenSUSE preparadas ahora procederemos a crear nuestro cluster (lo habitual suele ser preparar una máquina y crear una plantilla para poder luego crecer mucho más rapido)

Un vez tengamos los nodos que vayamos a utilizar con esta configuración continuaremos con la creación del cluster. Desde “kubemaster01” ejecutamos:

1
2
cd $HOME #Estamos utilizar el usuario opensuse
skuba cluster init --control-plane skuba.alefnode.com kubecluster

Y añadimos el primer nodo master del cluster.

1
2
3
4
cd $HOME/kubecluster
# Cambiamos el registry de docker por el de registry.suse.com
for i in $(find . -type f); do sed -i "s/registry.suse.de\/devel\/caasp\/4.0\/containers\/containers\/caasp\/v4/registry.suse.com\/caasp\/v4/g" $i; done
skuba node bootstrap --user opensuse --sudo --target kubemaster01.alefnode.com kubemaster01 -v 10

El siguiente paso se añadir el segundo nodo master del cluster.

1
2
cd $HOME/kubecluster
skuba node join --role master --user opensuse --sudo --target kubemaster02.alefnode.com kubemaster02 -v 10

Cada vez que queramos añadir un nuevo nodo master al cluster debemos ejecutar lo mismo.

Y ya por último añadimos los workers que necesitemos.

1
skuba node join --role worker --user opensuse --sudo --target kubeworker01.alefnode.com kubeworker01 -v 10

UPDATE [21-11-2019] - Fix IPv6 en Cilium.

Para hacer funcionar bien la red, por defecto viene habilitado IPv6 lo que genera errores al crear nuevos pod y exponerlos a través de nodePort para solventar esto es necesario editar el pod de cilium.

A continuación explicamos como hacer este paso.

Ejecutar el comando:

1
kubectl --kubeconfig=$HOME/kubecluster/admin.conf edit daemonset cilium -n kube-system

Cambiar la linea 10 y añadir justo detrás de "--disable-ipv4"

1
"--enable-ipv6=false"

Y añadir justo debajo de "- --disable-ipv4=$(DISABLE_IPV4)" (linea 46)

1
  - --enable-ipv6=false