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.sh
或source k8scompletion-copy.sh
。