Devo dare una mano a dei cari colleghi su un aggiornamento di k8s tramite Kubespray. Ho deciso quindi di lasciare questo diaro di bordo che racconta come ho aggiornato k8s sul mio cluster di lab con kubespray.

Alcune premesse:

  1. Procedere su ambiente sandbox prima che si voglia procedere in produzione
  2. Sul repo di kubespray viene appositamente utilizzata un’immagine docker ad-hoc per ogni release in modo da essere sempre sicuri di utilizzare le versione di Python e Ansible siano corrette.

In questo articolo procederò sia “manualmente” che tramite una pre-built docker image.

Check versione attuale k8s e repo git Kubespray

[root@k8s1 ~]# kubectl version

Server Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.7", GitCommit:"42c05a547468804b2053ecf60a3bd15560362fc2", GitTreeState:"clean", BuildDate:"2022-05-24T12:24:41Z", GoVersion:"go1.17.10", Compiler:"gc", Platform:"linux/amd64"}

La mia attuale versione di kube è la 1.23.7 e necessita quindi di un aggiornamento. Porterò il cluster fino alla versione v1.27.7.

Partirò dal tag v2.23.0 in quanto ho una versione troppo datata di k8s e non vorrei avere problemi con l’ultimo tag disponibile.

~/WORK/kimsufi/kubespray$ git checkout v2.23.0
Previous HEAD position was 4014a1ccc fix multus include (#10105)
HEAD is now at c33e4d7bb fix-resolv.conf-nameserver-inline-comments (#10415)

Nella sezione requirements https://github.com/kubernetes-sigs/kubespray/tree/v2.23.0#requirements potete verificare le versioni di Ansible e di Kubernetes supportate nella release di Kubespray selezionata.

Inizio con il primo upgrade alla versione di kube v.1.24.0

ansible-playbook upgrade-cluster.yml -b -i inventory/kimsufi/inventory.ini -e kube_version=v1.24.0

La mia attuale versione di Ansible non è compatibile con i prossimi aggiornamenti. Scelgo quindi una versione più recente (ma non troppo nuova) per i prossimi jump.

sudo python3 -m pip install --user ansible==7.4.0

sudo pip3 install ansible-core==2.14.11 (come suggerito qui https://github.com/kubernetes-sigs/kubespray/issues/10688) per evitare l’errore ottenuto in una prova precedente:

“The conditional check ‘groups.get(‘kube_control_plane’)’ failed. The error was: Conditional is marked as unsafe, and cannot be evaluated.” #10688

Eseguo upgrade a v1.25.0 e vari hop successivi.

Lancio apposito playbook di upgrade ovvero upgrade-cluster.yml (come riportato anche nella doc).

ansible-playbook upgrade-cluster.yml -b -i inventory/kimsufi/inventory.ini -e kube_version=v1.25.0

ansible-playbook upgrade-cluster.yml -b -i inventory/kimsufi/inventory.ini -e kube_version=v1.26.0

ansible-playbook upgrade-cluster.yml -b -i inventory/kimsufi/inventory.ini -e kube_version=v1.27.0

The Easy Way (to 1.27.7)

La modalità più facile per l’upgrade è utilizzare l’immagine suggerita nel README.md di Kubespray tramite la comodissima pre-built docker image. L’ultimo hop verso 1.27.7 espresso in questa guida sarà eseguito così.

[root@k8s1 kubespray]# podman run --rm -it --mount type=bind,source="$(pwd)"/inventory/sample,dst=/inventory \
>   --mount type=bind,source="${HOME}"/.ssh/id_rsa,dst=/root/.ssh/id_rsa \
>   quay.io/kubespray/kubespray:v2.23.1 bash

ansible-playbook upgrade-cluster.yml -b -i /inventory/inventory.ini # Ansible viene lanciato direttamente dentro il container.

Upgrade a Mandala v1.29

Come emerge qui per ora le ultimissime versioni di Kube sono solo supportate nel branch Master. https://github.com/kubernetes-sigs/kubespray/issues/10611. Nel prossimo post quindi partiremo dal branch master o ci sarà un tag apposito con supporto alle versioni 1.28 e 1.29 per poi provare le ultime novità di Mandala.