Kubernetes – rke2 upgrade

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/upgrade/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
Posted in Linux.