[K3s] Upgrade Plan apt

Een voorbeeld script om een Plan te maken die een ‘apt upgrade‘ doet op de nodes die een specifiek label hebben. Als eerste worden de instructies voor Ubuntu in een ‘secret‘ geplaatst. Het manifest secret.yml:

---
apiVersion: v1
kind: Secret
metadata:
  name: apt-upgrade
  namespace: system-upgrade
type: Opaque
stringData:
  upgrade.sh: |
    #!/bin/sh
    set -e
    secrets=$(dirname $0)
    apt-get --assume-yes update
    apt-get --assume-yes upgrade
    if [ -f /var/run/reboot-required ]; then
      cat /var/run/reboot-required
      reboot
    fi

Een Plan zal deze secret oppakken en de data als een bash-script in een directory plaatsen en uitvoeren. Het manifest plan.yml:

---
apiVersion: upgrade.cattle.io/v1
kind: Plan

metadata:
  name: apt-upgrade
  namespace: system-upgrade

spec:
  concurrency: 1
  version: focal

  tolerations:
    - key: "node-role.kubernetes.io/master"
      operator: "Exists"
      effect: "NoSchedule"
  
  nodeSelector:
    matchExpressions:
      - {key: apt-upgrade, operator: In, values: ["enabled"]}
      - {key: apt-upgrade, operator: Exists}
  
  serviceAccountName: system-upgrade
  
  secrets:
    - name: apt-update
      path: /host/run/system-upgrade/secrets/apt-update
  
  drain:
    # deleteLocalData: true  # default
    # ignoreDaemonSets: true # default
    force: true
  
  upgrade:
    image: ubuntu
    command: ["chroot", "/host"]
    args: ["sh", "/run/system-upgrade/secrets/apt-update/upgrade.sh"]

Enkele highlights:

version: focal

Het OS van de nodes is Ubuntu 20.04 en de DevlopmentCodeName hiervan is ‘focal’. Het Plan zal als image ubuntu:focal ophalen om de apt-upgrade uit te voeren.

tolerations:
    - key: "node-role.kubernetes.io/master"
      operator: "Exists"
      effect: "NoSchedule"

Bij een Multi-node-cluster willen we de upgrade ook op de master-node uitvoeren en daarom dient een toleration aanwezig te zijn. Deze optie is bij de HA-Cluster niet nodig omdat hierin de nodes alle rollen vervullen.

nodeSelector:
    matchExpressions:
      - {key: apt-upgrade, operator: In, values: ["enabled"]}
      - {key: apt-upgrade, operator: Exists}

De nodes die ge-upgrade dienen te worden moeten een specifiek label hebben.

Beide manifest toeveogen aan de namespace system-upgrade:

$ kubectl -n system-upgrade apply -f secret.yml
$ kubectl -n system-upgrade apply -f plan.yml

Nu is een een kwestie van het label plaatsen op de nodes die een upgrade nodig hebben.

$ kubectl label node rpi-1 rpi-2 rpi-3 apt-upgrade=enabled

De log-output van de upgrade job:

In dit geval is er geen upgrade nodig en zal de node ook niet herstart hoeven te worden.

In de Rancher GUI kunnen we de Jobs zien die de upgrades uitvoeren.

Nadat de een job Completed is zal de node weer ‘Uncordened‘ worden.