⎈ k8s knowledge compiler

Update a Deployment Without Downtime [page]deterministic

taskscliapiworkloads

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)

Sources

tasks/run-application/update-deployment-rolling.md · docUpdate a Deployment Without Downtime

Related (19)

part_of {{% heading "objectives" %}}describes conf=1
part_of {{% heading "prerequisites" %}}describes conf=1
part_of Performing a rolling updatedescribes conf=1
part_of Monitoring rollout progressdescribes conf=1
part_of Pausing and resuming a rolloutdescribes conf=1
part_of Configuring rolling update strategydescribes conf=1
part_of {{% heading "cleanup" %}}describes conf=1
part_of {{% heading "whatsnext" %}}describes conf=1
part_of Updating with `kubectl apply`describes conf=1
part_of Updating only the container imagedescribes conf=1
part_of Pausing a rolloutdescribes conf=1
part_of Making additional changes while pauseddescribes conf=1
part_of Resuming a rolloutdescribes conf=1
part_of Detecting a stalled rolloutdescribes conf=1
part_of Viewing rollout historydescribes conf=1
part_of Rolling back to the previous revisiondescribes conf=1
part_of Rolling back to a specific revisiondescribes conf=1
api_for Deploymentdocuments API object conf=1

← all Docs