diff --git a/.drone.yml b/.drone.yml
index 123df42ad27f308c868659da72585ca334bacb33..9ed952cb3123192d7efb1516eb473dc9ede2d5bc 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -8,7 +8,7 @@ platform:
 
 steps:
 - name: build
-  image: rancher/dapper:v0.5.0
+  image: rancher/dapper:v0.5.8
   commands:
   - dapper ci
   - dapper e2e-sonobuoy
@@ -88,6 +88,80 @@ volumes:
   host:
     path: /var/run/docker.sock
 
+---
+kind: pipeline
+name: s390x
+
+platform:
+  os: linux
+  arch: amd64
+
+node:
+  arch: s390x
+
+steps:
+- name: build
+  failure: ignore
+  image: rancher/dapper:v0.5.8
+  commands:
+  - dapper ci
+  volumes:
+  - name: docker
+    path: /var/run/docker.sock
+
+- name: upload-artifacts
+  failure: ignore
+  image: plugins/github-release
+  settings:
+    api_key:
+      from_secret: github_token
+    prerelease: true
+    checksum:
+    - sha256
+    checksum_file: CHECKSUMsum-s390x.txt
+    checksum_flatten: true
+    files:
+    - "dist/artifacts/*"
+  when:
+    instance:
+    - drone-publish.rancher.io
+    ref:
+    - refs/head/master
+    - refs/tags/*
+    event:
+    - tag
+
+- name: push-controller
+  failure: ignore
+  image: rancher/drone-images:docker-s390x
+  volumes:
+  - name: docker
+    path: /var/run/docker.sock
+  settings:
+    dockerfile: package/Dockerfile
+    build_args:
+    - ARCH=s390x
+    - TAG=${DRONE_TAG}-s390x
+    password:
+      from_secret: docker_password
+    repo: "rancher/system-upgrade-controller"
+    tag: "${DRONE_TAG}-s390x"
+    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: arm64
@@ -98,7 +172,7 @@ platform:
 
 steps:
 - name: build
-  image: rancher/dapper:v0.5.0
+  image: rancher/dapper:v0.5.8
   commands:
   - dapper ci
   volumes:
@@ -261,6 +335,7 @@ steps:
       - linux/amd64
       - linux/arm64
       - linux/arm
+      - linux/s390x
     target: "rancher/system-upgrade-controller:${DRONE_TAG}"
     template: "rancher/system-upgrade-controller:${DRONE_TAG}-ARCH"
   when:
@@ -295,5 +370,6 @@ steps:
 
 depends_on:
 - amd64
+- s390x
 - arm64
 - arm
diff --git a/Dockerfile.dapper b/Dockerfile.dapper
index 62e460e23ff2ae8974a4a5655f4c01358bdbf27c..bdd05908dba92140f112e8ac1dedac9c46cc9337 100644
--- a/Dockerfile.dapper
+++ b/Dockerfile.dapper
@@ -1,4 +1,4 @@
-ARG KUBECTL=rancher/kubectl:v1.18.20
+ARG KUBECTL=rancher/kubectl:v1.21.9
 FROM ${KUBECTL} AS kubectl
 
 FROM golang:1.16-alpine3.14
@@ -21,7 +21,7 @@ RUN if [ "${ARCH}" == "amd64" ]; then \
         go get sigs.k8s.io/kustomize/kustomize/v3@v3.5.4; \
     fi
 ARG SONOBUOY_VERSION=0.18.5
-RUN if [ "${ARCH}" != "arm" ]; then \
+RUN if [ "${ARCH}" != "arm" ] && [ "${ARCH}" != "s390x" ]; then \
         set -x; \
         curl -sL "https://github.com/vmware-tanzu/sonobuoy/releases/download/v${SONOBUOY_VERSION}/sonobuoy_${SONOBUOY_VERSION}_linux_${ARCH}.tar.gz" \
         | tar -xz -C /usr/local/bin; \
diff --git a/e2e/cluster/local/images/k3s/Dockerfile b/e2e/cluster/local/images/k3s/Dockerfile
index ba23094a12897656ae00c395490349ecac020ada..3b7aa77f7ae73d540e10ee75ce0c97ab728a566a 100644
--- a/e2e/cluster/local/images/k3s/Dockerfile
+++ b/e2e/cluster/local/images/k3s/Dockerfile
@@ -3,7 +3,7 @@
 ARG ALPINE="library/alpine:3.14"
 FROM ${ALPINE} AS k3s
 ARG ARCH
-ARG K3S_VERSION="v1.18.20+k3s1"
+ARG K3S_VERSION="v1.21.9+k3s1"
 RUN set -x \
  && apk --no-cache add \
     bash \
diff --git a/e2e/cluster/local/scripts/cluster-prepare b/e2e/cluster/local/scripts/cluster-prepare
index d80c09fc08210141e86da5759851a0a84cd81335..35150591eae0e97022d962949d81c86824d433e7 100755
--- a/e2e/cluster/local/scripts/cluster-prepare
+++ b/e2e/cluster/local/scripts/cluster-prepare
@@ -5,7 +5,7 @@ set -e
 : "${ARCH?required}"
 : "${DIST?required}"
 : "${ALPINE_TAG:=3.14}"
-: "${KUBECTL_TAG:=v1.18.20}"
+: "${KUBECTL_TAG:=v1.21.9}"
 : "${SONOBUOY_TAG:=v0.18.5}"
 
 docker-image-save() {
diff --git a/examples/ubuntu/bionic/k3s/Dockerfile b/examples/ubuntu/bionic/k3s/Dockerfile
index 42a2e82b8639b7186a857b56a7701570cc06d930..ff0c95d25ea1351279426275ecbc7e451893cc3f 100644
--- a/examples/ubuntu/bionic/k3s/Dockerfile
+++ b/examples/ubuntu/bionic/k3s/Dockerfile
@@ -31,7 +31,7 @@ RUN set -x \
     /var/lib/apt/lists/* \
     /var/tmp/*
 
-ARG INSTALL_K3S_VERSION=v1.18.20+k3s1
+ARG INSTALL_K3S_VERSION=v1.21.9+k3s1
 ARG INSTALL_K3S_SKIP_START=true
 ADD https://raw.githubusercontent.com/rancher/k3s/${INSTALL_K3S_VERSION}/install.sh /usr/share/rancher/k3s/
 RUN sh -x /usr/share/rancher/k3s/install.sh || true
diff --git a/manifests/system-upgrade-controller.yaml b/manifests/system-upgrade-controller.yaml
index 5e38d94e95fea62cb86f56d77e2bd5ef075b51f1..bba8555108936c6b3e5c3ec5ca8afee12dd09bfc 100644
--- a/manifests/system-upgrade-controller.yaml
+++ b/manifests/system-upgrade-controller.yaml
@@ -33,7 +33,7 @@ data:
   SYSTEM_UPGRADE_JOB_ACTIVE_DEADLINE_SECONDS: "900"
   SYSTEM_UPGRADE_JOB_BACKOFF_LIMIT: "99"
   SYSTEM_UPGRADE_JOB_IMAGE_PULL_POLICY: "Always"
-  SYSTEM_UPGRADE_JOB_KUBECTL_IMAGE: "rancher/kubectl:v1.18.20"
+  SYSTEM_UPGRADE_JOB_KUBECTL_IMAGE: "rancher/kubectl:v1.21.9"
   SYSTEM_UPGRADE_JOB_PRIVILEGED: "true"
   SYSTEM_UPGRADE_JOB_TTL_SECONDS_AFTER_FINISH: "900"
   SYSTEM_UPGRADE_PLAN_POLLING_INTERVAL: "15m"
diff --git a/pkg/upgrade/job/job.go b/pkg/upgrade/job/job.go
index 3fbcfa9cb54ff48f5a686fe000ab473413412587..93b347595f4afab527cef5a630cc4941d6280695 100644
--- a/pkg/upgrade/job/job.go
+++ b/pkg/upgrade/job/job.go
@@ -23,7 +23,7 @@ const (
 	defaultBackoffLimit            = int32(2)
 	defaultActiveDeadlineSeconds   = int64(600)
 	defaultPrivileged              = true
-	defaultKubectlImage            = "rancher/kubectl:v1.18.20"
+	defaultKubectlImage            = "rancher/kubectl:v1.21.9"
 	defaultImagePullPolicy         = corev1.PullIfNotPresent
 	defaultTTLSecondsAfterFinished = int32(900)
 )