This is an automated email from the ASF dual-hosted git repository. potiuk pushed a commit to branch v2-8-test in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 1c3d6c42f19c42857cf638cd11587007c985661b Author: Jarek Potiuk <ja...@potiuk.com> AuthorDate: Sat Feb 17 23:38:53 2024 +0100 Handle two types of k9s execution and add better diagnostics (#37510) With kind 0.21.0 there was a bug that disallow to use emulation on ARM after creating Kind cluster, this has been fixed and new images were released so workaround we implemented in #37371 can be removed. However we should leave the option to use local k9s if installed by default, and switching to docker when `--use-docker` flas is used. We also add better diagnostics who might have pulled a buggy kindest image and telling them how to recover. (cherry picked from commit f1af97a9d0f0fc2482ae939a75593877ac84869d) --- dev/breeze/doc/images/output_k8s_k9s.svg | 36 ++++++++----- dev/breeze/doc/images/output_k8s_k9s.txt | 2 +- .../airflow_breeze/commands/kubernetes_commands.py | 62 +++++++++++++--------- .../commands/kubernetes_commands_config.py | 1 + 4 files changed, 62 insertions(+), 39 deletions(-) diff --git a/dev/breeze/doc/images/output_k8s_k9s.svg b/dev/breeze/doc/images/output_k8s_k9s.svg index 564e262faf..4640145777 100644 --- a/dev/breeze/doc/images/output_k8s_k9s.svg +++ b/dev/breeze/doc/images/output_k8s_k9s.svg @@ -1,4 +1,4 @@ -<svg class="rich-terminal" viewBox="0 0 1482 464.79999999999995" xmlns="http://www.w3.org/2000/svg"> +<svg class="rich-terminal" viewBox="0 0 1482 513.5999999999999" xmlns="http://www.w3.org/2000/svg"> <!-- Generated with Rich https://www.textualize.io --> <style> @@ -43,7 +43,7 @@ <defs> <clipPath id="breeze-k8s-k9s-clip-terminal"> - <rect x="0" y="0" width="1463.0" height="413.79999999999995" /> + <rect x="0" y="0" width="1463.0" height="462.59999999999997" /> </clipPath> <clipPath id="breeze-k8s-k9s-line-0"> <rect x="0" y="1.5" width="1464" height="24.65"/> @@ -93,9 +93,15 @@ <clipPath id="breeze-k8s-k9s-line-15"> <rect x="0" y="367.5" width="1464" height="24.65"/> </clipPath> +<clipPath id="breeze-k8s-k9s-line-16"> + <rect x="0" y="391.9" width="1464" height="24.65"/> + </clipPath> +<clipPath id="breeze-k8s-k9s-line-17"> + <rect x="0" y="416.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="462.8" rx="8"/><text class="breeze-k8s-k9s-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: k8s k9s</text> + <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="511.6" rx="8"/><text class="breeze-k8s-k9s-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: k8s k9s</text> <g transform="translate(26,22)"> <circle cx="0" cy="0" r="7" fill="#ff5f57"/> <circle cx="22" cy="0" r="7" fill="#febc2e"/> @@ -111,17 +117,19 @@ </text><text class="breeze-k8s-k9s-r1" x="12.2" y="93.2" textLength="658.8" clip-path="url(#breeze-k8s-k9s-line-3)">Run k9s tool. You can pass any k9s args as extra args.</text><text class="breeze-k8s-k9s-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-3)"> </text><text class="breeze-k8s-k9s-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-4)"> </text><text class="breeze-k8s-k9s-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-k8s-k9s-line-5)">╭─</text><text class="breeze-k8s-k9s-r5" x="24.4" y="142" textLength="183" clip-path="url(#breeze-k8s-k9s-line-5)"> K8S k9s flags </text><text class="breeze-k8s-k9s-r5" x="207.4" y="142" textLength="1232.2" clip-path="url(#breeze-k8s-k9s-line-5)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text [...] -</text><text class="breeze-k8s-k9s-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-6)">│</text><text class="breeze-k8s-k9s-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-6)">-</text><text class="breeze-k8s-k9s-r4" x="36.6" y="166.4" textLength="85.4" clip-path="url(#breeze-k8s-k9s-line-6)">-python</text><text class="breeze-k8s-k9s-r6" x="292.8" y="166.4" textLength="24.4" clip-path="url(#breeze-k8s-k9s-line-6)">-p</text><text class= [...] -</text><text class="breeze-k8s-k9s-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-7)">│</text><text class="breeze-k8s-k9s-r5" x="341.6" y="190.8" textLength="732" clip-path="url(#breeze-k8s-k9s-line-7)">[default: 3.8]                                         [...] -</text><text class="breeze-k8s-k9s-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-8)">│</text><text class="breeze-k8s-k9s-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-8)">-</text><text class="breeze-k8s-k9s-r4" x="36.6" y="215.2" textLength="134.2" clip-path="url(#breeze-k8s-k9s-line-8)">-kubernetes</text><text class="breeze-k8s-k9s-r4" x="170.8" y="215.2" textLength="97.6" clip-path="url(#breeze-k8s-k9s-line-8)">-version</text>< [...] -</text><text class="breeze-k8s-k9s-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-9)">│</text><text class="breeze-k8s-k9s-r7" x="341.6" y="239.6" textLength="658.8" clip-path="url(#breeze-k8s-k9s-line-9)">(>v1.25.16< | v1.26.14 | v1.27.11 | v1.28.7 | v1.29.2)</text><text class="breeze-k8s-k9s-r5" x="1451.8" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-9)">│</text><text class="breeze-k8s-k9s-r1" x= [...] -</text><text class="breeze-k8s-k9s-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-10)">│</text><text class="breeze-k8s-k9s-r5" x="341.6" y="264" textLength="658.8" clip-path="url(#breeze-k8s-k9s-line-10)">[default: v1.25.16]                                   </text><text class="breeze-k [...] -</text><text class="breeze-k8s-k9s-r5" x="0" y="288.4" textLength="1464" clip-path="url(#breeze-k8s-k9s-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-k9s-r1" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-11)"> -</text><text class="breeze-k8s-k9s-r5" x="0" y="312.8" textLength="24.4" clip-path="url(#breeze-k8s-k9s-line-12)">╭─</text><text class="breeze-k8s-k9s-r5" x="24.4" y="312.8" textLength="195.2" clip-path="url(#breeze-k8s-k9s-line-12)"> Common options </text><text class="breeze-k8s-k9s-r5" x="219.6" y="312.8" textLength="1220" clip-path="url(#breeze-k8s-k9s-line-12)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><t [...] -</text><text class="breeze-k8s-k9s-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-13)">│</text><text class="breeze-k8s-k9s-r4" x="24.4" y="337.2" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-13)">-</text><text class="breeze-k8s-k9s-r4" x="36.6" y="337.2" textLength="97.6" clip-path="url(#breeze-k8s-k9s-line-13)">-verbose</text><text class="breeze-k8s-k9s-r6" x="158.6" y="337.2" textLength="24.4" clip-path="url(#breeze-k8s-k9s-line-13)">-v</text><text c [...] -</text><text class="breeze-k8s-k9s-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-14)">│</text><text class="breeze-k8s-k9s-r4" x="24.4" y="361.6" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-14)">-</text><text class="breeze-k8s-k9s-r4" x="36.6" y="361.6" textLength="48.8" clip-path="url(#breeze-k8s-k9s-line-14)">-dry</text><text class="breeze-k8s-k9s-r4" x="85.4" y="361.6" textLength="48.8" clip-path="url(#breeze-k8s-k9s-line-14)">-run</text><text clas [...] -</text><text class="breeze-k8s-k9s-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-15)">│</text><text class="breeze-k8s-k9s-r4" x="24.4" y="386" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-15)">-</text><text class="breeze-k8s-k9s-r4" x="36.6" y="386" textLength="61" clip-path="url(#breeze-k8s-k9s-line-15)">-help</text><text class="breeze-k8s-k9s-r6" x="158.6" y="386" textLength="24.4" clip-path="url(#breeze-k8s-k9s-line-15)">-h</text><text class="breeze- [...] -</text><text class="breeze-k8s-k9s-r5" x="0" y="410.4" textLength="1464" clip-path="url(#breeze-k8s-k9s-line-16)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-k9s-r1" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-16)"> +</text><text class="breeze-k8s-k9s-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-6)">│</text><text class="breeze-k8s-k9s-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-6)">-</text><text class="breeze-k8s-k9s-r4" x="36.6" y="166.4" textLength="48.8" clip-path="url(#breeze-k8s-k9s-line-6)">-use</text><text class="breeze-k8s-k9s-r4" x="85.4" y="166.4" textLength="85.4" clip-path="url(#breeze-k8s-k9s-line-6)">-docker</text><text class [...] +</text><text class="breeze-k8s-k9s-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-7)">│</text><text class="breeze-k8s-k9s-r1" x="341.6" y="190.8" textLength="1098" clip-path="url(#breeze-k8s-k9s-line-7)">if not found on PATH).                                     [...] +</text><text class="breeze-k8s-k9s-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-8)">│</text><text class="breeze-k8s-k9s-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-8)">-</text><text class="breeze-k8s-k9s-r4" x="36.6" y="215.2" textLength="85.4" clip-path="url(#breeze-k8s-k9s-line-8)">-python</text><text class="breeze-k8s-k9s-r6" x="292.8" y="215.2" textLength="24.4" clip-path="url(#breeze-k8s-k9s-line-8)">-p</text><text class= [...] +</text><text class="breeze-k8s-k9s-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-9)">│</text><text class="breeze-k8s-k9s-r5" x="341.6" y="239.6" textLength="732" clip-path="url(#breeze-k8s-k9s-line-9)">[default: 3.8]                                         [...] +</text><text class="breeze-k8s-k9s-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-10)">│</text><text class="breeze-k8s-k9s-r4" x="24.4" y="264" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-10)">-</text><text class="breeze-k8s-k9s-r4" x="36.6" y="264" textLength="134.2" clip-path="url(#breeze-k8s-k9s-line-10)">-kubernetes</text><text class="breeze-k8s-k9s-r4" x="170.8" y="264" textLength="97.6" clip-path="url(#breeze-k8s-k9s-line-10)">-version</text><text [...] +</text><text class="breeze-k8s-k9s-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-11)">│</text><text class="breeze-k8s-k9s-r7" x="341.6" y="288.4" textLength="658.8" clip-path="url(#breeze-k8s-k9s-line-11)">(>v1.25.16< | v1.26.14 | v1.27.11 | v1.28.7 | v1.29.2)</text><text class="breeze-k8s-k9s-r5" x="1451.8" y="288.4" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-11)">│</text><text class="breeze-k8s-k9s-r1" [...] +</text><text class="breeze-k8s-k9s-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-12)">│</text><text class="breeze-k8s-k9s-r5" x="341.6" y="312.8" textLength="658.8" clip-path="url(#breeze-k8s-k9s-line-12)">[default: v1.25.16]                                   </text><text class="bree [...] +</text><text class="breeze-k8s-k9s-r5" x="0" y="337.2" textLength="1464" clip-path="url(#breeze-k8s-k9s-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-k9s-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-13)"> +</text><text class="breeze-k8s-k9s-r5" x="0" y="361.6" textLength="24.4" clip-path="url(#breeze-k8s-k9s-line-14)">╭─</text><text class="breeze-k8s-k9s-r5" x="24.4" y="361.6" textLength="195.2" clip-path="url(#breeze-k8s-k9s-line-14)"> Common options </text><text class="breeze-k8s-k9s-r5" x="219.6" y="361.6" textLength="1220" clip-path="url(#breeze-k8s-k9s-line-14)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><t [...] +</text><text class="breeze-k8s-k9s-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-15)">│</text><text class="breeze-k8s-k9s-r4" x="24.4" y="386" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-15)">-</text><text class="breeze-k8s-k9s-r4" x="36.6" y="386" textLength="97.6" clip-path="url(#breeze-k8s-k9s-line-15)">-verbose</text><text class="breeze-k8s-k9s-r6" x="158.6" y="386" textLength="24.4" clip-path="url(#breeze-k8s-k9s-line-15)">-v</text><text class="br [...] +</text><text class="breeze-k8s-k9s-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-16)">│</text><text class="breeze-k8s-k9s-r4" x="24.4" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-16)">-</text><text class="breeze-k8s-k9s-r4" x="36.6" y="410.4" textLength="48.8" clip-path="url(#breeze-k8s-k9s-line-16)">-dry</text><text class="breeze-k8s-k9s-r4" x="85.4" y="410.4" textLength="48.8" clip-path="url(#breeze-k8s-k9s-line-16)">-run</text><text clas [...] +</text><text class="breeze-k8s-k9s-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-17)">│</text><text class="breeze-k8s-k9s-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-17)">-</text><text class="breeze-k8s-k9s-r4" x="36.6" y="434.8" textLength="61" clip-path="url(#breeze-k8s-k9s-line-17)">-help</text><text class="breeze-k8s-k9s-r6" x="158.6" y="434.8" textLength="24.4" clip-path="url(#breeze-k8s-k9s-line-17)">-h</text><text class= [...] +</text><text class="breeze-k8s-k9s-r5" x="0" y="459.2" textLength="1464" clip-path="url(#breeze-k8s-k9s-line-18)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-k9s-r1" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-k9s-line-18)"> </text> </g> </g> diff --git a/dev/breeze/doc/images/output_k8s_k9s.txt b/dev/breeze/doc/images/output_k8s_k9s.txt index baaa367762..8d9610b222 100644 --- a/dev/breeze/doc/images/output_k8s_k9s.txt +++ b/dev/breeze/doc/images/output_k8s_k9s.txt @@ -1 +1 @@ -9198ee4e5fa0d97caf6cb6d51480f814 +b92a689a190e9f454d09157b859da1b6 diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py index 5ca010c8ac..9ae00220d8 100644 --- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py +++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py @@ -46,7 +46,6 @@ from airflow_breeze.utils.ci_group import ci_group from airflow_breeze.utils.click_utils import BreezeGroup from airflow_breeze.utils.console import Output, get_console from airflow_breeze.utils.custom_param_types import CacheableChoice, CacheableDefault -from airflow_breeze.utils.host_info_utils import Architecture, get_host_architecture from airflow_breeze.utils.kubernetes_utils import ( CHART_PATH, K8S_CLUSTERS_PATH, @@ -166,6 +165,13 @@ option_upgrade = click.option( is_flag=True, envvar="UPGRADE", ) +option_use_docker = click.option( + "--use-docker", + help="Use Docker to start k8s executor (otherwise k9s from PATH is used and only" + " run with docker if not found on PATH).", + is_flag=True, + envvar="USE_DOCKER", +) option_use_standard_naming = click.option( "--use-standard-naming", help="Use standard naming.", @@ -1207,10 +1213,11 @@ def deploy_airflow( ) @option_python @option_kubernetes_version +@option_use_docker @option_verbose @option_dry_run @click.argument("k9s_args", nargs=-1, type=click.UNPROCESSED) -def k9s(python: str, kubernetes_version: str, k9s_args: tuple[str, ...]): +def k9s(python: str, kubernetes_version: str, use_docker: bool, k9s_args: tuple[str, ...]): result = create_virtualenv(force_venv_setup=False) if result.returncode != 0: sys.exit(result.returncode) @@ -1224,10 +1231,24 @@ def k9s(python: str, kubernetes_version: str, k9s_args: tuple[str, ...]): if not k9s_editor: env["K9S_EDITOR"] = env["EDITOR"] kubeconfig_file = get_kubeconfig_file(python=python, kubernetes_version=kubernetes_version) - # Until https://github.com/kubernetes-sigs/kind/pull/3511 is merged and released, running AMD images - # on ARM is broken with kind cluster running, so we need to run k9s directly on the host - arch, _ = get_host_architecture() - if arch != Architecture.ARM: + found_k9s = shutil.which("k9s") + if not use_docker and found_k9s: + get_console().print( + "[info]Running k9s tool found in PATH at $(found_k9s). Use --use-docker to run using docker." + ) + result = run_command( + [ + "k9s", + "--namespace", + HELM_AIRFLOW_NAMESPACE, + *k9s_args, + ], + env=env, + check=False, + ) + sys.exit(result.returncode) + else: + get_console().print("[info]Running k9s tool using docker.") result = run_command( [ "docker", @@ -1251,26 +1272,19 @@ def k9s(python: str, kubernetes_version: str, k9s_args: tuple[str, ...]): check=False, ) if result.returncode != 0: - sys.exit(result.returncode) - else: - if shutil.which("k9s") is None: get_console().print( - "[error]k9s is not installed. Please install it first " - "(for example with `brew install k9s`)." + "\n[warning]If you see `exec /bin/k9s: exec format error` it might be because" + " of known kind bug (https://github.com/kubernetes-sigs/kind/issues/3510).\n" ) - sys.exit(1) - result = run_command( - [ - "k9s", - "--namespace", - HELM_AIRFLOW_NAMESPACE, - *k9s_args, - ], - env=env, - check=False, - ) - if result.returncode != 0: - sys.exit(result.returncode) + get_console().print( + "\n[info]In such case you might want to pull latest `kindest` images. " + "For example if you run kubernetes version v1.25.16 you might need to run:\n" + "[special]* run `breeze k8s delete-cluster` (note k8s version printed after " + "Python version)\n" + "* run `docker pull kindest/node:v1.25.16`\n" + "* restart docker engine\n\n" + ) + sys.exit(result.returncode) def _logs(python: str, kubernetes_version: str): 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 3e988bd6bd..314fc92f2e 100644 --- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py +++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py @@ -255,6 +255,7 @@ KUBERNETES_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = { { "name": "K8S k9s flags", "options": [ + "--use-docker", "--python", "--kubernetes-version", ],