Primero empezaré explicando un escenario base de un cluster kubernetes, sobre el tipo de escenario, en nuestro caso seguiremos una implementación On-Premise sobre nuestra infraestructura virtual ya existente, pero cabe decir que podemos realizar una instalación sobre nodos físicos basados en Raspberry PI muy económica.
En nuestro caso, como comentaba anteriormente crearemos 3 Mvs sobre el sistema operativo Linux Centos7, en principio el motivo por el cual son 3 MVs, es por ser una instalación mínima para crear el cluster, pero dependiendo de las cargas de trabajo podemos ir uniendo nodos según los vayamos necesitando.
Un cluster de Kubernetes se compone de 2 roles diferenciados, el denominado Controller ó Master, que es aquella máquina la cual alberga todo el metadato (base de datos) que se va generando, además de la inteligencia del cluster, digamos que esta sería la máquina crítica, es decir para que un cluster de kubernetes esté formado, necesitaremos como mínimo un nodo que haga de Controlador/Master, en este nodo, están en funcionamiento una serie de servicios que son los encargados de "hacer la magia" en nuestro cluster, como es el caso del servicio etcd.
Los nodos encargados de almacenar y ejecutar los contenedores, son los denominados WORKERSNODE, decir, que este tipo de nodos, los podemos crear y destruir "al vuelo", es decir, podría eliminarlos completamente y volverlos a crear sin pérdida de información, ya que como comentaba anteriormente, el nodo encargado de almacenar toda la información (metadato), sería el nodo Controlador/Master.
Os dejo una imagen explicativa:
NUESTRO ESCENARIO
- CONTROLADOR/MASTER (k8)
CPU: 2 vCPU
RAM: 4 GB
IP: 192.168.100.80
- WORKERNODES ( wk01 y wk02)
CPU: 2 vCPU
RAM: 4 GB
wk01: 192.68.100.81
wk02: 192.68.100.82
Sobre recursos de CPU y RAM de los nodos, he utilizado recursos mínimos para este entorno, dependiendo de las cargas de trabajo iremos incrementado estos valores.
PREPARACIÓN DE LOS NODOS
Las siguientes tareas se realizarán en los 3 nodos (k8, wk01 y wk02):
- Agregar nomenclatura (resolución de nombres) de todos los nodos, se realizará sobre el fichero hosts (/etc/hosts).
|
2. Deshabilitaremos SELinux y SWAP.
- Deshabilitando SELinux
|
- Deshabilitando SWAP
|
Modificaremos (comentamos) el fichero fstab para que al reiniciar los nodos se desactive la partición SWAP de nuestro sistema operativo, para ello editamos el fichero fstab (/etc/fstab) de cada nodo.
vi /etc/fstab |
3.- Activamos módulo br_netfilter.
Para el correcto funcionamiento de kubernetes es necesario activar el módulo br_netfilter sobre el kernel de nuestro sistema operativo.Es necesario habilitar este módulo de nuestro kernel para que los pods de kubernetes puedan ser procesados por iptables y puedan comunicarse.
|
-Le decimos a Iptables que se comporte en modo bridge.
|
4.-Crearemos los repositorios para docker-ce y kubernetes y así poder realizar la instalación vía YUM.
- Instalando dependencias para docker-ce
yum install -y yum-utils device-mapper-persistent-data lvm2 |
- Agregamos el repositorio para docker-ce, lo denominaremos docker-ce.repo
|
- Procedemos a su instalación vía YUM.
yum install -y docker-ce |
- Creamos el repositorio para kubernetes, lo denominaremos kubernetes.repo.
|
- Procedemos a su instalación, introducimos el siguiente comando.
yum makecache -y fast |
Después de realizar la instalación procedemos a reiniciar todos los nodos.
Una vez reiniciados los nodos iniciamos los servicios docker y kubelet.
systemctl start docker & systemctl start kubelet |
5.-Agregar cgroup-driver.
Debemos asegurarnos que docker-ce y kubernetes usen el mismo cgroup de control, de forma predeterminada docker-ce debería de pertenecer al grupo cgroupfs, para comprobarlo utilizamos el siguiente comando:
docker info | grep -i cgroup |
Una vez comprobado, modificamos el cgroup-driver para kubernetes.
|
Reiniciamos el servicio de kubernetes para que agregue los cambios
systemctl daemon-reload & systemctl restart kubelet |
¿QUE HEMOS REALIZADO HASTA AHORA?
- Hemos configurado los nodos para que se resuelvan por nombre, para que no tengamos problemas de comunicación entre ellos.
- Hemos desactivado SELinux y Swap.
- Hemos activado el módulo br_netfilter del kernel de nuestro Centos7, para que la comunicación a través de Iptables sea correcta.
- Hemos instalado los paquetes correspondientes a docker-ce y kubernestes vía YUM.
- Hemos modificado el cgroup-driver para kubernetes.
COMPROBACIONES
Podemos comprobar en todos los nodos que los dos servicios principales estén corriendo sin errores.
systemctl status kubelet & systemctl status docker |
INICIAMOS EL CLUSTER
Una vez comprobado que tengo los 3 nodos funcionando correctamente procedemos a la configuración del nodo controlador/master.
Las siguientes configuración UNICAMENTE las realizaremos sobre el nodo Controlador/master (k8-192.268.100.80).
kubeadm init --apiserver-advertise-address=192.168.100.80 --pod-network-cidr=10.244.0.0/16 |
Básicamente estamos iniciando el APISERVER y estamos creando una red virtual para la comunicación entre los diferentes pods.
Este direccionamiento lo podemos modificar, ya que será un direccionamiento privado para nuestros pods.
Dejamos que se vaya iniciando el cluster y pasados unos segundos, seguimos los pasos que se nos muestran en pantalla
Básicamente nos quedarían realizar 3 pasos:
- Crear fichero de configuración para usuario.
- Desplegar contenedor flannel network.
- Copiar comando para unir nodos al cluster .
|
Creamos fichero con la configuración del cluster, sobre un usuario distinto de root.
|
Desplegar contenedor flanned network, básicamente este contenedor será el encargado de las comunicaciones entre el cluster y los diferentes pods.
|
Para comprobar si el despliegue ha sido correcto ejecutamos el siguiente comando
kubectl get pods --all-namespaces |
Obtendremos como resultado la siguiente información:
Una vez comprobado que el contenedor flanned está corriendo (estado running), procedemos a unir el resto de nodos al cluster, para ello nos conectamos a cada nodo (workerNode) y ejecutamos el siguiente comando que nos aparece en la instalación del kubemaster.
|
Deberíamos obtener la siguiente imagen con el estado de los 3 nodos de nuestro cluster:
CONCLUSIONES
Pues hasta aquí el manual de como crear nuestro propio cluster kubernetes ON-Premise, muy buena opción si queremos iniciarnos en el mundo de los contenedores e incluso disponer de nuestro propio entorno de desarrollo a bajo coste, ya que el consumo de recursos será mínimo en nuestra infraestructura.
Referencias: https://kubernetes.io/docs