Skip to main content

Baremetal Local Multi Master Multi ETCD

Este proyecto es una actualización del proyecto multi master para aumentar la complejidad y alta disponibilidad de nuestro kubernetes local colocando ETCD como un servicio externo al clúster.

Los requisitos necesarios:

sudo apt-get install vagrant
sudo apt-get install virtualbox

En versiones más recientes de VirtualBox, necesité modificar la configuración para liberar el rango de IPs.

sudo mkdir /etc/vbox
sudo echo "* 10.0.0.0/8 192.168.0.0/16" >> /etc/vbox/networks.conf
sudo echo "* 2001::/64" >> /etc/vbox/networks.conf

La topología propuesta aquí sigue el siguiente proyecto de Kubernetes. https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/ MultiMaster

Consulta sobre etcd en https://etcd.io

Observa que el clúster ETCD no posee conexión con el load balancer y la comunicación con los masters es directa. Solamente los masters se comunican con etcd a través del apiserver.

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/ ClusterETCD

Para la comunicación entre los nodos del clúster, el puerto utilizado es el 2380. Para la comunicación de los nodos con los masters el puerto es el 2379.

Para esta instalación vamos a configurar 3 nodos masters, 2 nodos workers, 2 load balancers y 3 VMs para formar nuestro clúster ETCD.

El foco de la explicación aquí será sobre el clúster ETCD. Para entender la parte multi master consulta el proyecto MultiMaster.

Generar certificado TLS

Es necesario generar un certificado TLS para que los masters se comuniquen con el clúster etcd de forma cifrada. ¿Es posible ejecutar sin el certificado? sí, pero vamos a hacer las cosas de forma correcta para aprender.

El primer paso es crear los certificados localmente para que estos archivos estén disponibles durante la creación de nuestro entorno completo.

wget -q --show-progress \
https://storage.googleapis.com/kubernetes-the-hard-way/cfssl/1.4.1/linux/cfssl \
https://storage.googleapis.com/kubernetes-the-hard-way/cfssl/1.4.1/linux/cfssljson

chmod +x cfssl cfssljson
sudo mv cfssl cfssljson /usr/local/bin/

Ahora que ya tenemos los binarios vamos a crear nuestra Autoridad Certificadora (CA).

La carpeta certs contiene el certificado que ya creé antes, pero para generar uno nuevo borra la carpeta certs y crea una nueva en su lugar.

rm -rf certs
mkdir certs
cd certs

El comando abajo crea la CA basada en el JSON especificado


cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"etcd": {
"expiry": "8760h",
"usages": ["signing","key encipherment","server auth","client auth"]
}
}
}
}
EOF

cat > ca-csr.json <<EOF
{
"CN": "etcd cluster",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "BR",
"L": "Vila Velha",
"O": "Kubernetes",
"OU": "ETCD-CA",
"ST": "Espirito Santo"
}
]
}
EOF

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

Ahora vamos a crear un certificado TLS. Este certificado se está creando para las IPs de las máquinas etcd que están declaradas en el vagrantfile, si modificas algo allí necesitarás modificar aquí también.

ETCD1_IP="10.10.10.231"
ETCD2_IP="10.10.10.232"
ETCD3_IP="10.10.10.233"

cat > etcd-csr.json <<EOF
{
"CN": "etcd",
"hosts": [
"localhost",
"127.0.0.1",
"${ETCD1_IP}",
"${ETCD2_IP}",
"${ETCD3_IP}"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "BR",
"L": "Vila Velha",
"O": "Kubernetes",
"OU": "ETCD-CA",
"ST": "Brazil"
}
]
}
EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd etcd-csr.json | cfssljson -bare etcd

Ahora ya tenemos todos los certificados. Estos certificados serán copiados a través de scripts dentro de las instancias de los masters y etcds

El archivo Vagrantfile contiene la configuración de las máquinas y las llamadas de los scripts necesarios para la instalación.

Explicando el Vagrantfile

Primer paso es crear el clúster etcd para cuando se haga el init del clúster ya apuntar hacia él. Segundo paso es levantar el load balancer pues es el enlace entre el master y los workers, será necesario durante el init. Tercer paso es crear los masters siendo que master1 hará el init del clúster y los demás harán un join. Cuarto paso es crear los workers y hacer el join dentro del clúster

Puedes ejecutar estos pasos despacio para ir acompañando cada uno de ellos si quieres, pero si quieres levantar todo solo ejecuta vagrant up sin pasaje de argumentos.

vagrant up etcd1 etcd2 etcd3
vagrant up loadbalancer1 loadbalancer2
vagrant up master1 master2 master3
vagrant up worker1 worker2

Accediendo al clúster etcd desde tu máquina local para pruebas

Si quieres subir solamente el clúster etcd puedes ejecutar

vagrant up etcd1 etcd2 etcd3

Instala en tu máquina etcdctl eligiendo la versión que desees en https://github.com/etcd-io/etcd/releases

# Modifica la versión aquí si es necesario
ETCD_VER=v3.5.4

mkdir -p /tmp/etcd
echo "Descargando y extrayendo a la carpeta /tmp/etcd y removiendo el zip"
curl -L "https://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz" -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz

echo "Moviendo los binarios a /usr/local/bin y dando permiso a los usuarios"
sudo mv /tmp/etcd/etcdctl /usr/local/bin
sudo chmod 755 /usr/local/bin/etcdctl

echo "Limpiando"
rm -rf /tmp/etcd

Entra en la carpeta certs y copia los certificados a tu máquina local en /etc/etcd/pki con los permisos necesarios.

sudo mkdir -p /etc/etcd/pki
sudo cp *.pem /etc/etcd/pki/
sudo chmod 755 /etc/etcd/pki/*

Ahora solo tienes que cargar las variables de entorno para que etcdctl sepa hacia dónde apuntar y qué certificados usar.

export ETCDCTL_API=3
export ETCDCTL_ENDPOINTS=https://10.10.10.231:2379,https://10.10.10.232:2379,https://10.10.10.233:2379
export ETCDCTL_CACERT=/etc/etcd/pki/ca.pem
export ETCDCTL_CERT=/etc/etcd/pki/etcd.pem
export ETCDCTL_KEY=/etc/etcd/pki/etcd-key.pem

Ejecuta algunos comandos para prueba:

etcdctl member list
etcdctl endpoint status
etcdctl endpoint health

etcdctl put mykey david
etcdctl get mykey
etcdctl del mykey
etcdctl get mykey

Recomendaciones

Creo que lo ideal es entender paso a paso lo que se hizo leyendo los scripts de bootstrap de cada uno de los nodos.