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),
 		),
 	}