k3sup es una herramienta que permite instalar clústers de Kubernetes basados en K3s en menos de un minuto. Pero acabo de descubrir que además, también permite actualizar el clúster.

A través de las respuestas al issue [Documentation] Upgrading k3s master and workers to newer versions of k3s he descubierto que relanzando el script sobre un clúster existente, se actualiza la versión de k3s (sólo las actualizaciones de patch). En mi caso, he pasado de 1.19.4 a 1.19.16.

La actualización se realiza porque no se especifica una versión concreta con el parámetro --k3s-version.

Para actualizar a una versión minor, debe especificarse en la versión como parámetro de k3sup (tanto el de instalación como el de join) de los nodos del clúster. He modificado el script que uso (del que ya hablé en Provisionar Kubernetes con Vagrant y k3sup) para crear el clúster sobre máquinas Vagrant añadiendo la última versión de k3s:

El script se encuentra en el repositorio onthedock/vagrant: k3s-cluster-install.sh

#!/usr/bin/env bash

IPControlPlaneNode=192.168.1.101
IPWorkerNode1=192.168.1.102
IPWorkerNode2=192.168.1.103
REMOTE_USER=operador
K3S_VERSION="v1.22.3+k3s1"

# Install the ControlPlane
k3sup install --ip $IPControlPlaneNode \
              --user $REMOTE_USER \
              --k3s-extra-args='--flannel-iface enp0s8' \
              --k3s-version $K3S_VERSION
              
# Install the agents/worker nodes
k3sup join --ip $IPWorkerNode1 \
           --server-ip $IPControlPlaneNode\
           --user $REMOTE_USER\
           --k3s-extra-args='--flannel-iface enp0s8' \
           --k3s-version $K3S_VERSION

k3sup join --ip $IPWorkerNode2 \
           --server-ip $IPControlPlaneNode \
           --user $REMOTE_USER \
           --k3s-extra-args='--flannel-iface enp0s8' \
           --k3s-version $K3S_VERSION

Sí, todavía sigo sin resolver el issue #1 : El nombre de la tarjeta de red “bridged” está fijado en el Vagrantfile.

He probado la actualización en un clúster prácticamente vacío; sólo había desplegado Longhorn. La actualización ha vuelto a configurar la storageClass local-path como storageClass por defecto del clúster:

$ kubectl get storageclass
NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
longhorn (default)     driver.longhorn.io      Delete          Immediate              true                   3h38m
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  46d

Como se indica en la documentación de Kubernetes Change the default StorageClass:

If two or more of them are marked as default, a PersistentVolumeClaim without storageClassName explicitly specified cannot be created.

Por tanto, como siempre, antes de realizar una actualización de este tipo asegúrate de tener un backup del clúster.

Dejando sólo una storageClass por defecto

En mi caso, solucionar el problema de múltiples storageClass por defecto es sencillo; sólo una storageClass en el clúster debe incluir la anotación storageclass.kubernetes.io/is-defult-class=true; el resto deben tener el valor a false.

Modificamos el valor para la storageClass local-path:

kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

Y validamos que sólo tenemos una storageClass por defecto:

$ kubectl get storageclass
NAME                 PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
longhorn (default)   driver.longhorn.io      Delete          Immediate              true                   3h43m
local-path           rancher.io/local-path   Delete          WaitForFirstConsumer   false                  46d

Tengo pendiente probar las actualizaciones mediante el System Upgrade Controller propio de Rancher: Upgrade a K3s Kubernetes Cluster with System Upgrade Controller.

Actualizando kubectl

Al haber instalado Kubernetes 1.22, las versiones de kubectl soportadas son 1.21, 1.22 y 1.23… Así que toca actualizar:

$ kubectl version --short
Client Version: v1.19.4
Server Version: v1.22.3+k3s1

Seguimos las instrucciones de la documentación oficial para Instalar y Configurar kubectl (la última versión disponible, 1.22):

curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"

Instalamos:

sudo install kubectl /usr/local/bin

Y validamos que se ha actualizado a la última versión:

$ kubectl version --short
Client Version: v1.22.3
Server Version: v1.22.3+k3s1