我可以在 zsh 中使用 kubectl 自动补全功能吗?

问题描述 投票:0回答:6

我发现自己每天都在做...

$ kubectl --context=foo get pods
  < copy text manually >
$ kubectl --context=foo logs dep1-12345678-10101

我想循环浏览与

匹配的资源
$ kubectl --context=foo logs dep1<TAB>

但这似乎对我的库存设置没有任何影响。有什么想法吗?

osx 10.12.3 kubectl v1.4.5 zsh zsh 5.2 (x86_64-apple-darwin16.0)

autocomplete kubernetes zsh kubectl
6个回答
91
投票

bash
zsh
都支持当您按
<TAB>
时完成打印命令的脚本。该功能称为可编程完成,您可以在此处找到有关该功能的更多详细信息:zsh 完成

幸运的是,您不需要编写自己的脚本 - kubectl 为 zsh > 5.2 提供了它。尝试运行此命令:

source <(kubectl completion zsh)
.

另一种选择是使用此工具:https://github.com/mkokho/kubemrr (免责声明:我是作者)。它存在的原因是因为标准完成脚本太慢 - Kubernetes 集群可能需要几秒钟才能回复所有 pod 名称。但是

kubemrr
将名称保留在本地,因此响应几乎立即返回。


18
投票

对于

oh-my-zsh
,启用 kubectl 自动补全的最简单方法是在
kubectl
中添加
~/.zshrc
插件:

# somewhere in your .zshrc
# kubectl: The kubectl completion script for Zsh can be generated with the command kubectl completion zsh. Sourcing the completion script in your shell enables kubectl autocompletion.
# kube-ps1: A script that lets you add the current Kubernetes context and namespace configured on kubectl to your Bash/Zsh prompt strings
plugins=(git kubectl Kube-ps1)

15
投票

我将此函数添加到我的 $HOME/.zshrc 中。

它将延迟加载

kubectl

的完整功能
kubectl () {
    command kubectl $*
    if [[ -z $KUBECTL_COMPLETE ]]
    then
        source <(command kubectl completion zsh)
        KUBECTL_COMPLETE=1 
    fi
}

单线版本:

(( ${+commands[kubectl]} )) && alias kubectl='test -z $C_KUBE && C_KUBE=1 && source <(command kubectl completion zsh); command kubectl'

8
投票

我想为所有使用

Oh My Zsh
的人建议更简洁的设置。 当前接受的答案使用命令
kubectl completion zsh
并将它们发送到环境。 我们不这样做,而是将它们放在
plugins
文件夹中,使用相同的命令,但将其修改为:

kubectl completion zsh > ~/.oh-my-zsh/custom/plugins/kubectl.plugin.zsh

现在我们必须在 ~/.zshrc 配置中定义要在 ZSH start 上加载的插件

...

plugins=(
  git
  ...
  kubectl
)

...

此解决方案的优点是保持配置干净。 (是的,我知道这是一行,但如果你必须为 10 个插件执行此操作,那么它就会加起来!:))


7
投票

尝试在 .zshrc 文件的开头添加一行

autoload -U +X compinit && compinit

然后在下面添加另一行

source <(kubectl completion zsh)

0
投票

现有答案为在 zsh 中启用 kubectl 自动完成提供了出色的解决方案。但是,如果您发现正在运行的源代码<(kubectl completion zsh) noticeably slows down your zsh initialization, here's a way to solve that:

# Disable notifications for background jobs
setopt local_options no_notify no_monitor

# Run the completion script in the background
source <(kubectl completion zsh) &
© www.soinside.com 2019 - 2024. All rights reserved.