(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】kubectlコマンドを補完して利用する方法

スポンサーリンク

やりたいこと

kubectlコマンドのサブコマンドを[TAB]キーで補完できるようにしたい。

環境情報
$ kubectl version
...
Client Version: version.Info{Major:"1", Minor:"17",
...
bash --version
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)

やり方

completionを用いて補完用の設定項目をファイルに吐き出し

kubectl completion bash > test.txt

同ファイルをログインシェルで読むように指定し

$ echo "source ./test.txt" >> .bashrc

同設定ファイルを読み込めば

$ source .bashrc

タブキーで候補が表示される。

$ kubectl get e
endpoints                        endpointslices.discovery.k8s.io  events                           events.events.k8s.io

以下、補足です。

補足

kubectlコマンドのマニュアルを見れば分かりますが以下のように設定用コマンドがデフォルトで利用できます。

Settings Commands:
  label          Update the labels on a resource
  annotate       Update the annotations on a resource
  completion     Output shell completion code for the specified shell (bash or zsh)

この「completion」はまさしく保管用のシェルを出力してくれます。

ファイルの中身は以下のように大量のテキストで構成されており例えばkubectl top用の設定箇所の一部を見てみると以下のようになっています。

_kubectl_top()
{
    last_command="kubectl_top"
    command_aliases=()
    commands=()
    commands+=("node")
    if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then
        command_aliases+=("no")
        aliashash["no"]="node"
        command_aliases+=("nodes")
        aliashash["nodes"]="node"
    fi
    commands+=("pod")
    if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then
        command_aliases+=("po")
        aliashash["po"]="pod"
        command_aliases+=("pods")
        aliashash["pods"]="pod"
    fi
...
    flags+=("--add-dir-header")
    flags+=("--alsologtostderr")
    flags+=("--as=")
    two_word_flags+=("--as")
    flags+=("--as-group=")
    two_word_flags+=("--as-group")
    flags+=("--cache-dir=")
...
    must_have_one_flag=()
    must_have_one_noun=()
    noun_aliases=()
}

環境によってはタブキーを押下した際に効かない場合も有、例えばCygwinというWindows系のOS用ソフトであれば以下のようなエラーになりました。(※GNU bash, バージョン 4.4.12(3)-release x86_64-unknown-cygwin)

$ kubectl get de-bash: _get_comp_words_by_ref: コマンドが見つかりません
-bash: _get_comp_words_by_ref: コマンドが見つかりません

終わり

意外と知らないKubernetes利用時の便利コマンドでした。尚、以下コマンドを押下すれば

$ kubectl  api-resources

各オブジェクト名とその短縮名も取得できるのでこれを活かせば尚操作しやすくなると思います。