🐺

kube-ps1をstartship上で設定する

2024/09/15に公開

kube-ps1をstar ship上で表示できるように設定する

ubuntuでzshを利用しており、starshipを導入した時にkube-ps1がうまくコンテキストを読み込めなかったので
starshipの設定を見てみたところ色々記載されていた。

結論kubectl set-contextでコンテキストの設定を行う必要がある

kube-ps1

kubectlで設定した現在のKubernetesコンテキストと名前空間を
Bash/Zshのプロンプト文字列(つまり$PS1)に追加できるスクリプトです。

https://github.com/jonmosco/kube-ps1

今回は直接sourceをcloneして起動させています。

https://github.com/jonmosco/kube-ps1

starship

無限にカスタマイズ可能なシェル用のプロンプト

https://starship.rs/ja-JP/guide/

configuration for kubernetes on starship

設定方法はstarshipのドキュメントに書いてあった。

https://starship.rs/config/#kubernetes

Displays the current Kubernetes context name and, if set, the namespace, user and cluster from the kubeconfig file. The namespace needs to be set in the kubeconfig file, this can be done via kubectl config set-context starship-context --namespace astronaut.

現在のKubernetesコンテキスト名を表示し、kubeconfig ファイルに設定されている場合は、名前空間、ユーザー、クラスターも表示する。
名前空間はkubeconfigファイルに設定される必要があり、これは kubectl config set-context starship-context --namespace astronaut のようなコマンドを使用して設定可能。

つまりkubectl config set-context starship-context --namespace astronautを実行すれば設定できる

kubectl config

Modify kubeconfig files using subcommands like "kubectl config set
current-context my-context".

新しいコンテキストを作成したり、既存のコンテキストを更新するサブコマンド

kubectl config set-context

set-context: Set a context entry in kubeconfig

追加、もしくは更新したいコンテキストを選択する

--namespace astronaut

--namespace='':
namespace for the context entry in kubeconfig

対象のコンテキストのデフォルトの名前空間を astronaut に設定します。

kube-ps1.sh コンテキストの設定

kube-ps1.shの中身を見てみると、KUBE_PS1_CONTEXT_ENABLE=trueの場合
kubectlコマンドで現在のコンテキストを設定している

KUBE_PS1_BINARY="${KUBE_PS1_BINARY:-kubectl}"

...省略

_kube_ps1_get_context() {
  if [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
    KUBE_PS1_CONTEXT="$(${KUBE_PS1_BINARY} config current-context 2>/dev/null)"
    # Set namespace to 'N/A' if it is not defined
    KUBE_PS1_CONTEXT="${KUBE_PS1_CONTEXT:-N/A}"

    if [[ -n "${KUBE_PS1_CLUSTER_FUNCTION}" ]]; then
      KUBE_PS1_CONTEXT="$("${KUBE_PS1_CLUSTER_FUNCTION}" "${KUBE_PS1_CONTEXT}")"
    fi
  fi
}

zshかbashによって対応を変えており、
zshの場合は、zshのフック関数でプロンプトの表示するタイミングで
上記コンテキストの反映に関するスクリプトを実行するように登録している

case "$(_kube_ps1_shell_type)" in
    "zsh")
      _KUBE_PS1_OPEN_ESC="%{"
      _KUBE_PS1_CLOSE_ESC="%}"
      _KUBE_PS1_DEFAULT_BG="%k"
      _KUBE_PS1_DEFAULT_FG="%f"
      setopt PROMPT_SUBST
      autoload -U add-zsh-hook
      add-zsh-hook precmd _kube_ps1_prompt_update
      zmodload -F zsh/stat b:zstat
      zmodload zsh/datetime
      ;;
    "bash")
      _KUBE_PS1_OPEN_ESC=$'\001'
      _KUBE_PS1_CLOSE_ESC=$'\002'
      _KUBE_PS1_DEFAULT_BG=$'\033[49m'
      _KUBE_PS1_DEFAULT_FG=$'\033[39m'
      [[ $PROMPT_COMMAND =~ _kube_ps1_prompt_update ]] || PROMPT_COMMAND="_kube_ps1_prompt_update;${PROMPT_COMMAND:-:}"
      ;;
  esac

カスタマイズする方法

Customization

The default settings can be overridden in ~/.bashrc or ~/.zshrc by setting the following variables:

KUBE_PS1_SYMBOL_COLORを変更する場合は.zshrcに下記設定を加えることで上書きすることができる

KUBE_PS1_SYMBOL_COLOR='green'

他にもカスタマイズできる項目はいくつかある

https://github.com/jonmosco/kube-ps1?tab=readme-ov-file#customization

Discussion