一直使用 kubectl 操作 k8s 集群,每次都需要查看 pod 名字、查看 service 名字等,比较麻烦,看了 kubectl 官方就支持 bash 自动补全,所以记录一下。

官方文档地址:https://kubernetes.io/zh/docs/tasks/tools/included/optional-kubectl-configs-bash-linux/

本文以 Ubuntu20.04 下的 kubectl 为例

Bash 自动补全

kubectl 的 Bash 补全脚本可以用命令 kubectl completion bash 生成。 在 shell 中导入(Sourcing)补全脚本,将启用 kubectl 自动补全功能。

然而,补全脚本依赖于工具 bash-completion, 所以要先安装它(可以用命令 type _init_completion 检查 bash-completion 是否已安装)。

安装 bash-completion

很多包管理工具均支持 bash-completion。 可以通过 apt-get install bash-completionyum install bash-completion 等命令来安装它。

上述命令将创建文件 /usr/share/bash-completion/bash_completion,它是 bash-completion 的主脚本。 依据包管理工具的实际情况,你需要在 ~/.bashrc 文件中手工导入此文件。

用户级和系统级二选一,用户级表示系统内所有用户都生效,用户级只对当前用户生效

用户级别开启 bash_completion

~/.bashrc 最后面添加两行

1
2
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)

系统层级开启 bash_completion

/etc/bash.bashrc 如下几行的注释取消

1
2
3
4
5
6
7
8
# enable bash completion in interactive shells
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi

bash-completion 负责导入 /etc/bash_completion.d 目录中的所有补全脚本。

1
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null

关联 kubectl 别名

如果 kubectl 有关联的别名,你可以扩展 shell 补全来适配此别名:

1
2
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -F __start_kubectl k' >>~/.bashrc

ZSH 自动补全

kubectl 通过命令 kubectl completion zsh 生成 Zsh 自动补全脚本。 在 shell 中导入(Sourcing)该自动补全脚本,将启动 kubectl 自动补全功能。

为了在所有的 shell 会话中实现此功能,请将下面内容加入到文件 ~/.zshrc 中。

1
source <(kubectl completion zsh)

如果你为 kubectl 定义了别名,可以扩展脚本补全,以兼容该别名。

1
2
echo 'alias k=kubectl' >>~/.zshrc
echo 'compdef __start_kubectl k' >>~/.zshrc

重新加载 shell 后,kubectl 自动补全功能将立即生效。

如果你收到 complete:13: command not found: compdef 这样的错误提示,那请将下面内容添加到 ~/.zshrc 文件的开头:

1
2
autoload -Uz compinit
compinit