Actualización de versión de un clúster RKE2
Hoy vamos a hablar sobre la posibilidad de cambiar de versión de un clúster de Kubernetes basado en Rancher Kubernetes Engine (a partir de ahora RKE2).
Recientemente hemos trabajado con proyectos que requerían una actualización de la versión de Kubernetes, aunque también puede darse el caso de que tengas desarrollados microservicios que requieran una versión anterior. Toda esta problemática, aunque está documentada en la propia web de RKE2, es bastante delicada y hay que tener algunas cosas en cuenta para realizarla de la manera menos impactante posible.
¿Qué es RKE2?
Antes de nada, RKE2 es una distribución de Kubernetes desarrollada por Rancher. Además de mejoras de seguridad, la principal diferencia con su antecesora es que ya no está basada en Docker.
Los recursos asociados al ControlPlane del clúster, se despliegan como pods estáticos orquestados mediante kubelet, y el resto de recursos del clúster utilizan ContaiNerd (actualmente, la opción estándar para la orquestación de contenedores). La instalación y despliegue de RKE2 es bastante sencilla si no se aplica ninguna configuración personalizada. Es completamente compatible con cualquier distribución de Linux, permitiendo su instalación sin tener que configurar nada específicamente para la distribución.
Si os interesa desplegar vuestro propio clúster basado en RKE2, podéis seguir los pasos indicados en la documentación en su página web.
Cambio de versión de RKE2
Una vez tengas un clúster de Kubernetes basado en RKE2, por diferentes motivos puedes querer cambiar la versión del mismo. Este proceso es el mismo tanto para actualizar como para una vuelta atrás a otra versión, lo cual facilita las cosas en caso de que haya cualquier problema con una actualización por cuestiones de compatibilidad. RKE2 en si va sacando versiones actualizadas mayormente con cambios sobre la versión de Kubernetes (aunque también con la propia versión de RKE2). Todas estas versiones se pueden ver en su repositorio de Github con el formato v[kubernetes version]+[rke2 version].
Teniendo esto en cuenta, vamos a describir los pasos más importantes para cualquier cambio de versión. Estos cambios tendrán que aplicarse por separado en cada nodo del clúster. Si se siguen todos estos pasos, al finalizar todo el proceso se podrá arrancar el clúster sin ningún tipo de problema (como si simplemente hubieramos reiniciado el mismo) y todos los recursos asociados se habrán mantenido tal y como estaban.
Pasos para el cambio de versión
Como hemos comentado anteriormente, estos pasos se han de seguir para cada nodo existente en el clúster. Es importante seguirlos en orden y que se ejecuten correctamente.
Vamos a seguir el proceso desde un entorno de prueba creado en el cual hay dos nodos. En este caso, actualizarás de versión el server, pero los pasos son los mismos si quisieras cambiar el agent.
En la siguiente captura, puedes ver cómo partes de la versión de Kubernetes v1.24.11 y la rke2r1 de RKE2 y, en este caso, actualizarás a la versión de Kubernetes 1.26.7.
En primer lugar, es importante detener todos los procesos que se estén ejecutando en el nodo. De esta forma, nos aseguramos de que ningún proceso interfiera en el proceso pudiendo dar lugar a errores. Para este paso, por defecto con la instalación de RKE2, se crea un script llamado rke2-killall.sh y alojado en la ruta «/usr/local/bin». Se encargará de parar todos los procesos del nodo. Una vez ejecutado, se parará el servicio de rke2 (server o agent, según sea el caso).
/usr/local/bin/rke2-killall.sh
service rke2-server stop
Una vez hecho este proceso, procede con la actualización del servicio de RKE2. Para ello, utiliza el script proporcionado por RKE2 fijando, al menos, las siguientes variables:
- INSTALL_RKE2_METHOD: en esta variable se fijará el método por el que se ha instalado RKE2 anteriormente. Por defecto, será «tarball» (tar).
- INSTALL_RKE2_TYPE: con esta otra variable se fijará según quieras actualizar un nodo del tipo server o agent.
- INSTALL_RKE2_VERSION: esta tercera variable definirá la versión de Kubernetes y RKE2 a la que quieres actualizar con el siguiente formato: vX.Y.Z+rke2rN. En caso de no fijar la versión, se actualizará a la última versión estable liberada.
Para este ejemplo, fija las variables con los siguientes valores y de la siguiente forma:
export INSTALL_RKE2_METHOD=tar
export INSTALL_RKE2_TYPE=server
export INSTALL_RKE2_VERSION=v1.26.7+rke2r1
Una vez fijadas estas variables, descarga el script, dale los permisos necesarios y ejecútalo.
curl -sfL https://get.rke2.io > /tmp/rke2-script.sh
chmod 755 /tmp/rke2-script.sh
/tmp/rke2-script.sh
Cuando el script se ejecute, podrás volver a arrancar el servicio de RKE2 y comprobarás que la versión es la que has fijado.
service rke2-server start
rke2 --version
Comprueba que la versión desplegada es la que habías fijado en las variables, y con esto finaliza la actualización del nodo.
Como hemos comentado anteriormente, en caso de querer actualizar un nodo de tipo agent, el proceso es el mismo. Además, si quieres desplegar una versión inferior de Kubernetes, también sería posible sin problema, ya que este proceso admite tanto el upgrade como el downgrade de versiones.
Cabe destacar que, en caso de que la instalación previa tuviera algún tipo de configuración personalizada (por ejemplo el directorio de ejecución de los servicios de RKE2), con esta actualización se perdería y tendrías que modificarlo de nuevo.
Conclusiones
RKE2 es una solución óptima y muy usada para montar un clúster de Kubernetes. Aunque su documentación es muy útil, en ocasiones puede llegar a pasar por alto algunos detalles.
Siguiendo este tutorial, se podrá cambiar la versión de RKE2 sin problemas, facilitando tanto la actualización de versión de Kubernetes como una posible vuelta atrás en caso de necesitarla. Como hemos mostrado, este proceso parece sencillo, pero es muy importante seguir los pasos estrictamente, ya que en caso de fallo, se pueden perder datos.