diff --git a/.drone.yml b/.drone.yml
index d151ee3b86d6ff535b9134a915e26814f7f4795f..c8a1d9a10bba09084a022785f844b2bba1af5160 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -101,7 +101,6 @@ node:
 
 steps:
 - name: build
-  failure: ignore
   image: rancher/dapper:v0.5.8
   commands:
   - dapper ci
@@ -110,7 +109,6 @@ steps:
     path: /var/run/docker.sock
 
 - name: upload-artifacts
-  failure: ignore
   image: rancher/drone-images:github-release-s390x
   settings:
     api_key:
@@ -132,7 +130,6 @@ steps:
     - tag
 
 - name: push-controller
-  failure: ignore
   image: rancher/drone-images:docker-s390x
   volumes:
   - name: docker
@@ -250,71 +247,6 @@ volumes:
   host:
     path: /var/run/docker.sock
 
----
-kind: pipeline
-name: arm
-
-platform:
-  os: linux
-  arch: arm
-
-steps:
-- name: build
-  image: rancher/dapper:v0.5.0
-  commands:
-  - dapper ci
-  volumes:
-  - name: docker
-    path: /var/run/docker.sock
-
-- name: upload-artifacts
-  image: plugins/github-release
-  settings:
-    api_key:
-      from_secret: github_token
-    prerelease: true
-    checksum:
-    - sha256
-    checksum_file: CHECKSUMsum-arm.txt
-    checksum_flatten: true
-    files:
-    - "dist/artifacts/*"
-  when:
-    instance:
-    - drone-publish.rancher.io
-    ref:
-    - refs/head/master
-    - refs/tags/*
-    event:
-    - tag
-
-- name: push-controller
-  image: plugins/docker
-  settings:
-    dockerfile: package/Dockerfile
-    build_args:
-    - ARCH=arm
-    - TAG=${DRONE_TAG}-arm
-    password:
-      from_secret: docker_password
-    repo: "rancher/system-upgrade-controller"
-    tag: "${DRONE_TAG}-arm"
-    username:
-      from_secret: docker_username
-  when:
-    instance:
-    - drone-publish.rancher.io
-    ref:
-    - refs/head/master
-    - refs/tags/*
-    event:
-    - tag
-
-volumes:
-- name: docker
-  host:
-    path: /var/run/docker.sock
-
 ---
 kind: pipeline
 name: manifest
@@ -334,7 +266,6 @@ steps:
     platforms:
       - linux/amd64
       - linux/arm64
-      - linux/arm
       - linux/s390x
     target: "rancher/system-upgrade-controller:${DRONE_TAG}"
     template: "rancher/system-upgrade-controller:${DRONE_TAG}-ARCH"
@@ -372,7 +303,6 @@ depends_on:
 - amd64
 - s390x
 - arm64
-- arm
 
 ---
 kind: pipeline
@@ -387,3 +317,4 @@ steps:
     when:
       instance:
         - drone-publish.rancher.io
+---
diff --git a/Dockerfile.dapper b/Dockerfile.dapper
index b0bdc1a705424ab98f0597d570219e1631a176b9..ccbb29302d40b4b6bdc55a341e8b1457ecaae441 100644
--- a/Dockerfile.dapper
+++ b/Dockerfile.dapper
@@ -1,7 +1,7 @@
 ARG KUBECTL=rancher/kubectl:v1.21.9
 FROM ${KUBECTL} AS kubectl
 
-FROM golang:1.16-alpine3.14
+FROM registry.suse.com/bci/golang:1.17-11.33
 
 COPY --from=kubectl /bin/kubectl /usr/local/bin/kubectl
 # COPY --from=sonobuoy /sonobuoy /usr/local/bin/sonobuoy
@@ -9,7 +9,12 @@ COPY --from=kubectl /bin/kubectl /usr/local/bin/kubectl
 ARG DAPPER_HOST_ARCH
 ENV ARCH $DAPPER_HOST_ARCH
 
-RUN apk -U add coreutils bash expect git gcc jq musl-dev docker docker-compose vim less file curl wget ca-certificates iproute2
+RUN zypper -n install expect git jq  docker vim less file curl wget iproute2 gawk
+# Manual install of docker-compose, only needed for e2e tests on amd64
+RUN if [ "${ARCH}" == "amd64" ]; then \
+        curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose && \
+        chmod +x /usr/local/bin/docker-compose; \
+    fi
 RUN go install github.com/mgechev/revive@v1.1.1 && \
     rm -rf /go/src /go/pkg
 RUN go install golang.org/x/tools/cmd/goimports@latest && \
diff --git a/README.md b/README.md
index 57f4e6c5041821fd47ac8975203a75d2d56397c0..8b864ea733d855fbed31350aec03d89ef6138b19 100644
--- a/README.md
+++ b/README.md
@@ -113,7 +113,7 @@ spec:
   tolerations:
   - {key: kubernetes.io/arch, effect: NoSchedule, operator: Equal, value: amd64}
   - {key: kubernetes.io/arch, effect: NoSchedule, operator: Equal, value: arm64}
-  - {key: kubernetes.io/arch, effect: NoSchedule, operator: Equal, value: arm}
+  - {key: kubernetes.io/arch, effect: NoSchedule, operator: Equal, value: s390x}
 
   # The prepare init container, if specified, is run before cordon/drain which is run before the upgrade container.
   # Shares the same format as the `upgrade` container.
diff --git a/e2e/cluster/local/images/k3s/Dockerfile b/e2e/cluster/local/images/k3s/Dockerfile
index 3b7aa77f7ae73d540e10ee75ce0c97ab728a566a..490ef80163e6f4e3a05588141bc352eafa0b037c 100644
--- a/e2e/cluster/local/images/k3s/Dockerfile
+++ b/e2e/cluster/local/images/k3s/Dockerfile
@@ -1,12 +1,11 @@
 # Install the all-in-one binary so we can copy our run-time images into the image
 # which helps avoid pulling them when running e2e tests.
-ARG ALPINE="library/alpine:3.14"
-FROM ${ALPINE} AS k3s
+ARG SLES="registry.suse.com/suse/sle15:15.3"
+FROM ${SLES} AS k3s
 ARG ARCH
 ARG K3S_VERSION="v1.21.9+k3s1"
 RUN set -x \
- && apk --no-cache add \
-    bash \
+ && zypper -n in \
     ca-certificates \
     curl \
  && if [ "${ARCH?required}" != "amd64" ]; then \
diff --git a/e2e/cluster/local/scripts/cluster-prepare b/e2e/cluster/local/scripts/cluster-prepare
index 161043300f69585492ce1620ae9770cedc02a650..fa13800757d283f007b54802cd9ea5e7fbf3c2c8 100755
--- a/e2e/cluster/local/scripts/cluster-prepare
+++ b/e2e/cluster/local/scripts/cluster-prepare
@@ -4,7 +4,7 @@ set -e
 
 : "${ARCH?required}"
 : "${DIST?required}"
-: "${ALPINE_TAG:=3.14}"
+: "${SLES_TAG:=15.3}"
 : "${KUBECTL_TAG:=v1.21.9}"
 : "${SONOBUOY_TAG:=v0.56.2}"
 
@@ -15,8 +15,8 @@ docker-image-save() {
   echo "Tagging '$1:$2' as '$1:latest' ..."
   docker image tag "$1:$2" "$1:latest"
 
-  echo "Saving '$1' images to '$(dirname $0)/../images/k3s/scratch/${1/\//-}-${ARCH}.tar' ..."
-  docker image save --output "$(dirname $0)/../images/k3s/scratch/${1/\//-}-${ARCH}.tar" "$1:$2" "$1:latest"
+  echo "Saving '$1' images to '$(dirname $0)/../images/k3s/scratch/${1//\//-}-${ARCH}.tar' ..."
+  docker image save --output "$(dirname $0)/../images/k3s/scratch/${1//\//-}-${ARCH}.tar" "$1:$2" "$1:latest"
 }
 
 rm -rf $(dirname $0)/../images/*/scratch/*
@@ -24,6 +24,6 @@ rm -rf $(dirname $0)/../images/*/scratch/*
 cp -vf "${DIST}/system-upgrade-controller-${ARCH}.tar" $(dirname $0)/../images/k3s/scratch/
 cp -vf "${DIST}/system-upgrade-controller-e2e-tests-${ARCH}.tar" $(dirname $0)/../images/k3s/scratch/
 
-docker-image-save "library/alpine"    "${ALPINE_TAG}"
+docker-image-save "registry.suse.com/suse/sle15"    "${SLES_TAG}"
 docker-image-save "rancher/kubectl"   "${KUBECTL_TAG}"
 docker-image-save "sonobuoy/sonobuoy" "${SONOBUOY_TAG}"
diff --git a/go.mod b/go.mod
index d9c96062d2cddf98a5a0eb455f66863d250242f5..e1e6debe6203796a67de5079d8141ac343144257 100644
--- a/go.mod
+++ b/go.mod
@@ -3,7 +3,7 @@ module github.com/rancher/system-upgrade-controller
 go 1.16
 
 require (
-	github.com/docker/distribution v2.8.0+incompatible
+	github.com/docker/distribution v2.8.1+incompatible
 	github.com/onsi/ginkgo v1.16.4
 	github.com/onsi/gomega v1.16.0
 	github.com/rancher/lasso v0.0.0-20210616224652-fc3ebd901c08
@@ -11,6 +11,7 @@ require (
 	github.com/rancher/wrangler v0.8.8
 	github.com/sirupsen/logrus v1.4.2
 	github.com/urfave/cli v1.22.2
+	golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect
 	k8s.io/api v0.18.18
 	k8s.io/apimachinery v0.18.18
 	k8s.io/client-go v0.18.18
@@ -19,6 +20,7 @@ require (
 )
 
 replace (
+	github.com/docker/distribution => github.com/distribution/distribution v2.8.1+incompatible
 	github.com/rancher/system-upgrade-controller/pkg/apis => ./pkg/apis
 	k8s.io/api => github.com/k3s-io/kubernetes/staging/src/k8s.io/api v1.18.20-k3s1
 	k8s.io/apiextensions-apiserver => github.com/k3s-io/kubernetes/staging/src/k8s.io/apiextensions-apiserver v1.18.20-k3s1
diff --git a/go.sum b/go.sum
index 69002354df8ffce46a1864ee3b5a1bad51ccc0bd..c6ce9e3b49e5eef11476c15be9936afd99fc5446 100644
--- a/go.sum
+++ b/go.sum
@@ -112,10 +112,9 @@ github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1
 github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/distribution/distribution v2.8.1+incompatible h1:8iXUoOqRPx30bhzIEPUmNIqlmBlWdrieW1bqr6LrX30=
+github.com/distribution/distribution v2.8.1+incompatible/go.mod h1:EgLm2NgWtdKgzF9NpMzUKgzmR7AMmb0VQi2B+ZzDRjc=
 github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
-github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
-github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY=
-github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
@@ -674,8 +673,9 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
 golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA=
+golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -726,8 +726,9 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0=
 golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -776,8 +777,9 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -787,8 +789,9 @@ golang.org/x/text v0.3.1-0.20171227012246-e19ae1496984/go.mod h1:NqM8EUOU14njkJ3
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
diff --git a/package/Dockerfile b/package/Dockerfile
index 527b45a1a5eff321a2a5af1142b87241c0849c78..c0b917b4b5006d3152ed871986ce7a0683929d20 100644
--- a/package/Dockerfile
+++ b/package/Dockerfile
@@ -1,27 +1,22 @@
-ARG ALPINE=alpine:3.14
-ARG GOLANG=golang:1.16-alpine3.14
+ARG SLES=registry.suse.com/suse/sle15:15.3
+ARG GOLANG=registry.suse.com/bci/golang:1.17-11.33
 
 FROM ${GOLANG} AS e2e-ginkgo
 ENV GOBIN=/bin
-RUN set -x \
- && apk add --no-cache \
-    ca-certificates \
-    git \
- && go install github.com/onsi/ginkgo/ginkgo@v1.16.4
+RUN go install github.com/onsi/ginkgo/ginkgo@v1.16.4
 
-FROM ${ALPINE} AS e2e-tests
+FROM ${SLES} AS e2e-tests
 ARG ARCH
 ARG REPO=rancher
 ARG TAG
 ENV SYSTEM_UPGRADE_CONTROLLER_IMAGE=${REPO}/system-upgrade-controller:${TAG}
-RUN set -x \
- && apk add --no-cache \
-    bash
 COPY --from=e2e-ginkgo /bin/ginkgo /bin/ginkgo
 COPY dist/artifacts/system-upgrade-controller.test-${ARCH} /bin/system-upgrade-controller.test
 COPY e2e/plugin/run.sh /run.sh
 RUN set -x \
  && chmod +x /run.sh
+RUN set -x \
+ && zypper -n in tar gzip
 ENTRYPOINT ["/run.sh"]
 
 FROM scratch AS controller
diff --git a/pkg/apis/go.mod b/pkg/apis/go.mod
index df075ba4d5313d95d7e22cd2bc45ae10d7c41ed2..3c42d675ee089c864633d49284b20286b5dabfdc 100644
--- a/pkg/apis/go.mod
+++ b/pkg/apis/go.mod
@@ -5,6 +5,9 @@ go 1.16
 require (
 	github.com/rancher/wrangler v0.8.5
 	github.com/sirupsen/logrus v1.4.2
+	golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect
+	golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 // indirect
+	golang.org/x/text v0.3.7 // indirect
 	k8s.io/api v0.18.18
 	k8s.io/apimachinery v0.18.18
 )
diff --git a/pkg/apis/go.sum b/pkg/apis/go.sum
index 0ea83245b59abee05ff4ff49537930c544dbf503..01c1ee5e25b7576cf5518d91ac547dacec0069c4 100644
--- a/pkg/apis/go.sum
+++ b/pkg/apis/go.sum
@@ -418,8 +418,9 @@ golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -451,16 +452,20 @@ golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20171227012246-e19ae1496984/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
diff --git a/pkg/apis/upgrade.cattle.io/v1/types.go b/pkg/apis/upgrade.cattle.io/v1/types.go
index 3df0e57e14a6524e49819bf68b2130f72177b122..ca6c5040179677ca5003297d9aa43833b1ff6efd 100644
--- a/pkg/apis/upgrade.cattle.io/v1/types.go
+++ b/pkg/apis/upgrade.cattle.io/v1/types.go
@@ -62,6 +62,13 @@ type ContainerSpec struct {
 	Args    []string               `json:"args,omitempty"`
 	Env     []corev1.EnvVar        `json:"envs,omitempty"`
 	EnvFrom []corev1.EnvFromSource `json:"envFrom,omitempty"`
+	Volumes []VolumeSpec           `json:"volumes,omitempty"`
+}
+
+type VolumeSpec struct {
+	Name        string `json:"name,omitempty"`
+	Source      string `json:"source,omitempty"`
+	Destination string `json:"destination,omitempty"`
 }
 
 // DrainSpec encapsulates `kubectl drain` parameters minus node/pod selectors.
diff --git a/pkg/apis/upgrade.cattle.io/v1/zz_generated_deepcopy.go b/pkg/apis/upgrade.cattle.io/v1/zz_generated_deepcopy.go
index 4058839b91b4e54d3f0ca69182a0d5d8d3ea7fc0..aef229d4db48788a4f3ef8486918c4a4cc065752 100644
--- a/pkg/apis/upgrade.cattle.io/v1/zz_generated_deepcopy.go
+++ b/pkg/apis/upgrade.cattle.io/v1/zz_generated_deepcopy.go
@@ -1,3 +1,4 @@
+//go:build !ignore_autogenerated
 // +build !ignore_autogenerated
 
 /*
@@ -56,6 +57,11 @@ func (in *ContainerSpec) DeepCopyInto(out *ContainerSpec) {
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
 	}
+	if in.Volumes != nil {
+		in, out := &in.Volumes, &out.Volumes
+		*out = make([]VolumeSpec, len(*in))
+		copy(*out, *in)
+	}
 	return
 }
 
@@ -255,3 +261,19 @@ func (in *SecretSpec) DeepCopy() *SecretSpec {
 	in.DeepCopyInto(out)
 	return out
 }
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *VolumeSpec) DeepCopyInto(out *VolumeSpec) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeSpec.
+func (in *VolumeSpec) DeepCopy() *VolumeSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(VolumeSpec)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/pkg/upgrade/container/container.go b/pkg/upgrade/container/container.go
index 2d70da3802e1f9c19581d19df1cfa9750c424e16..196f1ec6cb88cdf69406c217e81459135956cf74 100644
--- a/pkg/upgrade/container/container.go
+++ b/pkg/upgrade/container/container.go
@@ -76,6 +76,17 @@ func WithPlanEnvironment(planName string, planStatus upgradeapiv1.PlanStatus) Op
 	}
 }
 
+func WithVolumes(volumes []upgradeapiv1.VolumeSpec) Option {
+	return func(container *corev1.Container) {
+		for _, v := range volumes {
+			container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{
+				Name:      v.Name,
+				MountPath: v.Destination,
+			})
+		}
+	}
+}
+
 func New(name string, spec upgradeapiv1.ContainerSpec, opt ...Option) corev1.Container {
 	container := corev1.Container{
 		Name:    name,
@@ -110,6 +121,7 @@ func New(name string, spec upgradeapiv1.ContainerSpec, opt ...Option) corev1.Con
 		}}, spec.Env...),
 		EnvFrom: spec.EnvFrom,
 	}
+
 	for _, fn := range opt {
 		fn(&container)
 	}
diff --git a/pkg/upgrade/job/job.go b/pkg/upgrade/job/job.go
index 93b347595f4afab527cef5a630cc4941d6280695..2e1050fc73d593272ab936a4e1d4099ee3a3119b 100644
--- a/pkg/upgrade/job/job.go
+++ b/pkg/upgrade/job/job.go
@@ -212,6 +212,18 @@ func New(plan *upgradeapiv1.Plan, node *corev1.Node, controllerName string) *bat
 		})
 	}
 
+	// add volumes from upgrade plan
+	for _, v := range plan.Spec.Upgrade.Volumes {
+		podTemplate.Spec.Volumes = append(podTemplate.Spec.Volumes, corev1.Volume{
+			Name: v.Name,
+			VolumeSource: corev1.VolumeSource{
+				HostPath: &corev1.HostPathVolumeSource{
+					Path: v.Source,
+				},
+			},
+		})
+	}
+
 	// first, we prepare
 	if plan.Spec.Prepare != nil {
 		podTemplate.Spec.InitContainers = append(podTemplate.Spec.InitContainers,
@@ -220,6 +232,7 @@ func New(plan *upgradeapiv1.Plan, node *corev1.Node, controllerName string) *bat
 				upgradectr.WithSecrets(plan.Spec.Secrets),
 				upgradectr.WithPlanEnvironment(plan.Name, plan.Status),
 				upgradectr.WithImagePullPolicy(ImagePullPolicy),
+				upgradectr.WithVolumes(plan.Spec.Upgrade.Volumes),
 			),
 		)
 	}
@@ -260,6 +273,7 @@ func New(plan *upgradeapiv1.Plan, node *corev1.Node, controllerName string) *bat
 				upgradectr.WithSecrets(plan.Spec.Secrets),
 				upgradectr.WithPlanEnvironment(plan.Name, plan.Status),
 				upgradectr.WithImagePullPolicy(ImagePullPolicy),
+				upgradectr.WithVolumes(plan.Spec.Upgrade.Volumes),
 			),
 		)
 	} else if cordon {
@@ -271,6 +285,7 @@ func New(plan *upgradeapiv1.Plan, node *corev1.Node, controllerName string) *bat
 				upgradectr.WithSecrets(plan.Spec.Secrets),
 				upgradectr.WithPlanEnvironment(plan.Name, plan.Status),
 				upgradectr.WithImagePullPolicy(ImagePullPolicy),
+				upgradectr.WithVolumes(plan.Spec.Upgrade.Volumes),
 			),
 		)
 	}
@@ -290,6 +305,7 @@ func New(plan *upgradeapiv1.Plan, node *corev1.Node, controllerName string) *bat
 			upgradectr.WithSecrets(plan.Spec.Secrets),
 			upgradectr.WithPlanEnvironment(plan.Name, plan.Status),
 			upgradectr.WithImagePullPolicy(ImagePullPolicy),
+			upgradectr.WithVolumes(plan.Spec.Upgrade.Volumes),
 		),
 	}