diff --git a/deploy/crds/planetscale.com_vitessclusters.yaml b/deploy/crds/planetscale.com_vitessclusters.yaml
index f9567028..b05357b7 100644
--- a/deploy/crds/planetscale.com_vitessclusters.yaml
+++ b/deploy/crds/planetscale.com_vitessclusters.yaml
@@ -1318,6 +1318,14 @@ spec:
                             mysql80Compatible:
                               type: string
                           type: object
+                        mysqldExporter:
+                          type: string
+                        vtbackup:
+                          type: string
+                        vtorc:
+                          type: string
+                        vttablet:
+                          type: string
                       type: object
                     name:
                       maxLength: 63
diff --git a/docs/api/index.html b/docs/api/index.html
index 41caa361..1ffe05bf 100644
--- a/docs/api/index.html
+++ b/docs/api/index.html
@@ -6551,7 +6551,18 @@ <h3 id="planetscale.com/v2.VitessKeyspaceTemplateImages">VitessKeyspaceTemplateI
 </p>
 <p>
 <p>VitessKeyspaceTemplateImages specifies user-definable container images to
-use for this keyspace.</p>
+use for this keyspace. The images defined here by the user will override
+those defined at the top-level in VitessCluster.spec.images.</p>
+<p>While this field allows you to set a different Vitess version for some
+components than the version defined at the top level, it is important to
+note that Vitess only ensures compatibility between one version and the
+next and previous one. For instance: N is only guaranteed  to be compatible
+with N+1 and N-1. Do be careful when specifying multiple versions across
+your cluster so that they respect this compatibility rule.</p>
+<p>Note: this structure is a copy of VitessKeyspaceImages, once we have gotten
+rid of MysqldImage and replaced it by MysqldImageNew (planned for v2.15), we
+should be able to remove VitessKeyspaceTemplateImages entirely and just use
+VitessKeyspaceImages instead as it contains exactly the same fields.</p>
 </p>
 <table class="table table-striped">
 <thead class="thead-dark">
@@ -6563,6 +6574,39 @@ <h3 id="planetscale.com/v2.VitessKeyspaceTemplateImages">VitessKeyspaceTemplateI
 <tbody>
 <tr>
 <td>
+<code>vttablet</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Vttablet is the container image (including version tag) to use for Vitess Tablet instances.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>vtorc</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Vtorc is the container image (including version tag) to use for Vitess Orchestrator instances.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>vtbackup</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Vtbackup is the container image (including version tag) to use for Vitess Backup jobs.</p>
+</td>
+</tr>
+<tr>
+<td>
 <code>mysqld</code></br>
 <em>
 <a href="#planetscale.com/v2.MysqldImageNew">
@@ -6577,6 +6621,17 @@ <h3 id="planetscale.com/v2.VitessKeyspaceTemplateImages">VitessKeyspaceTemplateI
 mysqld running alongside each tablet.</p>
 </td>
 </tr>
+<tr>
+<td>
+<code>mysqldExporter</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<p>MysqldExporter specifies the container image for mysqld-exporter.</p>
+</td>
+</tr>
 </tbody>
 </table>
 <h3 id="planetscale.com/v2.VitessKeyspaceTurndownPolicy">VitessKeyspaceTurndownPolicy
diff --git a/pkg/apis/planetscale/v2/vitesskeyspace_defaults.go b/pkg/apis/planetscale/v2/vitesskeyspace_defaults.go
index aa5c51d2..a98a0f49 100644
--- a/pkg/apis/planetscale/v2/vitesskeyspace_defaults.go
+++ b/pkg/apis/planetscale/v2/vitesskeyspace_defaults.go
@@ -73,8 +73,20 @@ func DefaultVitessKeyspaceImages(dst *VitessKeyspaceImages, clusterDefaults *Vit
 // MergeVitessKeyspaceTemplateImages takes non-empty image values from a non-nil src
 // and sets them on dst.
 func MergeVitessKeyspaceTemplateImages(dst *VitessKeyspaceImages, src *VitessKeyspaceTemplateImages) {
+	if src.Vttablet != "" {
+		dst.Vttablet = src.Vttablet
+	}
+	if src.Vtorc != "" {
+		dst.Vtorc = src.Vtorc
+	}
+	if src.Vtbackup != "" {
+		dst.Vtbackup = src.Vtbackup
+	}
 	if src.Mysqld != nil {
 		dst.Mysqld.Mysql56Compatible = src.Mysqld.Mysql56Compatible
 		dst.Mysqld.Mysql80Compatible = src.Mysqld.Mysql80Compatible
 	}
+	if src.MysqldExporter != "" {
+		dst.MysqldExporter = src.MysqldExporter
+	}
 }
diff --git a/pkg/apis/planetscale/v2/vitesskeyspace_types.go b/pkg/apis/planetscale/v2/vitesskeyspace_types.go
index 1550b242..1d8dbdd0 100644
--- a/pkg/apis/planetscale/v2/vitesskeyspace_types.go
+++ b/pkg/apis/planetscale/v2/vitesskeyspace_types.go
@@ -188,13 +188,34 @@ type VitessKeyspaceTemplate struct {
 }
 
 // VitessKeyspaceTemplateImages specifies user-definable container images to
-// use for this keyspace.
+// use for this keyspace. The images defined here by the user will override
+// those defined at the top-level in VitessCluster.spec.images.
+//
+// While this field allows you to set a different Vitess version for some
+// components than the version defined at the top level, it is important to
+// note that Vitess only ensures compatibility between one version and the
+// next and previous one. For instance: N is only guaranteed  to be compatible
+// with N+1 and N-1. Do be careful when specifying multiple versions across
+// your cluster so that they respect this compatibility rule.
+//
+// Note: this structure is a copy of VitessKeyspaceImages, once we have gotten
+// rid of MysqldImage and replaced it by MysqldImageNew (planned for v2.15), we
+// should be able to remove VitessKeyspaceTemplateImages entirely and just use
+// VitessKeyspaceImages instead as it contains exactly the same fields.
 type VitessKeyspaceTemplateImages struct {
+	// Vttablet is the container image (including version tag) to use for Vitess Tablet instances.
+	Vttablet string `json:"vttablet,omitempty"`
+	// Vtorc is the container image (including version tag) to use for Vitess Orchestrator instances.
+	Vtorc string `json:"vtorc,omitempty"`
+	// Vtbackup is the container image (including version tag) to use for Vitess Backup jobs.
+	Vtbackup string `json:"vtbackup,omitempty"`
 	// Mysqld specifies the container image to use for mysqld, as well as
 	// declaring which MySQL flavor setting in Vitess the image is
 	// compatible with. Only one flavor image may be provided at a time.
 	// mysqld running alongside each tablet.
 	Mysqld *MysqldImageNew `json:"mysqld,omitempty"`
+	// MysqldExporter specifies the container image for mysqld-exporter.
+	MysqldExporter string `json:"mysqldExporter,omitempty"`
 }
 
 // VitessOrchestratorSpec specifies deployment parameters for vtorc.
diff --git a/test/endtoend/operator/operator-latest.yaml b/test/endtoend/operator/operator-latest.yaml
index b843456a..0cd6071c 100644
--- a/test/endtoend/operator/operator-latest.yaml
+++ b/test/endtoend/operator/operator-latest.yaml
@@ -2830,6 +2830,14 @@ spec:
                               mysql80Compatible:
                                 type: string
                             type: object
+                          mysqldExporter:
+                            type: string
+                          vtbackup:
+                            type: string
+                          vtorc:
+                            type: string
+                          vttablet:
+                            type: string
                         type: object
                       name:
                         maxLength: 63