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.