You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2026/04/15 22:21:34 UTC

(airflow) branch main updated: Add breeze k8s deploy-cluster command (#65260)

This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 7da8a112935 Add breeze k8s deploy-cluster command (#65260)
7da8a112935 is described below

commit 7da8a11293586d9569f1f62dc58f748fbc9761ed
Author: Przemysław Mirowski <17...@users.noreply.github.com>
AuthorDate: Thu Apr 16 00:21:26 2026 +0200

    Add breeze k8s deploy-cluster command (#65260)
    
    * Add breeze k8s deploy-cluster
    
    * Add outputs & skip flags
    
    * Regenerate images
    
    * Update test command docs
    
    * Update k8s tests doc
---
 contributing-docs/testing/k8s_tests.rst            |   8 +-
 dev/breeze/doc/05_test_commands.rst                |  21 ++-
 dev/breeze/doc/images/output_k8s.svg               |  42 +++---
 dev/breeze/doc/images/output_k8s.txt               |   2 +-
 .../doc/images/output_k8s_deploy-cluster.svg       | 156 +++++++++++++++++++++
 .../doc/images/output_k8s_deploy-cluster.txt       |   1 +
 .../output_setup_check-all-params-in-groups.svg    |  20 +--
 .../output_setup_check-all-params-in-groups.txt    |   2 +-
 .../output_setup_regenerate-command-images.svg     |  10 +-
 .../output_setup_regenerate-command-images.txt     |   2 +-
 .../airflow_breeze/commands/kubernetes_commands.py | 105 +++++++++++++-
 .../commands/kubernetes_commands_config.py         |  14 ++
 12 files changed, 341 insertions(+), 42 deletions(-)

diff --git a/contributing-docs/testing/k8s_tests.rst b/contributing-docs/testing/k8s_tests.rst
index e4e08b32a6a..fc678db9506 100644
--- a/contributing-docs/testing/k8s_tests.rst
+++ b/contributing-docs/testing/k8s_tests.rst
@@ -227,8 +227,12 @@ You can exit k9s by pressing Ctrl-C.
 Typical testing pattern for Kubernetes tests
 --------------------------------------------
 
-The typical session for tests with Kubernetes looks like follows:
+.. note::
 
+   Steps 1-6 from below instruction can be done by using one command ``breeze k8s deploy-cluster``.
+   For details visit `Test commands <../../dev/breeze/doc/05_test_commands.rst>`__.
+
+The typical session for tests with Kubernetes looks like follows:
 
 1. Prepare the environment:
 
@@ -431,7 +435,7 @@ Should show the status of current KinD cluster.
     breeze k8s upload-k8s-image
 
 
-5. Upload the image to KinD cluster - this uploads your image to make it available for the KinD cluster.
+6. Upload the image to KinD cluster - this uploads your image to make it available for the KinD cluster.
 
 .. code-block:: bash
 
diff --git a/dev/breeze/doc/05_test_commands.rst b/dev/breeze/doc/05_test_commands.rst
index 5ae0372978f..656e83cfb81 100644
--- a/dev/breeze/doc/05_test_commands.rst
+++ b/dev/breeze/doc/05_test_commands.rst
@@ -421,9 +421,9 @@ You can:
 
 * Setup environment for k8s tests with ``breeze k8s setup-env``
 * Build Airflow k8S images with ``breeze k8s build-k8s-image``
-* Manage KinD Kubernetes cluster and upload image and deploy Airflow to KinD cluster via
+* Manage KinD Kubernetes cluster, upload Airflow image, deploy Airflow to the cluster and check its status with
   ``breeze k8s create-cluster``, ``breeze k8s configure-cluster``, ``breeze k8s deploy-airflow``, ``breeze k8s status``,
-  ``breeze k8s upload-k8s-image``, ``breeze k8s delete-cluster`` commands
+  ``breeze k8s upload-k8s-image``, ``breeze k8s delete-cluster`` and ``breeze k8s deploy-cluster`` commands
 * Hot-reload DAGs and core sources (scheduler/triggerer/dag-processor) with ``breeze k8s dev`` (skaffold sync)
 * Run Kubernetes tests  specified with ``breeze k8s tests`` command
 * Run complete test run with ``breeze k8s run-complete-tests`` - performing the full cycle of creating
@@ -531,6 +531,23 @@ All parameters of the command are here:
   :width: 100%
   :alt: Breeze k8s configure-cluster
 
+Prepare Kind Cluster with Airflow image build
+.............................................
+
+In order to not execute every KinD cluster-related command and building Airflow image separately, use
+``breeze k8s deploy-cluster`` command for running:
+1. Local environment setup for KinD cluster and Airflow deployment
+2. KinD cluster creation and configuration
+3. Airflow UI asset compilation
+4. Airflow image build and upload
+
+All parameters of the command are here:
+
+.. image:: ./images/output_k8s_deploy-cluster.svg
+  :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/images/output_k8s_deploy-cluster.svg
+  :width: 100%
+  :alt: Breeze k8s deploy-cluster
+
 Deploying Airflow to the Cluster
 ................................
 
diff --git a/dev/breeze/doc/images/output_k8s.svg b/dev/breeze/doc/images/output_k8s.svg
index 30082c1981d..d2ec2c13c40 100644
--- a/dev/breeze/doc/images/output_k8s.svg
+++ b/dev/breeze/doc/images/output_k8s.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 830.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 855.1999999999999" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-k8s-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="779.8" />
+      <rect x="0" y="0" width="1463.0" height="804.1999999999999" />
     </clipPath>
     <clipPath id="breeze-k8s-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -138,9 +138,12 @@
 <clipPath id="breeze-k8s-line-30">
     <rect x="0" y="733.5" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-k8s-line-31">
+    <rect x="0" y="757.9" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="828.8" rx="8"/><text class="breeze-k8s-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="853.2" rx="8"/><text class="breeze-k8s-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -166,22 +169,23 @@
 </text><text class="breeze-k8s-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-k8s-line-13)">│</text><text class="breeze-k8s-r1" x="256.2" y="337.2" textLength="1183.4" clip-path="url(#breeze-k8s-line-13)">all&#160;clusters&#160;in&#160;parallel).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
 </text><text class="breeze-k8s-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-k8s-line-14)">│</text><text class="breeze-k8s-r4" x="24.4" y="361.6" textLength="207.4" clip-path="url(#breeze-k8s-line-14)">build-k8s-image&#160;&#160;</text><text class="breeze-k8s-r1" x="256.2" y="361.6" textLength="1183.4" clip-path="url(#breeze-k8s-line-14)">Build&#160;k8s-ready&#160;airflow&#160;image&#160;(optionally&#160;all&#160;images&#160;in&#160;parallel).&#160;&#160;&#160;&#160;&#160; [...]
 </text><text class="breeze-k8s-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-k8s-line-15)">│</text><text class="breeze-k8s-r4" x="24.4" y="386" textLength="207.4" clip-path="url(#breeze-k8s-line-15)">upload-k8s-image&#160;</text><text class="breeze-k8s-r1" x="256.2" y="386" textLength="1183.4" clip-path="url(#breeze-k8s-line-15)">Upload&#160;k8s-ready&#160;airflow&#160;image&#160;to&#160;the&#160;KinD&#160;cluster&#160;(optionally&#160;to&#160;all&#160;clusters&#160;in&#160; [...]
-</text><text class="breeze-k8s-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-line-16)">│</text><text class="breeze-k8s-r4" x="24.4" y="410.4" textLength="207.4" clip-path="url(#breeze-k8s-line-16)">deploy-airflow&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="256.2" y="410.4" textLength="1183.4" clip-path="url(#breeze-k8s-line-16)">Deploy&#160;airflow&#160;image&#160;to&#160;the&#160;current&#160;KinD&#160;cluster&#160;(or&#160;all&#160;clusters).&#160;&#160;&# [...]
-</text><text class="breeze-k8s-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-k8s-line-17)">│</text><text class="breeze-k8s-r4" x="24.4" y="434.8" textLength="207.4" clip-path="url(#breeze-k8s-line-17)">dev&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="256.2" y="434.8" textLength="1183.4" clip-path="url(#breeze-k8s-line-17)">Run&#160;skaffold&#160;dev&#160;loop&#160;to&#160;sync&#160;dags&#160;and&#1 [...]
-</text><text class="breeze-k8s-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-line-18)">│</text><text class="breeze-k8s-r1" x="256.2" y="459.2" textLength="1183.4" clip-path="url(#breeze-k8s-line-18)">(scheduler/triggerer/dag-processor/API&#160;Server&#160;hot-reload;&#160;UI&#160;auto-refresh&#160;not&#160;supported&#160;yet).&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-line-18)">│</text><t [...]
-</text><text class="breeze-k8s-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-k8s-line-19)">│</text><text class="breeze-k8s-r4" x="24.4" y="483.6" textLength="207.4" clip-path="url(#breeze-k8s-line-19)">delete-cluster&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="256.2" y="483.6" textLength="1183.4" clip-path="url(#breeze-k8s-line-19)">Delete&#160;the&#160;current&#160;KinD&#160;Cluster&#160;(optionally&#160;all&#160;clusters).&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="breeze-k8s-r5" x="0" y="508" textLength="1464" clip-path="url(#breeze-k8s-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-r1" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-k8s-line-20)">
-</text><text class="breeze-k8s-r5" x="0" y="532.4" textLength="24.4" clip-path="url(#breeze-k8s-line-21)">╭─</text><text class="breeze-k8s-r5" x="24.4" y="532.4" textLength="305" clip-path="url(#breeze-k8s-line-21)">&#160;K8S&#160;inspection&#160;commands&#160;</text><text class="breeze-k8s-r5" x="329.4" y="532.4" textLength="1110.2" clip-path="url(#breeze-k8s-line-21)">───────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-k [...]
-</text><text class="breeze-k8s-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-line-22)">│</text><text class="breeze-k8s-r4" x="24.4" y="556.8" textLength="97.6" clip-path="url(#breeze-k8s-line-22)">status&#160;&#160;</text><text class="breeze-k8s-r1" x="146.4" y="556.8" textLength="1293.2" clip-path="url(#breeze-k8s-line-22)">Check&#160;status&#160;of&#160;the&#160;current&#160;cluster&#160;and&#160;airflow&#160;deployed&#160;to&#160;it&#160;(optionally&#160;all&#160;cl [...]
-</text><text class="breeze-k8s-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-line-23)">│</text><text class="breeze-k8s-r4" x="24.4" y="581.2" textLength="97.6" clip-path="url(#breeze-k8s-line-23)">logs&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="146.4" y="581.2" textLength="463.6" clip-path="url(#breeze-k8s-line-23)">Dump&#160;k8s&#160;logs&#160;to&#160;${TMP_DIR}/kind_logs_</text><text class="breeze-k8s-r7" x="610" y="581.2" textLength="170.8" clip-pa [...]
-</text><text class="breeze-k8s-r5" x="0" y="605.6" textLength="1464" clip-path="url(#breeze-k8s-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-r1" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-line-24)">
-</text><text class="breeze-k8s-r5" x="0" y="630" textLength="24.4" clip-path="url(#breeze-k8s-line-25)">╭─</text><text class="breeze-k8s-r5" x="24.4" y="630" textLength="268.4" clip-path="url(#breeze-k8s-line-25)">&#160;K8S&#160;testing&#160;commands&#160;</text><text class="breeze-k8s-r5" x="292.8" y="630" textLength="1146.8" clip-path="url(#breeze-k8s-line-25)">──────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-k8s-r [...]
-</text><text class="breeze-k8s-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-k8s-line-26)">│</text><text class="breeze-k8s-r4" x="24.4" y="654.4" textLength="219.6" clip-path="url(#breeze-k8s-line-26)">tests&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="268.4" y="654.4" textLength="1171.2" clip-path="url(#breeze-k8s-line-26)">Run&#160;tests&#160;against&#160;the&#160;current&#160;KinD&#160;cluster&#160;(o [...]
-</text><text class="breeze-k8s-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-line-27)">│</text><text class="breeze-k8s-r4" x="24.4" y="678.8" textLength="219.6" clip-path="url(#breeze-k8s-line-27)">run-complete-tests</text><text class="breeze-k8s-r1" x="268.4" y="678.8" textLength="1171.2" clip-path="url(#breeze-k8s-line-27)">Run&#160;complete&#160;k8s&#160;tests&#160;consisting&#160;of:&#160;creating&#160;cluster,&#160;building&#160;and&#160;uploading&#160;image,&#160 [...]
-</text><text class="breeze-k8s-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-line-28)">│</text><text class="breeze-k8s-r1" x="268.4" y="703.2" textLength="1171.2" clip-path="url(#breeze-k8s-line-28)">airflow,&#160;running&#160;tests&#160;and&#160;deleting&#160;clusters&#160;(optionally&#160;for&#160;all&#160;clusters&#160;in&#160;parallel).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="703.2" textLength="12.2" cli [...]
-</text><text class="breeze-k8s-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-line-29)">│</text><text class="breeze-k8s-r4" x="24.4" y="727.6" textLength="219.6" clip-path="url(#breeze-k8s-line-29)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="268.4" y="727.6" textLength="1171.2" clip-path="url(#breeze-k8s-line-29)">Run&#160;shell&#160;environment&#160;for&#160;the&#160;current&#160;KinD&#160;cl [...]
-</text><text class="breeze-k8s-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-k8s-line-30)">│</text><text class="breeze-k8s-r4" x="24.4" y="752" textLength="219.6" clip-path="url(#breeze-k8s-line-30)">k9s&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="268.4" y="752" textLength="1171.2" clip-path="url(#breeze-k8s-line-30)">Run&#160;k9s&#160;tool.&#160;You&#160;can&#160;pass&#160;any&#160;k9s&#160;a [...]
-</text><text class="breeze-k8s-r5" x="0" y="776.4" textLength="1464" clip-path="url(#breeze-k8s-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-line-31)">
+</text><text class="breeze-k8s-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-line-16)">│</text><text class="breeze-k8s-r4" x="24.4" y="410.4" textLength="207.4" clip-path="url(#breeze-k8s-line-16)">deploy-cluster&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="256.2" y="410.4" textLength="1183.4" clip-path="url(#breeze-k8s-line-16)">Create,&#160;configure&#160;kind&#160;cluster&#160;and&#160;build&#160;Airflow&#160;image&#160;for&#160;Airflow&#160;Chart&#160;dep [...]
+</text><text class="breeze-k8s-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-k8s-line-17)">│</text><text class="breeze-k8s-r4" x="24.4" y="434.8" textLength="207.4" clip-path="url(#breeze-k8s-line-17)">deploy-airflow&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="256.2" y="434.8" textLength="1183.4" clip-path="url(#breeze-k8s-line-17)">Deploy&#160;airflow&#160;image&#160;to&#160;the&#160;current&#160;KinD&#160;cluster&#160;(or&#160;all&#160;clusters).&#160;&#160;&# [...]
+</text><text class="breeze-k8s-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-line-18)">│</text><text class="breeze-k8s-r4" x="24.4" y="459.2" textLength="207.4" clip-path="url(#breeze-k8s-line-18)">dev&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="256.2" y="459.2" textLength="1183.4" clip-path="url(#breeze-k8s-line-18)">Run&#160;skaffold&#160;dev&#160;loop&#160;to&#160;sync&#160;dags&#160;and&#1 [...]
+</text><text class="breeze-k8s-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-k8s-line-19)">│</text><text class="breeze-k8s-r1" x="256.2" y="483.6" textLength="1183.4" clip-path="url(#breeze-k8s-line-19)">(scheduler/triggerer/dag-processor/API&#160;Server&#160;hot-reload;&#160;UI&#160;auto-refresh&#160;not&#160;supported&#160;yet).&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="483.6" textLength="12.2" clip-path="url(#breeze-k8s-line-19)">│</text><t [...]
+</text><text class="breeze-k8s-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-k8s-line-20)">│</text><text class="breeze-k8s-r4" x="24.4" y="508" textLength="207.4" clip-path="url(#breeze-k8s-line-20)">delete-cluster&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="256.2" y="508" textLength="1183.4" clip-path="url(#breeze-k8s-line-20)">Delete&#160;the&#160;current&#160;KinD&#160;Cluster&#160;(optionally&#160;all&#160;clusters).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="breeze-k8s-r5" x="0" y="532.4" textLength="1464" clip-path="url(#breeze-k8s-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-line-21)">
+</text><text class="breeze-k8s-r5" x="0" y="556.8" textLength="24.4" clip-path="url(#breeze-k8s-line-22)">╭─</text><text class="breeze-k8s-r5" x="24.4" y="556.8" textLength="305" clip-path="url(#breeze-k8s-line-22)">&#160;K8S&#160;inspection&#160;commands&#160;</text><text class="breeze-k8s-r5" x="329.4" y="556.8" textLength="1110.2" clip-path="url(#breeze-k8s-line-22)">───────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-k [...]
+</text><text class="breeze-k8s-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-line-23)">│</text><text class="breeze-k8s-r4" x="24.4" y="581.2" textLength="97.6" clip-path="url(#breeze-k8s-line-23)">status&#160;&#160;</text><text class="breeze-k8s-r1" x="146.4" y="581.2" textLength="1293.2" clip-path="url(#breeze-k8s-line-23)">Check&#160;status&#160;of&#160;the&#160;current&#160;cluster&#160;and&#160;airflow&#160;deployed&#160;to&#160;it&#160;(optionally&#160;all&#160;cl [...]
+</text><text class="breeze-k8s-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-line-24)">│</text><text class="breeze-k8s-r4" x="24.4" y="605.6" textLength="97.6" clip-path="url(#breeze-k8s-line-24)">logs&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="146.4" y="605.6" textLength="463.6" clip-path="url(#breeze-k8s-line-24)">Dump&#160;k8s&#160;logs&#160;to&#160;${TMP_DIR}/kind_logs_</text><text class="breeze-k8s-r7" x="610" y="605.6" textLength="170.8" clip-pa [...]
+</text><text class="breeze-k8s-r5" x="0" y="630" textLength="1464" clip-path="url(#breeze-k8s-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-r1" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-k8s-line-25)">
+</text><text class="breeze-k8s-r5" x="0" y="654.4" textLength="24.4" clip-path="url(#breeze-k8s-line-26)">╭─</text><text class="breeze-k8s-r5" x="24.4" y="654.4" textLength="268.4" clip-path="url(#breeze-k8s-line-26)">&#160;K8S&#160;testing&#160;commands&#160;</text><text class="breeze-k8s-r5" x="292.8" y="654.4" textLength="1146.8" clip-path="url(#breeze-k8s-line-26)">──────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze [...]
+</text><text class="breeze-k8s-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-line-27)">│</text><text class="breeze-k8s-r4" x="24.4" y="678.8" textLength="219.6" clip-path="url(#breeze-k8s-line-27)">tests&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="268.4" y="678.8" textLength="1171.2" clip-path="url(#breeze-k8s-line-27)">Run&#160;tests&#160;against&#160;the&#160;current&#160;KinD&#160;cluster&#160;(o [...]
+</text><text class="breeze-k8s-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-line-28)">│</text><text class="breeze-k8s-r4" x="24.4" y="703.2" textLength="219.6" clip-path="url(#breeze-k8s-line-28)">run-complete-tests</text><text class="breeze-k8s-r1" x="268.4" y="703.2" textLength="1171.2" clip-path="url(#breeze-k8s-line-28)">Run&#160;complete&#160;k8s&#160;tests&#160;consisting&#160;of:&#160;creating&#160;cluster,&#160;building&#160;and&#160;uploading&#160;image,&#160 [...]
+</text><text class="breeze-k8s-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-line-29)">│</text><text class="breeze-k8s-r1" x="268.4" y="727.6" textLength="1171.2" clip-path="url(#breeze-k8s-line-29)">airflow,&#160;running&#160;tests&#160;and&#160;deleting&#160;clusters&#160;(optionally&#160;for&#160;all&#160;clusters&#160;in&#160;parallel).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="727.6" textLength="12.2" cli [...]
+</text><text class="breeze-k8s-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-k8s-line-30)">│</text><text class="breeze-k8s-r4" x="24.4" y="752" textLength="219.6" clip-path="url(#breeze-k8s-line-30)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="268.4" y="752" textLength="1171.2" clip-path="url(#breeze-k8s-line-30)">Run&#160;shell&#160;environment&#160;for&#160;the&#160;current&#160;KinD&#160;cluster. [...]
+</text><text class="breeze-k8s-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-line-31)">│</text><text class="breeze-k8s-r4" x="24.4" y="776.4" textLength="219.6" clip-path="url(#breeze-k8s-line-31)">k9s&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="268.4" y="776.4" textLength="1171.2" clip-path="url(#breeze-k8s-line-31)">Run&#160;k9s&#160;tool.&#160;You&#160;can&#160;pass&#160;any&#160;k9s& [...]
+</text><text class="breeze-k8s-r5" x="0" y="800.8" textLength="1464" clip-path="url(#breeze-k8s-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-line-32)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_k8s.txt b/dev/breeze/doc/images/output_k8s.txt
index d601d2a74e7..fdbc1e0160d 100644
--- a/dev/breeze/doc/images/output_k8s.txt
+++ b/dev/breeze/doc/images/output_k8s.txt
@@ -1 +1 @@
-21941a0b62454979f5b84da7c1630768
+d311e591fd9e3e467bfcb3fe2f18df2b
diff --git a/dev/breeze/doc/images/output_k8s_deploy-cluster.svg b/dev/breeze/doc/images/output_k8s_deploy-cluster.svg
new file mode 100644
index 00000000000..35b4841a057
--- /dev/null
+++ b/dev/breeze/doc/images/output_k8s_deploy-cluster.svg
@@ -0,0 +1,156 @@
+<svg class="rich-terminal" viewBox="0 0 1482 635.5999999999999" xmlns="http://www.w3.org/2000/svg">
+    <!-- Generated with Rich https://www.textualize.io -->
+    <style>
+
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Regular"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+        font-style: normal;
+        font-weight: 400;
+    }
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Bold"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+        font-style: bold;
+        font-weight: 700;
+    }
+
+    .breeze-k8s-deploy-cluster-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .breeze-k8s-deploy-cluster-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .breeze-k8s-deploy-cluster-r1 { fill: #c5c8c6 }
+.breeze-k8s-deploy-cluster-r2 { fill: #d0b344 }
+.breeze-k8s-deploy-cluster-r3 { fill: #c5c8c6;font-weight: bold }
+.breeze-k8s-deploy-cluster-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-k8s-deploy-cluster-r5 { fill: #868887 }
+.breeze-k8s-deploy-cluster-r6 { fill: #98a84b;font-weight: bold }
+.breeze-k8s-deploy-cluster-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="breeze-k8s-deploy-cluster-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="584.5999999999999" />
+    </clipPath>
+    <clipPath id="breeze-k8s-deploy-cluster-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-19">
+    <rect x="0" y="465.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-20">
+    <rect x="0" y="489.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-21">
+    <rect x="0" y="513.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-deploy-cluster-line-22">
+    <rect x="0" y="538.3" width="1464" height="24.65"/>
+            </clipPath>
+    </defs>
+
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="633.6" rx="8"/><text class="breeze-k8s-deploy-cluster-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;deploy-cluster</text>
+            <g transform="translate(26,22)">
+            <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
+            <circle cx="22" cy="0" r="7" fill="#febc2e"/>
+            <circle cx="44" cy="0" r="7" fill="#28c840"/>
+            </g>
+        
+    <g transform="translate(9, 41)" clip-path="url(#breeze-k8s-deploy-cluster-clip-terminal)">
+    
+    <g class="breeze-k8s-deploy-cluster-matrix">
+    <text class="breeze-k8s-deploy-cluster-r1" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-0)">
+</text><text class="breeze-k8s-deploy-cluster-r2" x="12.2" y="44.4" textLength="73.2" clip-path="url(#breeze-k8s-deploy-cluster-line-1)">Usage:</text><text class="breeze-k8s-deploy-cluster-r3" x="97.6" y="44.4" textLength="305" clip-path="url(#breeze-k8s-deploy-cluster-line-1)">breeze&#160;k8s&#160;deploy-cluster</text><text class="breeze-k8s-deploy-cluster-r1" x="414.8" y="44.4" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-1)">[</text><text class="breeze-k8s-deploy-c [...]
+</text><text class="breeze-k8s-deploy-cluster-r1" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-2)">
+</text><text class="breeze-k8s-deploy-cluster-r1" x="12.2" y="93.2" textLength="1024.8" clip-path="url(#breeze-k8s-deploy-cluster-line-3)">Create,&#160;configure&#160;kind&#160;cluster&#160;and&#160;build&#160;Airflow&#160;image&#160;for&#160;Airflow&#160;Chart&#160;deployment.</text><text class="breeze-k8s-deploy-cluster-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-3)">
+</text><text class="breeze-k8s-deploy-cluster-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-4)">
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-k8s-deploy-cluster-line-5)">╭─</text><text class="breeze-k8s-deploy-cluster-r5" x="24.4" y="142" textLength="341.6" clip-path="url(#breeze-k8s-deploy-cluster-line-5)">&#160;K8S&#160;cluster&#160;creation&#160;flags&#160;</text><text class="breeze-k8s-deploy-cluster-r5" x="366" y="142" textLength="1073.6" clip-path="url(#breeze-k8s-deploy-cluster-line-5)">────────────────────────────── [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-6)">│</text><text class="breeze-k8s-deploy-cluster-r4" x="24.4" y="166.4" textLength="292.8" clip-path="url(#breeze-k8s-deploy-cluster-line-6)">--python&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-deploy-cluster-r6" x="341.6" y="166.4" textLength="24.4" clip-path="url(#breeze-k8 [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-7)">│</text><text class="breeze-k8s-deploy-cluster-r7" x="390.4" y="190.8" textLength="317.2" clip-path="url(#breeze-k8s-deploy-cluster-line-7)">3.11&#160;|&#160;3.12&#160;|&#160;3.13&#160;|&#160;3.14)</text><text class="breeze-k8s-deploy-cluster-r5" x="1451.8" y="190.8" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-7)">│</text><text class= [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-8)">│</text><text class="breeze-k8s-deploy-cluster-r4" x="24.4" y="215.2" textLength="292.8" clip-path="url(#breeze-k8s-deploy-cluster-line-8)">--kubernetes-version&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-deploy-cluster-r1" x="390.4" y="215.2" textLength="671" clip-path="url(#breeze-k8s-deploy-cluster-line-8)">Kubernetes&#160;version&#160;used&# [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-9)">│</text><text class="breeze-k8s-deploy-cluster-r7" x="390.4" y="239.6" textLength="622.2" clip-path="url(#breeze-k8s-deploy-cluster-line-9)">|&#160;v1.31.12&#160;|&#160;v1.32.8&#160;|&#160;v1.33.4&#160;|&#160;v1.34.0&#160;|&#160;v1.35.0)</text><text class="breeze-k8s-deploy-cluster-r5" x="1451.8" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-depl [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-10)">│</text><text class="breeze-k8s-deploy-cluster-r4" x="24.4" y="264" textLength="292.8" clip-path="url(#breeze-k8s-deploy-cluster-line-10)">--force-recreate-cluster</text><text class="breeze-k8s-deploy-cluster-r1" x="390.4" y="264" textLength="756.4" clip-path="url(#breeze-k8s-deploy-cluster-line-10)">Force&#160;recreation&#160;of&#160;the&#160;cluster&#160 [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-11)">│</text><text class="breeze-k8s-deploy-cluster-r4" x="24.4" y="288.4" textLength="292.8" clip-path="url(#breeze-k8s-deploy-cluster-line-11)">--force-venv-setup&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-deploy-cluster-r1" x="390.4" y="288.4" textLength="427" clip-path="url(#breeze-k8s-deploy-cluster-line-11)">Force&#160;recreation& [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="312.8" textLength="1464" clip-path="url(#breeze-k8s-deploy-cluster-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-deploy-cluster-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-12)">
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="337.2" textLength="24.4" clip-path="url(#breeze-k8s-deploy-cluster-line-13)">╭─</text><text class="breeze-k8s-deploy-cluster-r5" x="24.4" y="337.2" textLength="231.8" clip-path="url(#breeze-k8s-deploy-cluster-line-13)">&#160;Build&#160;image&#160;flags&#160;</text><text class="breeze-k8s-deploy-cluster-r5" x="256.2" y="337.2" textLength="1183.4" clip-path="url(#breeze-k8s-deploy-cluster-line-13)">───────────────────────────────── [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-14)">│</text><text class="breeze-k8s-deploy-cluster-r4" x="24.4" y="361.6" textLength="244" clip-path="url(#breeze-k8s-deploy-cluster-line-14)">--rebuild-base-image</text><text class="breeze-k8s-deploy-cluster-r1" x="292.8" y="361.6" textLength="658.8" clip-path="url(#breeze-k8s-deploy-cluster-line-14)">Rebuilds&#160;base&#160;Airflow&#160;image&#160;before&# [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-15)">│</text><text class="breeze-k8s-deploy-cluster-r4" x="24.4" y="386" textLength="97.6" clip-path="url(#breeze-k8s-deploy-cluster-line-15)">--use-uv</text><text class="breeze-k8s-deploy-cluster-r1" x="122" y="386" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-15)">/</text><text class="breeze-k8s-deploy-cluster-r4" x="134.2" y="386" textLen [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-16)">│</text><text class="breeze-k8s-deploy-cluster-r4" x="24.4" y="410.4" textLength="244" clip-path="url(#breeze-k8s-deploy-cluster-line-16)">--skip-image-build&#160;&#160;</text><text class="breeze-k8s-deploy-cluster-r1" x="292.8" y="410.4" textLength="878.4" clip-path="url(#breeze-k8s-deploy-cluster-line-16)">Skips&#160;execution&#160;of&#160;breeze&#160; [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="434.8" textLength="1464" clip-path="url(#breeze-k8s-deploy-cluster-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-deploy-cluster-r1" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-17)">
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="459.2" textLength="24.4" clip-path="url(#breeze-k8s-deploy-cluster-line-18)">╭─</text><text class="breeze-k8s-deploy-cluster-r5" x="24.4" y="459.2" textLength="122" clip-path="url(#breeze-k8s-deploy-cluster-line-18)">&#160;UI&#160;flags&#160;</text><text class="breeze-k8s-deploy-cluster-r5" x="146.4" y="459.2" textLength="1293.2" clip-path="url(#breeze-k8s-deploy-cluster-line-18)">───────────────────────────────────────────────── [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-19)">│</text><text class="breeze-k8s-deploy-cluster-r4" x="24.4" y="483.6" textLength="292.8" clip-path="url(#breeze-k8s-deploy-cluster-line-19)">--skip-compile-ui-assets</text><text class="breeze-k8s-deploy-cluster-r1" x="341.6" y="483.6" textLength="854" clip-path="url(#breeze-k8s-deploy-cluster-line-19)">Skips&#160;execution&#160;of&#160;breeze&#160;ui&#16 [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="508" textLength="1464" clip-path="url(#breeze-k8s-deploy-cluster-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-deploy-cluster-r1" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-20)">
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="532.4" textLength="24.4" clip-path="url(#breeze-k8s-deploy-cluster-line-21)">╭─</text><text class="breeze-k8s-deploy-cluster-r5" x="24.4" y="532.4" textLength="195.2" clip-path="url(#breeze-k8s-deploy-cluster-line-21)">&#160;Common&#160;options&#160;</text><text class="breeze-k8s-deploy-cluster-r5" x="219.6" y="532.4" textLength="1220" clip-path="url(#breeze-k8s-deploy-cluster-line-21)">─────────────────────────────────────────── [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-22)">│</text><text class="breeze-k8s-deploy-cluster-r4" x="24.4" y="556.8" textLength="73.2" clip-path="url(#breeze-k8s-deploy-cluster-line-22)">--help</text><text class="breeze-k8s-deploy-cluster-r6" x="122" y="556.8" textLength="24.4" clip-path="url(#breeze-k8s-deploy-cluster-line-22)">-h</text><text class="breeze-k8s-deploy-cluster-r1" x="170.8" y="556.8"  [...]
+</text><text class="breeze-k8s-deploy-cluster-r5" x="0" y="581.2" textLength="1464" clip-path="url(#breeze-k8s-deploy-cluster-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-deploy-cluster-r1" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-deploy-cluster-line-23)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/dev/breeze/doc/images/output_k8s_deploy-cluster.txt b/dev/breeze/doc/images/output_k8s_deploy-cluster.txt
new file mode 100644
index 00000000000..fa099647e20
--- /dev/null
+++ b/dev/breeze/doc/images/output_k8s_deploy-cluster.txt
@@ -0,0 +1 @@
+6b82815ccbac7e68a900d84d9b2be1cd
diff --git a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg
index 67830493589..93eeb3545d8 100644
--- a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg
+++ b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg
@@ -206,16 +206,16 @@
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-8)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="215.2" textLength="1281" clip-path="url(#breeze-setup-check-all-params-in-groups-line-8)">ci-image:pull&#160;|&#160;ci-image:save&#160;|&#160;ci-image:verify&#160;|&#160;ci:fix-ownership&#160;|&#160;ci:free-space&#160;|&#160;ci:get-workflow-info</text [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-9)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="239.6" textLength="1281" clip-path="url(#breeze-setup-check-all-params-in-groups-line-9)">|&#160;ci:resource-check&#160;|&#160;ci:selective-check&#160;|&#160;ci:set-milestone&#160;|&#160;ci:upgrade&#160;|&#160;cleanup&#160;|&#160;doctor&#160;|&#160;do [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-10)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="264" textLength="1281" clip-path="url(#breeze-setup-check-all-params-in-groups-line-10)">|&#160;generate-migration-file&#160;|&#160;issues&#160;|&#160;issues:unassign&#160;|&#160;k8s&#160;|&#160;k8s:build-k8s-image&#160;|&#160;k8s:configure-cluster&#16 [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="288.4" textLength="1171.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">|&#160;k8s:create-cluster&#160;|&#160;k8s:delete-cluster&#160;|&#160;k8s:deploy-airflow&#160;|&#160;k8s:dev&#160;|&#160;k8s:k9s&#160;|&#160;k8s:logs&#160;|&# [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="312.8" textLength="1281" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">k8s:run-complete-tests&#160;|&#160;k8s:setup-env&#160;|&#160;k8s:shell&#160;|&#160;k8s:status&#160;|&#160;k8s:tests&#160;|&#160;k8s:upload-k8s-image&#160;|&#16 [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="337.2" textLength="1171.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">pr:auto-triage&#160;|&#160;pr:stats&#160;|&#160;prod-image&#160;|&#160;prod-image:build&#160;|&#160;prod-image:load&#160;|&#160;prod-image:pull&#160;|&#160;< [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="361.6" textLength="1134.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">prod-image:save&#160;|&#160;prod-image:verify&#160;|&#160;registry&#160;|&#160;registry:backfill&#160;|&#160;registry:extract-data&#160;|&#160;</text><text c [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="386" textLength="1098" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">registry:publish-versions&#160;|&#160;release-management&#160;|&#160;release-management:add-back-references&#160;|&#160;</text><text class="breeze-setup-check-all- [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="410.4" textLength="1110.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">release-management:check-release-files&#160;|&#160;release-management:clean-old-provider-artifacts&#160;|&#160;</text><text class="breeze-setup-check-all-par [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="434.8" textLength="1073.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">release-management:constraints-version-check&#160;|&#160;release-management:create-minor-branch&#160;|&#160;</text><text class="breeze-setup-check-all-params [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="459.2" textLength="1134.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">release-management:generate-airflowctl-changelog&#160;|&#160;release-management:generate-constraints&#160;|&#160;</text><text class="breeze-setup-check-all-p [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="483.6" textLength="1281" clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">release-management:generate-issue-content-airflow-ctl&#160;|&#160;release-management:generate-issue-content-core&#160;|&#160;</text><text class="breeze-setup-c [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="508" textLength="671" clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">release-management:generate-issue-content-helm-chart&#160;|&#160;</text><text class="breeze-setup-check-all-params-in-groups-r5" x="1451.8" y="508" textLength="12.2 [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="288.4" textLength="1281" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">|&#160;k8s:create-cluster&#160;|&#160;k8s:delete-cluster&#160;|&#160;k8s:deploy-airflow&#160;|&#160;k8s:deploy-cluster&#160;|&#160;k8s:dev&#160;|&#160;k8s:k9s& [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="312.8" textLength="1085.8" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">k8s:logs&#160;|&#160;k8s:run-complete-tests&#160;|&#160;k8s:setup-env&#160;|&#160;k8s:shell&#160;|&#160;k8s:status&#160;|&#160;k8s:tests&#160;|&#160;</text>< [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="337.2" textLength="1281" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">k8s:upload-k8s-image&#160;|&#160;pr&#160;|&#160;pr:auto-triage&#160;|&#160;pr:stats&#160;|&#160;prod-image&#160;|&#160;prod-image:build&#160;|&#160;prod-image: [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="361.6" textLength="1061.4" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">prod-image:pull&#160;|&#160;prod-image:save&#160;|&#160;prod-image:verify&#160;|&#160;registry&#160;|&#160;registry:backfill&#160;|&#160;</text><text class=" [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="386" textLength="890.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">registry:extract-data&#160;|&#160;registry:publish-versions&#160;|&#160;release-management&#160;|&#160;</text><text class="breeze-setup-check-all-params-in-groups [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="410.4" textLength="1000.4" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">release-management:add-back-references&#160;|&#160;release-management:check-release-files&#160;|&#160;</text><text class="breeze-setup-check-all-params-in-gr [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="434.8" textLength="1183.4" clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">release-management:clean-old-provider-artifacts&#160;|&#160;release-management:constraints-version-check&#160;|&#160;</text><text class="breeze-setup-check-a [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="459.2" textLength="1122.4" clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">release-management:create-minor-branch&#160;|&#160;release-management:generate-airflowctl-changelog&#160;|&#160;</text><text class="breeze-setup-check-all-pa [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="483.6" textLength="1195.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">release-management:generate-constraints&#160;|&#160;release-management:generate-issue-content-airflow-ctl&#160;|&#160;</text><text class="breeze-setup-check- [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="508" textLength="1268.8" clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">release-management:generate-issue-content-core&#160;|&#160;release-management:generate-issue-content-helm-chart&#160;|&#160;</text><text class="breeze-setup-chec [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="532.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">release-management:generate-issue-content-providers&#160;|&#160;release-management:generate-providers-metadata&#160;|&#160;</text><text class="breeze-setup-c [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="556.8" textLength="1110.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">release-management:install-provider-distributions&#160;|&#160;release-management:merge-prod-images&#160;|&#160;</text><text class="breeze-setup-check-all-par [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="581.2" textLength="1281" clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">release-management:prepare-airflow-ctl-distributions&#160;|&#160;release-management:prepare-airflow-distributions&#160;|</text><text class="breeze-setup-check- [...]
diff --git a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt
index ca70f9dbfed..1956792e47d 100644
--- a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt
+++ b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt
@@ -1 +1 @@
-84e48dec511d92250602531d6574ff5c
+6a605c405b9bd7f51d3ba9b294de9231
diff --git a/dev/breeze/doc/images/output_setup_regenerate-command-images.svg b/dev/breeze/doc/images/output_setup_regenerate-command-images.svg
index e2cb41ec5de..ddfe50c6819 100644
--- a/dev/breeze/doc/images/output_setup_regenerate-command-images.svg
+++ b/dev/breeze/doc/images/output_setup_regenerate-command-images.svg
@@ -223,11 +223,11 @@
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-10)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="264" textLength="1171.2" clip-path="url(#breeze-setup-regenerate-command-images-line-10)">ci:get-workflow-info&#160;|&#160;ci:resource-check&#160;|&#160;ci:selective-check&#160;|&#160;ci:set-milestone&#160;|&#160;ci:upgrade&#160;|&#160;</text><text class= [...]
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="288.4" textLength="1122.4" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">cleanup&#160;|&#160;doctor&#160;|&#160;down&#160;|&#160;exec&#160;|&#160;generate-migration-file&#160;|&#160;issues&#160;|&#160;issues:unassign&#160;|&#160;k8s&# [...]
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="312.8" textLength="1073.6" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">k8s:build-k8s-image&#160;|&#160;k8s:configure-cluster&#160;|&#160;k8s:create-cluster&#160;|&#160;k8s:delete-cluster&#160;|&#160;</text><text class="breeze-setup- [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="337.2" textLength="1244.4" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">k8s:deploy-airflow&#160;|&#160;k8s:dev&#160;|&#160;k8s:k9s&#160;|&#160;k8s:logs&#160;|&#160;k8s:run-complete-tests&#160;|&#160;k8s:setup-env&#160;|&#160;k8s:shel [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="361.6" textLength="1171.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">|&#160;k8s:status&#160;|&#160;k8s:tests&#160;|&#160;k8s:upload-k8s-image&#160;|&#160;pr&#160;|&#160;pr:auto-triage&#160;|&#160;pr:stats&#160;|&#160;prod-image&#1 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="386" textLength="1244.4" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">prod-image:build&#160;|&#160;prod-image:load&#160;|&#160;prod-image:pull&#160;|&#160;prod-image:save&#160;|&#160;prod-image:verify&#160;|&#160;registry&#160;</text>< [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="410.4" textLength="1159" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">|&#160;registry:backfill&#160;|&#160;registry:extract-data&#160;|&#160;registry:publish-versions&#160;|&#160;release-management&#160;|&#160;</text><text class="bre [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="434.8" textLength="1000.4" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">release-management:add-back-references&#160;|&#160;release-management:check-release-files&#160;|&#160;</text><text class="breeze-setup-regenerate-command-images- [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="337.2" textLength="1195.6" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">k8s:deploy-airflow&#160;|&#160;k8s:deploy-cluster&#160;|&#160;k8s:dev&#160;|&#160;k8s:k9s&#160;|&#160;k8s:logs&#160;|&#160;k8s:run-complete-tests&#160;|&#160;</t [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="361.6" textLength="1195.6" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">k8s:setup-env&#160;|&#160;k8s:shell&#160;|&#160;k8s:status&#160;|&#160;k8s:tests&#160;|&#160;k8s:upload-k8s-image&#160;|&#160;pr&#160;|&#160;pr:auto-triage&#160; [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="386" textLength="1183.4" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">pr:stats&#160;|&#160;prod-image&#160;|&#160;prod-image:build&#160;|&#160;prod-image:load&#160;|&#160;prod-image:pull&#160;|&#160;prod-image:save&#160;|&#160;</text>< [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="410.4" textLength="1244.4" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">prod-image:verify&#160;|&#160;registry&#160;|&#160;registry:backfill&#160;|&#160;registry:extract-data&#160;|&#160;registry:publish-versions&#160;|</text><text c [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="434.8" textLength="1244.4" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">release-management&#160;|&#160;release-management:add-back-references&#160;|&#160;release-management:check-release-files&#160;|</text><text class="breeze-setup-r [...]
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-18)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="459.2" textLength="1183.4" clip-path="url(#breeze-setup-regenerate-command-images-line-18)">release-management:clean-old-provider-artifacts&#160;|&#160;release-management:constraints-version-check&#160;|&#160;</text><text class="breeze-setup-regenerate- [...]
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-19)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="483.6" textLength="1122.4" clip-path="url(#breeze-setup-regenerate-command-images-line-19)">release-management:create-minor-branch&#160;|&#160;release-management:generate-airflowctl-changelog&#160;|&#160;</text><text class="breeze-setup-regenerate-comma [...]
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-20)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="508" textLength="1195.6" clip-path="url(#breeze-setup-regenerate-command-images-line-20)">release-management:generate-constraints&#160;|&#160;release-management:generate-issue-content-airflow-ctl&#160;|&#160;</text><text class="breeze-setup-regenerate-com [...]
diff --git a/dev/breeze/doc/images/output_setup_regenerate-command-images.txt b/dev/breeze/doc/images/output_setup_regenerate-command-images.txt
index 2a4c8952872..8538e42bc7a 100644
--- a/dev/breeze/doc/images/output_setup_regenerate-command-images.txt
+++ b/dev/breeze/doc/images/output_setup_regenerate-command-images.txt
@@ -1 +1 @@
-58ee7b06908a1070135dc0ce3ff3b6d2
+842d090a8c3d4ea38e9eeedf15d1341e
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
index 9b1506294b0..093cbeb960e 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
@@ -45,6 +45,7 @@ from airflow_breeze.commands.common_options import (
     option_verbose,
 )
 from airflow_breeze.commands.production_image_commands import run_build_production_image
+from airflow_breeze.commands.ui_commands import run_compile_ui_assets
 from airflow_breeze.global_constants import (
     AIRFLOW_SOURCES_TO,
     ALLOWED_EXECUTORS,
@@ -61,6 +62,7 @@ from airflow_breeze.utils.click_utils import BreezeGroup
 from airflow_breeze.utils.confirm import confirm_action
 from airflow_breeze.utils.console import Output, console_print, get_console
 from airflow_breeze.utils.custom_param_types import CacheableChoice, CacheableDefault
+from airflow_breeze.utils.docker_command_utils import perform_environment_checks
 from airflow_breeze.utils.kubernetes_utils import (
     CHART_PATH,
     K8S_CLUSTERS_PATH,
@@ -90,7 +92,12 @@ from airflow_breeze.utils.parallel import (
 )
 from airflow_breeze.utils.path_utils import AIRFLOW_ROOT_PATH
 from airflow_breeze.utils.recording import generating_command_images
-from airflow_breeze.utils.run_utils import RunCommandResult, check_if_image_exists, run_command
+from airflow_breeze.utils.run_utils import (
+    RunCommandResult,
+    assert_prek_installed,
+    check_if_image_exists,
+    run_command,
+)
 
 KUBERNETES_PYTEST_ARGS = [
     "--strict-markers",
@@ -249,6 +256,18 @@ option_parallelism_cluster = click.option(
     envvar="PARALLELISM",
     show_default=True,
 )
+option_skip_image_build = click.option(
+    "--skip-image-build",
+    help="Skips execution of breeze k8s build-k8s-image in deploy-cluster command.",
+    is_flag=True,
+    envvar="SKIP_IMAGE_BUILD",
+)
+option_skip_compile_ui_assets = click.option(
+    "--skip-compile-ui-assets",
+    help="Skips execution of breeze ui compile-assets in deploy-cluster command.",
+    is_flag=True,
+    envvar="SKIP_IMAGE_BUILD",
+)
 option_all = click.option("--all", help="Apply it to all created clusters", is_flag=True, envvar="ALL")
 
 K8S_CLUSTER_CREATE_PROGRESS_REGEXP = r".*airflow-python-[0-9.]+-v[0-9.].*|.*Connecting to localhost.*"
@@ -2231,3 +2250,87 @@ def run_complete_tests(
         )
         if result != 0:
             sys.exit(result)
+
+
+@kubernetes_group.command(
+    name="deploy-cluster",
+    help="Create, configure kind cluster and build Airflow image for Airflow Chart deployment.",
+    context_settings=dict(
+        ignore_unknown_options=True,
+    ),
+)
+@option_force_venv_setup
+@option_force_recreate_cluster
+@option_python
+@option_kubernetes_version
+@option_rebuild_base_image
+@option_use_uv
+@option_skip_image_build
+@option_skip_compile_ui_assets
+def deploy_cluster(
+    force_venv_setup: bool,
+    force_recreate_cluster: bool,
+    python: str,
+    kubernetes_version: str,
+    rebuild_base_image: bool,
+    use_uv: bool,
+    skip_image_build: bool,
+    skip_compile_ui_assets: bool,
+):
+    console_print("[info]Syncing Virtual Environment[/]")
+    result = sync_virtualenv(force_venv_setup=force_venv_setup)
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+    make_sure_kubernetes_tools_are_installed()
+
+    return_code, _ = _create_cluster(
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=None,
+        force_recreate_cluster=force_recreate_cluster,
+        num_tries=1,
+        show_hints=False,
+    )
+    if return_code != 0:
+        sys.exit(return_code)
+
+    return_code, _ = _configure_k8s_cluster(
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=None,
+    )
+    if return_code != 0:
+        sys.exit(return_code)
+
+    if skip_compile_ui_assets:
+        console_print("[info]Skipping compilation of Airflow UI assets[/]")
+    else:
+        console_print("[info]Compiling Airflow UI assets[/]")
+        perform_environment_checks()
+        assert_prek_installed()
+        result = run_compile_ui_assets(
+            dev=False, run_in_background=False, force_clean=False, additional_ui_hooks=[]
+        )
+        if result.returncode != 0:
+            sys.exit(result.returncode)
+
+    if skip_image_build:
+        console_print("[info]Skipping Airflow Image Build[/]")
+    else:
+        return_code, _ = _rebuild_k8s_image(
+            python=python,
+            rebuild_base_image=rebuild_base_image,
+            copy_local_sources=True,
+            use_uv=use_uv,
+            output=None,
+        )
+        if return_code != 0:
+            sys.exit(return_code)
+
+    return_code, _ = _upload_k8s_image(
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=None,
+    )
+    if return_code != 0:
+        sys.exit(return_code)
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
index fcabbbcba93..274439111ea 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
@@ -24,6 +24,7 @@ KUBERNETES_CLUSTER_COMMANDS: dict[str, str | list[str]] = {
         "configure-cluster",
         "build-k8s-image",
         "upload-k8s-image",
+        "deploy-cluster",
         "deploy-airflow",
         "dev",
         "delete-cluster",
@@ -265,4 +266,17 @@ KUBERNETES_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
             "options": ["--python", "--kubernetes-version", "--executor", "--force-venv-setup"],
         }
     ],
+    "breeze k8s deploy-cluster": [
+        {
+            "name": "K8S cluster creation flags",
+            "options": [
+                "--python",
+                "--kubernetes-version",
+                "--force-recreate-cluster",
+                "--force-venv-setup",
+            ],
+        },
+        {"name": "Build image flags", "options": ["--rebuild-base-image", "--use-uv", "--skip-image-build"]},
+        {"name": "UI flags", "options": ["--skip-compile-ui-assets"]},
+    ],
 }