k8sのコンテキストをシュッと見て切り替えられるようにする

Posted on

tl;dr

promptにコンテキスト名を出して、pecoでコンテキストフィルタリング出来るようにしたら良い感じだった。

モチベーション

k8sを運用していると環境ごとにコンテキストを分けるような場合が多いと思う。そこでdevelopmentと思いつつ作業していたらproductionだったみたいなことを避けたい。 またマイクロサービスなどで扱うコンテキストの数が増えるとコンテキスト名を思い出すコストが上がってくるのでシュッと切り替えたい。

コンテキスト可視化

シェルのpromptに表示して常に current-context を把握出来るようにした。 以下は現在fish shellで使っているプロンプト関数の抜粋。

function _k8s_context_name
  set -l ctx (cat $HOME/.kube/config | grep 'current-context' | cut -f 2 -d ':' | string trim)
  if string match -q 'gke*' $ctx
    echo (echo $ctx | cut -f 4 -d '_')
  else
    echo $ctx
  end
end

function fish_prompt
...
set -l k8s_raw (_k8s_context_name)
if test -n $k8s_raw
  if test -n "$K8S_PRODUCTION_CONTEXT" -a $k8s_raw = "$K8S_PRODUCTION_CONTEXT"
    set k8s_info "$red$k8s_raw "
  else
    set k8s_info "$yellow$k8s_raw "
  end
end
...
  • $K8S_PRODUCTION_CONTEXT に本番環境用のコンテキストを指定しておき、その時だけ色を変えるようなことしている
  • gke_.* コンテキストはprefix長いので個別にtrimしている

pecoでコンテキストを切り替える

単純に get-contexts したものをpecoに食わせて選択出来るようにした。 特に gke_.* のコンテキストはprefix長いので便利。

function peco_select_k8s_context
  set -l query (commandline)
  if test -n $query
    set peco_flags --query "$query"
  end

  kubectl config get-contexts --no-headers=true | awk '{print $2}'| peco $peco_flags | read line
  if test $line
    commandline "kubectl config use-context $line"
  else
    commandline ''
  end
end

まとめ

これまでhistoryから探して〜みたいな感じで切り替えていたので大分QOL上がった。 また今回紹介したコードは以下に上がっているので興味があれば覗いてみてください。