Upgrade
All components in Elemental are managed using Kubernetes. Below is how to use Kubernetes approaches to upgrade the components.
Elemental node upgrade​
Elemental nodes are upgraded with the Elemental Operator. Refer to the Elemental Operator documentation for complete information.
Upgrade can be achieve either with CLI or UI:
Upgrade via command line interface​
There are two ways of selecting nodes for upgrading. Via a cluster target, which will match ALL nodes in a cluster that matches our selector or via node selector, which will match nodes based on the node labels. Node selector allows us to be more targeted with the upgrade while cluster selector just selects all the nodes in a matched cluster.
Updating an existing ManagedOSImage
will trigger a new upgrade cycle, to reconcile the configured image (or image version) to all targeted nodes.
- With 'clusterTarget'
- With nodeSelector
- With FORCE flag
- With UPGRADE_RECOVERY flag
You can target nodes for an upgrade via a clusterTarget
by setting it to the cluster name that you want to upgrade.
All nodes in a cluster that matches that name will match and be upgraded.
apiVersion: elemental.cattle.io/v1beta1
kind: ManagedOSImage
metadata:
name: my-upgrade
namespace: fleet-default
spec:
# Set to the new Elemental version you would like to upgrade to or track the latest tag
osImage: "registry.suse.com/suse/sle-micro/5.5:latest"
clusterTargets:
- clusterName: my-cluster
You can target nodes for an upgrade via a nodeSelector
by setting it to the label and value that you want to match.
Any nodes containing that key with the value will match and be upgraded.
apiVersion: elemental.cattle.io/v1beta1
kind: ManagedOSImage
metadata:
name: my-upgrade
namespace: fleet-default
spec:
# Set to the new Elemental version you would like to upgrade to
osImage: "registry.suse.com/suse/sle-micro/5.5:latest"
clusterTargets:
- clusterName: my-cluster
nodeSelector:
matchLabels:
kubernetes.io/hostname: my-machine
When upgrading to an older version or the same version that is already running the upgrade-procedure will be skipped.
It is possible to force upgrades to older versions by setting the FORCE environment variable as shown below.
apiVersion: elemental.cattle.io/v1beta1
kind: ManagedOSImage
metadata:
name: my-upgrade
namespace: fleet-default
spec:
# Set to the new Elemental version you would like to upgrade to
osImage: "registry.suse.com/suse/sle-micro/5.5:latest"
clusterTargets:
- clusterName: my-cluster
upgradeContainer:
envs:
- name: FORCE
value: "true"
You can decide upgrade the Recovery partition when upgrading the system, or alternatively to upgrade the Recovery partition only.
apiVersion: elemental.cattle.io/v1beta1
kind: ManagedOSImage
metadata:
name: my-upgrade-recovery
namespace: fleet-default
spec:
# Set to the new Elemental version you would like to upgrade to
osImage: "registry.suse.com/suse/sle-micro/5.5:latest"
clusterTargets:
- clusterName: my-cluster
upgradeContainer:
envs:
# Use UPGRADE_RECOVERY_ONLY to upgrade the recovery partition only. (This has the same effect as FORCE="true")
- name: UPGRADE_RECOVERY_ONLY
value: "false"
# Use UPGRADE_RECOVERY to upgrade both system and recovery partitions.
- name: UPGRADE_RECOVERY
value: "true"
Selecting source for upgrade​
- Via 'osImage'
- Via 'ManagedOSVersion'
Just specify an OCI image on the osImage
field
apiVersion: elemental.cattle.io/v1beta1
kind: ManagedOSImage
metadata:
name: my-upgrade
namespace: fleet-default
spec:
# Set to the new Elemental version you would like to upgrade to or track the latest tag
osImage: "registry.suse.com/suse/sle-micro/5.5:latest"
clusterTargets:
- clusterName: my-cluster
In this case we use the auto populated ManagedOSVersion
resources to set the wanted managedOSVersionName
field.
See section Managing available versions to understand how the ManagedOSVersion
are managed.
apiVersion: elemental.cattle.io/v1beta1
kind: ManagedOSImage
metadata:
name: my-upgrade
namespace: fleet-default
spec:
# Set to the new ManagedOSVersion you would like to upgrade to
managedOSVersionName: v0.1.0-alpha22-amd64
clusterTargets:
- clusterName: my-cluster
If both osImage
and ManagedOSVersion
are defined in the same ManagedOSImage
be aware that osImage
takes precedence.
Managing available versions​
An ManagedOSVersionChannel
resource can be created in a Kubernetes cluster where the Elemental operator is installed to synchronize available versions for upgrades.
It has a syncer in order to generate ManagedOSVersion
automatically. Currently, we provide a json syncer and a custom one.
- Json syncer
- Custom syncer
This syncer will fetch a json from url and parse it into valid ManagedOSVersion
resources.
apiVersion: elemental.cattle.io/v1beta1
kind: ManagedOSVersionChannel
metadata:
name: elemental-versions
namespace: fleet-default
spec:
options:
URI: "https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/upgrade/versions.json"
Timeout: "1m"
type: json
A custom syncer allows more flexibility on how to gather ManagedOSVersion
by allowing custom commands with custom images.
This type of syncer allows to run a given command with arguments and env vars in a custom image and output a json file to /data/output
.
The generated data is then automounted by the syncer and then parsed so it can gather create the proper versions.
The only requirement to make your own custom syncer is to make it output a json file to /data/output
and keep the correct json structure.
Elemental project provides a channel to list all ManagedOSVersions
released as a custom syncer.
See the channel resource definition below:
apiVersion: elemental.cattle.io/v1beta1
kind: ManagedOSVersionChannel
metadata:
name: elemental-channel
namespace: fleet-default
spec:
options:
image: registry.suse.com/rancher/elemental-channel:latest
type: custom
In both cases the file that the operator expects to parse is a json file with the versions on it as follows
[
{
"metadata": {
"name": "my-flavor-v0.1.0"
},
"spec": {
"version": "v0.1.0",
"type": "container",
"metadata": {
"upgradeImage": "foo/bar-os:v0.1.0-myflavor",
"displayName": "Foo Bar OS - My Flavor"
}
}
},
{
"metadata": {
"name": "my-flavor-v0.1.0-iso"
},
"spec": {
"version": "v0.1.0",
"type": "iso",
"metadata": {
"uri": "foo/bar-iso:v0.1.0-myflavor",
"displayName": "Foo Bar ISO - My Flavor"
}
}
}
]
Upgrade via user interface​
To upgrade via the UI, you have to go in the Elemental Advanced menu, then click on Update Groups
.
Choose a name, select clusters to target and choose between the two upgrade ways:
- Via Managed OS Version
- Via Image from registry
In this case, a OS Version Channels
is used to auto populated OS Versions
resources.
The channel bellow is provide by us but you can bring your own channel as well.
See section Managing available versions to understand how the ManagedOSVersion
are managed.
After a short syncing time, you will see your OS Versions
appears in the OS Versions
menu.
Finally, you can select the OS Versions
when you create your Upgrade Group
according to the following screenshot:
Just specify an OCI image on the Image path
field to upgrade to:
Click on the Create
button to start the upgrade process, if you have multiple nodes, the upgrade will be done sequentially node by node.