Najpierw aktualizujemy nody Master następnie workery. Aktualizujemy do najnowszej wersji pomocniczej (minor) następnie do najnowszej następnej wersji minor 
1.27.7 -> 1.27.11 -> 1.28.11 -> 1.29.5
Dostępne wersje możemy sprawdzić na stronie https://github.com/rancher/rke2/releases
Automatyczna aktualizacja
Na podstawie https://docs.rke2.io/upgrades/automated_upgrade
Przygotowanie komponentów
Instalacja system-upgrade-controller. (Sprawdzić czy nie ma nowej wersji) https://github.com/rancher/system-upgrade-controller/releases
W url podmieniamy xxxxxxx na aktualny numer wersji np” v0.13.4
# kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/download/xxxxxxx/system-upgrade-controller.yaml
Przygotować plan aktualizacji osobno dla nodów master i worker
# cd /opt/kubernetes/auto-upgarde
# nano upgrade_plan.yaml
# Server plan
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
  name: server-plan
  namespace: system-upgrade
  labels:
    rke2-upgrade: server
spec:
  concurrency: 1
  nodeSelector:
    matchExpressions:
       - {key: rke2-upgrade, operator: Exists}
       - {key: rke2-upgrade, operator: NotIn, values: ["disabled", "false"]}
       # When using k8s version 1.19 or older, swap control-plane with master
       - {key: node-role.kubernetes.io/control-plane, operator: In, values: ["true"]}
  tolerations:
  - key: "CriticalAddonsOnly"
    operator: "Equal"
    value: "true"
    effect: "NoExecute"
  serviceAccountName: system-upgrade
  cordon: true
#  drain:
#    force: true
  upgrade:
    image: rancher/rke2-upgrade
  version: v1.27.7-rke2r2
---
# Agent plan
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
  name: agent-plan
  namespace: system-upgrade
  labels:
    rke2-upgrade: agent
spec:
  concurrency: 1
  nodeSelector:
    matchExpressions:
      - {key: rke2-upgrade, operator: Exists}
      - {key: rke2-upgrade, operator: NotIn, values: ["disabled", "false"]}
      # When using k8s version 1.19 or older, swap control-plane with master
      - {key: node-role.kubernetes.io/control-plane, operator: NotIn, values: ["true"]}
  prepare:
    args:
    - prepare
    - server-plan
    image: rancher/rke2-upgrade
  serviceAccountName: system-upgrade
  cordon: true
  drain:
    force: true
  upgrade:
    image: rancher/rke2-upgrade
  version: v1.27.7-rke2r2
Dodajemy etykiety do wszystkich nodów
# kubectl label node --all rke2-upgrade=true
Upgrade klastra
Sprawdzamy aktualną wersję
# kubectl get nodes
Zmieniamy w upgrade_plan.yaml version pilnując ścieżki upgrade i aplikujemy nowy plan
# kubectl apply -f upgrade_plan.yaml
Zaraz po aplikacji nowego plany rozpocznie sie upgrade klastra
Możemy sprawdzić działanie
# kubectl -n system-upgrade get plans -o yaml
# kubectl -n system-upgrade get jobs -o yaml
# kubectl get nodes
Mialem przypadek, że jeden z nodów nie chał się zaktualizować automatycznie. Aby rozwiązać problem skasowałem plan i wykonałem aktualizacje ręczną tego noda.
# kubectl delete -f upgrade_plan.yaml
Zdarzyło mi się, że po aktualizacji ręcznej system nadal cały czas próbuje go zaktualizować blokując noda. Aby usunąć problem odczytałem z innego noda label „plan.upgrade.cattle.io/agent-plan” i nadpisałem label w problematycznym nodzie.
# kubectl get node NODE-NAME-OK -o yaml
...
metadata:
  labels:
    plan.upgrade.cattle.io/agent-plan: xxxxxxxx
...
# kubectl label node NODE-NAME-PROBLEM plan.upgrade.cattle.io/server-plan=xxxxxxxx --overwrite
lub w przypadku workera
# kubectl label node NODE-NAME-PROBLEM plan.upgrade.cattle.io/agent-plan=xxxxxxxx --overwrite
# kubectl uncordon k8s-worker02
Ręczna aktualizacja
Na każdym nodzie MASTER uruchamiamy
# kubectl cordon NODE-NAME -  zapobiega uruchomieniu nowych podów
# kubectl drain --ignore-daemonsets NODE-NAME - migruje pody zwalniając noda
# curl -sfL https://get.rke2.io/ | INSTALL_RKE2_VERSION=v1.27.12+rke2r1 sh -
# systemctl restart rke2-server
# kubectl uncordon NODE-NAME
Na każdym workerze
# kubectl cordon NODE-NAME
# kubectl drain --ignore-daemonsets NODE-NAME
# curl -sfL https://get.rke2.io/ | INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_VERSION=v1.27.12+rke2r1 sh -
# systemctl restart rke2-agent
# kubectl uncordon NODE-NAME