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

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

k8s kubectl autocomplete非常棒,除非您想运行一个命令来处理多个事情

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

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-request
kubectl 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