Update a Deployment Without Downtime [page]deterministic
This page shows how to update a running Deployment to a new version using a rolling update. A rolling update gradually replaces old Pods with new ones, so your application remains available throughout the process.
##
- Trigger a rolling update on a Deployment.
- Monitor rollout progress.
- Pause and resume the rollout.
- Configure rolling update strategy parameters.
- (If required) Roll back to a previous revision.
##
You need an existing Deployment. If you do not have one, create the nginx Deployment from [Run a Stateless Application Using a Deployment](/docs/tasks/run-application/run-stateless-application-deployment/):
```shell kubectl apply -f https://k8s.io/examples/application/deployment.yaml ```
Verify the Deployment runs two Pods:
```shell kubectl get deployment nginx-deployment ```
The output is similar to:
``` NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 2/2 2 2 10s ```
## Performing a rolling update
Any change to the `.spec.template` field of a Deployment triggers a rolling update. Kubernetes creates new Pods with the updated configuration and gradually terminates old Pods.
### Updating with `kubectl apply`
You can trigger a rolling update by editing the Deployment manifest and applying the change. This approach works well when you keep manifests in version control.
Export the current Deployment to a local file:
```shell kubectl get deployment nginx-deployment -o yaml > /tmp/nginx-deployment.yaml ```
Edit `/tmp/nginx-deployment.yaml` and change `.spec.template.spec.containers[0].image` from `nginx:1.14.2` to `nginx:1.16.1`.
Before applying, compare your local changes against the cluster state:
```shell kubectl diff -f /tmp/nginx-deployment.yaml ```
The output is similar to:
``` diff -u -N /tmp/LIVE/apps.v1.Deployment.default.nginx-deployment /tmp/MERGED/apps.v1.Deployment.default.nginx-deployment --- /tmp/LIVE/apps.v1.Deployment... +++ /tmp/MERGED/apps.v1.Deployment... @@ -29,7 +29,7 @@ containers: - - image: nginx:1.14.2 + - image: nginx:1.16.1 name: nginx ```
Apply the updated manifest:
```shell kubectl apply -f /tmp/nginx-deployment.yaml ```
### Updating only the container image
To update the container image without editing a manifest file, use `kubectl set image`:
```shell kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 ```
The output is similar to:
``` deployment.apps/nginx-deployment image updated ```
Verify the image was updated:
```shell kubectl get deployment nginx-deployment -o jsonpath='{.spec.template.spec.containers[0].image}' ```
The output is similar to:
``` nginx:1.16.1 ```
## Monitoring rollout progress
Use `kubectl rollout status` to watch the progress of a rolling update:
```shell kubectl rollout status deployment/nginx-deployment ```
The output is similar to:
``` Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination... deployment "nginx-deployment" successfully rolled out ```
After the rollout completes, verify the Deployment:
```shell kubectl get deployment nginx-deployment ```
The output is similar to:
``` NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 2/2 2 2 2m ```
## Pausing and resuming a rollout
You can pause a rollout to inspect a partial update or to batch multiple changes into a single rollout.
### Pausing a rollout
```shell kubectl rollout pause deployment/nginx-deployment ```
The output is similar to:
``` deployment.apps/nginx-deployment paused ```
### Making additional changes while paused
While the rollout is paused, you can make additional changes. These changes do not trigger a new rollout until you resume:
```shell kubectl …(trimmed)