---
myst:
html_meta:
"description": "Upgrade the Plone image and the cdk8s-plone library, roll out changes safely, and roll back a failed update."
"property=og:description": "Upgrade the Plone image and the cdk8s-plone library, roll out changes safely, and roll back a failed update."
"property=og:title": "Upgrade and roll out"
"keywords": "Plone, cdk8s, Kubernetes, upgrade, rollout, rolling update, rollback, migration"
---
# Upgrade and roll out
This guide shows you how to upgrade the Plone images and the `cdk8s-plone` library, roll the change out safely, and roll it back if it fails.
## Prerequisites
- A working Plone deployment created with `cdk8s-plone`.
- Two or more replicas if you need a zero-downtime rollout. See {doc}`/how-to/scale-and-high-availability`.
## Upgrade the Plone image
Change the `image` tag on `backend` and `frontend` to the new version.
```typescript
backend: {
image: 'plone/plone-backend:6.1.4',
},
frontend: {
image: 'plone/plone-frontend:16.1.0',
}
```
Pin a specific tag rather than `latest`, so the rollout is reproducible and you can roll back to a known version.
Regenerate the manifests and apply them:
```shell
cdk8s synth
kubectl apply -f dist/
```
Kubernetes replaces the pods with the default RollingUpdate strategy.
With two or more replicas and a PodDisruptionBudget, the old pods drain only as new pods become ready.
```{important}
Upgrading to a new Plone major or minor version may require a Plone site upgrade step that `cdk8s-plone` does not perform.
After the new backend pods are ready, run the upgrade from the Plone control panel (`@@plone-upgrade`) on the maintenance or uncached route.
```
## Watch the rollout
Follow the rollout and confirm it completes.
```shell
kubectl rollout status deployment/ -n
kubectl get pods -n -w
```
## Roll back a failed upgrade
If the new version misbehaves, undo the rollout to the previous ReplicaSet:
```shell
kubectl rollout undo deployment/ -n
```
To return to a known-good definition instead, restore the previous image tag in your code, then `cdk8s synth` and `kubectl apply -f dist/` again.
```{warning}
A rollback reverts the container image, not your data.
If the upgrade ran an irreversible Plone site migration, restore the database from a backup. See {doc}`/how-to/backup-and-restore`.
```
## Upgrade the cdk8s-plone library
Bump the dependency, regenerate, and review the manifest diff before applying.
```shell
npm install @bluedynamics/cdk8s-plone@latest
cdk8s synth
git diff dist/
```
Read the [changelog](https://github.com/bluedynamics/cdk8s-plone/releases) for renamed or deprecated options, then apply the reviewed manifests.
## See also
- {doc}`/how-to/scale-and-high-availability` — replicas and PodDisruptionBudget for zero-downtime rollouts.
- {doc}`/how-to/backup-and-restore` — back up before a risky upgrade.
- {doc}`/reference/api/index` — authoritative option reference for each release.