はじめに
Kubernetes の複数の開発環境を扱う場合 kubectl config set-context
や kubectx
などのプラグインを利用してコンテキストを切り替えますが、この方法だと意図しない環境を操作してしまうこともしばしば...
そこで Kubernetes のコンテキストを一定時間だけ保持して利用する fish 関数を書いてみました。
説明
事前準備
以下を使える環境を前提としています。
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 のコンテキストに限らず利用できます。