How to upgrade your deployment

See also: Juju Roadmap & Releases

This document shows how to upgrade your deployment – the general logic and order, whether you upgrade in whole or in part, whether you are on Kubernetes or machines.

This typically involves upgrading Juju itself – the client, the controller (i.e., all the agents in the controller model + the internal database), and the models (i.e., all the agents in the non-controller models). Additionally, for all the applications on your models, you may want to upgrade their charm.

None of these upgrades are systematically related (e.g., compatibility between Juju component versions is based on overlap in the supported facades, and compatibility between charms and Juju versions is charm-specific, so to know if a particular version combination is possible you’ll need to consult the release notes for all these various parts).

See more: Upgrading things, Cross-version compatibility in Juju, Juju Roadmap & Releases, individual charm releases

However, in principle, you should always try to keep all the various pieces up to date, the main caveats being that the Juju components are more tightly coupled to one another than to charms and that, due to the way controller upgrades work, keeping your client, controller, and models aligned is quite different if you’re upgrading your Juju patch version vs. minor or major version.

Upgrade your Juju components’ patch version

e.g., 3.4.4 → 3.4.5

  1. Upgrade the client’s patch version to stable.
  2. Upgrade the controller’s patch version to the stable version.
  3. For each model on the controller: Upgrade the model’s patch version to the stable version. Optionally, for each application on the model: Upgrade the application’s charm.

Example workflow
snap refresh juju --channel 3.3/stable
juju switch <target controller>
juju upgrade-controller 
juju upgrade-model -m <target model>
juju refresh <charm>

See more:

Upgrade your Juju components’ minor or major version

e.g., 3.5 → 3.6 or 2.9 → 3.0

For best results, perform a patch upgrade first.

  1. Upgrade your client to the target minor or major.
  2. It is not possible to upgrade a controller’s minor or major version in place. Use the upgraded client to bootstrap a new controller of the target version.
  3. Clone your old controller’s users, permissions, configurations, etc., into the new controller (only supported for machine controllers).
  4. Migrate your old controller’s models to the new controller and upgrade them to match the version of the new controller. Optionally, for each application on the model: Upgrade the application’s charm.
  5. Help your users connect to the new controller.

Example workflow
# Upgrade the client to the version you want for your controller:
snap refresh juju --channel=<target controller version>

# Use the new client to bootstrap a controller:
juju bootstrap <cloud> newcontroller

# Create a backup of the old controller's controller model 
# and make note of the path to the backup file:
juju create-backup -m oldcontroller:controller
# Sample output:
# >>> ...
# >>>  Downloaded to juju-backup-20221109-090646.tar.gz

# Download the stand-alone juju-restore tool:
wget https://github.com/juju/juju-restore/releases/latest/download/juju-restore
chmod +x juju-restore

# Switch to the new controller's controller model:
juju switch newcontroller:controller

# Copy the juju-restore tool to the primary controller machine:  
juju scp juju-restore 0:

# Copy the backup file to the primary controller machine:
juju scp <path to backup> 0:

# SSH into the primary controller machine:
juju ssh 0

# Start the restore with the '--copy-controller' flag:
./juju-restore --copy-controller <path to backup>
# Congratulations, your <old version> controller config has been cloned into your <new version> controller.

# Switch to the old controller:
juju switch oldcontroller

# Migrate your models to the new controller:
juju migrate <model> newcontroller


# Switch to the new controller:
juju switch newcontroller

# Upgrade the migrated models to match the new controller's agent version:
juju upgrade-model --agent-version=<new controller's agent version>


# Reset the users' passwords to get a new registration string
# that they can use to connect to the new controller:
juju change-user-password <user> --reset
# >>> Password for "<user>" has been reset.
# >>> Ask the user to run:
# >>>     juju register 
# >>> MEcTA2JvYjAWExQxMC4xMzYuMTM2LjIxNToxNzA3MAQgJCOhZjyTflOmFjl-mTx__qkvr3bAN4HAm7nxWssNDwETBnRlc3QyOQAA
# When they use this registration string, they will be prompted to create a login for the new controller.


See more:

Contributors: @FaQ, @massigori, @simonrichardson, @tmihoc, @wallyworld

