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上がった。 また今回紹介したコードは以下に上がっているので興味があれば覗いてみてください。