Kubernetes 有没有办法在kubectl命令中自动完成多个对象?
k8s kubectl autocomplete非常棒,除非您想运行一个命令来处理多个事情 例如,我想删除2个吊舱,我可以运行:Kubernetes 有没有办法在kubectl命令中自动完成多个对象?,kubernetes,autocomplete,kubectl,Kubernetes,Autocomplete,Kubectl,k8s kubectl autocomplete非常棒,除非您想运行一个命令来处理多个事情 例如,我想删除2个吊舱,我可以运行: k删除pod foo-12345 bar-67890 但我只能用foo自动完成。bar呢?在最好的情况下,它是一个局部解决方案。经过几次测试,我可以说你的目标可以实现,但它有一些缺点。可能有第三方解决方案,但我不知道有 bash完成 “bash completion”包是使kubectl壳牌公司按预期完工所必需的。您可以使用apt get install bash c
k删除pod foo-12345 bar-67890
但我只能用foo自动完成。bar呢?在最好的情况下,它是一个局部解决方案。经过几次测试,我可以说你的目标可以实现,但它有一些缺点。可能有第三方解决方案,但我不知道有 bash完成 “bash completion”包是使kubectl壳牌公司按预期完工所必需的。您可以使用apt get install bash completionmo安装它。更多信息可以在Kubernetes文档中找到 调试 它有自己的语法和功能。出于调试目的,您可以运行导出BASH\u COMP\u DEBUG\u 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
不会完成多个对象,因为它的autocomplete函数运行sub-requestkubectl get argN
以获取对象列表,并且argN
是现有命令行的先前参数。当您第一次使用它时,它从kubectl command-pod->argN
获取参数并运行kubectl-get-pod
。第二次,它从kubectl命令pod-podname1->argN
获取参数,因此子请求看起来像kubectl-get-podname1
,而不是kubectl-get-pod
,这会导致错误和空输出,而不是对象列表
测试场景
要实现此脚本,可以使用命令kubectl completion bash>k8scompletion.sh
$ vi k8scompletion.sh
最好创建第二个完成脚本,您可以回滚到默认设置-kubectl completion bash>k8scompletion copy.sh
$ vi k8scompletion.sh
在函数\uuuu kubectl\u get\u resource()
中,我编辑了\uu kubectl\u parse\u get“${名词[${名词[@]}-1]}”
到\uu kubectl\u parse\u get“${名词[0]}”
脚本调整概述
调整后的脚本允许您完成kubernetes资源和该资源中的所有对象。以下变通方法足以演示和解决问题中提到的问题,但可能会产生一些副作用,因此请注意您得到的结果
旁注
Shell完成脚本在不同的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
$kubectl删除
apiservices.apiregistration.k8s.io nodes.metrics.k8s.io
backendconfigs.cloud.google.com persistentvolumeclaims
certificatesigningrequests.certificates.k8s.io持久卷
clusterrolebindings.rbac.authorization.k8s.io poddisruptionbudgets.policy
clusterroles.rbac.authorization.k8s.io pods
组件状态PODSecurityPolicys.policy
configmaps pods.metrics.k8s.io
controllerevisions.apps文件模板
cronjobs.batch priorityclass.scheduling.k8s.io
csidrivers.storage.k8s.io replicasets.apps
... 其他的也很少
$kubectl删除pod
poddisruptionbudgets.policy pods PodSecurityPolicys.policy pods.metrics.k8s.io podtemplates
$kubectl删除pod
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获得吊舱nginx
nginx nginx2 nginx-deploy-1-5494687955-sm5lh nginx-deploy-2-94985d7bd-bdb4d nginx-deploy-85df977897-44lcn
$kubectl获得吊舱nginx部署-
nginx-deploy-1-5494687955-sm5lh nginx-deploy-2-94985d7bd-bdb4d nginx-deploy-85df977897-44lcn
$kubectl获得吊舱nginx-deploy-1
###单击nginx-deploy-1-5494687955-sm5lh的选项卡后,将自动完成下面的操作
$kubectl获取吊舱nginx-deploy-1-5494687955-sm5lh
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删除吊舱nginx-deploy-1-5494687955-sm5lh nginx
nginx nginx2 nginx-deploy-1-5494687955-29vqs nginx-deploy-2-94985d7bd-bdb4d nginx-deploy-85df977897-44lcn
$kubectl删除吊舱nginx-deploy-1-5494687955-sm5lh nginx2
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删除吊舱nginx-deploy-1-5494687955-sm5lh nginx2
回滚更改
要应用此特定的完成脚本,您必须使用source
command-source k8scompletion.sh
或source k8scompletion.sh
这就是工作原理,kubectl[command][TYPE][NAME][flags]
我不知道有任何第三方解决方案可以使用它,但是,要实现这一点,有一个局部的解决方法,但是您需要在bash completion
中更改代码。你很好奇,或者你需要这个作为解决具体问题的方法
$ vi k8scompletion.sh