–agent-version=3.0.0 or the like is required here, otherwise the upgrade won’t find it - it’ll be looking for newer versions of 2.9 by default.

1 Like

Updated, thanks! (I had this in an earlier version of the doc and then lost it somehow.)

Its mentioned a tool here “the stand-alone juju-restore tool” but there is no link to it which makes the documentation somewhat incomplete.

I’ll try find it.

Thanks for catching this, @erik-lonroth, I’ve added a link now. It’s this one here: https://github.com/juju/juju-restore

1 Like

This page is titled “from 2.9 to 3.x” but it seems you can’t actually easily upgrade from 2.9 to 3.1. This is maybe alluded to with the note of

While you need a 3.x client to bootstrap a 3.x controller, you can technically continue to manage a 3.x controller with a 2.9 client, at least until Juju release 3.1 ."

If you switch to 3.1, bootstrap a controller, once you switch back to the 2.9.42 controller it won’t connect so you have to downgrade back to the 2.9 client at least.

If the intended path is truly 2.9->3.0->3.1 then the page should be updated to reflect that explicitly, especially now that 3.1 is out.

1 Like

Hi @lathiat, thanks for your feedback. Insofar as I know, you should be able to upgrade from 2.9.x to 3.1 in one step. But I will double-check.

Hi,

after spinning a new 3.1 controller and importing all data from a 2.9.42 controller i cannot import models into the new controller.

infact when i issue a migrate command the migration starts but than hangs saying (json output):

“model-status”: { “current”: “available”, “message”: “migrating: aborted, removing model from target controller: model data transfer failed, failed to import model into target controller: remote-applications: version 3 not valid (not val id)”, “since”: “14 Apr 2023 17:24:57+02:00” },

what am i missing?

forgot to add: i’m using juju 2.9 client as when trying to use the 3.1 version it stops immediately

ERROR juju client with major version 3 used with a controller having major version 2 not supported

update your juju client to match the version running on the controller

There are some migration issues with importing to juju 3.1.0 which are fixed in the current 3.1 candidate. We’ll have to see if this is one of them. I don’t have a release date, but soon.

1 Like

The other thing would be nice to have in this guide are steps to get the current model in a clean state. Particularly, I have seen cases where the user needs to run mongo purge before re-trying a failed migration, and increasing agent-ratelimit-max that always make model migrations to fail.

The See more: How to upgrade a model link points to a archived link, which I was able to seen only after login. I believe the new link is How to manage models

1 Like

Fixed, thanks!

1 Like

Step 4 says to upgrade juju client to 3.x but then juju create-backup fails

juju create-backup -m ...
ERROR juju client with version 3.1 used with a controller having major version 2 not supported
re-install your juju client to match the version running on the controller

Another thing is backing up container controller

$ juju create-backup -m ...
ERROR Juju command "create-backup" not supported on container controllers

There is a note saying If your deployment is on Kubernetes: You will have to replicate this logic manually. but no details, like what to backup.

Hello @tmihoc,

Could you help us to solve how to backup for if the deployment is on K8s?

Many thanks.

Hi @marosg & @amo-mycena,

We currently don’t support backups on Kubernetes. There is a bit of enablement work we need to do to have this supported. At the moment we don’t advertise Kubernetes controllers as a production support Juju because of this and our ability to not provide HA.

The steps above for manually cloning a controller is different and not a backup. The steps involved logging into the Mongo database container and exporting several collections and then importing these into the new Database.

I will have a talk with @wallyworld and we will get these written in a formal manner for someone to follow.

1 Like

Hi,

It is great now that we have the Juju roadmap and release schedule, but I think some extra clarity would be great regarding upgrade paths now that we have some more minor versions, and 3.5 (LTS) is soon to be released, so I’m basically getting back to the question from @lathiat one year ago.

It is clear that minor versions (3.1->3.2, 3.2->3.3 and so on) can’t be carried out without model migration, but when migrating from 2.9 to 3.latest with as few migrations as possible, can we expect LTS->LTS to work, i.e. 2.9->3.5 directly or will certain stops in between be required?

Thanks in advance!

Hi @hallback , this doc might help: https://juju.is/docs/juju/juju-version-compatibility-matrix Do let me know if if it still has issues (e.g., missing info or unclear) and I’ll work to improve it.

1 Like