Kubernetes のコンテキストを一定時間だけ保持して利用する fish 関数


はじめに

Kubernetes の複数の開発環境を扱う場合 kubectl config set-contextkubectx などのプラグインを利用してコンテキストを切り替えますが、この方法だと意図しない環境を操作してしまうこともしばしば...

そこで Kubernetes のコンテキストを一定時間だけ保持して利用する fish 関数を書いてみました。

説明

事前準備

以下を使える環境を前提としています。
- kubectl
- fish
- peco

fish function の作成

function 名は kubettl とします。
$HOME/.config/fish/functions/kubettl.fish というファイルを作成し、以下のソースを記述します。

function kubettl
    # 利用する変数の初期化
    set ctx_dir $HOME/.context
    set cxt_file $ctx_dir/kubectx
    set ctx

    # コンテキストが保持されていても無視する `--ignore` オプションの指定を確認
    set cmd_argv $argv
    if [ $argv[1] = '--ignore' ]
        set cmd_argv $argv[2..-1]
    end

    # コンテキストの決定
    if [ $argv[1] != '--ignore' ]; and test (find $cxt_file -mmin -10 ^ /dev/null | wc -l) -eq 1
        # 利用可能なコンテキストがあれば使う
        set ctx (cat $cxt_file)
    else
        # 無ければ peco を利用して選択する
        set ctx (string split ' ' (kubectl config view -o jsonpath='{.users[*].name}') | peco)
    end

    # コンテキストをファイルへ出力
    test -d $ctx_dir; or mkdir $ctx_dir
    echo $ctx >$cxt_file

    # コンテキストを指定してコマンド実行
    kubectl --context=$ctx $cmd_argv
end

コンテキストを一定時間だけ利用する方法について

コンテキストをファイルに出力し、そのファイルの更新日時が 10 min 以内であればその内容を利用するようにしています。

find hoge -mmin -10

こうすると hoge というファイルが 10 min 以内に更新されている場合のみ結果が出力されます。
* findコマンドのmtimeオプションまとめという記事が参考になります。

該当のファイルが存在しないとエラーが起きるため、ソース内では ^ /dev/null をつけた上で行数をカウントしています。

test (find hoge -mmin -10 ^ /dev/null | wc -l) -eq 1

使い方

kubectl の代わりに kubettl を使うだけです。

kubettl get pods

最後に

単にコンテキストをファイルに書き出して一定時間内だけ利用するという手法なので、もちろん Kubernetes のコンテキストに限らず利用できます。