有没有办法在kubectl命令中自动完成多个对象



k8s kubectl自动完成功能非常好,直到您想为多件事运行命令为止。

例如,我想删除2个pod,我可以运行:

k delete pod foo-12345 bar-67890

但我只能用foo自动完成。酒吧呢<选项卡>?

在最好的情况下,这是部分解决方法。经过几次测试,我可以说你的目标是可以实现的,但也有一些缺点。可能有第三方解决方案,但我不知道有。

bash完成

"bash-completion"包是使kubectl shell按预期完成工作所必需的。您可以使用apt-get install bash-completionmo进行安装。更多信息可以在Kubernetes文档中找到可选的kubectl配置。

调试

Bash补全有自己的语法和函数。出于调试目的,您可以运行export BASH_COMP_DEBUG_FILE=$HOME/compdebug.txt。它将创建compdebug文本文件,并将kubectl shell完成函数的所有调试输出发送给它

__kubectl_parse_get: get completion by kubectl get  -o template --template="{{ range .items  }}{{ .metadata.name }} {{ end }}" "first-deployment-85b75bf4f9-mn8zh"
__kubectl_handle_word: c is 0 words[c] is kubectl
__kubectl_handle_command: c is 0 words[c] is kubectl
__kubectl_handle_command: looking for _kubectl_root_command
__kubectl_handle_word: c is 1 words[c] is get
__kubectl_handle_command: c is 1 words[c] is get
__kubectl_handle_command: looking for _kubectl_get
__kubectl_handle_word: c is 2 words[c] is pod
__kubectl_handle_noun: c is 2 words[c] is pod
__kubectl_handle_reply
__kubectl_parse_get: get completion by kubectl get  -o template --template="{{ range .items  }}{{ .metadata.name }} {{ end }}" "pod"

它的工作原理

kubectl不会完成多个对象,因为它的自动完成函数运行子请求kubectl get argN来获取对象列表,而argN是现有命令行的前一个参数。当您第一次使用它时,它从kubectl command pod->argN获取参数并运行kubectl get pod。第二次它从kubectl command pod podname1->argN获取参数,所以子请求看起来像kubectl get podname1,而不是kubectl get pod,这会导致错误和空输出,而不是对象列表。

测试场景

要实现此脚本,可以使用命令kubectl completion bash > k8scompletion.sh

最好创建第二个可以回滚到默认设置kubectl completion bash > k8scompletion-copy.sh的完成脚本。

$ vi k8scompletion.sh

在函数__kubectl_get_resource()中,我已将__kubectl_parse_get "${nouns[${#nouns[@]} -1]}"编辑为__kubectl_parse_get "${nouns[0]}"

__kubectl_get_resource()
{
if [[ ${#nouns[@]} -eq 0 ]]; then
local kubectl_out
if kubectl_out=$(__kubectl_debug_out "kubectl api-resources $(__kubectl_override_flags) -o name --cached --request-timeout=5s --verbs=get"); then
COMPREPLY=( $( compgen -W "${kubectl_out[*]}" -- "$cur" ) )
return 0
fi
return 1
fi
__kubectl_parse_get "${nouns[0]}"
}

脚本调整概述

调整后的脚本允许您完成kubernetes资源和该资源中的所有对象。以下解决方法足以演示和解决问题中提到的问题,但可能会造成一些副作用,因此请注意您得到的结果。

旁注

外壳完成脚本因kubectl版本而异,因此很难创建通用补丁。

测试输出

$ kubectl delete <TAB>
apiservices.apiregistration.k8s.io                            nodes.metrics.k8s.io
backendconfigs.cloud.google.com                               persistentvolumeclaims
certificatesigningrequests.certificates.k8s.io                persistentvolumes
clusterrolebindings.rbac.authorization.k8s.io                 poddisruptionbudgets.policy
clusterroles.rbac.authorization.k8s.io                        pods
componentstatuses                                             podsecuritypolicies.policy
configmaps                                                    pods.metrics.k8s.io
controllerrevisions.apps                                      podtemplates
cronjobs.batch                                                priorityclasses.scheduling.k8s.io
csidrivers.storage.k8s.io                                     replicasets.apps
... and few others
$ kubectl delete pod<TAB>
poddisruptionbudgets.policy  pods                         podsecuritypolicies.policy   pods.metrics.k8s.io          podtemplates
$ kubectl delete pod <TAB><TAB>
httpd-deploy-1-6c4b998b99-jk876  httpd-deploy-6867dfd79c-tr648    nginx2                           nginx-deploy-2-94985d7bd-bdb4d
httpd-deploy-2-64dc95c468-s7vt2  nginx                            nginx-deploy-1-5494687955-sm5lh  nginx-deploy-85df977897-44lcn
$ kubectl get pod nginx<TAB>
nginx                            nginx2                           nginx-deploy-1-5494687955-sm5lh  nginx-deploy-2-94985d7bd-bdb4d   nginx-deploy-85df977897-44lcn
$ kubectl get pod nginx-deploy-<TAB>
nginx-deploy-1-5494687955-sm5lh  nginx-deploy-2-94985d7bd-bdb4d   nginx-deploy-85df977897-44lcn
$ kubectl get pod nginx-deploy-1<TAB>
###It autocomplete below after clicking on tab to nginx-deploy-1-5494687955-sm5lh
$ kubectl get pod nginx-deploy-1-5494687955-sm5lh <TAB>
httpd-deploy-1-6c4b998b99-jk876  httpd-deploy-6867dfd79c-tr648    nginx2                           nginx-deploy-2-94985d7bd-bdb4d
httpd-deploy-2-64dc95c468-s7vt2  nginx                            nginx-deploy-1-5494687955-sm5lh  nginx-deploy-85df977897-44lcn
$ kubectl delete pod nginx-deploy-1-5494687955-sm5lh nginx<TAB>
nginx                            nginx2                           nginx-deploy-1-5494687955-29vqs  nginx-deploy-2-94985d7bd-bdb4d   nginx-deploy-85df977897-44lcn
$ kubectl delete pod nginx-deploy-1-5494687955-sm5lh nginx2 <TAB>
httpd-deploy-1-6c4b998b99-jk876  httpd-deploy-6867dfd79c-tr648    nginx2                           nginx-deploy-2-94985d7bd-bdb4d
httpd-deploy-2-64dc95c468-s7vt2  nginx                            nginx-deploy-1-5494687955-29vqs  nginx-deploy-85df977897-44lcn
$ kubectl delete pod nginx-deploy-1-5494687955-sm5lh nginx2

回滚更改

要应用此特定的完成脚本,必须使用source命令-source k8scompletion.shsource k8scompletion-copy.sh

相关内容

  • 没有找到相关文章

最新更新